From elguavas@users.sourceforge.net Thu Jan 3 11:51:10 2002 From: elguavas@users.sourceforge.net (Stephen M. Gava) Date: Thu, 03 Jan 2002 03:51:10 -0800 Subject: [Idle-dev] CVS: idle EditorWindow.py,1.11,1.12 Message-ID: Update of /cvsroot/idlefork/idle In directory usw-pr-cvs1:/tmp/cvs-serv626 Modified Files: EditorWindow.py Log Message: moving to new config system Index: EditorWindow.py =================================================================== RCS file: /cvsroot/idlefork/idle/EditorWindow.py,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -r1.11 -r1.12 *** EditorWindow.py 2001/11/21 05:55:06 1.11 --- EditorWindow.py 2002/01/03 11:51:07 1.12 *************** *** 17,21 **** import idlever import WindowList ! from IdleConf import idleconf import aboutDialog, textView, configDialog --- 17,22 ---- import idlever import WindowList ! #from IdleConf import idleconf ! from configHandler import idleConf import aboutDialog, textView, configDialog *************** *** 80,84 **** class EditorWindow: - from Percolator import Percolator from ColorDelegator import ColorDelegator --- 81,84 ---- *************** *** 92,97 **** def __init__(self, flist=None, filename=None, key=None, root=None): ! edconf = idleconf.getsection('EditorWindow') ! coconf = idleconf.getsection('Colors') self.flist = flist root = root or flist.root --- 92,96 ---- def __init__(self, flist=None, filename=None, key=None, root=None): ! currentTheme=idleConf.CurrentTheme() self.flist = flist root = root or flist.root *************** *** 103,115 **** self.vbar = vbar = Scrollbar(top, name='vbar') self.text_frame = text_frame = Frame(top) ! self.text = text = Text(text_frame, name='text', padx=5, ! foreground=coconf.getdef('normal-foreground'), ! background=coconf.getdef('normal-background'), ! highlightcolor=coconf.getdef('hilite-foreground'), ! highlightbackground=coconf.getdef('hilite-background'), ! insertbackground=coconf.getdef('cursor-background'), ! width=edconf.getint('width'), ! height=edconf.getint('height'), ! wrap="none") self.createmenubar() --- 102,118 ---- self.vbar = vbar = Scrollbar(top, name='vbar') self.text_frame = text_frame = Frame(top) ! self.text = text = Text(text_frame, name='text', padx=5, wrap=None, ! foreground=idleConf.GetHighlight(currentTheme, ! 'normal',fgBg='fg'), ! background=idleConf.GetHighlight(currentTheme, ! 'normal',fgBg='bg'), ! highlightcolor=idleConf.GetHighlight(currentTheme, ! 'hilite',fgBg='fg'), ! highlightbackground=idleConf.GetHighlight(currentTheme, ! 'hilite',fgBg='bg'), ! insertbackground=idleConf.GetHighlight(currentTheme, ! 'cursor',fgBg='fg'), ! width=idleConf.GetOption('main','EditorWindow','width'), ! height=idleConf.GetOption('main','EditorWindow','height') ) self.createmenubar() *************** *** 145,149 **** text['yscrollcommand'] = vbar.set ! text['font'] = edconf.get('font-name'), edconf.get('font-size') text_frame.pack(side=LEFT, fill=BOTH, expand=1) text.pack(side=TOP, fill=BOTH, expand=1) --- 148,153 ---- text['yscrollcommand'] = vbar.set ! text.config(font=(idleConf.GetOption('main','EditorWindow','font'), ! idleConf.GetOption('main','EditorWindow','font-size'))) text_frame.pack(side=LEFT, fill=BOTH, expand=1) text.pack(side=TOP, fill=BOTH, expand=1) *************** *** 540,544 **** def get_standard_extension_names(self): ! return idleconf.getextensions() def load_extension(self, name): --- 544,548 ---- def get_standard_extension_names(self): ! return idleConf.GetExtensions() def load_extension(self, name): From elguavas@users.sourceforge.net Thu Jan 3 11:58:37 2002 From: elguavas@users.sourceforge.net (Stephen M. Gava) Date: Thu, 03 Jan 2002 03:58:37 -0800 Subject: [Idle-dev] CVS: idle configHandler.py,1.7,1.8 Message-ID: Update of /cvsroot/idlefork/idle In directory usw-pr-cvs1:/tmp/cvs-serv1884 Modified Files: configHandler.py Log Message: further development of highlighting and editor preference handling, plus misc fixes cleanups for new config system Index: configHandler.py =================================================================== RCS file: /cvsroot/idlefork/idle/configHandler.py,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -r1.7 -r1.8 *** configHandler.py 2001/12/03 00:37:28 1.7 --- configHandler.py 2002/01/03 11:58:35 1.8 *************** *** 1,12 **** - ##---------------------------------------------------------------------------## - ## - ## idle - configuration data handler, based on and replacing IdleConfig.py - ## elguavas - ## - ##---------------------------------------------------------------------------## """ ! Provides access to stored idle configuration information ! """ import os import sys --- 1,12 ---- """ ! Provides access to stored idle configuration information. + Throughout this module there is an emphasis on returning useable defaults if + there is a problem returning a requested configuration value back to idle. + This is to allow idle to continue to function in spite of errors in the + retrieval of config information. When a default is returned instead of a + requested config value, a message is printed to stderr to aid in + configuration problem notification and resolution. + """ import os import sys *************** *** 24,31 **** ConfigParser.__init__(self,defaults=cfgDefaults) ! def Get(self, section, option, 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': --- 24,32 ---- ConfigParser.__init__(self,defaults=cfgDefaults) ! def Get(self, section, option, type=None): #,default=None) """ Get an option value for given section/option or return default. If type is specified, return as type. + If a default is returned a warning is printed to stderr. """ if type=='bool': *************** *** 38,43 **** #return getVal(section, option, raw, vars) return getVal(section, option) ! else: ! return default def GetOptionList(self,section): --- 39,50 ---- #return getVal(section, option, raw, vars) return getVal(section, option) ! # #the following handled in IdleConf.GetOption instead ! # else: ! # warning=('\n Warning: configHandler.py - IdleConfParser.Get -\n'+ ! # ' problem retrieving configration option '+`option`+'\n'+ ! # ' from section '+`section`+'.\n'+ ! # ' returning default value: '+`default`+'\n') ! # sys.stderr.write(warning) ! # return default def GetOptionList(self,section): *************** *** 76,83 **** (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): --- 83,90 ---- (idle install dir)/config-keys.def user config files ! (user home dir)/.idlerc/config-main.cfg ! (user home dir)/.idlerc/config-extensions.cfg ! (user home dir)/.idlerc/config-highlight.cfg ! (user home dir)/.idlerc/config-keys.cfg """ def __init__(self): *************** *** 91,95 **** def CreateConfigHandlers(self): """ ! set up a dictionary config parsers for default and user configurations respectively """ --- 98,102 ---- def CreateConfigHandlers(self): """ ! set up a dictionary of config parsers for default and user configurations respectively """ *************** *** 113,117 **** 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]) --- 120,124 ---- for cfgType in configTypes: #build config file names defCfgFiles[cfgType]=os.path.join(idledir,'config-'+cfgType+'.def') ! usrCfgFiles[cfgType]=os.path.join(userdir,'config-'+cfgType+'.cfg') for cfgType in configTypes: #create config parsers self.defaultCfg[cfgType]=IdleConfParser(defCfgFiles[cfgType]) *************** *** 133,136 **** --- 140,148 ---- return self.defaultCfg[configType].Get(section, option, type=type) else: + warning=('\n Warning: configHandler.py - IdleConf.GetOption -\n'+ + ' problem retrieving configration option '+`option`+'\n'+ + ' from section '+`section`+'.\n'+ + ' returning default value: '+`default`+'\n') + sys.stderr.write(warning) return default *************** *** 153,157 **** return cfgParser.sections() ! def GetHighlight(self, theme, element): #get some fallback defaults defaultFg=self.GetOption('highlight', theme, 'normal' + "-foreground", --- 165,175 ---- return cfgParser.sections() ! def GetHighlight(self, theme, element, fgBg=None): ! """ ! return individual highlighting theme elements. ! fgBg - string ('fg'or'bg') or None, if None return a dictionary ! containing fg and bg colours (appropriate for passing to Tkinter in, ! e.g., a tag_config call), otherwise fg or bg colour only as specified. ! """ #get some fallback defaults defaultFg=self.GetOption('highlight', theme, 'normal' + "-foreground", *************** *** 161,170 **** #try for requested element colours fore = self.GetOption('highlight', theme, element + "-foreground") ! back = self.GetOption('highlight', theme, element + "-background") #fall back if required if not fore: fore=defaultFg if not back: back=defaultBg ! return {"foreground": fore, ! "background": back} def GetTheme(self, name=None): --- 179,201 ---- #try for requested element colours fore = self.GetOption('highlight', theme, element + "-foreground") ! back = None ! if element == 'cursor': #there is no config value for cursor bg ! back = None ! else: ! back = self.GetOption('highlight', theme, element + "-background") #fall back if required if not fore: fore=defaultFg if not back: back=defaultBg ! highlight={"foreground": fore,"background": back} ! if not fgBg: #return dict of both colours ! return highlight ! else: #return specified colour only ! if fgBg == 'fg': ! return highlight["foreground"] ! if fgBg == 'bg': ! return highlight["background"] ! else: ! raise 'Invalid fgBg specified' ! def GetTheme(self, name=None): *************** *** 175,178 **** --- 206,242 ---- pass + def CurrentTheme(self): + """ + Returns the name of the currently active theme + """ + return self.GetOption('main','Theme','name') + + + def CurrentKeys(self): + """ + Returns the name of the currently active theme + """ + return self.GetOption('main','Keys','name') + + def GetExtensions(self, activeOnly=1): + """ + Gets a list of all idle extensions declared in the config files. + activeOnly - boolean, if true only return active (enabled) extensions + """ + extns=self.GetSectionList('default','extensions') + userExtns=self.GetSectionList('user','extensions') + for extn in userExtns: + if extn not in extns: #user has added own extension + extns.append(extn) + if activeOnly: + activeExtns=[] + for extn in extns: + if self.GetOption('extensions',extn,'enable',default=1,type='bool'): + #the extension is enabled + activeExtns.append(extn) + return activeExtns + else: + return extns + def GetKeys(self, keySetName=None): """ From elguavas@users.sourceforge.net Thu Jan 3 12:00:36 2002 From: elguavas@users.sourceforge.net (Stephen M. Gava) Date: Thu, 03 Jan 2002 04:00:36 -0800 Subject: [Idle-dev] CVS: idle config-highlight.def,1.2,1.3 config-main.def,1.4,1.5 config.txt,1.3,1.4 Message-ID: Update of /cvsroot/idlefork/idle In directory usw-pr-cvs1:/tmp/cvs-serv2294 Modified Files: config-highlight.def config-main.def config.txt Log Message: further development of highlighting and editor preference handling, plus misc fixes cleanups for new config system Index: config-highlight.def =================================================================== RCS file: /cvsroot/idlefork/idle/config-highlight.def,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -r1.2 -r1.3 *** config-highlight.def 2001/11/04 07:02:02 1.2 --- config-highlight.def 2002/01/03 12:00:34 1.3 *************** *** 2,56 **** # 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-foreround= 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-foreground= black error-background= #ff7777 #shell window stdout-foreground= blue stderr-foreground= red console-foreground= #770000 --- 2,82 ---- # file is the default config file for idle highlight theme settings. ! [IDLE Classic] ! normal-foreground= #000000 ! normal-background= #ffffff normal-fontStyle= normal keyword-foreground= #ff7700 + keyword-background= #ffffff keyword-fontStyle= normal comment-foreground= #dd0000 + comment-background= #ffffff comment-fontStyle= normal string-foreground= #00aa00 + string-background= #ffffff string-fontStyle= normal definition-foreground= #0000ff + definition-background= #ffffff definition-fontStyle= normal ! hilite-foreground= #ffffff ! hilite-background= gray hilite-fontStyle= normal break-foreground= #ff7777 + break-background= #ffffff break-fontStyle= normal hit-foreground= #ffffff + hit-background= #000000 hit-fontStyle= normal ! error-foreground= #000000 error-background= #ff7777 + #cursor (only foreground can be set) + cursor-foreground= black #shell window stdout-foreground= blue + stdout-background= #ffffff stdout-fontStyle= normal stderr-foreground= red + stderr-background= #ffffff stderr-fontStyle= normal console-foreground= #770000 + console-background= #ffffff console-fontStyle= normal ! [IDLE New] ! bold-foreground= #000000 ! bold-background= #ffffff ! bold-fontStyle= bold keyword-foreground= #ff7700 + keyword-background= #ffffff keyword-fontStyle= bold comment-foreground= #dd0000 ! comment-background= #ffffff ! comment-fontStyle= bold string-foreground= #00aa00 ! string-background= #ffffff ! string-fontStyle= bold definition-foreground= #0000ff + definition-background= #ffffff definition-fontStyle= bold ! hilite-foreground= #ffffff ! hilite-background= gray ! hilite-fontStyle= bold break-foreground= #ff7777 ! break-background= #ffffff ! break-fontStyle= bold hit-foreground= #ffffff ! hit-background= #000000 ! hit-fontStyle= bold ! error-foreground= #000000 error-background= #ff7777 + #cursor (only foreground can be set) + cursor-foreground= black #shell window stdout-foreground= blue + stdout-background= #ffffff + stdout-fontStyle= bold stderr-foreground= red + stderr-background= #ffffff + stderr-fontStyle= bold console-foreground= #770000 + console-background= #ffffff + console-fontStyle= bold Index: config-main.def =================================================================== RCS file: /cvsroot/idlefork/idle/config-main.def,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -r1.4 -r1.5 *** config-main.def 2001/11/04 11:53:10 1.4 --- config-main.def 2002/01/03 12:00:34 1.5 *************** *** 49,53 **** editor-on-startup= 0 width= 80 ! height= 24 font= courier font-size= 12 --- 49,53 ---- editor-on-startup= 0 width= 80 ! height= 30 font= courier font-size= 12 *************** *** 60,64 **** [Theme] default= 1 ! name= IDLE Classic New [Keys] --- 60,64 ---- [Theme] default= 1 ! name= IDLE Classic [Keys] Index: config.txt =================================================================== RCS file: /cvsroot/idlefork/idle/config.txt,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -r1.3 -r1.4 *** config.txt 2001/07/12 05:24:19 1.3 --- config.txt 2002/01/03 12:00:34 1.4 *************** *** 50,54 **** [FormatParagraph] ! [ZoomHeight] #[ScriptBinding] # disabled in favor of ExecBinding --- 50,54 ---- [FormatParagraph] ! #[ZoomHeight] #[ScriptBinding] # disabled in favor of ExecBinding From elguavas@users.sourceforge.net Thu Jan 3 12:02:39 2002 From: elguavas@users.sourceforge.net (Stephen M. Gava) Date: Thu, 03 Jan 2002 04:02:39 -0800 Subject: [Idle-dev] CVS: idle tabpage.py,1.2,1.3 Message-ID: Update of /cvsroot/idlefork/idle In directory usw-pr-cvs1:/tmp/cvs-serv2638 Modified Files: tabpage.py Log Message: fixups and improvements Index: tabpage.py =================================================================== RCS file: /cvsroot/idlefork/idle/tabpage.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -r1.2 -r1.3 *** tabpage.py 2001/12/05 06:39:18 1.2 --- tabpage.py 2002/01/03 12:02:37 1.3 *************** *** 12,16 **** Frame.__init__(self, parent,borderwidth=2,relief=RIDGE) self.button=Radiobutton(self,padx=5,pady=5,takefocus=FALSE, ! underline=0,indicatoron=FALSE,highlightthickness=0, borderwidth=0,selectcolor=self.cget('bg')) self.button.pack() --- 12,16 ---- Frame.__init__(self, parent,borderwidth=2,relief=RIDGE) self.button=Radiobutton(self,padx=5,pady=5,takefocus=FALSE, ! indicatoron=FALSE,highlightthickness=0, borderwidth=0,selectcolor=self.cget('bg')) self.button.pack() *************** *** 20,24 **** a set of 'pages' with TabButtons for controlling their display """ ! def __init__(self,parent,pageNames,**kw): """ pageNames - a list of strings, each string will be the dictionary key --- 20,24 ---- a set of 'pages' with TabButtons for controlling their display """ ! def __init__(self,parent,pageNames=[],**kw): """ pageNames - a list of strings, each string will be the dictionary key *************** *** 107,110 **** --- 107,111 ---- labelPgName.pack(padx=5) entryPgName.pack(padx=5) + tabPage.ChangePage() root.mainloop() From elguavas@users.sourceforge.net Thu Jan 3 12:04:03 2002 From: elguavas@users.sourceforge.net (Stephen M. Gava) Date: Thu, 03 Jan 2002 04:04:03 -0800 Subject: [Idle-dev] CVS: idle aboutDialog.py,1.6,1.7 Message-ID: Update of /cvsroot/idlefork/idle In directory usw-pr-cvs1:/tmp/cvs-serv2987 Modified Files: aboutDialog.py Log Message: remove futzing with text font Index: aboutDialog.py =================================================================== RCS file: /cvsroot/idlefork/idle/aboutDialog.py,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -r1.6 -r1.7 *** aboutDialog.py 2001/11/21 05:58:24 1.6 --- aboutDialog.py 2002/01/03 12:04:01 1.7 *************** *** 1,135 **** ! ##---------------------------------------------------------------------------## ! ## ! ## idle - about box ! ## elguavas ! ## ! ##---------------------------------------------------------------------------## ! """ ! about box for idle ! """ ! from Tkinter import * ! import tkFont ! import string, os ! import textView ! import idlever ! class AboutDialog(Toplevel): ! """ ! modal about dialog for idle ! """ ! def __init__(self,parent,title): ! Toplevel.__init__(self, parent) ! self.configure(borderwidth=5) ! self.geometry("+%d+%d" % (parent.winfo_rootx()+30, ! parent.winfo_rooty()+30)) ! self.bg="#777777" ! self.fg="#ffffff" ! #no ugly bold default font on *nix ! font=tkFont.Font(self,Label(self).cget('font')) ! if os.name=='posix': font.config(weight=NORMAL) ! self.textFont=font ! ! self.CreateWidgets() ! self.resizable(height=FALSE,width=FALSE) ! self.title(title) ! self.transient(parent) ! self.grab_set() ! self.protocol("WM_DELETE_WINDOW", self.Ok) ! self.parent = parent ! self.buttonOk.focus_set() ! #key bindings for this dialog ! self.bind('',self.CreditsButtonBinding) #credits button ! self.bind('',self.LicenseButtonBinding) #license button ! self.bind('',self.Ok) #dismiss dialog ! self.bind('',self.Ok) #dismiss dialog ! self.wait_window() ! ! def CreateWidgets(self): ! frameMain = Frame(self,borderwidth=2,relief=SUNKEN) ! frameButtons = Frame(self) ! frameButtons.pack(side=BOTTOM,fill=X) ! frameMain.pack(side=TOP,expand=TRUE,fill=BOTH) ! self.buttonOk = Button(frameButtons,text='Ok', ! command=self.Ok)#,default=ACTIVE ! self.buttonOk.pack(padx=5,pady=5) ! #self.picture = Image('photo',data=self.pictureData) ! frameBg = Frame(frameMain,bg=self.bg) ! frameBg.pack(expand=TRUE,fill=BOTH) ! labelTitle = Label(frameBg,text='IDLEfork',fg=self.fg,bg=self.bg, ! font=('courier', 24, 'bold')) ! labelTitle.grid(row=0,column=0,sticky=W,padx=10,pady=10) ! #labelPicture = Label(frameBg,text='[picture]') ! #image=self.picture,bg=self.bg) ! #labelPicture.grid(row=0,column=1,sticky=W,rowspan=2,padx=0,pady=3) ! labelVersion = Label(frameBg,text='version '+idlever.IDLE_VERSION, ! fg=self.fg,bg=self.bg,font=self.textFont) ! labelVersion.grid(row=1,column=0,sticky=W,padx=10,pady=5) ! labelDesc = Label(frameBg, ! text="A development version of Python's lightweight\n"+ ! 'Integrated DeveLopment Environment, IDLE.', ! justify=LEFT,fg=self.fg,bg=self.bg,font=self.textFont) ! labelDesc.grid(row=2,column=0,sticky=W,columnspan=3,padx=10,pady=5) ! labelCopyright = Label(frameBg, ! text="Copyright (c) 2001 Python Software Foundation;\nAll Rights Reserved", ! justify=LEFT,fg=self.fg,bg=self.bg,font=self.textFont) ! labelCopyright.grid(row=3,column=0,sticky=W,columnspan=3,padx=10,pady=5) ! labelLicense = Label(frameBg, ! text='Released under the Python 2.1.1 PSF Licence', ! justify=LEFT,fg=self.fg,bg=self.bg,font=self.textFont) ! labelLicense.grid(row=4,column=0,sticky=W,columnspan=3,padx=10,pady=5) ! framePad = Frame(frameBg,height=5,bg=self.bg).grid(row=5,column=0) ! labelEmail = Label(frameBg,text='email: idle-dev@python.org', ! justify=LEFT,fg=self.fg,bg=self.bg,font=self.textFont) ! labelEmail.grid(row=6,column=0,columnspan=2,sticky=W,padx=10,pady=0) ! labelWWW = Label(frameBg,text='www: http://idlefork.sourceforge.net', ! justify=LEFT,fg=self.fg,bg=self.bg,font=self.textFont) ! labelWWW.grid(row=7,column=0,columnspan=2,sticky=W,padx=10,pady=0) ! frameDivider = Frame(frameBg,borderwidth=1,relief=SUNKEN, ! height=2,bg=self.bg).grid(row=8,column=0,sticky=(E,W),columnspan=3, ! padx=5,pady=5) ! labelPythonVer = Label(frameBg,text='Python version: '+ ! sys.version.split()[0],fg=self.fg,bg=self.bg,font=self.textFont) ! labelPythonVer.grid(row=9,column=0,sticky=W,padx=10,pady=0) ! #handle weird tk version num in windoze python >= 1.6 (?!?) ! tkVer = `TkVersion`.split('.') ! tkVer[len(tkVer)-1] = str('%.3g' % (float('.'+tkVer[len(tkVer)-1])))[2:] ! if tkVer[len(tkVer)-1] == '': ! tkVer[len(tkVer)-1] = '0' ! tkVer = string.join(tkVer,'.') ! labelTkVer = Label(frameBg,text='Tk version: '+tkVer,fg=self.fg,bg=self.bg, ! font=self.textFont) ! labelTkVer.grid(row=9,column=1,sticky=W,padx=2,pady=0) ! ! self.buttonLicense = Button(frameBg,text='View License',underline=5, ! width=14,highlightbackground=self.bg,command=self.ShowLicense)#takefocus=FALSE ! self.buttonLicense.grid(row=10,column=0,sticky=W,padx=10,pady=10) ! self.buttonCredits = Button(frameBg,text='View Credits',underline=5, ! width=14,highlightbackground=self.bg,command=self.ShowCredits)#takefocus=FALSE ! self.buttonCredits.grid(row=10,column=1,columnspan=2,sticky=E,padx=10,pady=10) ! ! def CreditsButtonBinding(self,event): ! self.buttonCredits.invoke() ! ! def LicenseButtonBinding(self,event): ! self.buttonLicense.invoke() ! ! def ShowLicense(self): ! self.ViewFile('About - License','LICENSE.txt') ! ! def ShowCredits(self): ! self.ViewFile('About - Credits','CREDITS.txt') ! ! def ViewFile(self,viewTitle,viewFile): ! fn=os.path.join(os.path.abspath(os.path.dirname(__file__)),viewFile) ! textView.TextViewer(self,viewTitle,fn) ! ! def Ok(self, event=None): ! self.destroy() ! ! if __name__ == '__main__': ! #test the dialog ! root=Tk() ! def run(): ! import aboutDialog ! aboutDialog.AboutDialog(root,'About') ! Button(root,text='Dialog',command=run).pack() ! root.mainloop() --- 1,125 ---- ! """ ! about box for idle ! """ ! from Tkinter import * ! import tkFont ! import string, os ! import textView ! import idlever ! class AboutDialog(Toplevel): ! """ ! modal about dialog for idle ! """ ! def __init__(self,parent,title): ! Toplevel.__init__(self, parent) ! self.configure(borderwidth=5) ! self.geometry("+%d+%d" % (parent.winfo_rootx()+30, ! parent.winfo_rooty()+30)) ! self.bg="#707070" ! self.fg="#ffffff" ! ! self.CreateWidgets() ! self.resizable(height=FALSE,width=FALSE) ! self.title(title) ! self.transient(parent) ! self.grab_set() ! self.protocol("WM_DELETE_WINDOW", self.Ok) ! self.parent = parent ! self.buttonOk.focus_set() ! #key bindings for this dialog ! self.bind('',self.CreditsButtonBinding) #credits button ! self.bind('',self.LicenseButtonBinding) #license button ! self.bind('',self.Ok) #dismiss dialog ! self.bind('',self.Ok) #dismiss dialog ! self.wait_window() ! ! def CreateWidgets(self): ! frameMain = Frame(self,borderwidth=2,relief=SUNKEN) ! frameButtons = Frame(self) ! frameButtons.pack(side=BOTTOM,fill=X) ! frameMain.pack(side=TOP,expand=TRUE,fill=BOTH) ! self.buttonOk = Button(frameButtons,text='Ok', ! command=self.Ok)#,default=ACTIVE ! self.buttonOk.pack(padx=5,pady=5) ! #self.picture = Image('photo',data=self.pictureData) ! frameBg = Frame(frameMain,bg=self.bg) ! frameBg.pack(expand=TRUE,fill=BOTH) ! labelTitle = Label(frameBg,text='IDLEfork',fg=self.fg,bg=self.bg, ! font=('courier', 24, 'bold')) ! labelTitle.grid(row=0,column=0,sticky=W,padx=10,pady=10) ! #labelPicture = Label(frameBg,text='[picture]') ! #image=self.picture,bg=self.bg) ! #labelPicture.grid(row=0,column=1,sticky=W,rowspan=2,padx=0,pady=3) ! labelVersion = Label(frameBg,text='version '+idlever.IDLE_VERSION, ! fg=self.fg,bg=self.bg) ! labelVersion.grid(row=1,column=0,sticky=W,padx=10,pady=5) ! labelDesc = Label(frameBg, ! text="A development version of Python's lightweight\n"+ ! 'Integrated DeveLopment Environment, IDLE.', ! justify=LEFT,fg=self.fg,bg=self.bg) ! labelDesc.grid(row=2,column=0,sticky=W,columnspan=3,padx=10,pady=5) ! labelCopyright = Label(frameBg, ! text="Copyright (c) 2001 Python Software Foundation;\nAll Rights Reserved", ! justify=LEFT,fg=self.fg,bg=self.bg) ! labelCopyright.grid(row=3,column=0,sticky=W,columnspan=3,padx=10,pady=5) ! labelLicense = Label(frameBg, ! text='Released under the Python 2.1.1 PSF Licence', ! justify=LEFT,fg=self.fg,bg=self.bg) ! labelLicense.grid(row=4,column=0,sticky=W,columnspan=3,padx=10,pady=5) ! framePad = Frame(frameBg,height=5,bg=self.bg).grid(row=5,column=0) ! labelEmail = Label(frameBg,text='email: idle-dev@python.org', ! justify=LEFT,fg=self.fg,bg=self.bg) ! labelEmail.grid(row=6,column=0,columnspan=2,sticky=W,padx=10,pady=0) ! labelWWW = Label(frameBg,text='www: http://idlefork.sourceforge.net', ! justify=LEFT,fg=self.fg,bg=self.bg) ! labelWWW.grid(row=7,column=0,columnspan=2,sticky=W,padx=10,pady=0) ! frameDivider = Frame(frameBg,borderwidth=1,relief=SUNKEN, ! height=2,bg=self.bg).grid(row=8,column=0,sticky=(E,W),columnspan=3, ! padx=5,pady=5) ! labelPythonVer = Label(frameBg,text='Python version: '+ ! sys.version.split()[0],fg=self.fg,bg=self.bg) ! labelPythonVer.grid(row=9,column=0,sticky=W,padx=10,pady=0) ! #handle weird tk version num in windoze python >= 1.6 (?!?) ! tkVer = `TkVersion`.split('.') ! tkVer[len(tkVer)-1] = str('%.3g' % (float('.'+tkVer[len(tkVer)-1])))[2:] ! if tkVer[len(tkVer)-1] == '': ! tkVer[len(tkVer)-1] = '0' ! tkVer = string.join(tkVer,'.') ! labelTkVer = Label(frameBg,text='Tk version: '+ ! tkVer,fg=self.fg,bg=self.bg) ! labelTkVer.grid(row=9,column=1,sticky=W,padx=2,pady=0) ! ! self.buttonLicense = Button(frameBg,text='View License',underline=5, ! width=14,highlightbackground=self.bg,command=self.ShowLicense)#takefocus=FALSE ! self.buttonLicense.grid(row=10,column=0,sticky=W,padx=10,pady=10) ! self.buttonCredits = Button(frameBg,text='View Credits',underline=5, ! width=14,highlightbackground=self.bg,command=self.ShowCredits)#takefocus=FALSE ! self.buttonCredits.grid(row=10,column=1,columnspan=2,sticky=E,padx=10,pady=10) ! ! def CreditsButtonBinding(self,event): ! self.buttonCredits.invoke() ! ! def LicenseButtonBinding(self,event): ! self.buttonLicense.invoke() ! ! def ShowLicense(self): ! self.ViewFile('About - License','LICENSE.txt') ! ! def ShowCredits(self): ! self.ViewFile('About - Credits','CREDITS.txt') ! ! def ViewFile(self,viewTitle,viewFile): ! fn=os.path.join(os.path.abspath(os.path.dirname(__file__)),viewFile) ! textView.TextViewer(self,viewTitle,fn) ! ! def Ok(self, event=None): ! self.destroy() ! ! if __name__ == '__main__': ! #test the dialog ! root=Tk() ! def run(): ! import aboutDialog ! aboutDialog.AboutDialog(root,'About') ! Button(root,text='Dialog',command=run).pack() ! root.mainloop() From elguavas@users.sourceforge.net Thu Jan 3 12:05:19 2002 From: elguavas@users.sourceforge.net (Stephen M. Gava) Date: Thu, 03 Jan 2002 04:05:19 -0800 Subject: [Idle-dev] CVS: idle configDialog.py,1.20,1.21 Message-ID: Update of /cvsroot/idlefork/idle In directory usw-pr-cvs1:/tmp/cvs-serv3320 Modified Files: configDialog.py Log Message: further development of highlighting and editor preference handling, plus misc fixes cleanups for new config system Index: configDialog.py =================================================================== RCS file: /cvsroot/idlefork/idle/configDialog.py,v retrieving revision 1.20 retrieving revision 1.21 diff -C2 -r1.20 -r1.21 *** configDialog.py 2001/12/05 07:54:07 1.20 --- configDialog.py 2002/01/03 12:05:17 1.21 *************** *** 23,38 **** #The third value indicates whether the element can have a foreground #or background colour or both. ! self.themeElements={'Normal Text':('normal','00','both'), ! 'Python Keywords':('keyword','01','both'), ! 'Python Definitions':('definition','02','both'), ! 'Python Comments':('comment','03','both'), ! 'Python Strings':('string','04','both'), ! 'Selected Text':('hilite','05','both'), ! 'Found Text':('hit','06','both'), ! 'Cursor':('cursor','07','fg'), ! 'Error Background':('error','08','bg'), ! 'Shell Foreground':('console','09','fg'), ! 'Shell Stdout Foreground':('stdout','10','fg'), ! 'Shell Stderr Foreground':('stderr','11','fg')} self.CreateWidgets() self.resizable(height=FALSE,width=FALSE) --- 23,38 ---- #The third value indicates whether the element can have a foreground #or background colour or both. ! self.themeElements={'Normal Text':('normal','00'), ! 'Python Keywords':('keyword','01'), ! 'Python Definitions':('definition','02'), ! 'Python Comments':('comment','03'), ! 'Python Strings':('string','04'), ! 'Selected Text':('hilite','05'), ! 'Found Text':('hit','06'), ! 'Cursor':('cursor','07'), ! 'Error Text':('error','08'), ! 'Shell Normal Text':('console','09'), ! 'Shell Stdout Text':('stdout','10'), ! 'Shell Stderr Text':('stderr','11')} self.CreateWidgets() self.resizable(height=FALSE,width=FALSE) *************** *** 116,132 **** def SetHighlightTarget(self): ! colourPlane=self.themeElements[self.highlightTarget.get()][2] ! if colourPlane == 'bg': self.radioFg.config(state=DISABLED) self.radioBg.config(state=DISABLED) ! self.fgHilite.set(0) ! elif colourPlane == 'fg': self.radioFg.config(state=DISABLED) self.radioBg.config(state=DISABLED) self.fgHilite.set(1) - elif colourPlane == 'both': - self.radioFg.config(state=NORMAL) - self.radioBg.config(state=NORMAL) - self.fgHilite.set(1) #default to setting foreground attribute self.SetColourSample() --- 116,127 ---- def SetHighlightTarget(self): ! if self.highlightTarget.get()=='Cursor': #bg not possible self.radioFg.config(state=DISABLED) self.radioBg.config(state=DISABLED) ! self.fgHilite.set(1) ! else: #both fg and bg can be set self.radioFg.config(state=DISABLED) self.radioBg.config(state=DISABLED) self.fgHilite.set(1) self.SetColourSample() *************** *** 145,148 **** --- 140,144 ---- self.tabPages = TabPageSet(self, pageNames=['Fonts/Tabs','Highlighting','Keys','General']) + self.tabPages.ChangePage()#activates default (first) page frameActionButtons = Frame(self) #action buttons *************** *** 499,505 **** for element in self.themeElements.keys(): colours=idleConf.GetHighlight(theme, self.themeElements[element][0]) apply(self.textHighlightSample.tag_config, (self.themeElements[element][0],),colours) ! def LoadFontCfg(self): ##base editor font selection list --- 495,504 ---- for element in self.themeElements.keys(): colours=idleConf.GetHighlight(theme, self.themeElements[element][0]) + if element=='Cursor': #cursor sample needs special painting + colours['background']=idleConf.GetHighlight(theme, + 'normal-text', fgBg='bg') apply(self.textHighlightSample.tag_config, (self.themeElements[element][0],),colours) ! def LoadFontCfg(self): ##base editor font selection list *************** *** 539,543 **** type='int',default=1)) ##currently set theme ! currentOption=idleConf.GetOption('main','Theme','name') ##load available theme option menus if self.themeIsBuiltin.get(): #default theme selected --- 538,542 ---- type='int',default=1)) ##currently set theme ! currentOption=idleConf.CurrentTheme() ##load available theme option menus if self.themeIsBuiltin.get(): #default theme selected *************** *** 576,580 **** type='int',default=1)) ##currently set keys ! currentOption=idleConf.GetOption('main','Keys','name') ##load available keyset option menus if self.keysAreDefault.get(): #default theme selected --- 575,579 ---- type='int',default=1)) ##currently set keys ! currentOption=idleConf.CurrentKeys() ##load available keyset option menus if self.keysAreDefault.get(): #default theme selected From elguavas@users.sourceforge.net Fri Jan 4 03:06:10 2002 From: elguavas@users.sourceforge.net (Stephen M. Gava) Date: Thu, 03 Jan 2002 19:06:10 -0800 Subject: [Idle-dev] CVS: idle Bindings.py,1.5,1.6 EditorWindow.py,1.12,1.13 config-extensions.def,1.1,1.2 config-highlight.def,1.3,1.4 config-keys.def,1.2,1.3 configHandler.py,1.8,1.9 SearchBinding.py,1.2,NONE Message-ID: Update of /cvsroot/idlefork/idle In directory usw-pr-cvs1:/tmp/cvs-serv9763 Modified Files: Bindings.py EditorWindow.py config-extensions.def config-highlight.def config-keys.def configHandler.py Removed Files: SearchBinding.py Log Message: move core functionality of SearchBindings.py into EditorWindow.py proper adjust configuration sources accordingly move SearchBindings.py into the attic now Index: Bindings.py =================================================================== RCS file: /cvsroot/idlefork/idle/Bindings.py,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -r1.5 -r1.6 *** Bindings.py 2001/12/03 00:37:28 1.5 --- Bindings.py 2002/01/04 03:06:08 1.6 *************** *** 42,45 **** --- 42,52 ---- ('_Paste', '<>'), ('Select _All', '<>'), + None, + ('_Find...', '<>'), + ('Find a_gain', '<>'), + ('Find _selection', '<>'), + ('Find in Files...', '<>'), + ('R_eplace...', '<>'), + ('Go to _line', '<>'), ]), ('run',[ Index: EditorWindow.py =================================================================== RCS file: /cvsroot/idlefork/idle/EditorWindow.py,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -r1.12 -r1.13 *** EditorWindow.py 2002/01/03 11:51:07 1.12 --- EditorWindow.py 2002/01/04 03:06:08 1.13 *************** *** 17,20 **** --- 17,23 ---- import idlever import WindowList + import SearchDialog + import GrepDialog + import ReplaceDialog #from IdleConf import idleconf from configHandler import idleConf *************** *** 132,135 **** --- 135,144 ---- text.bind("<>", self.select_all) text.bind("<>", self.remove_selection) + text.bind("<>", self.find_event) + text.bind("<>", self.find_again_event) + text.bind("<>", self.find_in_files_event) + text.bind("<>", self.find_selection_event) + text.bind("<>", self.replace_event) + text.bind("<>", self.goto_line_event) text.bind("<3>", self.right_menu_event) if flist: *************** *** 320,323 **** --- 329,364 ---- self.text.tag_remove("sel", "1.0", "end") self.text.see("insert") + + def find_event(self, event): + SearchDialog.find(self.text) + return "break" + + def find_again_event(self, event): + SearchDialog.find_again(self.text) + return "break" + + def find_selection_event(self, event): + SearchDialog.find_selection(self.text) + return "break" + + def find_in_files_event(self, event): + GrepDialog.grep(self.text, self.io, self.flist) + return "break" + + def replace_event(self, event): + ReplaceDialog.replace(self.text) + return "break" + + def goto_line_event(self, event): + text = self.text + lineno = tkSimpleDialog.askinteger("Goto", + "Go to line number:",parent=text) + if lineno is None: + return "break" + if lineno <= 0: + text.bell() + return "break" + text.mark_set("insert", "%d.0" % lineno) + text.see("insert") def open_module(self, event=None): Index: config-extensions.def =================================================================== RCS file: /cvsroot/idlefork/idle/config-extensions.def,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -r1.1 -r1.2 *** config-extensions.def 2001/09/24 09:43:17 1.1 --- config-extensions.def 2002/01/04 03:06:08 1.2 *************** *** 2,8 **** # file is the default config file for idle extensions settings. - [SearchBinding] - enable=1 - [AutoIndent] enable=1 --- 2,5 ---- Index: config-highlight.def =================================================================== RCS file: /cvsroot/idlefork/idle/config-highlight.def,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -r1.3 -r1.4 *** config-highlight.def 2002/01/03 12:00:34 1.3 --- config-highlight.def 2002/01/04 03:06:08 1.4 *************** *** 5,30 **** normal-foreground= #000000 normal-background= #ffffff - normal-fontStyle= normal keyword-foreground= #ff7700 keyword-background= #ffffff - keyword-fontStyle= normal comment-foreground= #dd0000 comment-background= #ffffff - comment-fontStyle= normal string-foreground= #00aa00 string-background= #ffffff - string-fontStyle= normal definition-foreground= #0000ff definition-background= #ffffff - definition-fontStyle= normal hilite-foreground= #ffffff hilite-background= gray - hilite-fontStyle= normal break-foreground= #ff7777 break-background= #ffffff - break-fontStyle= normal hit-foreground= #ffffff hit-background= #000000 - hit-fontStyle= normal error-foreground= #000000 error-background= #ff7777 --- 5,22 ---- *************** *** 34,70 **** stdout-foreground= blue stdout-background= #ffffff - stdout-fontStyle= normal stderr-foreground= red stderr-background= #ffffff - stderr-fontStyle= normal console-foreground= #770000 console-background= #ffffff - console-fontStyle= normal [IDLE New] bold-foreground= #000000 bold-background= #ffffff - bold-fontStyle= bold keyword-foreground= #ff7700 keyword-background= #ffffff - keyword-fontStyle= bold comment-foreground= #dd0000 comment-background= #ffffff - comment-fontStyle= bold string-foreground= #00aa00 string-background= #ffffff - string-fontStyle= bold definition-foreground= #0000ff definition-background= #ffffff - definition-fontStyle= bold hilite-foreground= #ffffff hilite-background= gray - hilite-fontStyle= bold break-foreground= #ff7777 break-background= #ffffff - break-fontStyle= bold hit-foreground= #ffffff hit-background= #000000 - hit-fontStyle= bold error-foreground= #000000 error-background= #ff7777 --- 26,51 ---- *************** *** 74,82 **** stdout-foreground= blue stdout-background= #ffffff - stdout-fontStyle= bold stderr-foreground= red stderr-background= #ffffff - stderr-fontStyle= bold console-foreground= #770000 console-background= #ffffff - console-fontStyle= bold --- 55,60 ---- Index: config-keys.def =================================================================== RCS file: /cvsroot/idlefork/idle/config-keys.def,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -r1.2 -r1.3 *** config-keys.def 2001/12/03 00:37:28 1.2 --- config-keys.def 2002/01/04 03:06:08 1.3 *************** *** 6,10 **** # single 'emacs style' multi-keystoke binding. ! [IDLE CUA-ish] Copy= Cut= --- 6,10 ---- # single 'emacs style' multi-keystoke binding. ! [IDLE Classic Windows] Copy= Cut= *************** *** 34,39 **** toggle-auto-coloring= undo= ! [IDLE Emacs-ish] Copy= Cut= --- 34,45 ---- toggle-auto-coloring= undo= + find= + find-again= + find-in-files= + find-selection= + replace= + goto-line= ! [IDLE Classic Unix] Copy= Cut= *************** *** 63,64 **** --- 69,76 ---- toggle-auto-coloring= undo= + find= + find-again= + find-in-files= + find-selection= + replace= + goto-line= Index: configHandler.py =================================================================== RCS file: /cvsroot/idlefork/idle/configHandler.py,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -r1.8 -r1.9 *** configHandler.py 2002/01/03 11:58:35 1.8 --- configHandler.py 2002/01/04 03:06:08 1.9 *************** *** 1,12 **** """ Provides access to stored idle configuration information. - - Throughout this module there is an emphasis on returning useable defaults if - there is a problem returning a requested configuration value back to idle. - This is to allow idle to continue to function in spite of errors in the - retrieval of config information. When a default is returned instead of a - requested config value, a message is printed to stderr to aid in - configuration problem notification and resolution. """ import os import sys --- 1,12 ---- """ Provides access to stored idle configuration information. """ + # Throughout this module there is an emphasis on returning useable defaults + # when a problem occurs in returning a requested configuration value back to + # idle. This is to allow idle to continue to function in spite of errors in + # the retrieval of config information. When a default is returned instead of + # a requested config value, a message is printed to stderr to aid in + # configuration problem notification and resolution. + import os import sys *************** *** 39,50 **** #return getVal(section, option, raw, vars) return getVal(section, option) - # #the following handled in IdleConf.GetOption instead - # else: - # warning=('\n Warning: configHandler.py - IdleConfParser.Get -\n'+ - # ' problem retrieving configration option '+`option`+'\n'+ - # ' from section '+`section`+'.\n'+ - # ' returning default value: '+`default`+'\n') - # sys.stderr.write(warning) - # return default def GetOptionList(self,section): --- 39,42 ---- --- SearchBinding.py DELETED --- From elguavas@users.sourceforge.net Fri Jan 4 07:53:08 2002 From: elguavas@users.sourceforge.net (Stephen M. Gava) Date: Thu, 03 Jan 2002 23:53:08 -0800 Subject: [Idle-dev] CVS: idle Bindings.py,1.6,1.7 ColorDelegator.py,1.5,1.6 EditorWindow.py,1.13,1.14 PyShell.py,1.10,1.11 config-extensions.def,1.2,1.3 config-main.def,1.5,1.6 configDialog.py,1.21,1.22 configHandler.py,1.9,1.10 Message-ID: Update of /cvsroot/idlefork/idle In directory usw-pr-cvs1:/tmp/cvs-serv23459 Modified Files: Bindings.py ColorDelegator.py EditorWindow.py PyShell.py config-extensions.def config-main.def configDialog.py configHandler.py Log Message: loading core keybindings via new config system plus further devel of highlight handling Index: Bindings.py =================================================================== RCS file: /cvsroot/idlefork/idle/Bindings.py,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -r1.6 -r1.7 *** Bindings.py 2002/01/04 03:06:08 1.6 --- Bindings.py 2002/01/04 07:53:06 1.7 *************** *** 74,83 **** ] ! #if sys.platform == 'win32': ! # default_keydefs = windows_keydefs ! #else: ! # default_keydefs = unix_keydefs ! ! default_keydefs = idleConf.GetKeys(keySetName=None) del sys --- 74,78 ---- ] ! default_keydefs = idleConf.GetKeys(keySetName=idleConf.CurrentKeys()) del sys Index: ColorDelegator.py =================================================================== RCS file: /cvsroot/idlefork/idle/ColorDelegator.py,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -r1.5 -r1.6 *** ColorDelegator.py 2001/11/03 14:53:23 1.5 --- ColorDelegator.py 2002/01/04 07:53:06 1.6 *************** *** 61,66 **** "STRING": idleConf.GetHighlight(theme, "string"), "DEFINITION": idleConf.GetHighlight(theme, "definition"), ! "SYNC": idleConf.GetHighlight(theme, "sync"), ! "TODO": idleConf.GetHighlight(theme, "todo"), "BREAK": idleConf.GetHighlight(theme, "break"), # The following is used by ReplaceDialog: --- 61,66 ---- "STRING": idleConf.GetHighlight(theme, "string"), "DEFINITION": idleConf.GetHighlight(theme, "definition"), ! "SYNC": {'background':None,'foreground':None}, ! "TODO": {'background':None,'foreground':None}, "BREAK": idleConf.GetHighlight(theme, "break"), # The following is used by ReplaceDialog: Index: EditorWindow.py =================================================================== RCS file: /cvsroot/idlefork/idle/EditorWindow.py,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -r1.13 -r1.14 *** EditorWindow.py 2002/01/04 03:06:08 1.13 --- EditorWindow.py 2002/01/04 07:53:06 1.14 *************** *** 207,211 **** self.extensions['AutoIndent'].set_indentation_params( self.ispythonsource(filename)) - def set_status_bar(self): --- 207,210 ---- Index: PyShell.py =================================================================== RCS file: /cvsroot/idlefork/idle/PyShell.py,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -r1.10 -r1.11 *** PyShell.py 2001/11/21 05:54:12 1.10 --- PyShell.py 2002/01/04 07:53:06 1.11 *************** *** 43,47 **** from UndoDelegator import UndoDelegator from OutputWindow import OutputWindow, OnDemandOutputWindow - from IdleConf import idleconf from configHandler import idleConf import idlever --- 43,46 ---- *************** *** 144,150 **** tagdefs = ColorDelegator.tagdefs.copy() theme = idleConf.GetOption('main','Theme','name') - tagdefs.update({ ! "stdin": idleConf.GetHighlight(theme, "stdin"), "stdout": idleConf.GetHighlight(theme, "stdout"), "stderr": idleConf.GetHighlight(theme, "stderr"), --- 143,149 ---- tagdefs = ColorDelegator.tagdefs.copy() theme = idleConf.GetOption('main','Theme','name') ! tagdefs.update({ ! "stdin": {'background':None,'foreground':None}, "stdout": idleConf.GetHighlight(theme, "stdout"), "stderr": idleConf.GetHighlight(theme, "stderr"), *************** *** 153,157 **** None: idleConf.GetHighlight(theme, "normal"), }) - class ModifiedUndoDelegator(UndoDelegator): --- 152,155 ---- Index: config-extensions.def =================================================================== RCS file: /cvsroot/idlefork/idle/config-extensions.def,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -r1.2 -r1.3 *** config-extensions.def 2002/01/04 03:06:08 1.2 --- config-extensions.def 2002/01/04 07:53:06 1.3 *************** *** 2,12 **** # file is the default config file for idle extensions settings. ! [AutoIndent] enable=1 ! [AutoExpand] enable=1 ! [FormatParagraph] enable=1 --- 2,12 ---- # file is the default config file for idle extensions settings. ! [FormatParagraph] enable=1 ! [AutoIndent] enable=1 ! [AutoExpand] enable=1 Index: config-main.def =================================================================== RCS file: /cvsroot/idlefork/idle/config-main.def,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -r1.5 -r1.6 *** config-main.def 2002/01/03 12:00:34 1.5 --- config-main.def 2002/01/04 07:53:06 1.6 *************** *** 64,68 **** [Keys] default= 1 ! name= IDLE Classic - windows [RecentFiles] --- 64,68 ---- [Keys] default= 1 ! name= IDLE Classic Windows [RecentFiles] Index: configDialog.py =================================================================== RCS file: /cvsroot/idlefork/idle/configDialog.py,v retrieving revision 1.21 retrieving revision 1.22 diff -C2 -r1.21 -r1.22 *** configDialog.py 2002/01/03 12:05:17 1.21 --- configDialog.py 2002/01/04 07:53:06 1.22 *************** *** 121,126 **** self.fgHilite.set(1) else: #both fg and bg can be set ! self.radioFg.config(state=DISABLED) ! self.radioBg.config(state=DISABLED) self.fgHilite.set(1) self.SetColourSample() --- 121,126 ---- self.fgHilite.set(1) else: #both fg and bg can be set ! self.radioFg.config(state=NORMAL) ! self.radioBg.config(state=NORMAL) self.fgHilite.set(1) self.SetColourSample() *************** *** 497,501 **** if element=='Cursor': #cursor sample needs special painting colours['background']=idleConf.GetHighlight(theme, ! 'normal-text', fgBg='bg') apply(self.textHighlightSample.tag_config, (self.themeElements[element][0],),colours) --- 497,501 ---- if element=='Cursor': #cursor sample needs special painting colours['background']=idleConf.GetHighlight(theme, ! 'normal', fgBg='bg') apply(self.textHighlightSample.tag_config, (self.themeElements[element][0],),colours) *************** *** 559,567 **** themeNames.sort(self.__ThemeNameIndexCompare) self.optMenuHighlightTarget.SetMenu(themeNames,themeNames[0]) - sampleBg=idleConf.GetHighlight(currentOption, - self.highlightTarget.get())['background'] - self.fgHilite.set(0) - self.frameColourSet.config(bg=sampleBg) self.PaintThemeSample() def __ThemeNameIndexCompare(self,a,b): --- 559,564 ---- themeNames.sort(self.__ThemeNameIndexCompare) self.optMenuHighlightTarget.SetMenu(themeNames,themeNames[0]) self.PaintThemeSample() + self.SetHighlightTarget() def __ThemeNameIndexCompare(self,a,b): Index: configHandler.py =================================================================== RCS file: /cvsroot/idlefork/idle/configHandler.py,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -r1.9 -r1.10 *** configHandler.py 2002/01/04 03:06:08 1.9 --- configHandler.py 2002/01/04 07:53:06 1.10 *************** *** 28,32 **** Get an option value for given section/option or return default. If type is specified, return as type. - If a default is returned a warning is printed to stderr. """ if type=='bool': --- 28,31 ---- *************** *** 126,129 **** --- 125,129 ---- either the user or the default configuration. configType must be one of ('main','extensions','highlight','keys') + If a default is returned a warning is printed to stderr. """ if self.userCfg[configType].has_option(section,option): *************** *** 202,206 **** Returns the name of the currently active theme """ ! return self.GetOption('main','Theme','name') --- 202,206 ---- Returns the name of the currently active theme """ ! return self.GetOption('main','Theme','name',default='') *************** *** 209,213 **** Returns the name of the currently active theme """ ! return self.GetOption('main','Keys','name') def GetExtensions(self, activeOnly=1): --- 209,213 ---- Returns the name of the currently active theme """ ! return self.GetOption('main','Keys','name',default='') def GetExtensions(self, activeOnly=1): *************** *** 231,239 **** return extns def GetKeys(self, keySetName=None): """ ! returns the requested keybindings, with fallbacks if required. """ - #default keybindings. #keybindings loaded from the config file(s) are loaded _over_ these #defaults, so if there is a problem getting any binding there will --- 231,249 ---- return extns + def GetKeyBinding(self, keySetName, eventStr): + """ + returns the keybinding for a specific event. + keySetName - string, name of key binding set + eventStr - string, the virtual event we want the binding for, + represented as a string, eg. '<>' + """ + eventName=eventStr[2:-2] #trim off the angle brackets + binding=self.GetOption('keys',keySetName,eventName,default='').split() + return binding + def GetKeys(self, keySetName=None): """ ! returns the requested set of keybindings, with fallbacks if required. """ #keybindings loaded from the config file(s) are loaded _over_ these #defaults, so if there is a problem getting any binding there will *************** *** 267,273 **** '<>': [''], '<>': [''], ! '<>': ['']} if keySetName: ! pass return keyBindings --- 277,293 ---- '<>': [''], '<>': [''], ! '<>': [''], ! '<>': ['', ''], ! '<>': [''], ! '<>': [''], ! '<>': [''], ! '<>': [''], ! '<>': [''] } ! if keySetName: ! for event in keyBindings.keys(): ! binding=self.GetKeyBinding(keySetName,event) ! if binding: #otherwise will keep default ! keyBindings[event]=binding return keyBindings From cinthia@anovaluz.com.br Wed Jan 9 23:14:24 2002 From: cinthia@anovaluz.com.br (NovaLuz) Date: Wed, 09 Jan 2002 21:14:24 -0200 Subject: [Idle-dev] =?iso-8859-1?Q?Don=B4t_stay_in_the_dark?= Message-ID: This is a Multipart MIME message. ------=_NextPart_000_001__5440004_76464,14 Content-Type: multipart/alternative; boundary="----=_NextPart_001_002__5440004_76464,14" ------=_NextPart_001_002__5440004_76464,14 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 7bit ------=_NextPart_001_002__5440004_76464,14 Content-Type: text/html; charset=iso-8859-1 Content-Transfer-Encoding: base64 PGh0bWwgeG1sbnM6dj0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp2bWwiDQp4bWxuczpv PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiDQp4bWxuczp3PSJ1 cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIg0KeG1sbnM9Imh0dHA6Ly93 d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPg0KDQo8aGVhZD4NCjxtZXRhIGh0dHAtZXF1aXY9 Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIi Pg0KPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50Pg0KPG1ldGEgbmFt ZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+DQo8bWV0YSBuYW1lPU9y aWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+DQo8bGluayByZWw9RmlsZS1M aXN0IGhyZWY9Ii4vSW5nbGVzJTIwLSUyME5MNTVDRF9hcnF1aXZvcy9maWxlbGlzdC54bWwi Pg0KPGxpbmsgcmVsPUVkaXQtVGltZS1EYXRhIGhyZWY9Ii4vSW5nbGVzJTIwLSUyME5MNTVD RF9hcnF1aXZvcy9lZGl0ZGF0YS5tc28iPg0KPCEtLVtpZiAhbXNvXT4NCjxzdHlsZT4NCnZc Oioge2JlaGF2aW9yOnVybCgjZGVmYXVsdCNWTUwpO30NCm9cOioge2JlaGF2aW9yOnVybCgj ZGVmYXVsdCNWTUwpO30NCndcOioge2JlaGF2aW9yOnVybCgjZGVmYXVsdCNWTUwpO30NCi5z aGFwZSB7YmVoYXZpb3I6dXJsKCNkZWZhdWx0I1ZNTCk7fQ0KPC9zdHlsZT4NCjwhW2VuZGlm XS0tPg0KPHRpdGxlPk7jbyBGaXF1ZSBubyBFc2N1cm88L3RpdGxlPg0KPCEtLVtpZiBndGUg bXNvIDldPjx4bWw+DQogPG86RG9jdW1lbnRQcm9wZXJ0aWVzPg0KICA8bzpBdXRob3I+Q0lO VEhJQTwvbzpBdXRob3I+DQogIDxvOlRlbXBsYXRlPk5vcm1hbDwvbzpUZW1wbGF0ZT4NCiAg PG86TGFzdEF1dGhvcj5DaW50aGlhIEFsbWVpZGEgZGUgU291emE8L286TGFzdEF1dGhvcj4N CiAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4NCiAgPG86VG90YWxUaW1lPjA8L286VG90 YWxUaW1lPg0KICA8bzpDcmVhdGVkPjIwMDItMDEtMDdUMjI6MzA6MDBaPC9vOkNyZWF0ZWQ+ DQogIDxvOkxhc3RTYXZlZD4yMDAyLTAxLTA3VDIyOjMwOjAwWjwvbzpMYXN0U2F2ZWQ+DQog IDxvOlBhZ2VzPjI8L286UGFnZXM+DQogIDxvOldvcmRzPjEyMTwvbzpXb3Jkcz4NCiAgPG86 Q2hhcmFjdGVycz42OTA8L286Q2hhcmFjdGVycz4NCiAgPG86Q29tcGFueT5Ob3ZhIGx1ejwv bzpDb21wYW55Pg0KICA8bzpMaW5lcz41PC9vOkxpbmVzPg0KICA8bzpQYXJhZ3JhcGhzPjE8 L286UGFyYWdyYXBocz4NCiAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+ODQ3PC9vOkNoYXJh Y3RlcnNXaXRoU3BhY2VzPg0KICA8bzpWZXJzaW9uPjkuMjgxMjwvbzpWZXJzaW9uPg0KIDwv bzpEb2N1bWVudFByb3BlcnRpZXM+DQo8L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBt c28gOV0+PHhtbD4NCiA8dzpXb3JkRG9jdW1lbnQ+DQogIDx3Okh5cGhlbmF0aW9uWm9uZT4y MTwvdzpIeXBoZW5hdGlvblpvbmU+DQogPC93OldvcmREb2N1bWVudD4NCjwveG1sPjwhW2Vu ZGlmXS0tPg0KPHN0eWxlPg0KPCEtLQ0KIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8NCkBmb250 LWZhY2UNCgl7Zm9udC1mYW1pbHk6IkNvcHBycGxHb3RoIEJkIEJUIjsNCglwYW5vc2UtMToy IDE0IDcgNSAyIDIgMyAyIDQgNDsNCgltc28tZm9udC1jaGFyc2V0OjA7DQoJbXNvLWdlbmVy aWMtZm9udC1mYW1pbHk6c3dpc3M7DQoJbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7DQoJbXNv LWZvbnQtc2lnbmF0dXJlOjcgMCAwIDAgMTcgMDt9DQpAZm9udC1mYWNlDQoJe2ZvbnQtZmFt aWx5OiJNb25vdHlwZSBDb3JzaXZhIjsNCglwYW5vc2UtMTozIDEgMSAxIDEgMiAxIDEgMSAx Ow0KCW1zby1mb250LWNoYXJzZXQ6MDsNCgltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzY3Jp cHQ7DQoJbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7DQoJbXNvLWZvbnQtc2lnbmF0dXJlOjY0 NyAwIDAgMCAxNTkgMDt9DQpAZm9udC1mYWNlDQoJe2ZvbnQtZmFtaWx5OiJMdWNpZGEgU2Fu cyBVbmljb2RlIjsNCglwYW5vc2UtMToyIDExIDYgMiAzIDUgNCAyIDIgNDsNCgltc28tZm9u dC1jaGFyc2V0OjA7DQoJbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7DQoJbXNvLWZv bnQtcGl0Y2g6dmFyaWFibGU7DQoJbXNvLWZvbnQtc2lnbmF0dXJlOjY3OTEgMCAwIDAgNjMg MDt9DQpAZm9udC1mYWNlDQoJe2ZvbnQtZmFtaWx5OiJBdmFudEdhcmRlIE1kIEJUIjsNCglw YW5vc2UtMToyIDExIDYgMiAyIDIgMiAyIDIgNDsNCgltc28tZm9udC1jaGFyc2V0OjA7DQoJ bXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7DQoJbXNvLWZvbnQtcGl0Y2g6dmFyaWFi bGU7DQoJbXNvLWZvbnQtc2lnbmF0dXJlOjcgMCAwIDAgMTcgMDt9DQogLyogU3R5bGUgRGVm aW5pdGlvbnMgKi8NCnAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwN Cgl7bXNvLXN0eWxlLXBhcmVudDoiIjsNCgltYXJnaW46MGNtOw0KCW1hcmdpbi1ib3R0b206 LjAwMDFwdDsNCgltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47DQoJZm9udC1zaXplOjEy LjBwdDsNCglmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsNCgltc28tZmFyZWFzdC1m b250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9DQpoMQ0KCXttc28tc3R5bGUtbmV4dDpO b3JtYWw7DQoJbWFyZ2luOjBjbTsNCgltYXJnaW4tYm90dG9tOi4wMDAxcHQ7DQoJdGV4dC1h bGlnbjpjZW50ZXI7DQoJbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOw0KCXBhZ2UtYnJl YWstYWZ0ZXI6YXZvaWQ7DQoJbXNvLW91dGxpbmUtbGV2ZWw6MTsNCglmb250LXNpemU6MTgu MHB0Ow0KCW1zby1iaWRpLWZvbnQtc2l6ZToxMi4wcHQ7DQoJZm9udC1mYW1pbHk6Ik1vbm90 eXBlIENvcnNpdmEiOw0KCW1zby1mb250LWtlcm5pbmc6MHB0Ow0KCWZvbnQtd2VpZ2h0Om5v cm1hbDt9DQpoMg0KCXttc28tc3R5bGUtbmV4dDpOb3JtYWw7DQoJbWFyZ2luOjBjbTsNCglt YXJnaW4tYm90dG9tOi4wMDAxcHQ7DQoJdGV4dC1hbGlnbjpjZW50ZXI7DQoJbXNvLXBhZ2lu YXRpb246d2lkb3ctb3JwaGFuOw0KCXBhZ2UtYnJlYWstYWZ0ZXI6YXZvaWQ7DQoJbXNvLW91 dGxpbmUtbGV2ZWw6MjsNCglmb250LXNpemU6MTQuMHB0Ow0KCW1zby1iaWRpLWZvbnQtc2l6 ZToxMi4wcHQ7DQoJZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7DQoJZm9udC13ZWln aHQ6bm9ybWFsO30NCnAuTXNvQ2FwdGlvbiwgbGkuTXNvQ2FwdGlvbiwgZGl2Lk1zb0NhcHRp b24NCgl7bXNvLXN0eWxlLW5leHQ6Tm9ybWFsOw0KCW1hcmdpbjowY207DQoJbWFyZ2luLWJv dHRvbTouMDAwMXB0Ow0KCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsNCglmb250LXNp emU6MTIuMHB0Ow0KCW1zby1iaWRpLWZvbnQtc2l6ZToxMC4wcHQ7DQoJZm9udC1mYW1pbHk6 IlRpbWVzIE5ldyBSb21hbiI7DQoJbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5l dyBSb21hbiI7DQoJY29sb3I6IzVGNUY1Rjt9DQpwLk1zb1RpdGxlLCBsaS5Nc29UaXRsZSwg ZGl2Lk1zb1RpdGxlDQoJe21hcmdpbjowY207DQoJbWFyZ2luLWJvdHRvbTouMDAwMXB0Ow0K CXRleHQtYWxpZ246Y2VudGVyOw0KCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsNCglm b250LXNpemU6MjAuMHB0Ow0KCW1zby1iaWRpLWZvbnQtc2l6ZToxMi4wcHQ7DQoJZm9udC1m YW1pbHk6Ikx1Y2lkYSBTYW5zIFVuaWNvZGUiOw0KCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5 OiJUaW1lcyBOZXcgUm9tYW4iOw0KCWNvbG9yOiMzMzMzQ0M7fQ0KcC5Nc29Cb2R5VGV4dCwg bGkuTXNvQm9keVRleHQsIGRpdi5Nc29Cb2R5VGV4dA0KCXttYXJnaW46MGNtOw0KCW1hcmdp bi1ib3R0b206LjAwMDFwdDsNCgltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47DQoJZm9u dC1zaXplOjE0LjBwdDsNCgltc28tYmlkaS1mb250LXNpemU6MTIuMHB0Ow0KCWZvbnQtZmFt aWx5OiJUaW1lcyBOZXcgUm9tYW4iOw0KCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1l cyBOZXcgUm9tYW4iO30NCnAuTXNvQm9keVRleHRJbmRlbnQsIGxpLk1zb0JvZHlUZXh0SW5k ZW50LCBkaXYuTXNvQm9keVRleHRJbmRlbnQNCgl7bWFyZ2luLXRvcDowY207DQoJbWFyZ2lu LXJpZ2h0OjBjbTsNCgltYXJnaW4tYm90dG9tOjBjbTsNCgltYXJnaW4tbGVmdDoyODMuMnB0 Ow0KCW1hcmdpbi1ib3R0b206LjAwMDFwdDsNCgl0ZXh0LWFsaWduOmp1c3RpZnk7DQoJdGV4 dC1pbmRlbnQ6MzUuNHB0Ow0KCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsNCglmb250 LXNpemU6MTQuMHB0Ow0KCW1zby1iaWRpLWZvbnQtc2l6ZToxMi4wcHQ7DQoJZm9udC1mYW1p bHk6IkF2YW50R2FyZGUgTWQgQlQiOw0KCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1l cyBOZXcgUm9tYW4iOw0KCW1zby1iaWRpLWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4i Ow0KCWNvbG9yOiM5OUNDMDA7DQoJZm9udC13ZWlnaHQ6Ym9sZDsNCgltc28tYmlkaS1mb250 LXdlaWdodDpub3JtYWw7DQoJZm9udC1zdHlsZTppdGFsaWM7DQoJbXNvLWJpZGktZm9udC1z dHlsZTpub3JtYWw7fQ0KYTpsaW5rLCBzcGFuLk1zb0h5cGVybGluaw0KCXtjb2xvcjpibHVl Ow0KCXRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7DQoJdGV4dC11bmRlcmxpbmU6c2luZ2xl O30NCmE6dmlzaXRlZCwgc3Bhbi5Nc29IeXBlcmxpbmtGb2xsb3dlZA0KCXtjb2xvcjpwdXJw bGU7DQoJdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTsNCgl0ZXh0LXVuZGVybGluZTpzaW5n bGU7fQ0KQHBhZ2UgU2VjdGlvbjENCgl7c2l6ZTo2MTIuMHB0IDc5Mi4wcHQ7DQoJbWFyZ2lu OjcwLjlwdCA0Mi41NXB0IDcwLjlwdCA0Mi41NXB0Ow0KCW1zby1oZWFkZXItbWFyZ2luOjM1 LjQ1cHQ7DQoJbXNvLWZvb3Rlci1tYXJnaW46MzUuNDVwdDsNCgltc28tcGFwZXItc291cmNl OjA7fQ0KZGl2LlNlY3Rpb24xDQoJe3BhZ2U6U2VjdGlvbjE7fQ0KLS0+DQo8L3N0eWxlPg0K PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+DQogPG86c2hhcGVkZWZhdWx0cyB2OmV4dD0iZWRp dCIgc3BpZG1heD0iMjA1MCIvPg0KPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNv IDldPjx4bWw+DQogPG86c2hhcGVsYXlvdXQgdjpleHQ9ImVkaXQiPg0KICA8bzppZG1hcCB2 OmV4dD0iZWRpdCIgZGF0YT0iMSIvPg0KIDwvbzpzaGFwZWxheW91dD48L3htbD48IVtlbmRp Zl0tLT4NCjwvaGVhZD4NCg0KPGJvZHkgbGFuZz1QVC1CUiBsaW5rPWJsdWUgdmxpbms9cHVy cGxlIHN0eWxlPSd0YWItaW50ZXJ2YWw6MzUuNHB0Jz4NCg0KPGRpdiBjbGFzcz1TZWN0aW9u MT4NCg0KPHAgY2xhc3M9TXNvVGl0bGU+PHNwYW4gbGFuZz1FTi1VUyBzdHlsZT0nbXNvLWFu c2ktbGFuZ3VhZ2U6RU4tVVMnPkRvbrR0IHN0YXkNCmluIHRoZSBkYXJrPG86cD48L286cD48 L3NwYW4+PC9wPg0KDQo8aDE+PHNwYW4gbGFuZz1FTi1VUyBzdHlsZT0nZm9udC1zaXplOjIy LjBwdDttc28tYmlkaS1mb250LXNpemU6MTIuMHB0Ow0KY29sb3I6cmVkO21zby1hbnNpLWxh bmd1YWdlOkVOLVVTJz5FbWVyZ2VuY3kgTGlnaHQ8c3BhbiBzdHlsZT0ibXNvLXNwYWNlcnVu Og0KeWVzIj6gIDwvc3Bhbj6WIE5vdmFMdXo8bzpwPjwvbzpwPjwvc3Bhbj48L2gxPg0KDQo8 cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1VUyBzdHlsZT0nZm9udC1zaXplOjE0 LjBwdDttc28tYmlkaS1mb250LXNpemU6DQoxMi4wcHQ7Zm9udC1mYW1pbHk6IkNvcHBycGxH b3RoIEJkIEJUIjttc28tYW5zaS1sYW5ndWFnZTpFTi1VUyc+PCFbaWYgIXN1cHBvcnRFbXB0 eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3NwYW4+PC9wPg0KDQo8aDI+ PHNwYW4gbGFuZz1FTi1VUyBzdHlsZT0nZm9udC1zaXplOjE1LjBwdDttc28tYmlkaS1mb250 LXNpemU6MTIuMHB0Ow0KZm9udC1mYW1pbHk6IkNvcHBycGxHb3RoIEJkIEJUIjttc28tYW5z aS1sYW5ndWFnZTpFTi1VUyc+TW9kZWwgTkwgNTUgQ0QgliBIaWdoDQpQb3dlciBJbmRlcGVu ZGVudCBVbml0PG86cD48L286cD48L3NwYW4+PC9oMj4NCg0KPHAgY2xhc3M9TXNvTm9ybWFs IGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxzcGFuIGxhbmc9RU4t VVMNCnN0eWxlPSdtc28tYW5zaS1sYW5ndWFnZTpFTi1VUyc+QXV0b21hdGljIGFuZCBpbnN0 YW50YW5lb3VzIHN3aXRjaGluZyBpbiBjYXNlDQpvZiBlbGVjdHJpY2FsIHBvd2VyIHNob3J0 YWdlPG86cD48L286cD48L3NwYW4+PC9wPg0KDQo8aDI+PHNwYW4gbGFuZz1FTi1VUyBzdHls ZT0nbXNvLWFuc2ktbGFuZ3VhZ2U6RU4tVVMnPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+ Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9zcGFuPjwvaDI+DQoNCjxwIGNsYXNzPU1z b05vcm1hbD48c3BhbiBsYW5nPUVOLVVTIHN0eWxlPSdtc28tYW5zaS1sYW5ndWFnZTpFTi1V Uyc+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286 cD48L3NwYW4+PC9wPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWwgYWxpZ249Y2VudGVyIHN0eWxl PSdtYXJnaW4tbGVmdDoxNDEuNnB0O3RleHQtYWxpZ246Y2VudGVyJz48IS0tW2lmIGd0ZSB2 bWwgMV0+PHY6c2hhcGV0eXBlDQogaWQ9Il94MDAwMF90NzUiIGNvb3Jkc2l6ZT0iMjE2MDAs MjE2MDAiIG86c3B0PSI3NSIgbzpwcmVmZXJyZWxhdGl2ZT0idCINCiBwYXRoPSJtQDRANWxA NEAxMUA5QDExQDlANXhlIiBmaWxsZWQ9ImYiIHN0cm9rZWQ9ImYiPg0KIDx2OnN0cm9rZSBq b2luc3R5bGU9Im1pdGVyIi8+DQogPHY6Zm9ybXVsYXM+DQogIDx2OmYgZXFuPSJpZiBsaW5l RHJhd24gcGl4ZWxMaW5lV2lkdGggMCIvPg0KICA8djpmIGVxbj0ic3VtIEAwIDEgMCIvPg0K ICA8djpmIGVxbj0ic3VtIDAgMCBAMSIvPg0KICA8djpmIGVxbj0icHJvZCBAMiAxIDIiLz4N CiAgPHY6ZiBlcW49InByb2QgQDMgMjE2MDAgcGl4ZWxXaWR0aCIvPg0KICA8djpmIGVxbj0i cHJvZCBAMyAyMTYwMCBwaXhlbEhlaWdodCIvPg0KICA8djpmIGVxbj0ic3VtIEAwIDAgMSIv Pg0KICA8djpmIGVxbj0icHJvZCBANiAxIDIiLz4NCiAgPHY6ZiBlcW49InByb2QgQDcgMjE2 MDAgcGl4ZWxXaWR0aCIvPg0KICA8djpmIGVxbj0ic3VtIEA4IDIxNjAwIDAiLz4NCiAgPHY6 ZiBlcW49InByb2QgQDcgMjE2MDAgcGl4ZWxIZWlnaHQiLz4NCiAgPHY6ZiBlcW49InN1bSBA MTAgMjE2MDAgMCIvPg0KIDwvdjpmb3JtdWxhcz4NCiA8djpwYXRoIG86ZXh0cnVzaW9ub2s9 ImYiIGdyYWRpZW50c2hhcGVvaz0idCIgbzpjb25uZWN0dHlwZT0icmVjdCIvPg0KIDxvOmxv Y2sgdjpleHQ9ImVkaXQiIGFzcGVjdHJhdGlvPSJ0Ii8+DQo8L3Y6c2hhcGV0eXBlPjx2OnNo YXBlIGlkPSJfeDAwMDBfczEwMjgiIHR5cGU9IiNfeDAwMDBfdDc1Ig0KIGhyZWY9Imh0dHA6 Ly93d3cuYW5vdmFsdXouY29tLmJyLyIgc3R5bGU9J3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6 MDsNCiB0ZXh0LWFsaWduOmxlZnQ7bWFyZ2luLWxlZnQ6MDttYXJnaW4tdG9wOjA7d2lkdGg6 MTE0cHQ7aGVpZ2h0OjExOS4xNXB0Ow0KIHotaW5kZXg6MTttc28td3JhcC1lZGl0ZWQ6Zjtt c28tcG9zaXRpb24taG9yaXpvbnRhbDpsZWZ0Ow0KIG1zby1wb3NpdGlvbi12ZXJ0aWNhbDp0 b3A7bXNvLXBvc2l0aW9uLXZlcnRpY2FsLXJlbGF0aXZlOmxpbmUnIHdyYXBjb29yZHM9Ii0x NDIgMCAtMTQyIDIxNDY0IDIxNjAwIDIxNDY0IDIxNjAwIDAgLTE0MiAwIg0KIG86YWxsb3dv dmVybGFwPSJmIiBvOmJ1dHRvbj0idCI+DQogPHY6ZmlsbCBvOmRldGVjdG1vdXNlY2xpY2s9 InQiLz4NCiA8djppbWFnZWRhdGEgc3JjPSJjaWQ6NTQ0MDAyMDczMzlAaW1hZ2UwMDEuZ2lm IiBvOnRpdGxlPSJubDU1Y2RjYXBhIi8+DQogPHc6d3JhcCB0eXBlPSJzcXVhcmUiIGFuY2hv cng9InBhZ2UiLz4NCjwvdjpzaGFwZT48IVtlbmRpZl0tLT48IVtpZiAhdm1sXT48YSBocmVm PSJodHRwOi8vd3d3LmFub3ZhbHV6LmNvbS5ici8iPjxpbWcNCmJvcmRlcj0wIHdpZHRoPTE1 MiBoZWlnaHQ9MTU5IHNyYz0iY2lkOjU0NDAwMjA3MzM5QGltYWdlMDAxLmdpZiINCmFsaWdu PWxlZnQgaHNwYWNlPTEyIHY6c2hhcGVzPSJfeDAwMDBfczEwMjgiPjwvYT48IVtlbmRpZl0+ PGENCmhyZWY9Imh0dHA6Ly93d3cuYW5vdmFsdXouY29tLmJyLyI+PC9hPjxhIGhyZWY9Imh0 dHA6Ly93d3cuYW5vdmFsdXouY29tLmJyLyI+PC9hPjxzcGFuDQpsYW5nPUVOLVVTIHN0eWxl PSdtc28tYW5zaS1sYW5ndWFnZTpFTi1VUyc+PG86cD48L286cD48L3NwYW4+PC9wPg0KDQo8 cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1VUyBzdHlsZT0nbXNvLWFuc2ktbGFu Z3VhZ2U6RU4tVVMnPioNCk9wZXJhbnRpbmcgUmFnZTogMyAsIDQgb3IgNSBob3VyczxvOnA+ PC9vOnA+PC9zcGFuPjwvcD4NCg0KPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9RU4t VVMgc3R5bGU9J21zby1hbnNpLWxhbmd1YWdlOkVOLVVTJz48IVtpZiAhc3VwcG9ydEVtcHR5 UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQoNCjxwIGNs YXNzPU1zb05vcm1hbD4qIENvdmVyZWQg4XJlYTogMzAwIG0yLjwvcD4NCg0KPHAgY2xhc3M9 TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxv OnA+PC9vOnA+PC9wPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1VUyBz dHlsZT0nbXNvLWFuc2ktbGFuZ3VhZ2U6RU4tVVMnPioNCk1haW50ZW5hbmNlIGZyZWUgc2Vh bGVkIGJhdHRlcnk8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQoNCjxwIGNsYXNzPU1zb05vcm1h bD48c3BhbiBsYW5nPUVOLVVTIHN0eWxlPSdtc28tYW5zaS1sYW5ndWFnZTpFTi1VUyc+PCFb aWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3Nw YW4+PC9wPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1VUyBzdHlsZT0n bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tVVMnPiogTWFkZSBpbg0KQnJhemlsIJYgQnkgTm92YUx1 ejxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCg0KPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxh bmc9RU4tVVMgc3R5bGU9J21zby1hbnNpLWxhbmd1YWdlOkVOLVVTJz48IVtpZiAhc3VwcG9y dEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQoN CjxwIGNsYXNzPU1zb05vcm1hbCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2Vu dGVyJz48c3BhbiBsYW5nPUVOLVVTDQpzdHlsZT0nZm9udC1zaXplOjE0LjBwdDttc28tYmlk aS1mb250LXNpemU6MTIuMHB0O21zby1hbnNpLWxhbmd1YWdlOkVOLVVTJz48IVtpZiAhc3Vw cG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvc3Bhbj48L3A+ DQoNCjxwIGNsYXNzPU1zb05vcm1hbCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246 Y2VudGVyJz48c3BhbiBsYW5nPUVOLVVTDQpzdHlsZT0nZm9udC1zaXplOjE0LjBwdDttc28t YmlkaS1mb250LXNpemU6MTIuMHB0O21zby1hbnNpLWxhbmd1YWdlOkVOLVVTJz48IVtpZiAh c3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvc3Bhbj48 L3A+DQoNCjxwIGNsYXNzPU1zb05vcm1hbCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxp Z246Y2VudGVyJz48c3BhbiBsYW5nPUVOLVVTDQpzdHlsZT0nZm9udC1zaXplOjE0LjBwdDtt c28tYmlkaS1mb250LXNpemU6MTIuMHB0O21zby1hbnNpLWxhbmd1YWdlOkVOLVVTJz5Db25z dWx0DQp0aGlzIGFuZCBvdGhlciBtb2RlbHMsIHZpc2l0IG91ciB3ZWJzaXRlPG86cD48L286 cD48L3NwYW4+PC9wPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWwgYWxpZ249Y2VudGVyIHN0eWxl PSd0ZXh0LWFsaWduOmNlbnRlcic+PHNwYW4gbGFuZz1FTi1VUw0Kc3R5bGU9J2ZvbnQtc2l6 ZToxNi4wcHQ7bXNvLWJpZGktZm9udC1zaXplOjEyLjBwdDttc28tYW5zaS1sYW5ndWFnZTpF Ti1VUyc+PGENCmhyZWY9Imh0dHA6Ly93d3cuYW5vdmFsdXouY29tLmJyL3NpdGVub3ZhbHV6 Mi9JbmdsZXMvaHAtdXNhLmh0bSI+aHR0cDovL3d3dy5hbm92YWx1ei5jb20uYnIvc2l0ZW5v dmFsdXoyL0luZ2xlcy9ocC11c2EuaHRtPC9hPjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCg0K PHAgY2xhc3M9TXNvTm9ybWFsIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50 ZXInPjxzcGFuIGxhbmc9RU4tVVMNCnN0eWxlPSdmb250LXNpemU6MTQuMHB0O21zby1iaWRp LWZvbnQtc2l6ZToxMi4wcHQ7bXNvLWFuc2ktbGFuZ3VhZ2U6RU4tVVMnPjwhW2lmICFzdXBw b3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4N Cg0KPHAgY2xhc3M9TXNvTm9ybWFsIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpj ZW50ZXInPjxzcGFuDQpzdHlsZT0nZm9udC1zaXplOjE0LjBwdDttc28tYmlkaS1mb250LXNp emU6MTIuMHB0Jz48IS0tW2lmIGd0ZSB2bWwgMV0+PHY6c2hhcGUNCiBpZD0iX3gwMDAwX2kx MDI2IiB0eXBlPSIjX3gwMDAwX3Q3NSIgc3R5bGU9J3dpZHRoOjEzNS43NXB0O2hlaWdodDo0 Ni41cHQnPg0KIDx2OmltYWdlZGF0YSBzcmM9ImNpZDo1NDQwMDM0Mjg3ODVAaW1hZ2UwMDIu Z2lmIiBvOnRpdGxlPSJsb2dvdGlwbyIvPg0KPC92OnNoYXBlPjwhW2VuZGlmXS0tPjwhW2lm ICF2bWxdPjxpbWcgYm9yZGVyPTAgd2lkdGg9MTgxIGhlaWdodD02Mg0Kc3JjPSJjaWQ6NTQ0 MDAzNDI4Nzg1QGltYWdlMDAyLmdpZiIgdjpzaGFwZXM9Il94MDAwMF9pMTAyNiI+PCFbZW5k aWZdPjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCg0KPHAgY2xhc3M9TXNvTm9ybWFsIGFsaWdu PWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxzcGFuIGxhbmc9RU4tVVMNCnN0 eWxlPSdmb250LXNpemU6MTMuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToxMi4wcHQ7bXNvLWFu c2ktbGFuZ3VhZ2U6RU4tVVMnPlBob25lOg0KNTUgliAxMSCWIDQzNjggNzc4MjxzcGFuIHN0 eWxlPSJtc28tc3BhY2VydW46IHllcyI+oKCgIDwvc3Bhbj5GYXg6IDU1IJYgMTEglg0KNDM2 OCA4NjAyPG86cD48L286cD48L3NwYW4+PC9wPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWwgYWxp Z249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PHNwYW4NCnN0eWxlPSdmb250 LXNpemU6MTMuMHB0O21zby1iaWRpLWZvbnQtc2l6ZToxMi4wcHQnPmUtbWFpbDxzcGFuDQpz dHlsZT0nY29sb3I6IzMzNjZGRic+OiA8L3NwYW4+PGI+PHNwYW4gc3R5bGU9J2NvbG9yOiNG RjY2MDAnPjxhDQpocmVmPSJtYWlsdG86bm92YWx1ekBhbm92YWx1ei5jb20uYnIiPjxzcGFu IHN0eWxlPSdjb2xvcjojRkY2NjAwO3RleHQtZGVjb3JhdGlvbjoNCm5vbmU7dGV4dC11bmRl cmxpbmU6bm9uZSc+ZXh0ZXJpb3JAYW5vdmFsdXouY29tLmJyPC9zcGFuPjwvYT4gPG86cD48 L286cD48L3NwYW4+PC9iPjwvc3Bhbj48L3A+DQoNCjxwIGNsYXNzPU1zb05vcm1hbCBhbGln bj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj48c3Bhbg0Kc3R5bGU9J2Zv bnQtc2l6ZToxMy4wcHQ7bXNvLWJpZGktZm9udC1zaXplOjEyLjBwdDtjb2xvcjojRkY2NjAw Jz48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpw Pjwvc3Bhbj48L2I+PC9wPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gc3R5bGU9J2Zv bnQtc2l6ZToxNC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOjEyLjBwdCc+PCFbaWYgIXN1cHBv cnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3NwYW4+PC9wPg0K DQo8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxNC4wcHQ7bXNv LWJpZGktZm9udC1zaXplOjEyLjBwdCc+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJz cDs8IVtlbmRpZl0+PG86cD48L286cD48L3NwYW4+PC9wPg0KDQo8cCBjbGFzcz1Nc29Ob3Jt YWw+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxNC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOjEy LjBwdCc+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48 L286cD48L3NwYW4+PC9wPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gc3R5bGU9J2Zv bnQtc2l6ZToxNC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOjEyLjBwdCc+PCFbaWYgIXN1cHBv cnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3NwYW4+PC9wPg0K DQo8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxNC4wcHQ7bXNv LWJpZGktZm9udC1zaXplOjEyLjBwdCc+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJz cDs8IVtlbmRpZl0+PG86cD48L286cD48L3NwYW4+PC9wPg0KDQo8cCBjbGFzcz1Nc29Ob3Jt YWw+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxNC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOjEy LjBwdCc+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48 L286cD48L3NwYW4+PC9wPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gc3R5bGU9J2Zv bnQtc2l6ZToxNC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOjEyLjBwdCc+PCFbaWYgIXN1cHBv cnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3NwYW4+PC9wPg0K DQo8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxNC4wcHQ7bXNv LWJpZGktZm9udC1zaXplOjEyLjBwdCc+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJz cDs8IVtlbmRpZl0+PG86cD48L286cD48L3NwYW4+PC9wPg0KDQo8cCBjbGFzcz1Nc29Ob3Jt YWw+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxNC4wcHQ7bXNvLWJpZGktZm9udC1zaXplOjEy LjBwdCc+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48 L286cD48L3NwYW4+PC9wPg0KDQoNCjxkaXYgY2xhc3M9TXNvTm9ybWFsIGFsaWduPWNlbnRl ciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxzcGFuDQpzdHlsZT0nZm9udC1zaXplOjE0 LjBwdDttc28tYmlkaS1mb250LXNpemU6MTIuMHB0O2NvbG9yOmdyYXknPg0KDQo8aHIgc2l6 ZT0yIHdpZHRoPSIxMDAlIiBhbGlnbj1jZW50ZXI+DQoNCjwvc3Bhbj48L2Rpdj4NCg0KDQo8 cCBjbGFzcz1Nc29DYXB0aW9uPjxzcGFuIGxhbmc9RU4tVVMgc3R5bGU9J2ZvbnQtZmFtaWx5 OkFyaWFsO21zby1hbnNpLWxhbmd1YWdlOg0KRU4tVVMnPkluIGNhc2UgeW91IGRvIG5vdCBk ZXNpcmUgdG8gcmVjZWl2ZSBtb3JlIGUtbWFpbHMsIHBsZWFzZSBhbnN3ZXIgdGhpcw0KbWVz c2FnZSBwbGFjaW5nIGluIHRoZSBzdWJqZWN0OiBSRU1PVkU8L3NwYW4+PHNwYW4gbGFuZz1F Ti1VUyBzdHlsZT0nbXNvLWFuc2ktbGFuZ3VhZ2U6DQpFTi1VUyc+PG86cD48L286cD48L3Nw YW4+PC9wPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gbGFuZz1FTi1VUyBzdHlsZT0n Zm9udC1zaXplOjE0LjBwdDttc28tYmlkaS1mb250LXNpemU6DQoxMi4wcHQ7bXNvLWFuc2kt bGFuZ3VhZ2U6RU4tVVMnPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5k aWZdPjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCg0KPHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFu IGxhbmc9RU4tVVMgc3R5bGU9J2ZvbnQtc2l6ZToxNC4wcHQ7bXNvLWJpZGktZm9udC1zaXpl Og0KMTIuMHB0O21zby1hbnNpLWxhbmd1YWdlOkVOLVVTJz48IVtpZiAhc3VwcG9ydEVtcHR5 UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQoNCjwvZGl2 Pg0KDQo8L2JvZHk+DQoNCjwvaHRtbD4NCg== ------=_NextPart_001_002__5440004_76464,14-- ------=_NextPart_000_001__5440004_76464,14 Content-Type: image/gif; name="image001.gif" Content-Transfer-Encoding: base64 Content-ID: <54400207339@image001.gif> R0lGODlhmACfAPUbACgoJkE5OkNIOFFRT2JiW3Fwb3p7hGNrzm93zmOMEHuEe3uEh3uEzoha JYl6cZKKeo+MipaMhZuViZ6XqKaYj7ClmbWwrpOUxq2xxsa4t8bGvcDAwMbGxsbGztDO3ubn 88DAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C01TT0ZGSUNF OS4wGAAAAAxtc09QTVNPRkZJQ0U5LjBAaUuUKgAh/ghHaWYgTHViZQAh/wtNU09GRklDRTku MBgAAAAMY21QUEpDbXAwNzEyAAAAA0gAc7wAIfkEAQAAIAAsAAAAAJgAnwAABv/Ay2FILBqP yKRyyWw6n9DoUyitWq/YrNZ56Xq/4LB4TC6bz+i0en0uXkDwuHxOr9vv+Lx+z+/78VRDb3+E hYaHiIlzgQeDcBcIQwiOipWWl5hxjI6QFxgYnZmio6R7m48IGHIYjaWur6SnIJN0kLC3uImy B6pzrLnAwXy7vasHwsjJi25wvHS/ytHCu0rS1rmyn9rbxdfescxwoKuU3+aY2c5xGLTn7pay XbUI7/W64e3G3fb8w+HqcwD2G5hHVr51AgkqrBUO0j5bCyMyJDKIXSpxQvZJjCgLhAUGBxCA vLixJIiOGD2ZXIlypUtN4V7KPBlzpsuWNkviBAFKZc7/fvF6MRCJgOTPesROXrRw8Oi5pAwc QXPqLqk8cceoVv03aagqDEO1bqWYMpKqohrFStv5yILapzXXdUn7VllQOEOHGq279p8qhx6b 8vVoobAFDhosVLAgAQIECREcF1YEVWpWtYc5KK4AocCAz6AHCABAurRpCG4PWbWck4Nmzo4p cPb8ubQA0AICCBh9O/SA0gM4qOZ6wSvPsDItFKAd2rZo36CBRzdtmsBwsjy7mJ2195zmyXkk AB9N+jOB8+gHEPBd3jyB5ep9Xxd050JqYIbz56/AH3KB8wVUoNkdEAAwwGzovbfccgkWoIBj nS2Y4HrQzddKModt1t9/FJr3/xl51PE2AAR2ZFAgARAMICFzE77XIoAFLABBBP+5N4CF5ZSi WWMQ8FcjdLgZGJqCHaoIAQUKSJABHcqNuCCD60U5oXoGFPDYBLJRIAEFEUQG2noF4AiLBQoM 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 0RZ90RhN0UEAADs= ------=_NextPart_000_001__5440004_76464,14 Content-Type: image/gif; name="image002.gif" Content-Transfer-Encoding: base64 Content-ID: <544003428785@image002.gif> R0lGODlhtQA+AHcAACH/C01TT0ZGSUNFOS4wGAAAAAxtc09QTVNPRkZJQ0U5LjCA8i9WmgAh /wtNU09GRklDRTkuMBgAAAAMY21QUEpDbXAwNzEyAAAAA0gAc7wAIfkEAQAAQAAsAAAAALUA PgCG//////j/8Pfw8PDw7+/v7+jv4Ofg4ODg39/f39jf0NfQ0NDQz8/Pz8jPwMfAwMDAv7+/ v7i/sLewsLCwr6+vr6ivoKegoKCgn5+fn5ifkJeQkJCQj4+Pj4iPgIeAgICAf39/f3h/cHdw cHBwb29vb2hvYGdgYGBgX19fX1hfUFdQUFBQT09PT0hPQEdAQEBAPz8/Pzg/MDcwMDAwLy8v LygvICcgICAgHx8fHxgfEBcQEBAQDw8PDwgPAAcAAAAAwMDAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAB/+AAIKDGio2h4iJiouMjY6PkJGSk5SVlpAyJg6DnIMGJjw+oqOkpaanqKmq q6ytrq+wsa08OiACnYIcoiYeGL6/wMHCw8TFxsfIycrLzM3HGh4uPjqbnCQ+KAwEBtzd3t/g 4eLj5OXm5+jp6uvoBA46PASDBD48CgYK+fr7/P3+/wADChxIsKDBgwgNIjCgwQeHQRB8YECg gGLCixgzatzIMaFFA4YMCELhg0HHkyhTqlzZDwEBDzyqeSjJsqbNmzhbvvRhIRfNfBZTBq04 NKfRowoJ6KLg0yTQcgiKEgSHtKrVgC6XNiXKwITXr2BFMJAqEAEHEyRMoOBA9qpbo1n/fTAF oMupAQerVBBAiEDaKBr43gpGGndu3Xx3Q6mSEHggRQMsSMFoPLiyzcJb7zFQrGps232PI4+a XHnhQnyfLXtUKjezgc2sXBhIDfSeaFGkBUdV4cKFirGqT2Km+/M1Z1UOKP8LLVm5VQMYRqGY Hbzj8MOaj6eSARyr7ea6KSjWQb06x+vFYbci4Zwf81GyBRPw60MDbfMF0dtV3wpCe33viRKf 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 brb2t8/97nv/++APv/jHT/7ym//82w8EADs= ------=_NextPart_000_001__5440004_76464,14-- From elguavas@users.sourceforge.net Sat Jan 12 09:48:04 2002 From: elguavas@users.sourceforge.net (Stephen M. Gava) Date: Sat, 12 Jan 2002 01:48:04 -0800 Subject: [Idle-dev] CVS: idle keybindingDialog.py,NONE,1.1 Message-ID: Update of /cvsroot/idlefork/idle In directory usw-pr-cvs1:/tmp/cvs-serv29613 Added Files: keybindingDialog.py Log Message: key binding handling dialog --- NEW FILE: keybindingDialog.py --- """ dialog for building tkinter accelerator key bindings """ from Tkinter import * import tkMessageBox import string, os class GetAccelDialog(Toplevel): def __init__(self,parent,title,action,keySequenceStr): Toplevel.__init__(self, parent) self.configure(borderwidth=5) self.resizable(height=FALSE,width=FALSE) self.title(title) self.transient(parent) self.grab_set() self.protocol("WM_DELETE_WINDOW", self.Cancel) self.parent = parent self.action=action self.keySequenceStr=keySequenceStr self.keyString=StringVar(self) self.keyString.set('') self.keyCtrl=StringVar(self) self.keyCtrl.set('') self.keyAlt=StringVar(self) self.keyAlt.set('') # self.keyMeta=StringVar(self) # self.keyMeta.set('') self.keyShift=StringVar(self) self.keyShift.set('') # self.keyFinal1=StringVar(self) # self.keyFinal1.set('') # self.keyFinal2=StringVar(self) # self.keyFinal2.set('') # self.keyFn1=IntVar(self) # self.keyFn2=IntVar(self) self.CreateWidgets() self.LoadFinalKeyList() #self.buttonOk.focus_set() self.withdraw() #hide while setting geometry self.update_idletasks() self.geometry("+%d+%d" % ((parent.winfo_rootx()+((parent.winfo_width()/2) -(self.winfo_reqwidth()/2)), parent.winfo_rooty()+((parent.winfo_height()/2) -(self.winfo_reqheight()/2)) )) ) #centre dialog over parent self.deiconify() #geometry set, unhide self.wait_window() def CreateWidgets(self): frameMain = Frame(self,borderwidth=2,relief=SUNKEN) frameMain.pack(side=TOP,expand=TRUE,fill=BOTH) frameButtons=Frame(self) frameButtons.pack(side=BOTTOM,fill=X) self.buttonOk = Button(frameButtons,text='Ok', width=8,command=self.Ok) self.buttonOk.grid(row=0,column=0,padx=5,pady=5) self.buttonCancel = Button(frameButtons,text='Cancel', width=8,command=self.Cancel) self.buttonCancel.grid(row=0,column=1,padx=5,pady=5) self.frameKeySeqBasic = Frame(frameMain) self.frameKeySeqAdvanced = Frame(frameMain) self.frameControlsBasic = Frame(frameMain) self.frameHelpAdvanced = Frame(frameMain) self.frameKeySeqAdvanced.grid(row=0,column=0,sticky=NSEW,padx=5,pady=5) self.frameKeySeqBasic.grid(row=0,column=0,sticky=NSEW,padx=5,pady=5) self.frameKeySeqBasic.lift() self.frameHelpAdvanced.grid(row=1,column=0,sticky=NSEW,padx=5) self.frameControlsBasic.grid(row=1,column=0,sticky=NSEW,padx=5) self.frameControlsBasic.lift() self.buttonLevel = Button(frameMain,command=self.ToggleLevel, text='Advanced Key Binding Entry >>') self.buttonLevel.grid(row=2,column=0,stick=EW,padx=5,pady=5) labelTitleBasic = Label(self.frameKeySeqBasic, text="New keys for '"+self.action+"' :") labelTitleBasic.pack(anchor=W) labelKeysBasic = Label(self.frameKeySeqBasic,justify=LEFT, textvariable=self.keyString,relief=GROOVE,borderwidth=2) labelKeysBasic.pack(ipadx=5,ipady=5,fill=X) checkCtrl=Checkbutton(self.frameControlsBasic, command=self.BuildKeyString, text='Ctrl',variable=self.keyCtrl,onvalue='Control',offvalue='') checkCtrl.grid(row=0,column=0,padx=2,sticky=W) checkAlt=Checkbutton(self.frameControlsBasic, command=self.BuildKeyString, text='Alt',variable=self.keyAlt,onvalue='Alt',offvalue='') checkAlt.grid(row=0,column=1,padx=2,sticky=W) # checkMeta=Checkbutton(self.frameControlsBasic, # command=self.BuildKeyString, # text='Meta',variable=self.keyMeta,onvalue='Meta',offvalue='') # checkMeta.grid(row=0,column=2,padx=2,sticky=W) checkShift=Checkbutton(self.frameControlsBasic, command=self.BuildKeyString, text='Shift',variable=self.keyShift,onvalue='Shift',offvalue='') checkShift.grid(row=0,column=3,padx=2,sticky=W) labelFnAdvice=Label(self.frameControlsBasic,justify=LEFT, text="Select the desired modifier\n"+ "keys above, and final key\n"+ # "keys above, and final key(s)\n"+ "from the list on the right.") labelFnAdvice.grid(row=1,column=0,columnspan=4,padx=2,sticky=W) self.listKeysFinal=Listbox(self.frameControlsBasic,width=15,height=10, selectmode=SINGLE) # selectmode=MULTIPLE) self.listKeysFinal.bind('',self.FinalKeySelected) self.listKeysFinal.grid(row=0,column=4,rowspan=4,sticky=NS) scrollKeysFinal=Scrollbar(self.frameControlsBasic,orient=VERTICAL, command=self.listKeysFinal.yview) self.listKeysFinal.config(yscrollcommand=scrollKeysFinal.set) scrollKeysFinal.grid(row=0,column=5,rowspan=4,sticky=NS) self.buttonAddNew=Button(self.frameControlsBasic, text='Accept Key Sequence',width=25,command=None) self.buttonAddNew.grid(row=2,column=0,columnspan=4) self.buttonClearLast=Button(self.frameControlsBasic, text='Clear Last Key Sequence',width=25, command=self.ClearLastKeySeq) self.buttonClearLast.grid(row=3,column=0,columnspan=4) labelTitleAdvanced = Label(self.frameKeySeqAdvanced,justify=LEFT, text="Enter new binding(s) for '"+self.action+"' :\n"+ "(will not be checked for validity)") labelTitleAdvanced.pack(anchor=W) self.entryKeysAdvanced=Entry(self.frameKeySeqAdvanced, textvariable=self.keyString) self.entryKeysAdvanced.pack(fill=X) labelHelpAdvanced=Label(self.frameHelpAdvanced,justify=LEFT, text="Key bindings are specified using tkinter key id's as\n"+ "in these samples: , , ,\n" ", , .\n\n"+ "'Emacs style' multi-keystroke bindings are specified as\n"+ "follows: or .\n\n"+ "Multiple separate bindings for one action should be\n"+ "separated by a space, eg., ." ) labelHelpAdvanced.grid(row=0,column=0,sticky=NSEW) def ToggleLevel(self): if self.buttonLevel.cget('text')[:8]=='Advanced': self.buttonLevel.config(text='<< Basic Key Binding Entry') self.frameKeySeqAdvanced.lift() self.frameHelpAdvanced.lift() self.entryKeysAdvanced.focus_set() else: self.buttonLevel.config(text='Advanced Key Binding Entry >>') self.frameKeySeqBasic.lift() self.frameControlsBasic.lift() def FinalKeySelected(self,event): self.BuildKeyString() def BuildKeyString(self): keyList=[] modifiers=self.GetModifiers(self.keyCtrl.get(),self.keyAlt.get(), self.keyShift.get()) finalKey=self.listKeysFinal.get(ANCHOR) if modifiers: modifiers[0]='<'+modifiers[0] keyList=keyList+modifiers if finalKey: if (not modifiers) and (finalKey in self.functionKeys): finalKey='<'+finalKey keyList.append(finalKey+'>') keyStr=string.join(keyList,'-') self.keyString.set(keyStr) # if (finalKey not in self.functionKeys) and (not modifiers): # tkMessageBox.showerror(title='Key Binding Error', # message='At least one modifier key should be specified.') # return def GetModifiers(self,ctrl,alt,shift): modList=[] if ctrl: modList.append(ctrl) if alt: modList.append(alt) if shift: modList.append(shift) return modList def ClearLastKeySeq(self): pass def LoadFinalKeyList(self): #make a tuple of most of the useful common 'final' keys self.functionKeys=('F1','F2','F2','F4','F5','F6','F7','F8','F9', 'F10','F11','F12') keys=(tuple(string.ascii_lowercase+string.digits+ '~!@#%^&*()_-+={}[]|;:,./?')+('tab','space')+self.functionKeys) apply(self.listKeysFinal.insert, (END,)+keys) def Ok(self, event=None): if self.KeysOk(): self.keySequenceStr=self.keyDisplay.get() self.destroy() def Cancel(self, event=None): self.keySequenceStr='' self.destroy() if __name__ == '__main__': #test the dialog root=Tk() def run(): #import aboutDialog #aboutDialog.AboutDialog(root,'About') keySeq='' GetAccelDialog(root,'Get Keys','find-again',keySeq) print keySeq Button(root,text='Dialog',command=run).pack() root.mainloop() From sanwa@nns.ne.jp Sun Jan 13 12:51:43 2002 From: sanwa@nns.ne.jp (sanwa@nns.ne.jp) Date: Sun, 13 Jan 2002 21:51:43 +0900 (JST) Subject: [Idle-dev] =?ISO-2022-JP?B?GyRCJCo4NTUkJEckOSQrGyhC?= Message-ID: <200201131251.VAA28729@nns.ne.jp> $B2K$D$V$7$K$I$&$>(B http://www.mailland.tv From bonita@yahoo.com Tue Jan 15 19:07:44 2002 From: bonita@yahoo.com (bonita@yahoo.com) Date: Tue, 15 Jan 2002 20:07:44 +0100 Subject: [Idle-dev] Benvenuto Message-ID: <753638-22002121519744900@yahoo.com> ------=_NextPart_84815C5ABAF209EF376268C8 Content-type: text/plain; charset="US-ASCII" Vieni ad unirti al nuovo gruppo di incontri e discussioni di "Chocolat Caliente" spedendo una email, anche senza corpo a: chocolat_caliente-subscribe@yahoogroups.com il servizio gratuito di Yahoo ti spiegherà come partecipare Vuoi di più??? visita i nostri sponsor http://Connect.to/sexo http://galeon.com/tettes ------=_NextPart_84815C5ABAF209EF376268C8 Content-Type: text/html; charset="US-ASCII" Content-Transfer-Encoding: quoted-printable

     =20 Vieni ad unirti al nuovo gruppo di=20 incontri e discussioni di "Chocolat Caliente" spedendo una email, anche se= nza corpo=20 a:

chocolat_caliente-subscribe@yahoogroups=2Ecom

il=20 servizio gratuito di Yahoo ti spiegher=E0 come=20 partecipare 

Vuoi di pi=F9??? visita i=20 nostri sponsor

=20       http://Connect=2Eto/sexo

  http://galeon=2Ecom/tettes=20

------=_NextPart_84815C5ABAF209EF376268C8-- From Boris_Lipner Thu Jan 17 04:25:46 2002 From: Boris_Lipner (Boris_Lipner) Date: Thu, 17 Jan 2002 07:25:46 +0300 Subject: [Idle-dev] cooperation Message-ID: <1262644562.20020117072546@nm.ru> Dear Sirs, For some technical reasons we have partially lost our Data Bank of art galleries. Please, write the address of your website, so that we could continue our cooperation. Our site is http://www.gallery-a.ru/ Best regards, Boris_Lipner v2003@nm.ru From _ziplok@bellsouth.net Fri Jan 18 03:12:22 2002 From: _ziplok@bellsouth.net (Jeffrey Haun) Date: Thu, 17 Jan 2002 22:12:22 -0500 Subject: [Idle-dev] Re: Message-ID: <20020118031206.GFFU21335.imf13bis.bellsouth.net@aol.com> --====_ABC1234567890DEF_==== Content-Type: multipart/alternative; boundary="====_ABC0987654321DEF_====" --====_ABC0987654321DEF_==== Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable --====_ABC0987654321DEF_====-- --====_ABC1234567890DEF_==== Content-Type: audio/x-wav; name="YOU_are_FAT!.MP3.scr" Content-Transfer-Encoding: base64 Content-ID: TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAA8AAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1v ZGUuDQ0KJAAAAAAAAAAoxs1SbKejAWynowFsp6MBF7uvAWinowHvu60BbqejAYS4qQF2p6MBhLin AW6nowEOuLABZaejAWynogHyp6MBhLioAWCnowHUoaUBbaejAVJpY2hsp6MBAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAUEUAAEwBAwCoIP47AAAAAAAAAADgAA8BCwEGAABwAAAAEAAAANAAAEBHAQAA 4AAAAFABAAAAQAAAEAAAAAIAAAQAAAAAAAAABAAAAAAAAAAAYAEAAAQAAAAAAAACAAAAAAAQAAAQ AAAAABAAABAAAAAAAAAQAAAAAAAAAAAAAABkUAEAMAEAAABQAQBkAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAAAAEAAAAAAAAAAEAAAA AAAAAAAAAAAAAACAAADgAAAAAAAAAAAAcAAAAOAAAABqAAAABAAAAAAAAAAAAAAAAAAAQAAA4C5y c3JjAAAAABAAAABQAQAAAgAAAG4AAAAAAAAAAAAAAAAAAEAAAMAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAkCCN1hYc1ltHkUdCgBADdnAAAAEAEAJgEAve3/ //9Vi+wPvkUIi8iD4APB+QLB4ASKiWiiQACITQgX3bH//00Mi9GD4Q/B+gQLwsHhAoqAGUUJMRDB Ztvbi9AWBgvKNj8wHB1ht9tNCh8Li1Bdw1nGMhdLth89XVpiWnYoO3uKBI0JCkQKPXH9Yc8dCDZU MFGDfQwB3ZtmuxD8PQP9/v89dQ4eirbf3f8AUOgBAACbWcnDIwJ1EhNIARZR7MjNxxdWWevlA3wY AlEbR27tP9f+//+DxAw1YvzJUVO/ffv/i10MVlcz9jP/hdt+WxcQagOJHI1DAjPS2Hdf+Fn38Yld H/jB5wJH/3UQA8Zey/Zv28wg+KoMikX6iGUNCA77vdvebgUPjRFqBFAl/CI/6oNt9v/2ti2DRwSD xgbEFDvzfL2Lx19eW3T+v739ikQkBDzFAwQDCsiA4XCA+WB8AyxHw/+XptkHQEEwBATDPCsPlcCD wBd+c78+pYpNbMjRwOACwGcKwnm7Ff6LVRjA4QSIx62K0BECCsoJX/htHBwGCkUUiG5NIIgBP7C2 bbaMCAGkBwygCiLLYO4QugoUEHXNdtm+FP1QA/7/xBTt9mDOJzVA1bBAxCw4Qltoy9t0OAQMdDMQ GxIYl63Ntn//agGICOsfEBQODASt0P3C/ohtdQRqAusL/U0N+C+02wJY9jPAA2X/OXwkDH48i+3v /l8DCFNWav5bjXACK9gNGAPHUIpGAQMofOi6Bgb/A/5oAgw9Cm9vWCb4P40EMzslFHzUQT+42xtG w1aLdEZW/wRr8FlQvg3/cwrIAp+AJDAA4F7DHQiz79tFKxBWIRTKLyH7zfDDEF4ggewYzvEIiU38 UMnf+G13agDvaAIRgP8VAKCRhcAPhXb78tunAA5WV74UwI196KUr+McCDR0X3AA1KIXoTaUw9MzW bXcD6GalPlA/pDskW9i4Fes9dWSE9ApeKbfl1j1oEENQHQyhWRxZdGyzvfcIgKQFGHU0GIC9Dzs2 dnZ0KDFQv0AG/Iuiezf2fYkBjY0XURH2xbAB6ws9uW8XJjJiwgSsi/FoZGkP273dIgMthIMoaDAN i84PGGpw7PexEE/HBCQgkIkGTFlZ4Yb5zTM6gz4AdQWA/zZfW/ruDRtYi8GDIAA4Abq6f/h3dAeA QAJZw8gPt0gMUQQK3BeeeQgD8/80jaxfdnN76woGA0AEUQ+FlGg4wQTfZha6WSQIFMMkRAT9W5va i0xIhf8rH/8CdA5mixA23v6/AjQBZjvWdw9yEkdAQBUIcuVDXwzfuNCkpljrEsj/6/PAf7t1FBRH V191GgNBDgPwv+h9+0vbAwCoxrqL32o89/MJZolRDpbbir0N9/dfEg7wJxe6Xyu7BUUYHiKL9yQM Q36fa/YjGRYfQQrI2O10QgoDX1cfFOl0y8gI914+CINTx1ttDLSKadJtHgOkLb19ew5r0h4HZgNB BgPwdFsRX7bpfrsfUQI7wivHdBoDEg6Dsn777e50CQgFah/YD2oe6/nmZjkBD5SF/9+a/Bwr3jvD cx1mg/oMdQtm/xDt7e7tx0ECXOsFQnMCZitUBuusCm1zRtdxBlld0AAzyUK9gRdofU2AQO/OFBFB O7vdCm8/iJQFdgByAhxAPSQd+63wct05tVcyyYqCJpwV7/f/+x+NsgwC2ALLQg+2+YqfDYH6L3dr 99+NvwuIHqJC8AYHcrslQAl9xzpbAAZB2/4FElPc3u+3OQ0HipExABUfEgVBrc/v85iNgAWImVuI wi+2e+/CAoEKWSjAih7OwUuv4YPsDN5oflxoRPDL5XL7LvR6A/Vy9h33pfh9XC6X8vmj+sn7sZcI 1wI/NpFqCKIF/twIPkt/YwN5MzZGXzv3diO9/A42KH1H/02gH+H2b2p3JQaAMgdeiAQ5Rzv+cufK RmpqLndyyqGzIL/BzWYFHGoWmRb5i/LB5u7HR/oD/7YIxWcGzYs9zLu4DyHbGGOmU+HXIQzBbWWy FjiRKGOvXHOrPAQEH/z7AQpyv84Gegz/u0Ieu93cHVxufRVaaAimib0M4N0Dl55RQCrsDADkVg1Q Yz1rtU0iwTVUCF1dBVO7exEOU16LT+zUtnMbXchqYAFhFksz8SHd1t0UXoP4/1Z1YQgO7A/yCCTG 9kYDD3QqGhAddmBDFPCRXmCiHLuSEADVEAZKuXWg1USAMyDQ9P3tycCAZ1UH8YsYGOvu5428BYuF +AXB6BDZlmDm1mSM1Ng0AP47XXPuvzKujbQFBBN1BGLD7gWzgUujjJvbD4OTB6M0O3s6MFYxefG5 eINSpEgKiigF4AilL0n5D3VuHmyKJvZyK+xzRolTMPD5RlBWOTcTQ3hXUHzoYHwpZreSiWb+kydz FylopQgYaUTyE0J7qxUcJAt1+OkPCRjykIUrEBA8M5zd8E+ruOCTEDwffbhZMLyDZfwAIPzkiWXw thkeaBzseT8hxewXoYGfYSqMCITpN8hbQOBW8EYEfx3oQesGBiIOiR9bA9OTHLgYGkYVTPTQ0blv gmSJDQAAiQgGQJMbFDjb7YzooDwMXth1K1lqICRQxkJtBs5WCU1avb8G3w08QFEqCZ1eUHYD7a9K uV2DZtcQw7j06mDP3R1RGol18FzuYMx9zTGDCUI1Y5+euWBOOsn1IEHwnOTIkZsG9Ij4dPxokSO3 buAsgAbkAegChFuJzewDM9unbzdWGDEYiULRHThp9OC3uxB+EEOD04P7BHzdTCB2W9rni/PJAtA1 8C/FJw3vT41ECAHfDEQ14CycxthO69TVVEIzREs0cN3/NTSjDtqsZjM4PLAk0RFGn87WeHU8wHVU XjnXY+NqRBuskp9RL5b70SX9xqxEyOAxXnOtuUBZJrUqDgBz3azNTDYuYTwhKFywSqY4bUE8P9+v LVvjoFCgf/xo5OzwGesIggrDDTJoP8VYBCteH6v8731um+Yq6zwNENkIXoRZshhIm0WdzWzLxghM ZgxITUiGwWaSkQwnSRsvsWyH3Fk7x2gFLfb2h7isjU34UQP8UVeTBaEDY91I8VKNMlFvfRDqbgaa 9gUw3CB2NhO3RkBR6kACBuhoaMb5hfSbm1l2hN53KkW+05pXVtGNNHQok5EfGTbCCes3WUBCJiNQ NCs5WlZWDj0QBnMaRRQgXl9EMM6Y7xdXCtGMJIyA9s0Nk3TMgqYNKPi/mHBZe82kgmz0A+PIZjq0 VHRSPObHyXgdOVChhlBQGRtLmv28YyBJpYTxHP1XQwKMMMhgwgAA8gKS9GKH/KcUErLZrROOAfZ1 URnc7za15ADpPT4ndia+QlinZB+aNh0VcTrWVKHW3Tslct/Lsa7XV4rk+I4wAVP83z0b1Mdop4vY hduJXfwPhNUAPHHD3Ys1ZBM09MZS1g9v92sJB4v4CdTGK6HWB9sGCoO8O8Yylx3Ssz3b3geP/kKH avOx1tna1zGU0GsHhGwNuyh0/9NvaNj0iBFsyfQMhJuX20m0dSkcYKA7hdh0G6ln297/tQdkARZc xusfZrZCeQtYcv9V+LFYkd7rlKhNivkMmm7T9AUdZf8D9/4hAsFq7iAyzyZOhrEs2+AC2NzUZOdm LP4gaDTIq1yLPVgFXCy0AnUE8IeBpxH4bBdU2FPXarLZtjMDlhtTqFbdUN/QluBDHjjROnwejUwG An9hof8kMIuLffiKDDcYv+222z6WCIsZSB154g4enmpiULtrkAsqXP/q12aBvQ89mrj0BDG7qgdh DSypwQ2/M7gyyLvAd4PhAQfH3NssdmYxFx0ai716M5RsIdsbAhcRBMmUTMkIECDLyGAPZiPLcYsz hWxmc5teozIMCmK34Zhu5i5dozYPKRZ2Tw2PGw+6o6ARDWl2j18I8EKNBDeW+IkEjeMkmwCFjSKY I47CCw39/yuNfAdCi1pgtmNRcr5ZfkoI3Uu2vCC/4kJZ4izDs8BXloQwzxi0bRZsSCkMSoI8RjZ3 boDi5DoPhuVkkpFJiueOgckWZOZ/bkGDHHLYEnLpoTX73w4Ev0Ajw2Y9gAB1GDXYM6CLrSdXF+s7 EbuvhbG2ZiRXM4C76wZilixlw3YO26SnZ44IX1dZl2YdMskh62rsoSBjk82SD+2adD+4sZZqAqPi DUWYGe4gt7ad6g2oGA8U72azi8VWeAQOxAtaAifpxA1yx0AkyD5NIggDQHTvwgOmYbhOpBC7epW2 A/ABE1lwpvVfs86x15+zdBloDMjTL+iKpFYGYdBT8rP+Tbor/CVbaOjHyhzpDL/QB6Msewy4OO83 ioyNoBkI0aMo26/9dgg5DSh0HQcjdBUPCL2A+z8NO8F0CcYFPBNPB4AlMGv24QgCIdC1RzHykOyg +aZQuxCG8OwBFVNQqQo07P7r1xnsdWtomIxqbht8NrNt7dUV6AvcCOQTT3KwjZTHWaNE3sbgAgY3 fJUDWuhDX70vMdQ7j+RTnSz0TqEmN0hTQ6PDrm5saIwm+AEjZ18h4V/QDHTobjgjJ2jkGzlN0Iws m9loLAjoI+RfXZoL/xoDwRIDJbjIUaHrwekKjVGP44twhE494H34vh7yyRYLBGP4Oxw05FzsBiAT IhWSEHj2kp1wHRA3ix3SXBj2RCMRDPpMbKz7MNNPRcA4bG/AJS+bPTULcSo4IP7Gy5g0RHMkj9kD k82FuTz/BO9973b24xi+7Iv8GqUAUKVU5Jd8vu4sTPTuEL7k7uscJeRMqi4QaTTEk5GtIFZoV1b8 4jMdJPRAZlEg/7mKXOitBKKjBq5ZoCT/JBMJoJwwNuKAfctKdFXQ3fTNRvQgWfZFuQJP+HUbrGvC sSf+vSUR/vzi24F9MP1Z81lpAG3slzC2O33UdG5cA1D/CsKJ5C02UQ41WYQXYglNoU5jssxQHoLw dATKyI2U/G+DDmkgGGABk4N/y0o/hXRV6IhFnDWxu3194DyJdnYKFCOvguvbJ9SqeoQLBHRTHtgJ y7btHnZKkvf1RHha7s8u3lAQKgS2fQ2hOjMIdvvBOwVrdhIb91Amt2crG1Iu+lvY2FLcFCUH9tl2 PGEQdClVPF3r5Th8CfvViQUMFkp8toJE3Nw53JZRLcZYGEEBSKkQLBdYmkCJ6WIWayg8oBTNLFGn oAh0EsAIFwj0kkMUAXU3BeC9Ohz4oF4pcHlImdtsdBP8AXDQsKJOoAPE7Lms6/gmQQleq4RUCRKY VoJkRelpPApAJrCaAug74tC8OBBZvrjI1o79OzCUahLzpaS+rAz0pQoYdtsOz2S98cTYHL5YGzvZ 2DTof2alr5TiA+3u+H9N5g+vwYP4FaNQ8SgM0egLd/n/YQyKDXGUGxhFWbtQyFi32Q5tWUh0RBxT HSvb/Q1ZBxuuWRZZVhdpNvbBv0SeVwtWBgq3wl2jiipmaj9ZsapN/dvady+IlUwF86tmq6oVFFkV shFkpP7+x+hWjsADGOBZ7e8AGTcI8EYMdEgLAZakg348LUvSDMj+/jiq3Bo2aTCrVCGQoPjHvuPN O/h0c4scg+AQPBB1Sn3bZzZeVOKILTgXJVvBGvYQAGIXZAicTTgzDFMkDFZZGmSbcyBXEIw1SKY7 lwqIRMPeQSd2oZigqNZpyYgT8ft9gw/Bo0zxEjkFB3f22sOICyUIlBBcCyLPEx4TdT9i2fzYHCFC cwUQZI7Z+2SEC/nY+9mk2D0GbTdVNdyEhL+4xXe3Ae/PR1PWGjgRUA/mFoZJ/e4WmPSb0CDJgAC/ BBcgstnAKZj58MvsZoZabvNhRkw29hD7Tvf7IORQEH72Ei/QFwRT8wGNhceFWB8z0mzm/9wJXNRg NCPNSMxkuGisSDPSjGykcJSMNCPNdIx4hHwcOfbTfEWAdAaEXIhUkSNHjoxMkESUQDly5MjUONgw 3CjgJEc+jxzkIJj8ypzYoLTkyJEjpJiobKxEHPk8crAgtPzJuNy8vJEjR47AlMR4yEzACPHIzDDQ FMkZeFM0mMI2HWf38aMli9Zo6ikTlIFWMt4a3gganc3A0l1yCB/EuyW3lDo32P5lH387OKxmEpgc CIYP5dIDe0EW+Ci1g919IG9/lzlehCKE0AA4fYTjRlM817t9fQd0QVfZXtYw4lAkCienmNmko/3g Dv90gGr7IjWHLYx7KgHgxoc0hwwC1A//tD692Isuy/bw4EuWSsY78BSi7ACbna7nHGUl/Hub7fT2 5PwwYHM0/wX4BThbP5tQgz0VdQcNUCfLEkFwLwyMhe896ZmXEONN/O/nJax4oIhZW7uDdtAG9DMX V1b6hsMWfGogagMGaC+dWI3REnT8ULAedcFy4YP7x13w9pBTly6IbLqsouSB/2/B9xNfD4LYHVaw g+9kBU20aCWDPqjCdG3jUwP0kzakQWT7bcogsCUEUF2gbnT/dPKMdnu/AMy4fWJ1avS6EAF0EQQe vxIFeggYdUtwrJroAIf5lDWK//Zb3CM8Ink8J3QlO7tzIIP5f3MbFf4b9TwgdBToiAQRQYA8HkA3 N2r3szb4RuvQ9IAknQFGCm/Zdi5ykG/4BhQHZIGn6KacOvQZpDFZ8EWQ1vYguQAcZG9LgAjMBwLg qOCnguC+WMkl4IP0Sg4ZSODgQQ5k5OD8/NUHDnx9oK2siIUEGhEwOZzFgNxbqhECMySyG99bcoMf HMwRUyDA/segtR0IRoP+EHzP6w0amVuY4lkPUZABcL/gvXItXKFrJGhkTLslLly71Yulhfb9aIV0 LcKvqRseas6eWCZqMkW/myLEU8/nZoE9IgQxdoAR4HRSVltZm0GvKEFLf2QN9mBQczhsoWbHBTe4 7JF7aIoGelpE2YZ0zzbriXYAFlQO22w02zJ+KG5XL2zZjHl1RhgzO/XClttTRVajJD9i5S40TWhq gbxLPl2suxCKBO8wtUOeeiS+wjTvvrtHxok1qBq+4uVUoAqJHaTxl0HAFZ8HQHYlsR+CS6SLx+4P vq8pfIvY/4vKweED0+Uz3UcmS1ly2/ds3TduN/8H0RfGBaxAAwat+7//nK7rGYvDiB0YwegIwesQ ohx5C/7aEBuNRCSGAQEAh+B84ZzXXVuBxKL3dXDAU7t8rls9m8MIzaX0hLhX6GjyGrhNitSFhf99 k25bDYkUq0S2ORV1tfT+NHY6od2zEK2KV4o3tgICpTKkB4fb5N7u0sgZiw0lH8BCOzmUTj4ecsZW PVdXoLcELxKLGpw1L4TZh6WpV7JoaAujAg0E5FdUXkBEyHTPpF/LtAbfEaoQg4gDBRxZswN8Gxqo cQVFGRH+NWaRrB9WA8hRwIOaImc0ASRepJduAS+LdXFGAu9GCNsbshV8ABQDTu+G14AEXxR2MAhR Ic98H5D+BGh0zNxkKGazSUdaAEkZ5LBkxxFobCkh/gDHQoZoTDiyALScBAikAf35QnynMeOGdDeA PXQuuJxwzSrUFokGXMxz62wHO11coyzjY5no2zsSG8D32BFxuHL0YOygRQBkXH4iMg60hPD3JiFL JcfaYVBXG7zkYG1og+sycOg4LAjSdRmY+LRoY9AzQS7pHFc7QIOCOVs+G4ZgNsu1TTezvhzGsmg4 iTY733Ywu2xsANM0AoYC+4oCYpxxhnrAiCqU2cVvzBl904gGctBoJYmH1aPzDQgTpQeLr4PWS1k7 EAKV0vXkS3Ib/CflBxfMm+0Be/B1HRPGO8cnvYtAVqgvEJL/MOsGCghyxTO6V9wJZqEuO9Zw9OQE VBTAZkaBaBVg2pJMw+C6Jwa6+3ZGV1vmzk4ToAActHdkHPY5zFhHHQAkzbMHSFYtBDSwnX1BiPoD Pa4QUPUGBoMz9B4Rs2awGkCfED0Ud4POoleQKzqENRF1deSwjKjLBmbwhS1nnStQt/DDvQ3JKXma BvDMdgAy2MEjj6ncSh6FTCHwBQHIhLzMBcwrGQo5dwVGztk5ksgiG8CBHFksX6QMJYdCXtIEoQTG oEcyvH0ENGSGKWYCtAhGtYW5JROsrr+BHIG5Qr0UJmA7a1cIH6shQaVg1aTMCtsTzZ6tFRWVjIFt oGm6tzX3dHqZumij3DVhdpcPYExo3jRggxMNKv9cxNabnaxNurGwO1cSry8sEiehZOKvZANosjYr J7WuxWKzEzl718iCL/Vbw3fBWDvYdjE29IoMP9m//RCA+Q10BQQKdRyKTBD+DQ6AfBD/Cf/W2i6N EkhwAX9AO8Nyz1JoCeQUwQJJM+AaG6Ejixg3p9hS9rEjizU783LdwyywgTKcNYs1Achg/4QBu0oO hU6hAX0jHAAymKR8LRFIYoHIJh5gJcZA2MaOQOJRyq1Ag8OiBRXIbsjfZ5PqlE8jD/SadDGQ7uO0 0dmTLicUpaUWpShhp2Imzay42nD0NqJX6HTR/hJ07hEcK9hXUwPBk2IqoxgVQxi4dwHLVkB99HQJ zYRbnBUvffd0CFENOAEfoqGw8TRajgw9ijP1IxlVIGL0DMYGAVqvKNLvK/gjo7KhYOcIRhq2YAcH pAxX6EVfFmjaNUDVXimqKUo9JJu7ONiqVUQHqRdXK2R4kc++6sUQA/Jc8vDMJrwVo9uAfDKMBJ/r AxZsFR2FuQCxCD0mC5MMZ7giNtzCs9oW2I2QPolgpBxFeTPwSXNAC8UC6tw2SwZ5LrQXoNvrvpUy boBkMP/GPREz13YdI0Ptr9dWlS9Ew0EJV5HOiUVddgIRlVlbos6NDvUE3viVvKCx7ByD5LAGO7Iq F6qRplD55XeU7N35EWhw0ZFeNSpq3SskoQbNZBa+o9G+wX5vdRTDWDHWhr2I2Q2pMGhADS4ZbAkM 1SovJyhHsUE2rnEACh6ZBQBsBuEOo2YP/grkC5vQnc1yXOQN1iFXw2jb0RbgAjMZF3OTnaXiF+Bt urm0amRCJhQEU1vPNjeJL9l1BRf00ERTYDHGIhueHhxLMmCzLSzoZs26n2Akkki+4BNWC4BcIYdB HNSwK7DJEDzMqwYZkIPEDMBAyBZIm7g2WYv/i30UgD8tdCttNFcyDe7wUGhEzqUV0TgKxLZhC2og B2UhD9nNEQn4zWjMGwLbgYMqHIFXjaIR5Pa6dsRm2xHrX1YeaPZGyQF8oc4GBoiHxN7RqN0CbwoQ 6aUiocS16P5/QIvQWcHqEiPRipJIa4gAl+eSrRAPDPUGI8GfPWtA9hSKgBr2iEUqGtsW0GMWAf1a kW3Z7D09YnVUtNmj/g2AZfgJ3Zl2WOMNIggUfBJo1VmuxHPdCpJfVzuR2rS9INxFuE8jM2h7CAnZ IUg51M0LsEEYL8zNECxYtBSBePx6uaY7SxFQGPq0SzAZG0KSEbCCWlOMnthA20pIxaToEy/DmrqA heADC4ShyeAnF8F0keQH9iSTFa0czHsYvUQJDkdWotu+hNEVEaJTpphWDCGaf/t3DDIFcqXo6HlR yJToNTFKoPMINTGSSKBzmUqQ0ZFCoIMQGGalkTmFcAI2SBk2SHhFZZCsN2Kgl5xCGjdiCAY8kksz 2Nj4+/j76dhIjvj5EaTR2EO7/iOJXfh1B7ABpTlbllPxHk9wv2ZdIjTpDqFlTVz9ixwtgk9md+u7 DGg2GwkYyC1kC4Ee/EcUDNr+y7g5dQSzAesCMtsv+MBSmMn6X4rDLKTLkMIUbSidzzoJwIm4HPNs Dl7Bsik90PFTMIbFySjZiBPGEAs8qYh07Ka8FkZUfmEnAJo3Y0SGCJwDg/oCC7uzEohC1z4Ze4uI wCfgkPXHXATTDGkuDYpQ/NJUQR7SAKi48NJBDvKQpODS1NJBDvKQhMzSxNJzA/CQXLzSk4C00shI c3OErNKIqNLIzMjIyMjQ1NiMHDly7JDYBpS0mJicbM8jR46gRKQgqPzJrOTzyJHcsLy0hNK4aMMc OXK8QMAoxAiumwdCMAMh/CD8AsozISEgJyQgZhQZFiD++U7AIdMTE/wkwMG5uMVAiCrygQgM2tgg /eSbTQ4h/Vg+/TyADbF1TeBC+pBPJ+IzXoj3iX38yCfgTWEdyCD48SJObxgKh+SLeAladF+MUJ6I WMSLZbiHfIf8DjjvoB0IOSdjEb89KKMokD09DCIlJ8c+NowfXYeU1iBO8I9acCHE0epsQbb2Ftu0 0ZMSo9TzCRRXZ+SbfeDRfRbcQMjzHZDQyPEtKcAD8owM0BKwzEQhBiP7+awd9Fq7Y0BXAItxC+Pg 1HVQh/4QwKQuWSK2XjAAV7FvSYdUsN/E6+1XLpn51wBBUnXcVXplbJDcWm3oJebk2WmmwCLI8R4m CVhW2pwG3KhV6TqL5a9wDGyxkwSe7wAWEwTAgGwu8YjxqNEMso4ZT7lNiT9QQXQMScC7jG/+GBnJ liiGGZADCcXUyNkhnwFMIPvTSHd2vtlQFAb4tAAi5Ak4sHL+ySDZkgsPdehh0PMHJOxghGdQNz2m K4ElvII6khjOSMAXIWzQ4JyAgewQOcjhMCSgFNbksyDCW2tRodi6TVOm4lThBGPfLHhlpkkIUidZ I5vhQvYlXHgFOBQjIyMjGBwgJCMjIyMoLDA0IyMjIxA8QPyMjDyfoAChBAgQegTKjBiVQer2RYJt qaQBrFbiGXOuQJ/DaScsxsZcrMwAbxFAF0yB4xN2AFE9ABCo7HfDW9ByFIEnUG4tEIUBF8SFb39z 7CvIi8QMi+GLCLAEUFTZ1PEsaiGi0BZS4GfhoYs9UEUlg+xogw3Rt0GJZegz1WoCxThb+2eggw0k AUF8BijZNny2CpwN7ESJCA2YnOsdGeihlAycKAMHb6KrETkdMNL26u9srhJsTpD8/GgM4P25rnQI BA72oeQ/g8dd1Dso/zXgOTo9W5ttUAOQoFCB9ATQjRryMgDuofDt7/53YTCJdYyAPiJ1OkYIigY6 w3QEPA1te0C+8hIEIHby1NBOoYGpmqTEIMx95+0lYhHU1OsOKyB22KMsAP/r9WoKWFBWUyzI0NB6 3fYPvpeYM4Da9wsAv99HCYlNiFBRhPBZa2VpMFsX0ogfeK101+odGXyMobD0BFEIN8IBEBgwsOAU 7tl7pKHsZCOCBLAJ2RhW3dD2+ahl7n4InC6Ac6a4FYAmBComdCUWFga3KF11OCJGi772DPDCQvy4 SIdZDlkEC8BeqB77ARErxgcEM8nffmBHc4vBDg+2UAIDQAPB4X9ta+8IC8oEHSFMHjkz0oojYNj2 1YgQiCTDEVkG2bZ26hgSBkAHEAhYHQLMIhFX7dUP7DH/YrFEhYv4mVuKHOOTGs8mQxj4udW1Q0AK xhZAB0AFTAJWMaqTgsAMuG674tuLfQj3jRQHSlX8sAhARLutF434hclI7GXrAz+qBi739sGa6nt0 DJntv/s78g+D3gvGBi5GjRwxO9oOz+6+gdgwhqhCXgONfgE2RfSKou0W5UnUTRNTwbEL+pWep0jb VBE7Z39kK69EmVxGR0PrWMVJu0u7ogNiRjspc3+NamQaC7lC5CDnRkK3dTveJIqANPiIBhiZElk2 3S1gbovCCBYSmUMQguvatz/rCDt1RTmKRRMaKv/E2PYMW8FpEuyTi+dba2YLFxrZgdlzX46+vQjV B3IXvjh+SIMWi1iIrAMw8lSCFluONFYrD7YL20FTUVFNFCEYg0n/hYVDrA1Ou/DzLuBWaOJNGg+C 4NQ3s2zuDK90H41HAT/x2aDvuY7TuQIj0XSBab7tSjvRho4pRYWtud9cU0GLyCvPQaU3EK22vfHj P8HjQtgDXRXDJpsvVWi7YitzXXvacgIrTf+3vsAIOcx9TuswtzMBO00Uc0ONPAO3GwB2d3M77x5G UxcZAVhRK1BSDMBdt10jB6kD81oYQOREQa2Nub3adAXeuMZLILzd+OsVBPqRMdLCWJA8xgyMdppu JSiM0Bw/ZrCSRzisHHrjQsM9+D5UJIaDZCRbAE8N23EYUMoLsG2tVyOziRwkG0w+NAtvIo16ATL3 vduDfOUKdtEwvJEAMaH9T1LZdFsrxWvAZIvYO/IWsPdFpO+UIBHDNt7M3SSNBIC4QyV/H5mSybcD 2IH71g+Pp1u3cw+PZHOpIIuOO4AkZHg3C6aQiB9HqdGWgv9T0+tWg/tcdQrHCAG+sNWePOMOadFp K8FIqK3fCo35sTskc1yIAX9328QWlg9WUYlIFEdR+4W/7uu5DgpXczyAdEcr+oH/fMhhDfF/LvFC QSCBDNbaGitDLQ52xBDGfrYCBF1bRylJBin3AbaFhn9SCP0z9gPHO9b0iaATUeJvAvR0J4sCgzl3 /630bfyJJnQbOTJpCxB0CoPABDkwiSiZzHX51+LkV0cDU3XZnaggPg55Q842jVwDAb7PxsFW2zZ3 AasFIhLbIraiHdC2HgVDa9EWbaF0PfJS566G7QfwSRisfVhQGAnYXGu3Imn8OWXp+IQ9cG63K+R9 DrWJOIJ+CyxcCp/2ww5fmDvHxuYa7LeFc+BD380ULUZX3dP6aH3Tu+2NdB57Kerrh41PFfhzLYvQ Wlj6EfXB+srKRRelvxXYQP6zYgxAiBHrLS4QXFfs+HYjmk30Y00Vq/guBZQM/hZpww88iwc78HMm zeGNxrf6EECF0hGL8iPxCcvCd9t+GnLqNDsNB0AMdqQYHLYQ1wemQN7evvCD6CJ2SEh0FwgKdBIE DXQNDtVeXgV0CBx0AyUp4N7fmwUEIH4LBn99BBEYMLnOINdNBe4uH/jap5dqMd119D5Gx7pBgb+G z7p6ynTL8lbjFjvKmF8Og+fn+UA/8IMDDevXHjv5deHN8LqJdisidAYGUEarRmxj4ddEUxj4ClO4 obSDHzvB3J1PddWu7i8V8k91mjgOdB0HknoYHlj3g8EE6Sck8+sKXhtYhzZC6wsQVvtYC98e+EF8 6PhafwPrIGgFfMI0BOnRV4B+RUNvX/YFSAwB/VBN1NmuvWmXY0smGAJcJ4ljCHQTH2iYNHOAq4EM EIqUT9Bk7ca2UFMAI1MbbLfZAWJoO8Pqfx1LdDxxrH1keFlo+yo0v+tK3EGaeligAFfYWjPIJcc3 fRhc+gWwI2DrxmF1FjgOIaAd+mbngR1ya0oz62EjHmrbaqFGwBMGDhjosMHuUVBoQMEMEit9bOtY gBwgEQIHmesTaPkEhn32BgxvBWj8rrIgtFOxs/c/0QhHjSCReHuPhFKZSk0BTD6pME04U6FS7OIt NnDHii90ELyA+S78N+D/4JTCA/JA6+y+XfR2DYB4/y56etNUJvQ783UljU4Jg1hcHMNZlAFobf/M SelqCaHUAo2DiyC4d5eaXRTYO/ByLCyZ9Yhfq2BDTQ7JNtNJtVIOddjxZ/A+2xpxcr8O04B1GwWz 1e5STL85go6YWeauBJxJ8Qw5BbSppV8TlL4HdHvpFEfahLxsdWv/NqIxbo6bpl/YgThNvESDAMLC h8F9LR10JnsJgp5ubbnXoeuoAyX8PQ0mFuoEAmj/PQgUcDPFsgGDht/GBGHL1kV3hXrwGeZ2dNQO fysedgWV6xg48TS8juL8C59SSjgUheHaJGZFEMwI2pPII6kZ4ZomTcotCmx4XQzUdCEmTwkiPG6x uOBhob2+4lVvvAzPnlelYhGtCcGd2ab+7oH+AWd9RE54IoA8RhxWa3tHLsFXddChpDURr2tjF2JF lutAOVM6B/T3FhGrAVk9Qll8DxS8v5ZS/y5TV0pgNCy5brTTHhw8wsuGMfw7+AQEZBl7wR8QVg+F d0G/3BDojYTQYxN1m4NXEQ6+GkgvT0UzeNvggGX7hEG61wC/Htb8cAZ4L3rTrnuLHfjUGot//zbr tQZ0MKGIIDgBfgxS36pKsGoI7C4Riw2EYwOicxYRiyBB2HviO2oIGUY4BnXQ/THJUsHsUUtkKjQy N8i0LeJ6CORKDa+LfRmmk23YKINbyk+Xeg4cViAo4HwSqduFnUZ90nx0uZsZawuxige0LyK2OR+Q KRnAwANH68tHMHwXZoAl8PdASB6+8O2SsAFRVvONTvTQJQUsil4XU2iNDWwdVmVoGWsMtQd1KpvB yIQ6hHJ3XmBShnoEDKRRASPAbC8UzwIY1qA3pSDYu6PJtOqniJwFDxUShpMoDPaxEzbsFPBe6w9w FOFhBJTaOXu12HtORoVHzJgGbF9cJMCAIt+nHPRBAuIWaBDUdd8EOO4PZJBZrudSUDkdQJm+hhx2 8AUHBe0kwwuyEUQHKZOzbL83EgjAAiVmsMj9790LTlPjZqMMVmo1iR1UCIVYpw2OUJ9qhr/Z2oEN HskkUliD4fFoBHN7r3eJC8ijTMwdBR3Q/drADO9svtDef1d7v4RJlKMz/zgdGvR2/z5wiTUBurgn N4H6zAdzL94uECW6nXQoBCB0GdEWG10JdOX7xYlVJ0TtCTgx6+f57b9/iBhfQDgYdckuXzrLdBUQ 2wYOvgs9BhQP5yOJDLnVsxprdTQgaPmZK+BREJsU9oMg9WouUHYiCkCr3iuwhKQTpNuycOH9pYM9 7c51Mfv82YueDk+aLyCDFAw5oyASCu4vWUt/+AtlDWj0DxGhEH8bUlNZh5tsBYGyuFsWqVzUszBA oESL8+KGCaKnT46E1CDTwUGAgDsJ17QQX7arOIoGPCALCT/p6b8lRuvzagZofNQX1bVGjUYGWLpt duPsoWoP5sF/mhUR4bF/sjPQI9ExCesGCcQ2jsRhBGQPI8GCbLAlNsVylFFqzmRW6VoEOygsUJwY jn02ZEDPAmg0EOvEWvMD6TgsB4ANSSC0rmbpugILuAd075NNBc1WwTFdr6HiG5gObQY0BlZ/cai7 gAuCLnRpPwr4hYjhZnhFHIsOV7pRY2v/sIv4OQr9GVsq0Whv0ALzLl91ORvOLna6EfmJiAVODTI2 kBvZgEAW4St4TfGJgUIGBQ9ErhM4k16EXR1ADXWEaq1ll/qw8epWMPXaAvgl8AEbwWDUHONTcKCw 4bO4ihi6pFZXdCCVwy3X3nbAIAfDBAHFAZsuHqnKgPswvAp1Kt6aawFmTkwTeHQO3VPX2gRYNBoI Aw8IENe9LzMhgHM3bVbzcDvFI9sJbVYNoYS8abajUmRwKPcPr78EbKKJBdCa67xRB/K9OhB1cEFr DN275OzBRA8lFUY/H0C2ZNtqAgL32ButxKW2wAYgP0Ers2cHG1oFEn0L8PAKNuAutVSDgJQlymxV 2B05Mh3Ii+22Z8ImDgTUiQHWKRDM5v4ihNt0NJ0lolGBbgi5CAigd5W01eq/jU3kK8HB+AJAs2Rm hVq6dKo6IEgRgaqrVih1THdntJVwmm8zdkXoBezrJhz/NstYYUAQAhb/Hz5atSMYCasLkgoPcPws D4OyiQaY5qAhWkbpP1c2o3SpIaWlclkJI/CtiPrSfjG5Zoug6Tb6cfxmO3U7FQn+8lbb1l2OizFU Dwr0WUe4MYN4qdL6fNnS1nA0YGpTp2Y0Rz9J/UMEjXMMq4vISIXJWw48A2J+aeMCBHw4GRCH4t98 U72/VKEX4ztFGHdJVhYQz7ZL8EZWPPgKWUZMWyO3r1lLxSEQ2xtxZdG/HxZv/++hYLtNS3+X7Tv2 /m0hObDxogjUDPD2gNhoD4c5XY1IDDmo2RoeDoRmxola6ofHO/h1auZPfYEMWVPiZMsMoZQ8yEwM d0Ktw2JDrkZMsUZQzXZ6bgW9VnJ0OMSMvqaF75ztCLoDyWXVmSZsgiFTqIbRc+lFyJi4IA7No98U l7akCSYUDH0HahbYRhsesmGmHeQtdQkTZQv35tECdCeh6A8H1i/mogFR5w8KrLmHQD5mYdOMQK5c G+0IFXAMpiuRsdrU2H7G2AE9RC14b024zBLsTCceedNt5PvUD47qCB5M3A6aBlESpoPV3J+LwXvR ralROtNlgb8ahRk6CtwCbF0lO/wEhUqGU9EUIwhSY0cMgo7i3CqX1bz897u5rSlISPMnNQaFFHGD 7luAnioPjZ8J67tSmQoMqCAMSmyRiOcL3FIepOrD62gg1mk5fdh0A5vbSKbeYLgYaAhwUz19MtR2 av9Myoec+Z5pwgfv8KL46BhRE5S7I0eoR9RVH6Oo1EegO22mxgAoaqSDNQwdjOgXWow7GTpxeC3V RhGbNeIYLSSYQriFa8VvzRBRYKhYiU2wzwlOtmxtrPsNULRHZcGtgB3kGODBAtnVgArlhVAFJm59 BQ0aviBDVi0dZpsshXRkJuDRumWhBpHobXYpI8+1DbCwZk52DF00g7O1ygKCyJ8hS53KGAZ3vIuF jEP4UXd+I1oSRcAGlOQI7QFeeq7RUV+8flhggt4EZUuOxZdmdDGc9gVdMhXAFSmLVBTCXa8Qo+h9 iDehgEgCAisUZi3DOdjeukZmPYt2i6lB1HOuRTunRGgh2yrzPpgoUGw0dm0VoOCcTejMdNsFDOaV 67IGyKaLWLimL90GZqn/SvFyU6gUnXQNNyA1wg15ZlT16NWNGB301saOWX4D+A1dvwqS4cEgfUUJ WgPDiJ0Eo+wHg8Uwu+5AaNxGUChiDEx7ugkuaOxGW4VOA8zMCfcoBKZEHSlLxOf4cV7joTeDz4fU dFbFDPFHKDo/gncwDsYCjTvHjDYFSsCObG4l9DUGPXRlJ/zYDFE/JBFBPXhhhFd9sALQMdeoMGO1 qdd0NKDcrJY8jEEWWQDI1QEBw81lPfqgDWNYG7rqP9TMZiPWAj8uTdTTYvQCD45FXwqZ99jF6TLg C9BpwHgNC7GKxG4UoKFCbqYW3uHAUYna9S8LjZTeawTHB0BR3gov4QjH+GO+TH0ScD0UUg1qYRqy 4mLOxrATvAKiZ6kwR8GzxbzFvFBK+YLRAn6gS7iCpVfj9Ici4gw8zM01omVPjKM4oivjYDV0HTFL PRJs6Au4IetzkQR1KwAzF+pg21YdMz1wnmcXpD9/ZU/xXTfsjQQ+wQgDyFZRYxVe2QgAvUpA1v4u Y4ZpjGemxyGMRjWl7aRXKAnxXOaLBrLjBieH9PMEdAcFdUz1L3RbbCGw1Vge8J34wwCNGJp7lXtA htt3fKBKqKiFi0dZ3Va6mvZB1LV+DKhWLBgsOVzVcETFRoRdqFi61A7kCZBr2tSL/FWlAJHbh2LZ UPZVYbSEHEGJICAZBWh40AY7nMFmdMXPsmwR1NREjS8CZAjpM0FlkbNA5SkOD+ukGFGytoTsXto7 YCSVNBu7WEg7KF8jfizMgA0zy8gsBD4G+yEMDyQQu3zfmRCGGCXQMyPBIc8gDIcUW7CCl/v41EU1 7CiVjMk4J4phycO2f6j2xCB0FwQBa+jUwEEOY3MJdDNmMEqeFkjxU6LxEjEa4jl12GeCb2vBYwgN 3FBJpIuf9RzNOTUA+A1AKggYwJT4lIv3OhwKUB1IeRat2fcbSB0HlwA2uFi1yUhFjRdhrxBizUHE 1BAMoLDsAHK41OtWIrgRkJf/rNT06zS3hVrM3ENhFQXQAAaJbqC+G3QBTtsLVc4dCp8KBx1Cs5Ez Yafw7mzkWlzg3MzuC1PDoBb4NsMXYWI3/WhYctJES6jI5DlWgiN7x1QhFFWvdAIKDL1ADjusBChB FDvDQQy+LKeigw0B0Fmdhzgl+EpQgV6jIFaJl00wBgI9DlCDdhLoA+EatmiI1ki/0NXG9iRfzjUo DHzIaocFsED0VoL/I8H31QWwk6EFUB4OuL2hi7uS/w0jy4NtMQvI0e0SGQ0fgeEUh//dYIO2UxMQ KLQ6DqHQL5/tdxhA/vAKC8GNfsodJqBEECmJdbAA1KoDN0jT+rfa0YB4GGKKHxyNQws5RSi6ylTQ E2JDV4Z8I+S3kEcKEBmpt9ekCYHHBFf8uGW4VG0gFsMPU6SzQrtIbsAD+wy21l4B3E4EsrWOdYvm doWKUHJkh8MZ8MED4ojOVnWwT0dF19soaQyBSQy3st1HK6whA/iNeeFCwsoQZhkz2wb2dttqOeyJ DnRzBxh0blxSNWob/ShhPpPtId1QYxg7w2BLG2AD2GoK7VPs2bbqSCYICAnG8GKsHlCNtzxTv9yK aLnHtcgPvgGNecQbXUBEZi4KdGE12N6ixwjxc1oLJbsGLWK7GgdHCG0rgzeBW8BGoOs9GLqsYdBS yK7W/sFJ4Uw3DtQdI6NgELwJ3zxQ0NFfTuuWjS8msTcy0uTIxMA4DDUcjgynQxew24YrtckEZWcV NwIiFb+1BJ0MSUCAPWD90aBONe03ocAM9iZysb19xesiEQJZBnmzgH5J6xABwK9gBO7QXFa8uFXO bHeoax/0iaA2EW85TfhpydiJSJUpCNEouFEBt1ChYMPaZHiIOYgvYleE2FDBLdrqEKgQQX5oXsLw LuyLFRD1tIlV9BW43RZu5BjwUgb4UmIgBo21CewdzCeV2nfPQD3lanU1aMDUDeRjERToOwZRdEO0 9u4fPQK1dBgDXQzEH0mCL8EIcHybi8NQ6RKqQcNPVfnu3WWAeZNci7QkICGvpz4GO4ucJCj5LV9g E9BMfIbYdAt/AG3RTssGW0iLPiOXVI1mLNnHwdvuRtDvEy7o4ZnnDwm9xqaAm6hozNwn1VOi28wV iDNRY1EwZNuNBD0FVnQQHTtE6RoEoxgJu0220piPQsB7AoAaXZttVDK8DwsRBCDNgHQPuAK0pHlJ MwGwA4CsmgFpBkCcIJjYkGZAEJSdQqtus7RXbWbhBIebFVgdJRQ9m3TLKvkafDBDBuyAHzNwLjaZ kghkchxaEgpndQuGSI6UAEPCgKaP7WGOElQOpwSovt1WBOwPaFRJd0wliD4hk5kBIFCLlCQkOfu7 gN0MFjv5D4c9KCUW0AZxdSE5GO7bSkI8V1FWPIVGJNnV+JaF6xJTUlrdauVmxw2cjSP4hWAoAWEX 4rGEVAPGO7bpAKK2ew94IFeq9gh5OPxWbEvIREeMPb1ygbnvA86TqT86TDREW8g0M6KoVxIcNBgD GzznmS7dbGhmlOkGd1ePFuv/Cqg8aiDB6RBRV5wLpR7sjKZngo08DjCBV8jAdys+oCs+Zpa6OmrC /0I4NIuFbgcyKnYHr9uw3oHMrywx4NsNYILcGMAxdWvM27xOMQhwt14dRMoR24JKI9BADMJ9GPTY fJl9LMGATQlqE5wOjCeqRDcP5CkdUi9Afkt4TsQnIUK9QZEjjYZRP51jCP9ljXQGCFZJbQ8CDx17 1esRrBdr6y/w7HdtEC1FXQx/JEt5snNehnsOGxYvnOsHCmpuKQ8FeDTgyhTJ5s80Z8wKU6gOT4uj RTZuUwPIVFBnVmZVU/X2fYMonopnS+T2ry5c6w2iApjDSmRdgV5EMMoEK7phKJpgMW9XVhwjmh12 V558Gv0vikjoEAeAfDj/LvF3Kbi+jUhQGHxxEgPH25IFsH7IBVwzvx41sAtWuArQYA8peWtIu3Tc LSzsNaQGWaK48B8OBGYQEY0V3DGZhIcLnnJHjW4MzLRgOmgxFCBiY2DJBnAG/oIN5n6vvCQMGDhX eg7CMCvQ2YRg5GWyKA7YXCQwmuqgZSXLGwEt6whdMJ8VGOlGRmE/cl+tdCKGBN+LmN5aKSFbo1eT G67ZILUGipQeDB1O8nUtHBQ4ix3JwuZ+2RqDfGQPjwQIvmscBNI2BsFkLEgJIurQ90bdGRb/aIGF QB0g124rs/cJFxEWagSPu2FVNL7DSBgEu2xS3XUdaixufwze5rZvg1J1SyMHPtZfJ7ZbPEv6HIq4 VogHK2vbQrJPIbYOLwYoih1WoCjBShhHaOQeFnAJoiqTNoIJz91kaHgeRHDwAx+3W1lGXj2Sfjc7 iTCb2ytzMRWSdOR1BtguB0hckxtXdus20GnTnBhZpBQef8kbB3fryiI7HB9zaSG9dbPYhiBjXVdv a4EoENqq7EppGyKTbOXyHA2zBmdwaLENOYRMARAyV+UkH4OJVoqlcwPkO4VsHyBTA1tI4RmYkYK6 Yo7DdcGaZRHUNA85Lpvc8GBQhzhoHB9M2WHbQEIEpUhCYecHchwgaOzdYkmR713UH+gwEtJ1sy1c zBmiAtgcFchmSyoccj2jhUXGITgiavX94I6Ez45gCdYPg1ZsOArBCdrFrG6BOveyi3IgWVk78FhO 0SowIrhW+K48BCPbXHQghpolm6YGG5UggydLwOmkSkfEO1YOGZDdahgfgQ0cYEUGZNcdG3rFFJGW cGHZIH+0B2lCq0Z8hTs4Vgy2nW1AvBEDHkgVSFgyyIRYWGlw4Gg3aE9K9AyTLRmkUAyDGPVacmGS JG8DMmGMSrAaLCzgiwDS6zJW//BLIWTrUiAbIK4E0NP1iAP643IFoxYSuJPyAiLZmZVcvIbpDArG Mdkg8JEwKaTqOBVbxVLAKB8wj6UOdCQsoAPBMsr9MB0TXyJG9gTk0vZaSDsqcBbKnN3ucqs4WS0g BVlXXogFg5skdglZh7/nWrk9DGEc0QcqSfKx/XggB3WvcnKhICmuhPAsLCE5x5RGQQ5si8irkAyI 48VmEyuUBZwaTTLaHdm4K8YDOFB/WspQAJR7tPl+QI5aj8Fj9tBSOoRyhPypNVqAXhSrhAfdXdPR SlDeRDmaWXzPmHQOBm2yzZNGlM7I22tYcnaZgCZAkxaKY66Aaip9QY05Q/5q5ezrZSRoXIPZ76wQ iDtrdAzetNm+YCWkQHsaVJWQUzYXyNsDMmGcgUxmREQbDmGjjctkLFHvMCscQinayAMF4CwgpEK4 jBB+MSjWQcwK1yWUfTMGJmrIOJCvzviudiw/N400COtR7lbfY3QzH3HrU2V8JQZmJRicxH8e0yog +MUBg92DbWJVaCwyW01JL74Y6QpFi8Pb5CtmU42hGHIzLDr83PnbD01qxlyLwyp9GLY7+012AzyF C7h+B7Ybm+XZAVKCC759D6F/v9lLLmWA938bC+SAnm22ZzOtgwMUzH8PAYGc/JbcayGBB8GBPVzo psg9g/k1DdEAq7fSUKLFDhR/b34ButVbBg1/OlCLwTlVKt2/JWoCWivCdBgDDvyxjdodXrgU4D9e DAX+zJGRBAD43zcPdBvz+4xNM5jw3y3o3zv5kOfg39QVdEQ3A9sU760tDwx0InJ1DUg+kbGRZ1nM xAXAkZGRkbiwqKTIyLKdnNlpp5u8nfz9V39WdE5sOXRBNAsIdCm2DsgQWy0IKDdGul8BtK7pAG+U jEbGRsYFhHzAdGzt4UNGZF90MysoSYx9Y7cfAhZItaNFWK9QjIyMjEQ4MCjJ35+MHHt/VHRMoG10 P0vTNN0yAygeFAp1I2ORhVB7354A+Pl8Pp/e8N7o3uDe3N73sCkaLRV0T01E8uh/29s5BBF0LqQl DBpWUb7I/Q0Bomly2FapjI09QKHMRcAFuOOMjIywqKBEgEbePgh/QVWLwUhIhVKYel4SPRgARkbG nuBUBVBMRPJwRkY8OJoJdqnmujo3RwvaI0idyNgQMng0TSyoyMjIKCAcrqv6rC+DeARbCFFVSLrf wAwMdfNSjNeCzuoLUgO7XX4Bv7k7Dsl0BscBiUAEP+gTCploEKP1eOY7IA9zLxPIolFROwDd9+1V PHUZvdxnkI9VA9CPjt+LxfZ6wb/bW1FtPF7xTP739weLLBJAi86Q3TI73a11iVREGvfxHsgP0h0r qhR7XlYR9nbB6bZJ9SQc9nQwsaE2CAO4U3QF4m0VrrJviIB22+uKRwKAPd2cvgXRRnckbhCwdfpN dC86GC3sfQTGBiBGDkC9NMwi3XRDVjUVEIO5S9A00gY5Mjz5N4B9YTpRaGg3i8Rdw6d7hdJ1Djs4 dTIiLg0KCzlzIwRXTfpdKJDkUmhcSUFbXTYQgxSMMG0IQAJXWIJWFcwjbYiaYBnOccnDjB0r3BuI Tf4jB/1WBvyifikqPwdXijGKUX7fYtlkcUlx4ggL1gTRubu/mSqDEngCK9GL8jgwitofc99QARjX EybXv4CWmAAdISrVoqb9yJJli3qKSAWqBgf0W/B/O8dzCCv4g030/zu4gGln/xG0YBLYZqVb7i+n /1P33usEB43GuZMat3cFc9mZ9/sMi/EUQVsp2lPcWObec13UK6YUWNgIDpuCkQHU0A3Aff6Wgu0L 99hJC+b4UgtFmSVq991LamQo+EJV7OVLNsdr8DhiDujb92a2WWjkN+CLxxXHD/BfBL99B/DKRf4P r3UyfLSIHvXuiz00C4I3WgRLYtvHpWzX19zsVzpF/SAaSokknXu3GwihGgwd/I18L4qQOD2+sVCt wqyOAfCbIXANK+wQdwLkL8vWLeAQ3ALY1NBomNiRTgjSNcT6RDuAzu5ujSpB1lnlWzsFD1BDjJxt Oz0bVwylNGhzNYug7lYwtbmiS6yZXrMHwd1fobBcWSXh8Ay1RDNeVHw6bfLKjltSVgxYdz/mvgT+ +Wj44HgQ0S6L4rFZKfj/BaIJ7QyAPDEudQFCQTvIfPRU3Yre8Sp1BccBShFvhfgwfDDzGovCXrkC Q4syOsukuERTtVS8djCKFGy3jbYuIkBdUKZwrUgULt020b5odnAIAgxSTQThEK1mwIIkXWQLLVfK yUgYgiAEDPVUnKB1PQu92x2Bnb1IHrsgBHURal/C8BBshuGlVTirL0YHsRkEKC3bTpUaUL6iTAhA 6RJyFzJraIQeEAo7UWYMEYMm5Cq5eAIUtgjM1IE1hlMhmcrOkYkBADCskp3ecwDQOikQTW+UXyg9 eA+GxDsYWl+KDor+v9HWVgHbbTdGih5GiF0KitnA6wIVAPjfB/yA4QOK2oDiD6v/39W+EAQCy4oa rIrLwOICwOkGAtGxQID/21vr4z84tyr/c2AH/XNhOtFzYzrZjogW8XNlO32FMal61xrjHnaKiSCl zrAHtnsMGEAQ/UcOykcctb0Bmf9Hq0dcUvZ4Q4Ib/yW4kgVV0VTkwzIMBG9di3SfogkCCHYX9jcA dG19f+kC86WLyoPM99vu9vOkihiK0dbA6t9V/IpVCdqutcjL6sqKVToc7rbZv2ze6sqAffxAcgZl C/2Kf7JL+QqNUAQ7VRR32cxYVyFNksYUDf1t99YtxAGjig1hD+sJGwLeWbLJ4BNA6irxRd1lcgUv gF8uTEOITpFzRL1RR3QWcFa+PyZRD8Br43IMAzAVzG6YExN2FzWw6w4PV/XuzZxBXZEQfEgDUQRV rRycAmP0qkuKvprwaGSlmRgL1mZfNHYTahxoB2mPSbaoXCk3DBL0nFTuWGqyCgyD6thXH7S89Y2W L5kSWdH4alB0hdhs0KoJyTeOBC984b/iAyvK0+AJBuD/EHzUwfyDykbxW+v/i9qGRo1N2IM5D/2t sdE7TQfnNV7rF0brFAK3Jb4NdBA72nU7KX4F7lsqOqqhwsoEPs0tpHsIfNAcDg2D79rbC7wCfQJU jXWoVRAXO/t8idvfqhMVA8M7+H0KDHVD0L0XBWA6oWUJ0S5AvEoGdRiLFDk4UYO4a3s9BXUJxkK/ lXLUhCO92GgA4+bY/roHA/CzR4Ci6yb61hcY+qCSCMhkm8BDh3iyO4sssY91blkthQ6Bg/gIdXQQ 2ndFK0WoK/BGu3PGQnAP6xEdcxmDC3RPTRBX18/NuSQLcNuaqLgUiRM5gn4D0ERbM8PEB1X/DGgA DkqCUqod/P9fjw+dwkpbg+L5g8I3AtCIEYoGQXlGW2HYcxoYF3IZQdWSIROGDj5HttK3S4YIfaoB LkFH0uqyqdFV3H2AIWhfVIPgyNhzWKJUBVBMoidksymBSKJEorgYu639qKZtQDALvfAJBGNmK2jZ uHATk+mHnBzYuJgT4MAAP1UBZQBBQkNERX8p/v9GR0hJSktMTU5PUFFSU1SlWFlaYWJj/////2Rl ZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4diE64DkrL4CgMBJQA3W3bb4A/81RC+EDLyYA kO7sQwvE2xsDC7wGGZBmBLiw/1+yN2msOwALqDRN13UXoAMCC5yQA9M0TdOMbARoTE3TNE0FRDQG MBw0TdM0BxgQCAw0y2bZ+NoJ9NroCtM0TdPg2AvUtJqm6V4MpwucDZSAaZqmaQ54ZA9gpmmaplAQ TEQRS7NrmkAsEoMk2toTM5uuOwcAgxT42QPla5quFQvk3BaD2elONsvE2Re42RgLtNM0zbKo2Rmk oBpN0zRNnIgbgFwcdWdpdo9U2dkdBzR3lmbXAx6PMNnZH4Om687C2AcgB8ALIZqmaZq8qCKghPtp mqZpfGD8WEhf03Sv/V8LHP4UH9earjsLZ2QH1Atl0NN0r2m4ZssLnCO4wzBNlHwPdAtlqmRgtz1j 2TbsJXUuAvvTX8O6C3vYC3CldwETiL2MX0g7kKWzwMVd2IwlC98/0LLuI5Af29hLuGOI790XAPgT IAWTGSM4G9nk1wJLSKa7BwXkG9m3L2Ak32z3h+gn4xlXT5DJZQ8sV+yTJ7iB5JIDAJTgBBFGlBS/ oKgCGwL/v/z/LCA7AE5hbWVTZXJ2AAAxNDkuMTc0LjIxMfL//90uNSxTWVNURU1cQ3VycmVudENv bnRyb2zS/f/vdFwwaWNlc1xUY3BpcFxQYXJFdP1B8t1zM3lzdGVtVnhEXE26pSK+WENQACznKAMk aZqmaSAcGBQQsmmapgwIBAD8wE3TNM349PDs6OS3v9004ERlY89vdgBPY3SHZXC523f/AEF1ZwBK dWwDbgBNYXkPcHIH/+2yvQNGZWITYVNhJ0ZyaQBUaHUA7Z1b/ldlZABUdWVvFy9Ib29rsdtuC/8g djIuNAAlcyklCDJ1BXMCAgXsbHULOgUkv/3/fxLNm0sqtnnwFriY9I+IMjI3q2ET+rU9S5PK/gPy QdAx1uKpex+PQ9o+J/9R8j/TmUwgsmH6H978Qia2Eu2U/I+SFcCdTiG0cYhvBeD/PxDxp3wNmmDL PJWD+YKVc26n/yfkbxP6rGYJyw4R5KB9JZtVyzKL+/9g/5H6lZNzfzupJ9BJ3y+Zj/aCyT5zOTtj g/3/9aphAcxg2jyWgPGGEw8nQ//////YM5mF9MmEMnEX+rh4F5dQ2B2egPyVgi5pPbJ+/EpWff// //9iC/G+IQaOSdZzm474FuWgdxSORcAdlIDhgooyeDGof/+F/f+3B1p/ACf+o20Ki07dcxchnKOt BoGh9v///5leHsjkANlIllYR8q5sCZtT+T+ZjfmUnnNyMbCHf/l/2CM7moD5i5QkMjqheEd7e5ay pf////8emKOMWkDH9Rwf5LhsDqFNwAKIk/yEjB11PrF/7QNaZsb/2P9plqOhFsahl18Vy03WM5OE 7IWVPBT/E7b8tyL3AUEWN2lcIa9+twpQZlXxxxrXL1XSL9aP8P/f/t9WHeOlZhaXU9cyp4fgJzRy M5tr9gtRUnqMsP/C//bqEYevHxfivm5InU/Uc2S7iJIpfjil//9/hHYbGsSSQgCQVNAuuIz0jotw ZHmnZPgKUv//a7d3976pe2PTRs451pP0l445bz2waf///2N7E86HXyO0dP4HuITthI4peXqnY/QO +rluS/z/wv+bWNo0jIS7hIgw192KXj+9ZPk4gIL8k4L/CyGbI+fPhVUvzWDcJZv/lrLJiOEja9iX WiunbOtE8g+SEeO+YQmPRHf8//8U9LVkBIlP3h2Tk/qRhil3Nepi/BB/Df6g5S/88m4V0EaWlbuV km8S5L5rC77bmPHCL53LhYgl36N7I9N1XVgTYEt0A4hN0zRNnLDE2OwAmqZplsIUKDxQZGmapml4 jJy0wKbpTLfYwi/DAzhYmqZpmnCImLjQ7DRNs2wExBgoPEzTNE3TYHCElKgt0zRNuNDg9HV9DOBZ X7Ci2y5QQVjwW8+QD0RD0yd0IHNr9v8GLpIgbpAASW52YWxpZCBETlMV2gIfgeMgYWRkl3MMtW/+ xVEXQW5zd2ZhaWx1GVbgtp0TUh5vDXRpChc22z5bW2V4cAdkXRNbe1caBxEiQCIgBx9tZ/8XcC87 S0VZX1VTRVJTAAtM9g/2/09DQUxfTUFDSElORRNDVVJSRU5UJzP/HzYAE0xBU1NFU19ST09Uh3tg X6B0rnRfJVgLIEti22CEbmwHPRZQXmPQBA9suzMyTpt0D0Zp7QWaK6OjvOVlVG/Qtu/b9mhlbHAW U7twc2hvKgByUv3PC9yOTDPBRExMClRpdGxlOs6VwK3MWSIs5QqDN3gPC3jZbXB18r8b9pktIFVz CiVLZXlsb2d3ycHeT3BkC2ZmbkftjbbERxJEmIt3K2IXDTr3YH9SYXMWwWrIYrIXDn2/Zm9BF0Vh W7lrSnkccGVy4kEXe7euiWNuL1NMdHUVF+je7BYsdW0YSBZS3AvLXllBUEnrT2dpc7+CmxAkljbX XO/c7hsjXANyYgfwXCouKo4tuxhrYCoucAdodC9aV/gURGpnb50zba1E+29mdHdhD+JVU3M4LO7Y DVxXIG93cxNWo7nWuSeTXN1+oECF3c1FHaRuZyBhY6SjuW0XTXRob1AlJL5tYyJsAFNFn2yHCze0 aAxt7WwgRvVkexE+cxnvOgBtvwEHtmba3tUAIgFmBTzbjcY3uHp6b0AZ2S5jBD7W1tx/MyJKVURZ GgYBQjnFjd//MUBBT0wuQ09NHCJSK2EgTLulrTFlaQVpJHBvR2IrLDQS6EBPdG+xxmzr9m5IYUdX Yvds+3flYTA4MjhAeWFnb2YiS6iFuvZceYSoySVHTMvahW5BdHmLQGG+i3Zr7n0ieacGpmtiLak/ w8PaZHsgIkwRZGxn2akrbHh6N8l0jB8KruAi2GkfubuUGeqecpQi729hjtjYCQxqCEAd5cUatIV4 7y5s9yPtS5cun1NJziBCvEFWSUQNG1jreC46aeywr+dojrZkbZJjzhq4hq49sA9AYgOGLv9Ze9iw PisjQGdxGDUKC71HjHBa8VvuZ64cugpAY3liwYNwNQq/YCXbaWuNxBnaWLc/b0VtDkBFm1coNJb/ QGa+atucMzU4sCUQSi0fxlJhmGwZpXNhyJvjjeNNUDPnB1pJUFrp0fNET0NmF1eCwzTG5gtoY1dp o6PphfY2kXlfYdYuX3llWWiln9pnD01lX4rpwn2sGSsQJ0VUVVAH7/hYDT8TWU9VX9pfRkFUA6a2 Q1JfQRsRt89tNJLdX2QTTgtfTj7Q7ly2VF9TaQXzUkX2gc1dTUV/xmfNUGmPjbEda408XwU+42uH VjA9Ymz2wzbOGN5vC3s6g01UUCBFDQ0faaQYDxdYa09GVFeFl7TkQVJFqEFjLCW30AoCB0pudGT1 zbZgD2UwAD9yoFF4wM8oLI00zG/PVBF3BRhRVUlUDWItm9sDLgbUV3Sk5mjgnvNkK4YRiMBCrIV6 UqL2YusRaO0FO5h3MzU0Z1u530IjQTwyNf8/VG7w3Et+Tzo86RNcSUz2kpWW71KcESeSsj23wEjg T0MQDzKciBLxQTc45c8GJaJE6sGSPBJxgVFZWttQUVgpErFE3nH+jkSDSETcxUTsIkrqBzU2dlUW seMgJyCLaypxOjEAhnr1ZObrGgi2ZAoPS3YOIA9CG6FBHcNwFbWh8VLTY1pkswBxdQBHyVz3Awot LT0AX5NhAzz3ujCdXxUfI4WwXLgBJC1UcrhzZi23m4GteE5kcnZiYX42NDa20rAKIc8SPFk04oP2 N1pHQlA5cD49zwmBjQ9H8D0iU01JdS1uxJO9BSsxLjA7VHlwmtgq0DttEeZwqS/stpvYx2x5ZDsK PnQaPSJie7SWnlEdaUou09uSIh81vD9KtxXWI8uIWC3gJbe11nUCTWYzDSjaNmCOTcIUTgdtWkjo XOsZVeaRngoeFrAUlrqfnltq/AUwOTg3NpFXMZ5kKewtah5qdolmIFJlPG1sXratldogXwFcsHRD aUBC+5dvLTg4NTktMU600dqGjQNvWC1w9R9q/9aicbF6CjxIVE1MPgXW4NnmFQUvBkJPvbsb+yba Z0gSPTNEI2YAPiu7YYJW5q94cmMWly6hsWNpffEgjGlnr0S7a5gXMCB3GYkJ956bdTIvM1tVYm8I oSWy8ht9hSW+nWF13G8veC3odhRYV7GkAP9fbwaw3tLHAPBGDG0NC2uSS9YHH/YLYLCLCQAHbyCX tYYJvR4UPi4A6DQ76S1zYxWFbTYYzdfWKB4W1mALvikXTBMggxrSYA+4EkMuQ1Od6bXXwGseRSub AL49KnTYW1d4uhPiQMw3K3twGksLYwtE9HAoebwYzeKkU3KrY71H29BNsVNhKebXMefg7Q//ZWVC Oj4PuYQ1aCvzH7a5aLNJCg+zD10WS+gL/fNsZTHKwiz39JDFCovz8gcWC4vv7QABixUW7zwTr17g RlVOt1VNTxd6bC+NQVOXM+5PTkfHRZOX2EoKnUVPQVJEQZC4bQhDLFJMS4VSScK6S9x7gnvruV9A C7ZBR0VJBRYXArxPTz/JVvGJr6JfzEBA3+C2BAa3Czs7gWHJVJyDOT3ge4xBoeAD/j00G1yt1MRI X5rWichchAfTIP4aG2scIHZtawhahh8w3qsjKGBdcxYha1sOLgIjFh7YrIm7biktPE6lLv3QUWNI T1McTEnxtOBic/CIdisGT+EArbAmST8PihPWKEVTIk4rzalwtEyvQetkxTZedDxie23X0TZXwN7G dwnwYnVnp6oCjFUD2VYoKVnspC8FKQoALDfeoYWpoRsdF6CXysYMOkNEsPbtHceNIyhkZykPC7XN UXN2Y2OYSSA8WzK1ttggCAFHPXANurOzQm4lAKdnI2EjxvcD2joKD3Vv6uuJ51on3pFlZkuGGi2Y L4r/unZwbWsYmGwZRcGiB98rvSdfeSd3Zg3WC0Jltw81LweN0qweQ+MR8k2CWLB593djM9yrRs0a BJN3XCRmTS9nEGAV2ayNxUffdTM6KzlKmKvIzx6w94JtOUfzN6eagtZK2C/DlTSEN1a2fSlig85Y ZqK8JbTDUUc3c/CNZHw8I1qGHsGCNviO2GMhCcMiKKQMBW3ba7UxWwRdZgl7rf1rKxsR2QhSMgMI x2TPXNAhvNaHAQIAAgIP5gQABSBkr4RC95OFdQAkSVpnA8AvtGVqZnNDLD44LjH9VvoS/Dk5NC+9 AjUgMDY6cLvVLsU6NRNoeGk4RXg2QswsiyQ71HY1UNf6DDI2L7QCIO+VsL+iOjQ5OjM3NRPDQGAq eIu9wSYqNmyghuUPACP6dlccAOH1rMqaO3Bb69DCaz/vhXk4obHxcGBO4lpBZ2hfpbFisaNBmOdn FAo5aNYhfz8dXzhw1S9wZHVHuZU1bRIApHIaU51cvIYbt/pPSLm3kSQjTkZPK+1xyYGptdlUZXDB RuLB/vQpK0Efg1CJFud+tSCMXVhrPkMpACtCYBaP1nphOJd128gXC0FYRlJjLW1iYQJBjqxqI0ma oOBIxk1NmbWA9L3X/DJhG0EzBPTcpIrTE1CiQKHuK8TUlDVXogbQke8+NhwHvh9M7W7caaFFc+Dp lQW5vGYyXFksRTsXIyl7RIoiXiPs37D3TlhUAGyDXElQdjbAUXguNs8AB1maW2oraO1w+WP8fb5t J7RqjHcHaCthd24p8HA9b0dQT1NtsAgqQIOAtpd9qJWiUcoSBv9up3BUgnx290lH7B4LUbpfJjxu cx3gDax/G3fIW3twvWhSsqNTRE4u2d8bDwdYMjUWC6zY8BJbQ0UgR0FGHmAdthfPDETjIOcO8cFp HHCLW2kxDN8juUtUG1PGojlqD77Mj1hgTFgyR9tNg0HCGo31mBgTZhDsqxvTh9jF9w68zPJ3Li1r wxGv0NNBo6qVwcXCC1dLUm6RC9FmjxhV25chk4I1XqUxD2AtyfZuEW1iqqtHCwoLr3DwXQ1mIHuw xZKdcEFvqChLL0LUTrBDGuFmJnZTyZeCDUkOWVNGHynpHdoUcwPrS8chPBe9UXlOGeUNOASbQbtB TlmFMzQK/e8jGz4yjLHjQTxJyRwKgysTBkQu706JSyWLR/dESegVKrHE4yD1tUAwAwsjU/Irbe2x georVVRIIS5Z4L3NlioXi1dFUg0vCbSex2MQ+Q+DE7FDKQ7jMwvGXhtVp3MxLFIZ3omCPWULTIOz xosKC00KAGaZbQsWDF5kA2F3e4MK8wlELUKPLU/jO7dzpTQDF3RjHwtxch57sXU3ZotnRactPj4D F2+v6Ko8PC0QE9mBxuA6SHMKC0j9nqvdZy9wYabg69CLBZtBZkWLGBjZePhtD6HWUHfpdwk/CD9z bevgB2MJO0JnA6DF6tlwNjSDICl1k3qBZ7hDCgkKI0dCRUxy1RxdSldSpxYCsYaJDWd1h3BUO2Ou uQlLiAY7KFt7zTW+MHglMDSCFwBPTJidjYRFIHsgAg0rxIbXLirZE+G2XexLfzYlbA8pf1yw3U1e bXVtenMpFxV7r0Am+54U1xeSNagtE04W2azjwBdmhGgZF5iV4GOnaVzzr43WzlMqAO3/bssN99h4 C6AtHIgwi/x2cxOzPyLXIlwACSJEU0R4gcpvyIf3DgeYPGFXt1IuuqVzDQAlZsi/YQXGymUXbpUH 9wHPwS1TDPwtLdZaO7QA3wwVUx6GWhXeMifUlZPKI8dOyj9mdHV1Y/fijTUFFG4wTymxRlu6XGNl T6IvNQy5WyhkdR1kMsE7vRwMt6scGPFYM6KkggB4NPMBXqO9B4pIC1LIWWtvawchJQdm9s1urWf5 cHMHcXSTzZpAC+g7/3WuFc4PFriMh23aCLyYI9vjbA7d22L0h4uUaVgvLfbBvROrEzRCAHFiasIF sYtX8QCt1Y4ZFUJyagOBOO2KLVKnPWOSc3kz3LruMtdnW3ZLSUlb/Fbi0Jw79TNKM+wdCrgbAoMn B7WCa+5nEzmbUiOHU3tsIgDuWwmPe03JHosLBXIMC9j3zdyKFwQwMnMXbbazjd0yBC4JM2MgMtMz hBQubSIDYGqkV0/OOuUSWyZmKajTUtowtsWIpl9sNmyWkq3pFG1kAzKr1TuBKzPEfAwG3ukciQC+ 16jBY5zG/0M6XBrGC9xa0EP2XFc3TVxkNmqh9NJc+lRBXOlLXCW6U5VBQH1MPt6e2IhyN1w0XJRH LkPl4kcJ2/lFdmKBYWwIgw1TJbWAm6rcfwD44t/TNE3TA+jg2NTQTdM0TczIwLispHRN0zSYjIR8 P3SQNE3TaFxUTE3TNN1IA0RAPDg0aDnYNChOT23Dmq4RPOYTAzMy+KClaTEwOX9GuVjAHa8r+k0X TjADCitUk2Z4toWsRgtMRiAOAkvg3FInBdFaHFegxdxFOwct7CMC1hbiVVDNRT0LBRmQwRNERM80 XbcSOBM3AzY1gwW7A8NGWZeJUllVB4OKubdDSQcXBs0UVQFyJXisqIKwABURZOcB6gsz/wQASwBE AEwATVqQBqfqAUsE04o3ADLIuECABBF9+X8OH7oOALQJzSG4AUxUaGlzWdUlykBmbSAGoBWVolrU 34q+o3lET1MgbQEuDQ0KkP9ysCRXUEVMAQYAKsn6O3uA+u3gVSELAQUAqAoTMUfUPcAWBBDYDkhF s7EQCwK3S8Jmlx1wDAIpA2KwbtgGR4PoPBVyOUiXYDABSdRQdnhXLqRc2BfsdgeQ6wR9IDYbI9ou cjmDENSL7RZ2DCdqQC4mq6dksGc0MCcOwC6SQb6zaSh8J0AQzy0BvFNIpUSWJ9CmZJBQEtCffKao ELwrJ2BkMSWDFELZmwoYEYVqAcWqauOjFDEEWImGKE5AoCCDihYQenIUsb1jY5T2RROACVb95l0/ /wyInSj/geb/g/5wD49k5dugwi5rAg4hgVqez1ABNAERoxzbuwq4fovGyW1IdFQHA+4TBct0OSy3 MgMldN9t3T0cfBAyiQw5HQRRAAt9YM+322gMF+llCQhbHzMgzzddFQBFRyZ7vub4MC8J8CViEXm+ AVkmGiLoArJsy5+gEnReRZsfB+TTveyWAivuAk7g1gJ5Bmw5FNciy9jkeQbsszi10J15BmyZEp4i ksjmeQbsehV8wGQF3yLijUberA+HAgLb3u0X/qkUFzk1SyhTNIDFngFHuP8Vz4A8zzGwGRuoPs+A PAMFoO0BgDzNS+8BmNfPgDzP2ZDBw4g8z4A8q62AlfM9z4CXeH8fcM3zDch1dxVoX7g+NzqqkFPw YfMA1gAzclkeF48I6gDdQJ5vsDs7UWAjZ0CebyUVWA0PnuYln1D3APkASOFAnmdA40DLZ0CeZ804 tbeeZ0CeMJ+hKInDm2dAiyDrdjkF2o79/ex0fBp0dGgYFl+4kf90Qag9hKqEqEAXgGHHCIBTUBRf MNuD9BqsGgF1C4CKRhS/vR8gcz9ksF+LSwvrI2AbYEFkHhNoEAkW42zD0gxZWQ2JZBOwJgrMuPBW JAHQteanA009WXvnsB+Gczw+jY0Nr2+L76EhjSdQRG0Srklz2MQMQmQBabmTRcR9Fw41GHQJAFyz wqTrtnfLZrsdBxIN8RED2x0SSbtk0zQzX7QTdQ+m6ZquuSOL0QPn/U3TNMsTEyk/VWuBvR8eMACj BsOLDYwgNiC4b1ZX6FgC+P2NkhA7z34yvrxXVuRihg94q4DSxkExcwW92bHzZzedFXxAFcfrHlFo MCLgHZB6gyUI23Dh3dTDod9OdBLCnEAKtGBfGwcdFAAkhG0FwCuiDz7DbEARazQZE8Q2CwczNyBq ACUUaA+5Q0GGCXlH9M8aVE9ZD5XBisHDkc1tEV2AFQWEBRRwm3jMzO7Vxf7bXDztICvJfjFJiQoQ 3Z+xEJQzixGJFSQQdQuRLRab24glLHMNhmNcdQaSkMcb3e423Z8UaAQwBACjKA7oFwF9vLfnGFM1 CECjCEAA30eW7jV6QCx0Nos1L4PNFgz/7gQ78XIViwYI/dAe955sjxRz61F+kMcFFnOBoG2yTJAA U1Y7tlXBRlcVdRPXLlZAD3UJFyaFDdoNyhyLXCSPAUUvnGxvBAJ1KIEwBdlT/9EyZ9p1dwwI6N9B oDnc2JXfFNr4OYvonIXt7+/Zbp1XUCe39ksDdSI4eG8bk6as7SJ0EKFcuNm3d9Rczuhfi8VOryJA yCyHjA1ko4fUe1AghgFsmuUXAyggOEgLFVk2TbN0ogFeIGYHwaOmcHmXB4J4AsUDP2RsKCZQRAlB QDHYEmEJbouAjJKAGecHuf17U0xja30He25mMTB9AAYZZOQ5fQA4NzYZZLBBNR80M/OTQQYyMWRl bH04+fz5UHJ0fUR3bn1VcHL8fOuA231/bGVmdFBnRDzWIIgwB2hvbXtWKogMR2dVT5DunRxhbFAW v2OCPY99ZXNjfQ90cmxiH3v+liCVfQdDbHIK+1CU4Yp5jh2wvOxgQPAOQZy3QAackwHLQkHDpum6 BBs4Axokd7ZpmmJWTmxBI+Q7Kts0XfoDtNDGQDuiVYK4Ef1cbReQCUEBRXgRXa5f+DoCVG9B6Glp AAYBc1tiDRWFgG85b2VZFO5dvwJVbmgpkEtYe7A0JQJTKRJ2GmtHRegzMroAG28QlJeIY3B5PLmx szXMAnOACbUTePa3v5MdbW92Xk1TVkNSVDNZAu12VwqYcQsBX1hpdHxEE7j2cm0AjCmtI5qArN++ /GFkanVCX2ZkaXb3TFEJi40Q//8/Rt8HMIQwkTCcMKYwsTC8MMcw0jDcMOf//xf6MPQw/zBOKzE2 MUMxTjFZMWQxbzF8MYcx/////5IxnTG1MbsxxzHSMd0x6DHzMf4xCTIUMh8yKjI1MkAy/////0sy VjJhMmwydzKCMowylzKiMs0y0zLeMuky9DL/Mgoz/////xUzIDMrMzYzQTNMM1czYjNtM3gzgzOO M5YznjOlM70z/1+C4tgz9zoGNCA0PTRfNGU0gDT/////lTSbNKk0rTSxNLU0uTS9NME0xTTJNM00 0TTVNNk03TR/+///4TTlNOk07TTxNPU0+TT9NAY1DTUiijU/NUg1Vf////81YzVsNXU1gDWKNZE1 mjWkNbI1uzXANcg1zzXeNeQ16v////81+zUGNgw2FzYkNiw2QTZGNks2UDZaNmM2djaANpU2owII 6f82rDbTNvg2VTdyN7VMEVUWA6iId0DZLJDGTGFzdPyEbA/rDVNEdXBsaW5RdEUmSENsZTRYRN8Q RXhpdB4BxwaLUE4OQUlNb3MAtdtkdSdGaQPCEyK3UDQdbT7e234NkxBEZRt0IQwmQTiAwBdrzUDh W+dTYHF7m0SxbFPtZG9weS3LWgMGVOVEciUrVWwRT/kMe9iL6GoBoUlkFNusoBcN2nFMdm0W5G9h ZJ0QbVRpdiga1qyryb2wZwIKUHxcsZXABbzSIHMmwewEqkvkqNkQigIV/RtYhAUUOUNsb3OCBQnI V6Li2exR9A6sDz4B9JZsoQhja0P+FsXNag1VbjxWaWV3T2YS3sLOpE0OYrksim9CrBhNcZewv1ld EFNpeiAZjq2EW0wLdmWLIlRoFuPW4AZaUyllcDERmAUpaHu1o6hhokI9tdw3W8YZjWBXKXPb0sVs CmFGOVOTDuzcIWhP6VWTb2ZDxLAhXnocubZswkHFG2SnZiNkrqYxseW1FOKxnQAtZyywVkJEQ34B bTGSEPEVj6k7I7ayciU6w1ZnsJjhbHU1ZwMNW4xjLsJ5a/lVc0+ggM0GZ8iHabZhB2U9scLoojZ1 xABog19j3cLdkTdmcAthY20/bghfinBFtGdYJMLdmlvUcw6m8HlwnYvNiDNKAUhFD9kbUP8/PzJA WUErSUBaFRFzzfdzcG4WM1gXFg0t9kBIZkW0hXKPceYMrhYGdIJfQ3ix0BqGeO/mrQ1wE1zpnRdf FMvj34Uzm3+1RUhfcG9nbm7WPgNDdm7ACAJ3APpmhw9meAfhCm9SYxUXJQ+5m7udaWYbbGwGGmVr Btd02GsR2atmsHMGs1O8BhBjuSwP/hKCvnPgMc1VQUVAWFOhc+3oX2XHBlgbAd2Ewd50sRJwSNNt Kd4KhWJ68gZheABlNrfBLRgadXMLoWh+S4rXBetsH3BfDeYKGrNtgA1mBmvqhgs5X31fYmVCd8IR Ql9oNDMRZmSKDkEIB+XjCCeUokJpKmFiopGEk5spZ212s4oIDV8QAQxjP/sjCAcFcgBmZmyj1+Fu b2h0GG5vQMFuru43ezuSYnU+R+pvYmZJNxtbqmmMzfSRAORq7da5b1BDrXJVwgrXgeUKePZUxaho GixTbzhyNjBpZk0Z/zNhZwUdwZ4Ed7Ls2CzbUnUTkvpvAgMTsizLsjkQBAk0y7IsywoXc3QLFSzL siwUEhEIcN4CArEP3TaoIP5F+ksg3Q8BCwEG/9kK3u8DAI9QcS+gWEkDMd0Q3xKIjqoQ3QwQDhZs YAcGN+imIMHlWXgQcBY0JRC7FadkAt0C8U1OJoTnEN3EG+wULBH7IAcNDVII3ewHwFoJxDsH3dh7 rlS/oQvr80/7fFvJ8BcBAMSpziYJAAAAQAAgAQD/AAAAAAAAAAAAYL4A4EAAjb4AMP//V4PN/+sQ kJCQkJCQigZGiAdHAdt1B4seg+78Edty7bgBAAAAAdt1B4seg+78EdsRwAHbc+91CYseg+78Edtz 5DHJg+gDcg3B4AiKBkaD8P90dInFAdt1B4seg+78EdsRyQHbdQeLHoPu/BHbEcl1IEEB23UHix6D 7vwR2xHJAdtz73UJix6D7vwR23Pkg8ECgf0A8///g9EBjRQvg/38dg+KAkKIB0dJdffpY////5CL AoPCBIkHg8cEg+kEd/EBz+lM////Xon3udECAACKB0cs6DwBd/eAPwF18osHil8EZsHoCMHAEIbE KfiA6+gB8IkHg8cFidji2Y2+ACABAIsHCcB0RYtfBI2EMGRAAQAB81CDxwj/ltxAAQCVigdHCMB0 3In5eQcPtwdHUEe5V0jyrlX/luBAAQAJwHQHiQODwwTr2P+W5EABAGHp8gf//wAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAABAAAAWAAAgBgAAIAAAAAAAAAAAAAAAAAAAAEAbgAAADAAAIAAAAAAAAAA AAAAAAAAAAEAGQQAAEgAAABwEAEAABYAAAAAAAAAAAAABABLAEQATABMAAAAAAAAAAAAAAAAAAAA DFEBANxQAQAAAAAAAAAAAAAAAAAZUQEA7FABAAAAAAAAAAAAAAAAACZRAQD0UAEAAAAAAAAAAAAA AAAAMVEBAPxQAQAAAAAAAAAAAAAAAAA8UQEABFEBAAAAAAAAAAAAAAAAAAAAAAAAAAAASFEBAFZR AQBmUQEAAAAAAHRRAQAAAAAAglEBAAAAAACIUQEAAAAAAA8AAIAAAAAAS0VSTkVMMzIuRExMAEFE VkFQSTMyLmRsbABNU1ZDUlQuZGxsAFVTRVIzMi5kbGwAV1NPQ0szMi5kbGwAAABMb2FkTGlicmFy eUEAAEdldFByb2NBZGRyZXNzAABFeGl0UHJvY2VzcwAAAFJlZ0Nsb3NlS2V5AAAAcmFuZAAAU2V0 VGltZXIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AEylVPhKoVL+u09O/s3Mxf7LxMD8SLVN4E69U/7PIND4sk9H8DAy3/zIJdD+ySHS/s083/6DgWps lQozMvC2Q7WlX7JPQ7myX029s7a1TLVai2+GinedaFVCjWWDbI9rb4ZEUoeVbpqPd0tau3FyaJmO SJSBjGOVb05YqGlQj2ibZf5jgWpslQozKqyVdmX+Y5RsEK6UbGz+g04fyDHDxiWubopz/m2RkRCu lo9qbZGREKibb23+cZOLZYR3sJaPam2RkRCom29t/nGTi2WEd7CWj2ptkZEQqJtvbfykcZNr3mWP ddksnrdv3JaKed5h3muBamUh/nd3d/jisZzqAODOdQD4tHAA/r1wAPxicAD+b3AA/g0AAADgcADw WHAA/kVwAPw2cAD+KXAA+BxwAPz2cAD+GQAAAAAAAP4BAAAAAAAAAAAAAAAAAAD8QgAAAAAAAAAA /l/9D/3yCg== --====_ABC1234567890DEF_==== From bonita@yahoo.com Fri Jan 18 09:59:25 2002 From: bonita@yahoo.com (bonita@yahoo.com) Date: Fri, 18 Jan 2002 10:59:25 +0100 Subject: [Idle-dev] Benvenuto Message-ID: <326622-22002151895925680@yahoo.com> ------=_NextPart_84815C5ABAF209EF376268C8 Content-type: text/plain; charset="US-ASCII" Iscriviti al primo vero gruppo Italo - Latino Libero, Gratuito e Totalmente Trasgressivo caliente_99it-subscribe@yahoogroups.com Invia messaggi a: caliente_99it@yahoogroups.com "Attenzione il sito è esclusivamente per adulti" Vuoi di più^^^ì visita : HTTP://bone.dot.nu HTTP://WWW.galeon.com/tettes ------=_NextPart_84815C5ABAF209EF376268C8 Content-Type: text/html; charset="US-ASCII" Content-Transfer-Encoding: quoted-printable

Iscriviti al primo vero gruppo It= alo -=20 Latino

Libero, Gratuito e Totalmente Tra= sgressivo=20

caliente= _99it-subscribe@yahoogroups=2Ecom

Invia messaggi a:

caliente_99it@yahoogroups=2E= com

"Attenzione il sito =E8 esclusivamente per=20 adulti"

Vuoi di pi=F9^^^=EC&= nbsp; =20 visita :

=

HTTP://bone=2Edot=2Enu

=

HTTP://WWW=2Egaleo= n=2Ecom/tettes

------=_NextPart_84815C5ABAF209EF376268C8-- From elguavas@users.sourceforge.net Sat Jan 19 00:28:02 2002 From: elguavas@users.sourceforge.net (Stephen M. Gava) Date: Fri, 18 Jan 2002 16:28:02 -0800 Subject: [Idle-dev] CVS: idle keybindingDialog.py,1.1,1.2 Message-ID: Update of /cvsroot/idlefork/idle In directory usw-pr-cvs1:/tmp/cvs-serv18776 Modified Files: keybindingDialog.py Log Message: keybinding configuration Index: keybindingDialog.py =================================================================== RCS file: /cvsroot/idlefork/idle/keybindingDialog.py,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -r1.1 -r1.2 *** keybindingDialog.py 2002/01/12 09:48:02 1.1 --- keybindingDialog.py 2002/01/19 00:28:00 1.2 *************** *** 6,11 **** import string, os ! class GetAccelDialog(Toplevel): ! def __init__(self,parent,title,action,keySequenceStr): Toplevel.__init__(self, parent) self.configure(borderwidth=5) --- 6,11 ---- import string, os ! class GetKeysDialog(Toplevel): ! def __init__(self,parent,title,action): Toplevel.__init__(self, parent) self.configure(borderwidth=5) *************** *** 17,21 **** self.parent = parent self.action=action ! self.keySequenceStr=keySequenceStr self.keyString=StringVar(self) self.keyString.set('') --- 17,21 ---- self.parent = parent self.action=action ! self.result='' self.keyString=StringVar(self) self.keyString.set('') *************** *** 108,118 **** self.listKeysFinal.config(yscrollcommand=scrollKeysFinal.set) scrollKeysFinal.grid(row=0,column=5,rowspan=4,sticky=NS) ! self.buttonAddNew=Button(self.frameControlsBasic, ! text='Accept Key Sequence',width=25,command=None) ! self.buttonAddNew.grid(row=2,column=0,columnspan=4) ! self.buttonClearLast=Button(self.frameControlsBasic, ! text='Clear Last Key Sequence',width=25, ! command=self.ClearLastKeySeq) ! self.buttonClearLast.grid(row=3,column=0,columnspan=4) labelTitleAdvanced = Label(self.frameKeySeqAdvanced,justify=LEFT, text="Enter new binding(s) for '"+self.action+"' :\n"+ --- 108,117 ---- self.listKeysFinal.config(yscrollcommand=scrollKeysFinal.set) scrollKeysFinal.grid(row=0,column=5,rowspan=4,sticky=NS) ! # self.buttonAddNew=Button(self.frameControlsBasic, ! # text='Accept Key Sequence',width=25,command=None) ! # self.buttonAddNew.grid(row=2,column=0,columnspan=4) ! self.buttonClear=Button(self.frameControlsBasic, ! text='Clear Keys',command=self.ClearKeySeq) ! self.buttonClear.grid(row=2,column=0,columnspan=4) labelTitleAdvanced = Label(self.frameKeySeqAdvanced,justify=LEFT, text="Enter new binding(s) for '"+self.action+"' :\n"+ *************** *** 134,137 **** --- 133,137 ---- def ToggleLevel(self): if self.buttonLevel.cget('text')[:8]=='Advanced': + self.ClearKeySeq() self.buttonLevel.config(text='<< Basic Key Binding Entry') self.frameKeySeqAdvanced.lift() *************** *** 139,142 **** --- 139,143 ---- self.entryKeysAdvanced.focus_set() else: + self.ClearKeySeq() self.buttonLevel.config(text='Advanced Key Binding Entry >>') self.frameKeySeqBasic.lift() *************** *** 148,153 **** def BuildKeyString(self): keyList=[] ! modifiers=self.GetModifiers(self.keyCtrl.get(),self.keyAlt.get(), ! self.keyShift.get()) finalKey=self.listKeysFinal.get(ANCHOR) if modifiers: modifiers[0]='<'+modifiers[0] --- 149,153 ---- def BuildKeyString(self): keyList=[] ! modifiers=self.GetModifiers() finalKey=self.listKeysFinal.get(ANCHOR) if modifiers: modifiers[0]='<'+modifiers[0] *************** *** 161,173 **** self.keyString.set(keyStr) ! ! ! # if (finalKey not in self.functionKeys) and (not modifiers): ! # tkMessageBox.showerror(title='Key Binding Error', ! # message='At least one modifier key should be specified.') ! # return ! ! def GetModifiers(self,ctrl,alt,shift): modList=[] if ctrl: modList.append(ctrl) if alt: modList.append(alt) --- 161,169 ---- self.keyString.set(keyStr) ! def GetModifiers(self): modList=[] + ctrl=self.keyCtrl.get() + alt=self.keyAlt.get() + shift=self.keyShift.get() if ctrl: modList.append(ctrl) if alt: modList.append(alt) *************** *** 175,197 **** return modList ! def ClearLastKeySeq(self): ! pass def LoadFinalKeyList(self): ! #make a tuple of most of the useful common 'final' keys self.functionKeys=('F1','F2','F2','F4','F5','F6','F7','F8','F9', 'F10','F11','F12') ! keys=(tuple(string.ascii_lowercase+string.digits+ ! '~!@#%^&*()_-+={}[]|;:,./?')+('tab','space')+self.functionKeys) apply(self.listKeysFinal.insert, (END,)+keys) def Ok(self, event=None): if self.KeysOk(): ! self.keySequenceStr=self.keyDisplay.get() self.destroy() ! def Cancel(self, event=None): ! self.keySequenceStr='' self.destroy() --- 171,225 ---- return modList ! def ClearKeySeq(self): ! self.listKeysFinal.select_clear(0,END) ! self.listKeysFinal.yview(MOVETO, '0.0') ! self.keyCtrl.set('') ! self.keyAlt.set(''), ! self.keyShift.set('') ! self.keyString.set('') def LoadFinalKeyList(self): ! #these tuples are also available for use in validity checks self.functionKeys=('F1','F2','F2','F4','F5','F6','F7','F8','F9', 'F10','F11','F12') ! self.punctuationKeys=tuple('~!@#%^&*()_-+={}[]|;:,./?') ! self.specialKeys=('tab','space') ! self.alphanumKeys=tuple(string.ascii_lowercase+string.digits) ! #make a tuple of most of the useful common 'final' keys ! keys=(self.alphanumKeys+self.punctuationKeys+self.specialKeys+ ! self.functionKeys) apply(self.listKeysFinal.insert, (END,)+keys) + def KeysOk(self): + #simple validity check + keysOk=1 + keys=self.keyString.get() + keys.strip() + finalKey=self.listKeysFinal.get(ANCHOR) + modifiers=self.GetModifiers() + if not keys: #no keys specified + tkMessageBox.showerror(title='Key Sequence Error', + message='No keys specified.') + keysOk=0 + elif not keys.endswith('>'): #no final key specified + tkMessageBox.showerror(title='Key Sequence Error', + message='No final key specified.') + keysOk=0 + elif (modifiers==['Shift']) and (finalKey not in self.functionKeys): + #shift alone is only a useful modifier with a function key + tkMessageBox.showerror(title='Key Sequence Error', + message='Shift alone is only a useful modifier '+ + 'when used with a function key.') + keysOk=0 + return keysOk + def Ok(self, event=None): if self.KeysOk(): ! self.result=self.keyString.get() self.destroy() ! def Cancel(self, event=None): ! self.result='' self.destroy() *************** *** 203,208 **** #aboutDialog.AboutDialog(root,'About') keySeq='' ! GetAccelDialog(root,'Get Keys','find-again',keySeq) ! print keySeq Button(root,text='Dialog',command=run).pack() root.mainloop() --- 231,236 ---- #aboutDialog.AboutDialog(root,'About') keySeq='' ! dlg=GetKeysDialog(root,'Get Keys','find-again') ! print dlg.result Button(root,text='Dialog',command=run).pack() root.mainloop() From elguavas@users.sourceforge.net Sat Jan 19 00:29:05 2002 From: elguavas@users.sourceforge.net (Stephen M. Gava) Date: Fri, 18 Jan 2002 16:29:05 -0800 Subject: [Idle-dev] CVS: idle configDialog.py,1.22,1.23 Message-ID: Update of /cvsroot/idlefork/idle In directory usw-pr-cvs1:/tmp/cvs-serv18963 Modified Files: configDialog.py Log Message: keybinding configuration Index: configDialog.py =================================================================== RCS file: /cvsroot/idlefork/idle/configDialog.py,v retrieving revision 1.22 retrieving revision 1.23 diff -C2 -r1.22 -r1.23 *** configDialog.py 2002/01/04 07:53:06 1.22 --- configDialog.py 2002/01/19 00:29:03 1.23 *************** *** 4,11 **** --- 4,13 ---- from Tkinter import * import tkMessageBox, tkColorChooser, tkFont + import string from configHandler import idleConf from dynOptionMenuWidget import DynOptionMenu from tabpage import TabPageSet + from keybindingDialog import GetKeysDialog class ConfigDialog(Toplevel): *************** *** 355,372 **** #frameCustom frameTarget=Frame(frameCustom) - frameSet=Frame(frameCustom) labelCustomTitle=Label(frameCustom,text='Set Custom Key Bindings') ! labelTargetTitle=Label(frameTarget,text='Action') ! scrollTarget=Scrollbar(frameTarget) ! listTarget=Listbox(frameTarget) ! scrollTarget.config(command=listTarget.yview) ! listTarget.config(yscrollcommand=scrollTarget.set) ! labelKeyBindTitle=Label(frameSet,text='Binding') ! labelModifierTitle=Label(frameSet,text='Modifier:') ! checkCtrl=Checkbutton(frameSet,text='Ctrl') ! checkAlt=Checkbutton(frameSet,text='Alt') ! checkShift=Checkbutton(frameSet,text='Shift') ! labelKeyEntryTitle=Label(frameSet,text='Key:') ! entryKey=Entry(frameSet,width=4) buttonSaveCustomKeys=Button(frameCustom,text='Save as a Custom Key Set') #frameKeySets --- 357,371 ---- #frameCustom frameTarget=Frame(frameCustom) labelCustomTitle=Label(frameCustom,text='Set Custom Key Bindings') ! labelTargetTitle=Label(frameTarget,text='Action - Key(s)') ! scrollTargetY=Scrollbar(frameTarget) ! scrollTargetX=Scrollbar(frameTarget,orient=HORIZONTAL) ! self.listBindings=Listbox(frameTarget) ! scrollTargetY.config(command=self.listBindings.yview) ! scrollTargetX.config(command=self.listBindings.xview) ! self.listBindings.config(yscrollcommand=scrollTargetY.set) ! self.listBindings.config(xscrollcommand=scrollTargetX.set) ! buttonNewKeys=Button(frameCustom,text='Get New Keys for Selection', ! command=self.GetNewKeys) buttonSaveCustomKeys=Button(frameCustom,text='Save as a Custom Key Set') #frameKeySets *************** *** 389,404 **** labelCustomTitle.pack(side=TOP,anchor=W,padx=5,pady=5) buttonSaveCustomKeys.pack(side=BOTTOM,fill=X,padx=5,pady=5) ! frameTarget.pack(side=LEFT,padx=5,pady=5,fill=Y) ! frameSet.pack(side=LEFT,padx=5,pady=5,fill=Y) ! labelTargetTitle.pack(side=TOP,anchor=W) ! scrollTarget.pack(side=RIGHT,anchor=W,fill=Y) ! listTarget.pack(side=TOP,anchor=W,expand=TRUE,fill=BOTH) ! labelKeyBindTitle.pack(side=TOP,anchor=W) ! labelModifierTitle.pack(side=TOP,anchor=W,pady=5) ! checkCtrl.pack(side=TOP,anchor=W) ! checkAlt.pack(side=TOP,anchor=W,pady=2) ! checkShift.pack(side=TOP,anchor=W) ! labelKeyEntryTitle.pack(side=TOP,anchor=W,pady=5) ! entryKey.pack(side=TOP,anchor=W) #frameKeySets labelKeysTitle.pack(side=TOP,anchor=W,padx=5,pady=5) --- 388,400 ---- labelCustomTitle.pack(side=TOP,anchor=W,padx=5,pady=5) buttonSaveCustomKeys.pack(side=BOTTOM,fill=X,padx=5,pady=5) ! buttonNewKeys.pack(side=BOTTOM,fill=X,padx=5,pady=5) ! frameTarget.pack(side=LEFT,padx=5,pady=5,expand=TRUE,fill=BOTH) ! #frame target ! frameTarget.columnconfigure(0,weight=1) ! frameTarget.rowconfigure(1,weight=1) ! labelTargetTitle.grid(row=0,column=0,columnspan=2,sticky=W) ! self.listBindings.grid(row=1,column=0,sticky=NSEW) ! scrollTargetY.grid(row=1,column=1,sticky=NS) ! scrollTargetX.grid(row=2,column=0,sticky=EW) #frameKeySets labelKeysTitle.pack(side=TOP,anchor=W,padx=5,pady=5) *************** *** 433,437 **** #frameWinSize labelWinSizeTitle=Label(frameWinSize,text='Initial Window Size') - buttonWinSizeSet=Button(frameWinSize,text='Set to current window size') labelWinWidthTitle=Label(frameWinSize,text='Width') entryWinWidth=Entry(frameWinSize,textvariable=self.winWidth, --- 429,432 ---- *************** *** 468,477 **** radioRunSeparate.pack(side=LEFT,anchor=W,padx=5,pady=5) #frameWinSize ! labelWinSizeTitle.pack(side=TOP,anchor=W,padx=5,pady=5) ! buttonWinSizeSet.pack(side=LEFT,anchor=W,padx=5,pady=5) ! labelWinWidthTitle.pack(side=LEFT,anchor=W,padx=5,pady=5) ! entryWinWidth.pack(side=LEFT,anchor=W,padx=5,pady=5) ! labelWinHeightTitle.pack(side=LEFT,anchor=W,padx=5,pady=5) ! entryWinHeight.pack(side=LEFT,anchor=W,padx=5,pady=5) #frameExt labelExtTitle.pack(side=TOP,anchor=W,padx=5,pady=5) --- 463,471 ---- radioRunSeparate.pack(side=LEFT,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) ! labelWinHeightTitle.pack(side=RIGHT,anchor=E,pady=5) ! entryWinWidth.pack(side=RIGHT,anchor=E,padx=10,pady=5) ! labelWinWidthTitle.pack(side=RIGHT,anchor=E,pady=5) #frameExt labelExtTitle.pack(side=TOP,anchor=W,padx=5,pady=5) *************** *** 589,594 **** self.optMenuKeysBuiltin.SetMenu(itemList,itemList[0]) self.SetKeysType() ! ##load keyset element option menu def LoadConfigs(self): """ --- 583,612 ---- self.optMenuKeysBuiltin.SetMenu(itemList,itemList[0]) self.SetKeysType() ! ##load keyset element list ! keySet=idleConf.GetKeys(currentOption) ! bindNames=keySet.keys() ! bindNames.sort() ! for bindName in bindNames: ! key=string.join(keySet[bindName]) #make key(s) into a string ! bindName=bindName[2:-2] #trim off the angle brackets ! self.listBindings.insert(END, bindName+' - '+key) ! ! def GetNewKeys(self): ! listIndex=self.listBindings.index(ANCHOR) ! binding=self.listBindings.get(listIndex) ! bindName=binding.split()[0] #first part, up to first space ! newKeys=GetKeysDialog(self,'Get New Keys',bindName) ! print newKeys.result ! if newKeys.result: #new keys were specified ! self.listBindings.delete(listIndex) ! self.listBindings.insert(listIndex,bindName+' - '+newKeys.result) ! self.listBindings.select_set(listIndex) ! ! def LoadGeneralCfg(self): ! #initial window size ! self.winWidth.set(idleConf.GetOption('main','EditorWindow','width')) ! self.winHeight.set(idleConf.GetOption('main','EditorWindow','height')) + def LoadConfigs(self): """ *************** *** 605,608 **** --- 623,627 ---- ### help page ### general page + self.LoadGeneralCfg() def SaveConfigs(self): From elguavas@users.sourceforge.net Sat Jan 19 00:29:56 2002 From: elguavas@users.sourceforge.net (Stephen M. Gava) Date: Fri, 18 Jan 2002 16:29:56 -0800 Subject: [Idle-dev] CVS: idle config-keys.def,1.3,1.4 configHandler.py,1.10,1.11 dynOptionMenuWidget.py,1.3,1.4 Message-ID: Update of /cvsroot/idlefork/idle In directory usw-pr-cvs1:/tmp/cvs-serv19107 Modified Files: config-keys.def configHandler.py dynOptionMenuWidget.py Log Message: keybinding configuration Index: config-keys.def =================================================================== RCS file: /cvsroot/idlefork/idle/config-keys.def,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -r1.3 -r1.4 *** config-keys.def 2002/01/04 03:06:08 1.3 --- config-keys.def 2002/01/19 00:29:54 1.4 *************** *** 14,18 **** close-all-windows= close-window= - dump-undo-state= end-of-file= python-docs= --- 14,17 ---- *************** *** 50,54 **** close-window= do-nothing= - dump-undo-state= end-of-file= history-next= --- 49,52 ---- Index: configHandler.py =================================================================== RCS file: /cvsroot/idlefork/idle/configHandler.py,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -r1.10 -r1.11 *** configHandler.py 2002/01/04 07:53:06 1.10 --- configHandler.py 2002/01/19 00:29:54 1.11 *************** *** 258,262 **** '<>': [''], '<>': [''], - '<>': [''], '<>': [''], '<>': [''], --- 258,261 ---- Index: dynOptionMenuWidget.py =================================================================== RCS file: /cvsroot/idlefork/idle/dynOptionMenuWidget.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -r1.3 -r1.4 *** dynOptionMenuWidget.py 2001/11/03 14:55:47 1.3 --- dynOptionMenuWidget.py 2002/01/19 00:29:54 1.4 *************** *** 1,8 **** - ##---------------------------------------------------------------------------## - ## - ## idle - modified OptionMenu widget - ## elguavas - ## - ##---------------------------------------------------------------------------## """ OptionMenu widget modified to allow dynamic menu reconfiguration --- 1,2 ---- From elguavas@users.sourceforge.net Sat Jan 19 01:30:58 2002 From: elguavas@users.sourceforge.net (Stephen M. Gava) Date: Fri, 18 Jan 2002 17:30:58 -0800 Subject: [Idle-dev] CVS: idle configDialog.py,1.23,1.24 keybindingDialog.py,1.2,1.3 Message-ID: Update of /cvsroot/idlefork/idle In directory usw-pr-cvs1:/tmp/cvs-serv31355 Modified Files: configDialog.py keybindingDialog.py Log Message: keybinding configuration Index: configDialog.py =================================================================== RCS file: /cvsroot/idlefork/idle/configDialog.py,v retrieving revision 1.23 retrieving revision 1.24 diff -C2 -r1.23 -r1.24 *** configDialog.py 2002/01/19 00:29:03 1.23 --- configDialog.py 2002/01/19 01:30:56 1.24 *************** *** 596,601 **** binding=self.listBindings.get(listIndex) bindName=binding.split()[0] #first part, up to first space ! newKeys=GetKeysDialog(self,'Get New Keys',bindName) ! print newKeys.result if newKeys.result: #new keys were specified self.listBindings.delete(listIndex) --- 596,602 ---- binding=self.listBindings.get(listIndex) bindName=binding.split()[0] #first part, up to first space ! currentKeySet=idleConf.CurrentKeys() ! currentKeySequences=idleConf.GetKeys(currentKeySet).values() ! newKeys=GetKeysDialog(self,'Get New Keys',bindName,currentKeySequences) if newKeys.result: #new keys were specified self.listBindings.delete(listIndex) Index: keybindingDialog.py =================================================================== RCS file: /cvsroot/idlefork/idle/keybindingDialog.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -r1.2 -r1.3 *** keybindingDialog.py 2002/01/19 00:28:00 1.2 --- keybindingDialog.py 2002/01/19 01:30:56 1.3 *************** *** 7,11 **** class GetKeysDialog(Toplevel): ! def __init__(self,parent,title,action): Toplevel.__init__(self, parent) self.configure(borderwidth=5) --- 7,17 ---- class GetKeysDialog(Toplevel): ! def __init__(self,parent,title,action,currentKeySequences): ! """ ! action - string, the name of the virtual event these keys will be ! mapped to ! currentKeys - list, a list of all key sequence lists currently mapped ! to virtual events, for overlap checking ! """ Toplevel.__init__(self, parent) self.configure(borderwidth=5) *************** *** 17,20 **** --- 23,27 ---- self.parent = parent self.action=action + self.currentKeySequences=currentKeySequences self.result='' self.keyString=StringVar(self) *************** *** 192,195 **** --- 199,211 ---- (END,)+keys) + def Ok(self, event=None): + if self.KeysOk(): + self.result=self.keyString.get() + self.destroy() + + def Cancel(self, event=None): + self.result='' + self.destroy() + def KeysOk(self): #simple validity check *************** *** 199,202 **** --- 215,219 ---- finalKey=self.listKeysFinal.get(ANCHOR) modifiers=self.GetModifiers() + keySequence=keys.split()#make into a key sequence list for overlap check if not keys: #no keys specified tkMessageBox.showerror(title='Key Sequence Error', *************** *** 207,210 **** --- 224,232 ---- message='No final key specified.') keysOk=0 + elif (not modifiers) and (finalKey not in self.functionKeys): + #modifier required if not a function key + tkMessageBox.showerror(title='Key Sequence Error', + message='No modifier key(s) specified.') + keysOk=0 elif (modifiers==['Shift']) and (finalKey not in self.functionKeys): #shift alone is only a useful modifier with a function key *************** *** 213,227 **** 'when used with a function key.') keysOk=0 return keysOk - def Ok(self, event=None): - if self.KeysOk(): - self.result=self.keyString.get() - self.destroy() - - def Cancel(self, event=None): - self.result='' - self.destroy() - if __name__ == '__main__': #test the dialog --- 235,244 ---- 'when used with a function key.') keysOk=0 + elif keySequence in self.currentKeySequences: #keys combo already in use + tkMessageBox.showerror(title='Key Sequence Error', + message='This key combination is already in use.') + keysOk=0 return keysOk if __name__ == '__main__': #test the dialog *************** *** 231,235 **** #aboutDialog.AboutDialog(root,'About') keySeq='' ! dlg=GetKeysDialog(root,'Get Keys','find-again') print dlg.result Button(root,text='Dialog',command=run).pack() --- 248,252 ---- #aboutDialog.AboutDialog(root,'About') keySeq='' ! dlg=GetKeysDialog(root,'Get Keys','find-again',[]) print dlg.result Button(root,text='Dialog',command=run).pack() From elguavas@users.sourceforge.net Sat Jan 19 10:30:57 2002 From: elguavas@users.sourceforge.net (Stephen M. Gava) Date: Sat, 19 Jan 2002 02:30:57 -0800 Subject: [Idle-dev] CVS: idle keybindingDialog.py,1.3,1.4 Message-ID: Update of /cvsroot/idlefork/idle In directory usw-pr-cvs1:/tmp/cvs-serv16500 Modified Files: keybindingDialog.py Log Message: further work on keybinding configuration Index: keybindingDialog.py =================================================================== RCS file: /cvsroot/idlefork/idle/keybindingDialog.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -r1.3 -r1.4 *** keybindingDialog.py 2002/01/19 01:30:56 1.3 --- keybindingDialog.py 2002/01/19 10:30:54 1.4 *************** *** 162,168 **** if finalKey: if (not modifiers) and (finalKey in self.functionKeys): ! finalKey='<'+finalKey keyList.append(finalKey+'>') - keyStr=string.join(keyList,'-') self.keyString.set(keyStr) --- 162,169 ---- if finalKey: if (not modifiers) and (finalKey in self.functionKeys): ! finalKey='<'+self.TranslateKey(finalKey) ! else: ! finalKey=self.TranslateKey(finalKey) keyList.append(finalKey+'>') keyStr=string.join(keyList,'-') self.keyString.set(keyStr) *************** *** 190,201 **** self.functionKeys=('F1','F2','F2','F4','F5','F6','F7','F8','F9', 'F10','F11','F12') - self.punctuationKeys=tuple('~!@#%^&*()_-+={}[]|;:,./?') - self.specialKeys=('tab','space') self.alphanumKeys=tuple(string.ascii_lowercase+string.digits) #make a tuple of most of the useful common 'final' keys ! keys=(self.alphanumKeys+self.punctuationKeys+self.specialKeys+ ! self.functionKeys) apply(self.listKeysFinal.insert, (END,)+keys) def Ok(self, event=None): --- 191,221 ---- self.functionKeys=('F1','F2','F2','F4','F5','F6','F7','F8','F9', 'F10','F11','F12') self.alphanumKeys=tuple(string.ascii_lowercase+string.digits) + self.punctuationKeys=tuple('~!@#%^&*()_-+={}[]|;:,.<>/?') + self.whitespaceKeys=('Tab','Space','Return') + self.editKeys=('BackSpace','Delete','Insert') + self.moveKeys=('Home','End','Page Up','Page Down','Left Arrow', + 'Right Arrow','Up Arrow','Down Arrow') #make a tuple of most of the useful common 'final' keys ! keys=(self.alphanumKeys+self.punctuationKeys+self.functionKeys+ ! self.whitespaceKeys+self.editKeys+self.moveKeys) apply(self.listKeysFinal.insert, (END,)+keys) + + def TranslateKey(self,key): + #translate from key list value to tkinter key-id + translateDict={'~':'asciitilde','!':'exclam','@':'at','#':'numbersign', + '%':'percent','^':'asciicircum','&':'ampersand','*':'asterisk', + '(':'parenleft',')':'parenright','_':'underscore','-':'minus', + '+':'plus','=':'equal','{':'braceleft','}':'braceright', + '[':'bracketleft',']':'bracketright','|':'bar',';':'semicolon', + ':':'colon',',':'comma','.':'period','<':'less','>':'greater', + '/':'slash','?':'question','Page Up':'Prior','Page Down':'Next', + 'Left Arrow':'Left','Right Arrow':'Right','Up Arrow':'Up', + 'Down Arrow': 'Down'} + if key in translateDict.keys(): + key=translateDict[key] + key='Key-'+key + return key def Ok(self, event=None): From elguavas@users.sourceforge.net Sat Jan 19 10:32:15 2002 From: elguavas@users.sourceforge.net (Stephen M. Gava) Date: Sat, 19 Jan 2002 02:32:15 -0800 Subject: [Idle-dev] CVS: idle configHandler.py,1.11,1.12 Message-ID: Update of /cvsroot/idlefork/idle In directory usw-pr-cvs1:/tmp/cvs-serv16713 Modified Files: configHandler.py Log Message: further work on keybinding configuration Index: configHandler.py =================================================================== RCS file: /cvsroot/idlefork/idle/configHandler.py,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -r1.11 -r1.12 *** configHandler.py 2002/01/19 00:29:54 1.11 --- configHandler.py 2002/01/19 10:32:13 1.12 *************** *** 154,158 **** else: raise 'Invalid configSet specified' - return cfgParser.sections() --- 154,157 ---- *************** *** 216,221 **** activeOnly - boolean, if true only return active (enabled) extensions """ ! extns=self.GetSectionList('default','extensions') ! userExtns=self.GetSectionList('user','extensions') for extn in userExtns: if extn not in extns: #user has added own extension --- 215,222 ---- activeOnly - boolean, if true only return active (enabled) extensions """ ! extns=self.RemoveKeyBindNames( ! self.GetSectionList('default','extensions')) ! userExtns=self.RemoveKeyBindNames( ! self.GetSectionList('user','extensions')) for extn in userExtns: if extn not in extns: #user has added own extension *************** *** 231,234 **** --- 232,304 ---- return extns + def RemoveKeyBindNames(self,extnNameList): + #get rid of keybinding section names + names=extnNameList + kbNameIndicies=[] + for name in names: + if name.endswith('_bindings') or name.endswith('_cfgBindings'): + kbNameIndicies.append(names.index(name)) + kbNameIndicies.sort() + kbNameIndicies.reverse() + for index in kbNameIndicies: #delete each keybinding section name + del(names[index]) + return names + + def GetExtensionKeys(self,extensionName): + """ + returns a dictionary of the configurable keybindings for a particular + extension,as they exist in the dictionary returned by GetCurrentKeySet; + that is, where previously re-used bindings are disabled. + """ + keysName=extensionName+'_cfgBindings' + activeKeys=self.GetCurrentKeySet() + extKeys={} + if self.defaultCfg['extensions'].has_section(keysName): + eventNames=self.defaultCfg['extensions'].GetOptionList(keysName) + for eventName in eventNames: + event='<<'+eventName+'>>' + binding=activeKeys[event] + extKeys[event]=binding + return extKeys + + def __GetRawExtensionKeys(self,extensionName): + """ + returns a dictionary of the configurable keybindings for a particular + extension, as defined in the configuration files, or an empty dictionary + if no bindings are found + """ + keysName=extensionName+'_cfgBindings' + extKeys={} + if self.defaultCfg['extensions'].has_section(keysName): + eventNames=self.defaultCfg['extensions'].GetOptionList(keysName) + for eventName in eventNames: + binding=self.GetOption('extensions',keysName, + eventName,default='').split() + event='<<'+eventName+'>>' + extKeys[event]=binding + return extKeys + + def GetExtensionBindings(self,extensionName): + """ + Returns a dictionary of all the event bindings for a particular + extension. The configurable keybindings are returned as they exist in + the dictionary returned by GetCurrentKeySet; that is, where re-used + keybindings are disabled. + """ + bindsName=extensionName+'_bindings' + extBinds=self.GetExtensionKeys(extensionName) + #add the non-configurable bindings + if self.defaultCfg['extensions'].has_section(bindsName): + eventNames=self.defaultCfg['extensions'].GetOptionList(bindsName) + for eventName in eventNames: + binding=self.GetOption('extensions',bindsName, + eventName,default='').split() + event='<<'+eventName+'>>' + extBinds[event]=binding + + return extBinds + + + def GetKeyBinding(self, keySetName, eventStr): """ *************** *** 242,251 **** return binding ! def GetKeys(self, keySetName=None): """ ! returns the requested set of keybindings, with fallbacks if required. """ #keybindings loaded from the config file(s) are loaded _over_ these ! #defaults, so if there is a problem getting any binding there will #be an 'ultimate last resort fallback' to the CUA-ish bindings #defined here. --- 312,340 ---- return binding ! def GetCurrentKeySet(self): ! """ ! Returns a dictionary of: all current core keybindings, plus the ! keybindings for all currently active extensions. If a binding defined ! in an extension is already in use, that binding is disabled. ! """ ! currentKeySet=self.GetCoreKeys(keySetName=self.CurrentKeys()) ! activeExtns=self.GetExtensions(activeOnly=1) ! for extn in activeExtns: ! extKeys=self.__GetRawExtensionKeys(extn) ! if extKeys: #the extension defines keybindings ! for event in extKeys.keys(): ! if extKeys[event] in currentKeySet.values(): ! #the binding is already in use ! extKeys[event]='' #disable this binding ! currentKeySet[event]=extKeys[event] #add binding ! return currentKeySet ! ! def GetCoreKeys(self, keySetName=None): """ ! returns the requested set of core keybindings, with fallbacks if ! required. """ #keybindings loaded from the config file(s) are loaded _over_ these ! #defaults, so if there is a problem getting any core binding there will #be an 'ultimate last resort fallback' to the CUA-ish bindings #defined here. From elguavas@users.sourceforge.net Sat Jan 19 10:33:23 2002 From: elguavas@users.sourceforge.net (Stephen M. Gava) Date: Sat, 19 Jan 2002 02:33:23 -0800 Subject: [Idle-dev] CVS: idle configDialog.py,1.24,1.25 Message-ID: Update of /cvsroot/idlefork/idle In directory usw-pr-cvs1:/tmp/cvs-serv16848 Modified Files: configDialog.py Log Message: further work on keybinding configuration Index: configDialog.py =================================================================== RCS file: /cvsroot/idlefork/idle/configDialog.py,v retrieving revision 1.24 retrieving revision 1.25 diff -C2 -r1.24 -r1.25 *** configDialog.py 2002/01/19 01:30:56 1.24 --- configDialog.py 2002/01/19 10:33:21 1.25 *************** *** 584,588 **** self.SetKeysType() ##load keyset element list ! keySet=idleConf.GetKeys(currentOption) bindNames=keySet.keys() bindNames.sort() --- 584,588 ---- self.SetKeysType() ##load keyset element list ! keySet=idleConf.GetCurrentKeySet() bindNames=keySet.keys() bindNames.sort() *************** *** 596,601 **** binding=self.listBindings.get(listIndex) bindName=binding.split()[0] #first part, up to first space ! currentKeySet=idleConf.CurrentKeys() ! currentKeySequences=idleConf.GetKeys(currentKeySet).values() newKeys=GetKeysDialog(self,'Get New Keys',bindName,currentKeySequences) if newKeys.result: #new keys were specified --- 596,600 ---- binding=self.listBindings.get(listIndex) bindName=binding.split()[0] #first part, up to first space ! currentKeySequences=idleConf.GetCurrentKeySet().values() newKeys=GetKeysDialog(self,'Get New Keys',bindName,currentKeySequences) if newKeys.result: #new keys were specified From elguavas@users.sourceforge.net Sat Jan 19 10:35:08 2002 From: elguavas@users.sourceforge.net (Stephen M. Gava) Date: Sat, 19 Jan 2002 02:35:08 -0800 Subject: [Idle-dev] CVS: idle config-extensions.def,1.3,1.4 Message-ID: Update of /cvsroot/idlefork/idle In directory usw-pr-cvs1:/tmp/cvs-serv17110 Modified Files: config-extensions.def Log Message: changeover to new keybinding configuration implementation Index: config-extensions.def =================================================================== RCS file: /cvsroot/idlefork/idle/config-extensions.def,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -r1.3 -r1.4 *** config-extensions.def 2002/01/04 07:53:06 1.3 --- config-extensions.def 2002/01/19 10:35:06 1.4 *************** *** 1,25 **** # IDLE reads several config files to determine user preferences. This # file is the default config file for idle extensions settings. [FormatParagraph] enable=1 [AutoIndent] enable=1 [AutoExpand] enable=1 [ZoomHeight] enable=1 - #[ScriptBinding] # disabled in favor of ExecBinding - #enable=0 - [ExecBinding] enable=1 [CallTips] enable=1 [ParenMatch] --- 1,65 ---- # IDLE reads several config files to determine user preferences. This # file is the default config file for idle extensions settings. + # + # Each extension must have at least one section, named after the extension + # module. This section must contain an 'enable' item (=1 to enable the + # extension, =0 to disable it) and also contains any other general configuration + # items for the extension. Each extension may also define up to two optional + # sections named ExtensionName_bindings and ExtensionName_cfgBindings. If + # present, ExtensionName_bindings defines virtual event bindings for the + # extension that are not sensibly re-configurable. If present, + # ExtensionName_cfgBindings defines virtual event bindings for the extension + # that may be sensibly re-configured. [FormatParagraph] enable=1 + [FormatParagraph_cfgBindings] + format-paragraph= [AutoIndent] enable=1 + [AutoIndent_cfgBindings] + smart-backspace= + newline-and-indent= + smart-indent= + indent-region= + dedent-region= + comment-region= + uncomment-region= + tabify-region= + untabify-region= + toggle-tabs= + change-indentwidth= [AutoExpand] enable=1 + [AutoExpand_cfgBindings] + expand-word= [ZoomHeight] enable=1 + [ZoomHeight_cfgBindings] + zoom-height= [ExecBinding] enable=1 + [ExecBinding_cfgBindings] + run-complete-script= + stop-execution= + + #[ScriptBinding] #currently ExecBinding has replaced ScriptBinding + #enable=0 + #[ScriptBinding_cfgBindings] + #run-script= + #check-module= + #import-module= [CallTips] enable=1 + [CallTips_bindings] + paren-open= + paren-close= + check-calltip-cancel= + calltip-cancel= [ParenMatch] *************** *** 30,31 **** --- 70,74 ---- hilite-foreground= black hilite-background= #43cd80 + [ParenMatch_bindings] + flash-open-paren= + check-restore= From elguavas@users.sourceforge.net Sat Jan 19 10:36:56 2002 From: elguavas@users.sourceforge.net (Stephen M. Gava) Date: Sat, 19 Jan 2002 02:36:56 -0800 Subject: [Idle-dev] CVS: idle AutoExpand.py,1.3,1.4 Message-ID: Update of /cvsroot/idlefork/idle In directory usw-pr-cvs1:/tmp/cvs-serv17400 Modified Files: AutoExpand.py Log Message: changeover to new keybinding configuration implementation Index: AutoExpand.py =================================================================== RCS file: /cvsroot/idlefork/idle/AutoExpand.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -r1.3 -r1.4 *** AutoExpand.py 2001/07/12 22:13:51 1.3 --- AutoExpand.py 2002/01/19 10:36:54 1.4 *************** *** 8,19 **** class AutoExpand: - keydefs = { - '<>': [''], - } - - unix_keydefs = { - '<>': ['', ''], - } - menudefs = [ ('edit', [ --- 8,11 ---- From elguavas@users.sourceforge.net Sat Jan 19 10:37:50 2002 From: elguavas@users.sourceforge.net (Stephen M. Gava) Date: Sat, 19 Jan 2002 02:37:50 -0800 Subject: [Idle-dev] CVS: idle AutoIndent.py,1.2,1.3 Message-ID: Update of /cvsroot/idlefork/idle In directory usw-pr-cvs1:/tmp/cvs-serv17548 Modified Files: AutoIndent.py Log Message: changeover to new keybinding configuration implementation Index: AutoIndent.py =================================================================== RCS file: /cvsroot/idlefork/idle/AutoIndent.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -r1.2 -r1.3 *** AutoIndent.py 2001/07/04 03:15:10 1.2 --- AutoIndent.py 2002/01/19 10:37:48 1.3 *************** *** 42,46 **** menudefs = [ ('format', [ # /s/edit/format dscherer@cmu.edu - None, ('_Indent region', '<>'), ('_Dedent region', '<>'), --- 42,45 ---- *************** *** 53,89 **** ]), ] - - keydefs = { - '<>': [''], - '<>': ['', ''], - '<>': [''] - } - - windows_keydefs = { - '<>': [''], - '<>': ['', # dscherer@cmu.edu - ''], - '<>': [''], - '<>': [''], - '<>': [''], - '<>': [''], - '<>': [''], - '<>': [''], - } - - unix_keydefs = { - '<>': ['', - '', - ''], - '<>': ['', - '', - ''], - '<>': ['', ''], - '<>': ['', ''], - '<>': ['', ''], - '<>': ['', ''], - '<>': [''], - '<>': [''], - } # usetabs true -> literal tab characters are used by indent and --- 52,55 ---- From elguavas@users.sourceforge.net Sat Jan 19 10:38:53 2002 From: elguavas@users.sourceforge.net (Stephen M. Gava) Date: Sat, 19 Jan 2002 02:38:53 -0800 Subject: [Idle-dev] CVS: idle Bindings.py,1.7,1.8 Message-ID: Update of /cvsroot/idlefork/idle In directory usw-pr-cvs1:/tmp/cvs-serv17698 Modified Files: Bindings.py Log Message: changeover to new keybinding configuration implementation Index: Bindings.py =================================================================== RCS file: /cvsroot/idlefork/idle/Bindings.py,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -r1.7 -r1.8 *** Bindings.py 2002/01/04 07:53:06 1.7 --- Bindings.py 2002/01/19 10:38:51 1.8 *************** *** 74,78 **** ] ! default_keydefs = idleConf.GetKeys(keySetName=idleConf.CurrentKeys()) del sys --- 74,78 ---- ] ! default_keydefs = idleConf.GetCurrentKeySet() del sys From elguavas@users.sourceforge.net Sat Jan 19 10:39:49 2002 From: elguavas@users.sourceforge.net (Stephen M. Gava) Date: Sat, 19 Jan 2002 02:39:49 -0800 Subject: [Idle-dev] CVS: idle CallTips.py,1.3,1.4 Message-ID: Update of /cvsroot/idlefork/idle In directory usw-pr-cvs1:/tmp/cvs-serv17874 Modified Files: CallTips.py Log Message: changeover to new keybinding configuration implementation Index: CallTips.py =================================================================== RCS file: /cvsroot/idlefork/idle/CallTips.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -r1.3 -r1.4 *** CallTips.py 2001/07/12 23:10:35 1.3 --- CallTips.py 2002/01/19 10:39:47 1.4 *************** *** 11,27 **** ] - keydefs = { - '<>': [''], - '<>': [''], - '<>': [''], - '<>': ['', ''], - } - - windows_keydefs = { - } - - unix_keydefs = { - } - def __init__(self, editwin): self.editwin = editwin --- 11,14 ---- From elguavas@users.sourceforge.net Sat Jan 19 10:40:44 2002 From: elguavas@users.sourceforge.net (Stephen M. Gava) Date: Sat, 19 Jan 2002 02:40:44 -0800 Subject: [Idle-dev] CVS: idle EditorWindow.py,1.14,1.15 Message-ID: Update of /cvsroot/idlefork/idle In directory usw-pr-cvs1:/tmp/cvs-serv18035 Modified Files: EditorWindow.py Log Message: changeover to new keybinding configuration implementation Index: EditorWindow.py =================================================================== RCS file: /cvsroot/idlefork/idle/EditorWindow.py,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -r1.14 -r1.15 *** EditorWindow.py 2002/01/04 07:53:06 1.14 --- EditorWindow.py 2002/01/19 10:40:41 1.15 *************** *** 591,605 **** ins = cls(self) self.extensions[name] = ins ! kdnames = ["keydefs"] ! if sys.platform == 'win32': ! kdnames.append("windows_keydefs") ! elif sys.platform == 'mac': ! kdnames.append("mac_keydefs") ! else: ! kdnames.append("unix_keydefs") ! keydefs = {} ! for kdname in kdnames: ! if hasattr(ins, kdname): ! keydefs.update(getattr(ins, kdname)) if keydefs: self.apply_bindings(keydefs) --- 591,595 ---- ins = cls(self) self.extensions[name] = ins ! keydefs=idleConf.GetExtensionBindings(name) if keydefs: self.apply_bindings(keydefs) *************** *** 613,616 **** --- 603,607 ---- if hasattr(ins, methodname): self.text.bind(vevent, getattr(ins, methodname)) + if hasattr(ins, "menudefs"): self.fill_menus(ins.menudefs, keydefs) From elguavas@users.sourceforge.net Sat Jan 19 10:41:53 2002 From: elguavas@users.sourceforge.net (Stephen M. Gava) Date: Sat, 19 Jan 2002 02:41:53 -0800 Subject: [Idle-dev] CVS: idle ExecBinding.py,1.2,1.3 FormatParagraph.py,1.3,1.4 ParenMatch.py,1.3,1.4 ScriptBinding.py,1.3,1.4 ZoomHeight.py,1.2,1.3 Message-ID: Update of /cvsroot/idlefork/idle In directory usw-pr-cvs1:/tmp/cvs-serv18204 Modified Files: ExecBinding.py FormatParagraph.py ParenMatch.py ScriptBinding.py ZoomHeight.py Log Message: changeover to new keybinding configuration implementation Index: ExecBinding.py =================================================================== RCS file: /cvsroot/idlefork/idle/ExecBinding.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -r1.2 -r1.3 *** ExecBinding.py 2001/07/04 03:15:10 1.2 --- ExecBinding.py 2002/01/19 10:41:51 1.3 *************** *** 46,54 **** class ExecBinding: - keydefs = { - '<>': [''], - '<>': [''], #'' - } - menudefs = [ ('run', [None, --- 46,49 ---- Index: FormatParagraph.py =================================================================== RCS file: /cvsroot/idlefork/idle/FormatParagraph.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -r1.3 -r1.4 *** FormatParagraph.py 2001/07/13 04:12:02 1.3 --- FormatParagraph.py 2002/01/19 10:41:51 1.4 *************** *** 26,37 **** ] - keydefs = { - '<>': [''], - } - - unix_keydefs = { - '<>': [''], - } - def __init__(self, editwin): self.editwin = editwin --- 26,29 ---- Index: ParenMatch.py =================================================================== RCS file: /cvsroot/idlefork/idle/ParenMatch.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -r1.3 -r1.4 *** ParenMatch.py 2001/07/13 19:49:27 1.3 --- ParenMatch.py 2002/01/19 10:41:51 1.4 *************** *** 44,60 **** so I haven't bothered. """ - menudefs = [] - - keydefs = { - '<>' : ('', - '', - ''), - '<>' : ('',), - } - - windows_keydefs = {} - unix_keydefs = {} - iconf = idleconf.getsection('ParenMatch') STYLE = iconf.getdef('style', 'default') --- 44,48 ---- Index: ScriptBinding.py =================================================================== RCS file: /cvsroot/idlefork/idle/ScriptBinding.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -r1.3 -r1.4 *** ScriptBinding.py 2001/07/12 06:46:53 1.3 --- ScriptBinding.py 2002/01/19 10:41:51 1.4 *************** *** 36,45 **** class ScriptBinding: - keydefs = { - '<>': ['', ''], - '<>': [''], - '<>': [''], - } - menudefs = [ ('edit', [None, --- 36,39 ---- Index: ZoomHeight.py =================================================================== RCS file: /cvsroot/idlefork/idle/ZoomHeight.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -r1.2 -r1.3 *** ZoomHeight.py 2001/07/04 03:15:10 1.2 --- ZoomHeight.py 2002/01/19 10:41:51 1.3 *************** *** 11,22 **** ]) ] ! ! windows_keydefs = { ! '<>': [''], ! } ! unix_keydefs = { ! '<>': [''], ! } ! def __init__(self, editwin): self.editwin = editwin --- 11,15 ---- ]) ] ! def __init__(self, editwin): self.editwin = editwin From denise@yahoo.com Sun Jan 20 15:20:20 2002 From: denise@yahoo.com (denise@yahoo.com) Date: Sun, 20 Jan 2002 16:20:20 +0100 Subject: [Idle-dev] Re: Scusa Message-ID: <296765-220021020152020910@yahoo.com> ------=_NextPart_84815C5ABAF209EF376268C8 Content-type: text/plain; charset="US-ASCII" Un gruppo italiano Libero, Gratuito e Totalmente Trasgressivo il SITO DI BETTY(bonitait)......si è trasferito al nuovo indirizzo vieni subito.. montagne di ..tutto per partecipare gratis scrivi a: bonitait-subscribe@yahoogroups.com per visitare il sito vai a: http://it.groups.yahoo.com/group/bonitait"Attenzione il sito è esclusivamente per adulti" Vuoi di più.......^^^?? Visita I siti suggeriti da Betty : HTTP://sex1.dot.nu HTTP://avixx.dot.nu SMS Gratis, Logos, Top Ring http://www.starlinecard.com/sms/ ------=_NextPart_84815C5ABAF209EF376268C8 Content-Type: text/html; charset="US-ASCII" Content-Transfer-Encoding: quoted-printable

Un gruppo=20 italiano

Libero, Gratuito e Totalmen= te=20 Trasgressivo=20

il SITO DI=20 BETTY(bonitait)=2E=2E=2E=2E=2E=2Esi =E8 trasferito al nuovo indirizzo vien= i subito=2E=2E montagne=20 di =2E=2Etutto per partecipare gratis scrivi a:

per visitare il sito vai a:

bonitai= t-subscribe@yahoogroups=2Ecom

http://it=2E= groups=2Eyahoo=2Ecom/group/bonitait
"Attenzione il sito =E8 esclusivamente per=20 adulti"

Vuoi di=20 pi=F9=2E=2E=2E=2E=2E=2E=2E^^^??

Visita I siti sugger= iti da=20 Betty :

HTTP://sex1=2Edot=2Enu

HTTP://av= ixx=2Edot=2Enu

SMS Gratis, Logos, Top=20 Ring

http://www=2Estarlinec= ard=2Ecom/sms/

<= /FONT>

------=_NextPart_84815C5ABAF209EF376268C8-- From mats@laplaza.org Sat Jan 19 14:10:56 2002 From: mats@laplaza.org (Mats Wichmann) Date: Sat, 19 Jan 2002 14:10:56 +0000 Subject: [Idle-dev] Use of __future__ features in IDLE In-Reply-To: References: Message-ID: <5.1.0.14.1.20020119210445.00ae18a0@204.151.72.2> I just had occasion to try out an interactive example that's intended to demonstrate the difference in Python 2.1 (still the subject of my training curriculum for a while) of: from __future__ import nested_scopes ... and was somewhat surprised to find out that in the IDLE distributed with Python 2.1.1 at least, it seems to have no effect, throwing an exception as if the nested_scopes were not enabled: SyntaxError: local name 'b' in 'testfun' shadows use of 'b' as global in nested scope 'inner_test' (, line 1) I'm being a little lazy here, for several days I don't have access to any of my normal stuff, only email, so I can't see what happens with idlefork, the idle in 2.2, or so on (of course, in 2.2, I'd have to find a different future feature to try). The same bit of test code has no problems demonstrating the behavior (i.e. showing the difference between the import and omitting it) through the regular Python 2.1 interpreter, or Jython 2.1 for that matter. Just curious what's going on here and if there's a way to address it? From tim.one@home.com Sun Jan 20 21:43:48 2002 From: tim.one@home.com (Tim Peters) Date: Sun, 20 Jan 2002 16:43:48 -0500 Subject: Mats Wichmann: [Idle-dev] Use of __future__ features in IDLE In-Reply-To: <200201201850.NAA05247@cj20424-a.reston1.va.home.com> Message-ID: > Do you recall what this was? A limitation documented in PEP 236 (the __future__ PEP). Michael Hudson and I repaired it for Python 2.2, via PEP 264 ("Future statements in simulated shells"). The fixes are too involved to backstitch into 2.1.x without significant effort, and nobody volunteered. Even in 2.2, it's *easier* in IDLE to deal with a __future__ statement by sticking one at the top of an IDLE file window, and using Execute Script repeatedly as the file changes. Nested scopes in particular require writing non-trivial code to have visible effect, and typing non-trivial code "live" at an interactive prompt is often a regrettable idea. From elguavas@users.sourceforge.net Mon Jan 21 06:38:23 2002 From: elguavas@users.sourceforge.net (Stephen M. Gava) Date: Sun, 20 Jan 2002 22:38:23 -0800 Subject: [Idle-dev] CVS: idle configDialog.py,1.25,1.26 configHandler.py,1.12,1.13 config-main.def,1.6,1.7 Message-ID: Update of /cvsroot/idlefork/idle In directory usw-pr-cvs1:/tmp/cvs-serv13988 Modified Files: configDialog.py configHandler.py config-main.def Log Message: extension config reading by configDialog and beginning of configuration saving Index: configDialog.py =================================================================== RCS file: /cvsroot/idlefork/idle/configDialog.py,v retrieving revision 1.25 retrieving revision 1.26 diff -C2 -r1.25 -r1.26 *** configDialog.py 2002/01/19 10:33:21 1.25 --- configDialog.py 2002/01/21 06:38:21 1.26 *************** *** 37,40 **** --- 37,50 ---- 'Shell Stdout Text':('stdout','10'), 'Shell Stderr Text':('stderr','11')} + #changedItems. When any config item is changed in this dialog, an entry + #should be made in the relevant section (config type) of this + #dictionary. The key should be the config file section name and the + #value a dictionary, whose key:value pairs are item=value pairs for + #that config file section. + self.changedItems={'main':{},'highlight':{},'keys':{},'extensions':{}} + #defaultItems. This dictionary is loaded with the values from the + #default config files. It is used for comparison with self.changedItems + #to decide which changed items actually need saving. + self.defaultItems=self.GetDefaultItems() self.CreateWidgets() self.resizable(height=FALSE,width=FALSE) *************** *** 45,142 **** self.tabPages.focus_set() #key bindings for this dialog ! self.bind('',self.CancelBinding) #dismiss dialog, no save ! self.bind('',self.ApplyBinding) #apply changes, save ! self.bind('',self.HelpBinding) #context help self.LoadConfigs() self.wait_window() - def Cancel(self): - self.destroy() - - def Ok(self): - pass - - def Apply(self): - pass - - def Help(self): - pass - - def CancelBinding(self,event): - self.Cancel() - - def OkBinding(self,event): - self.Ok() - - def ApplyBinding(self,event): - self.Apply() - - def HelpBinding(self,event): - self.Help() - - def SetThemeType(self): - if self.themeIsBuiltin.get(): - self.optMenuThemeBuiltin.config(state=NORMAL) - self.optMenuThemeCustom.config(state=DISABLED) - self.buttonDeleteCustomTheme.config(state=DISABLED) - else: - self.optMenuThemeBuiltin.config(state=DISABLED) - self.optMenuThemeCustom.config(state=NORMAL) - self.buttonDeleteCustomTheme.config(state=NORMAL) - - def SetKeysType(self): - if self.keysAreDefault.get(): - self.optMenuKeysBuiltin.config(state=NORMAL) - self.optMenuKeysCustom.config(state=DISABLED) - self.buttonDeleteCustomKeys.config(state=DISABLED) - else: - self.optMenuKeysBuiltin.config(state=DISABLED) - self.optMenuKeysCustom.config(state=NORMAL) - self.buttonDeleteCustomKeys.config(state=NORMAL) - - def GetColour(self): - target=self.highlightTarget.get() - rgbTuplet, colourString = tkColorChooser.askcolor(parent=self, - title='Pick new colour for : '+target, - initialcolor=self.frameColourSet.cget('bg')) - if colourString: #user didn't cancel - self.frameColourSet.config(bg=colourString)#set sample - if self.fgHilite.get(): plane='foreground' - else: plane='background' - apply(self.textHighlightSample.tag_config, - (self.themeElements[target][0],),{plane:colourString}) - - def SetFontSampleBinding(self,event): - self.SetFontSample() - - def SetFontSample(self): - self.editFont.config(size=self.fontSize.get(),weight=NORMAL, - family=self.listFontName.get(self.listFontName.curselection()[0])) - - def SetHighlightTargetBinding(self,*args): - self.SetHighlightTarget() - - def SetHighlightTarget(self): - if self.highlightTarget.get()=='Cursor': #bg not possible - self.radioFg.config(state=DISABLED) - self.radioBg.config(state=DISABLED) - self.fgHilite.set(1) - else: #both fg and bg can be set - self.radioFg.config(state=NORMAL) - self.radioBg.config(state=NORMAL) - self.fgHilite.set(1) - self.SetColourSample() - - def SetColourSampleBinding(self,*args): - self.SetColourSample() - - def SetColourSample(self): - #set the colour smaple area - tag=self.themeElements[self.highlightTarget.get()][0] - if self.fgHilite.get(): plane='foreground' - else: plane='background' - colour=self.textHighlightSample.tag_cget(tag,plane) - self.frameColourSet.config(bg=colour) - def CreateWidgets(self): self.tabPages = TabPageSet(self, --- 55,64 ---- self.tabPages.focus_set() #key bindings for this dialog ! #self.bind('',self.Cancel) #dismiss dialog, no save ! #self.bind('',self.Apply) #apply changes, save ! #self.bind('',self.Help) #context help self.LoadConfigs() self.wait_window() def CreateWidgets(self): self.tabPages = TabPageSet(self, *************** *** 150,154 **** command=self.Ok,takefocus=FALSE) self.buttonApply = Button(frameActionButtons,text='Apply', ! command=self.Apply,underline=0,takefocus=FALSE) self.buttonCancel = Button(frameActionButtons,text='Cancel', command=self.Cancel,takefocus=FALSE) --- 72,76 ---- command=self.Ok,takefocus=FALSE) self.buttonApply = Button(frameActionButtons,text='Apply', ! command=self.Apply,takefocus=FALSE) self.buttonCancel = Button(frameActionButtons,text='Cancel', command=self.Cancel,takefocus=FALSE) *************** *** 163,168 **** frameActionButtons.pack(side=BOTTOM) self.tabPages.pack(side=TOP,expand=TRUE,fill=BOTH) ! ! def CreatePageFontTab(self): #tkVars --- 85,89 ---- frameActionButtons.pack(side=BOTTOM) self.tabPages.pack(side=TOP,expand=TRUE,fill=BOTH) ! def CreatePageFontTab(self): #tkVars *************** *** 362,371 **** scrollTargetX=Scrollbar(frameTarget,orient=HORIZONTAL) self.listBindings=Listbox(frameTarget) scrollTargetY.config(command=self.listBindings.yview) scrollTargetX.config(command=self.listBindings.xview) self.listBindings.config(yscrollcommand=scrollTargetY.set) self.listBindings.config(xscrollcommand=scrollTargetX.set) ! buttonNewKeys=Button(frameCustom,text='Get New Keys for Selection', ! command=self.GetNewKeys) buttonSaveCustomKeys=Button(frameCustom,text='Save as a Custom Key Set') #frameKeySets --- 283,293 ---- scrollTargetX=Scrollbar(frameTarget,orient=HORIZONTAL) self.listBindings=Listbox(frameTarget) + self.listBindings.bind('',self.KeyBindingSelected) scrollTargetY.config(command=self.listBindings.yview) scrollTargetX.config(command=self.listBindings.xview) self.listBindings.config(yscrollcommand=scrollTargetY.set) self.listBindings.config(xscrollcommand=scrollTargetX.set) ! self.buttonNewKeys=Button(frameCustom,text='Get New Keys for Selection', ! command=self.GetNewKeys,state=DISABLED) buttonSaveCustomKeys=Button(frameCustom,text='Save as a Custom Key Set') #frameKeySets *************** *** 388,392 **** labelCustomTitle.pack(side=TOP,anchor=W,padx=5,pady=5) buttonSaveCustomKeys.pack(side=BOTTOM,fill=X,padx=5,pady=5) ! buttonNewKeys.pack(side=BOTTOM,fill=X,padx=5,pady=5) frameTarget.pack(side=LEFT,padx=5,pady=5,expand=TRUE,fill=BOTH) #frame target --- 310,314 ---- labelCustomTitle.pack(side=TOP,anchor=W,padx=5,pady=5) buttonSaveCustomKeys.pack(side=BOTTOM,fill=X,padx=5,pady=5) ! self.buttonNewKeys.pack(side=BOTTOM,fill=X,padx=5,pady=5) frameTarget.pack(side=LEFT,padx=5,pady=5,expand=TRUE,fill=BOTH) #frame target *************** *** 412,416 **** self.winWidth=StringVar(self) self.winHeight=StringVar(self) ! self.extState=IntVar(self) #widget creation #body --- 334,338 ---- self.winWidth=StringVar(self) self.winHeight=StringVar(self) ! self.startupEdit=IntVar(self) #widget creation #body *************** *** 421,432 **** frameExt=Frame(frame,borderwidth=2,relief=GROOVE) #frameRun ! labelRunTitle=Label(frameRun,text='Run Preferences') ! labelRunChoiceTitle=Label(frameRun,text='Run code : ') ! radioRunInternal=Radiobutton(frameRun,variable=self.runType, ! value=0,command=self.SetKeysType,text="in IDLE's Process") ! radioRunSeparate=Radiobutton(frameRun,variable=self.runType, ! value=1,command=self.SetKeysType,text='in a Separate Process') #frameWinSize ! labelWinSizeTitle=Label(frameWinSize,text='Initial Window Size') labelWinWidthTitle=Label(frameWinSize,text='Width') entryWinWidth=Entry(frameWinSize,textvariable=self.winWidth, --- 343,355 ---- frameExt=Frame(frame,borderwidth=2,relief=GROOVE) #frameRun ! labelRunTitle=Label(frameRun,text='Startup Preferences') ! labelRunChoiceTitle=Label(frameRun,text='On 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') #frameWinSize ! labelWinSizeTitle=Label(frameWinSize,text='Initial Window Size'+ ! ' (in characters)') labelWinWidthTitle=Label(frameWinSize,text='Width') entryWinWidth=Entry(frameWinSize,textvariable=self.winWidth, *************** *** 441,455 **** labelExtListTitle=Label(frameExtList,text='Extension') scrollExtList=Scrollbar(frameExtList) ! listExt=Listbox(frameExtList,height=5) ! scrollExtList.config(command=listExt.yview) ! listExt.config(yscrollcommand=scrollExtList.set) labelExtSetTitle=Label(frameExtSet,text='Settings') ! radioEnableExt=Radiobutton(frameExtSet,variable=self.extState, ! value=1,text="enable") ! radioDisableExt=Radiobutton(frameExtSet,variable=self.extState, ! value=0,text="disable") ! self.extState.set(1) ! buttonExtConfig=Button(frameExtSet,text='Configure') ! #widget packing #body --- 364,377 ---- labelExtListTitle=Label(frameExtList,text='Extension') scrollExtList=Scrollbar(frameExtList) ! self.listExt=Listbox(frameExtList,height=5) ! scrollExtList.config(command=self.listExt.yview) ! self.listExt.config(yscrollcommand=scrollExtList.set) ! self.listExt.bind('',self.ExtensionSelected) labelExtSetTitle=Label(frameExtSet,text='Settings') ! self.radioEnableExt=Radiobutton(frameExtSet,variable=self.startupEdit, ! value=1,text="enabled",state=DISABLED) ! self.radioDisableExt=Radiobutton(frameExtSet,variable=self.startupEdit, ! value=0,text="disabled",state=DISABLED) ! self.buttonExtConfig=Button(frameExtSet,text='Configure',state=DISABLED) #widget packing #body *************** *** 460,465 **** labelRunTitle.pack(side=TOP,anchor=W,padx=5,pady=5) labelRunChoiceTitle.pack(side=LEFT,anchor=W,padx=5,pady=5) ! radioRunInternal.pack(side=LEFT,anchor=W,padx=5,pady=5) ! radioRunSeparate.pack(side=LEFT,anchor=W,padx=5,pady=5) #frameWinSize labelWinSizeTitle.pack(side=LEFT,anchor=W,padx=5,pady=5) --- 382,387 ---- 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) #frameWinSize labelWinSizeTitle.pack(side=LEFT,anchor=W,padx=5,pady=5) *************** *** 474,485 **** labelExtListTitle.pack(side=TOP,anchor=W) scrollExtList.pack(side=RIGHT,anchor=W,fill=Y) ! listExt.pack(side=LEFT,anchor=E,expand=TRUE,fill=BOTH) labelExtSetTitle.pack(side=TOP,anchor=W) ! radioEnableExt.pack(side=TOP,anchor=W) ! radioDisableExt.pack(side=TOP,anchor=W) ! buttonExtConfig.pack(side=TOP,anchor=W,pady=5) ! return frame def PaintThemeSample(self): if self.themeIsBuiltin.get(): #a default theme --- 396,482 ---- labelExtListTitle.pack(side=TOP,anchor=W) scrollExtList.pack(side=RIGHT,anchor=W,fill=Y) ! self.listExt.pack(side=LEFT,anchor=E,expand=TRUE,fill=BOTH) labelExtSetTitle.pack(side=TOP,anchor=W) ! self.radioEnableExt.pack(side=TOP,anchor=W) ! self.radioDisableExt.pack(side=TOP,anchor=W) ! self.buttonExtConfig.pack(side=TOP,anchor=W,pady=5) return frame + def GetDefaultItems(self): + dItems={'main':{},'highlight':{},'keys':{},'extensions':{}} + for configType in dItems.keys(): + sections=idleConf.GetSectionList('default',configType) + for section in sections: + dItems[configType][section]={} + options=idleConf.defaultCfg[configType].GetOptionList(section) + for option in options: + dItems[configType][section][option]=( + idleConf.defaultCfg[configType].Get(section,option)) + return dItems + + def SetThemeType(self): + if self.themeIsBuiltin.get(): + self.optMenuThemeBuiltin.config(state=NORMAL) + self.optMenuThemeCustom.config(state=DISABLED) + self.buttonDeleteCustomTheme.config(state=DISABLED) + else: + self.optMenuThemeBuiltin.config(state=DISABLED) + self.optMenuThemeCustom.config(state=NORMAL) + self.buttonDeleteCustomTheme.config(state=NORMAL) + + def SetKeysType(self): + if self.keysAreDefault.get(): + self.optMenuKeysBuiltin.config(state=NORMAL) + self.optMenuKeysCustom.config(state=DISABLED) + self.buttonDeleteCustomKeys.config(state=DISABLED) + else: + self.optMenuKeysBuiltin.config(state=DISABLED) + self.optMenuKeysCustom.config(state=NORMAL) + self.buttonDeleteCustomKeys.config(state=NORMAL) + + def GetColour(self): + target=self.highlightTarget.get() + rgbTuplet, colourString = tkColorChooser.askcolor(parent=self, + title='Pick new colour for : '+target, + initialcolor=self.frameColourSet.cget('bg')) + if colourString: #user didn't cancel + self.frameColourSet.config(bg=colourString)#set sample + if self.fgHilite.get(): plane='foreground' + else: plane='background' + apply(self.textHighlightSample.tag_config, + (self.themeElements[target][0],),{plane:colourString}) + + def SetFontSampleBinding(self,event): + self.SetFontSample() + + def SetFontSample(self): + self.editFont.config(size=self.fontSize.get(),weight=NORMAL, + family=self.listFontName.get(self.listFontName.curselection()[0])) + + def SetHighlightTargetBinding(self,*args): + self.SetHighlightTarget() + + def SetHighlightTarget(self): + if self.highlightTarget.get()=='Cursor': #bg not possible + self.radioFg.config(state=DISABLED) + self.radioBg.config(state=DISABLED) + self.fgHilite.set(1) + else: #both fg and bg can be set + self.radioFg.config(state=NORMAL) + self.radioBg.config(state=NORMAL) + self.fgHilite.set(1) + self.SetColourSample() + + def SetColourSampleBinding(self,*args): + self.SetColourSample() + + def SetColourSample(self): + #set the colour smaple area + tag=self.themeElements[self.highlightTarget.get()][0] + if self.fgHilite.get(): plane='foreground' + else: plane='background' + colour=self.textHighlightSample.tag_cget(tag,plane) + self.frameColourSet.config(bg=colour) + def PaintThemeSample(self): if self.themeIsBuiltin.get(): #a default theme *************** *** 602,612 **** self.listBindings.insert(listIndex,bindName+' - '+newKeys.result) self.listBindings.select_set(listIndex) ! def LoadGeneralCfg(self): #initial window size self.winWidth.set(idleConf.GetOption('main','EditorWindow','width')) self.winHeight.set(idleConf.GetOption('main','EditorWindow','height')) ! ! def LoadConfigs(self): """ --- 599,625 ---- self.listBindings.insert(listIndex,bindName+' - '+newKeys.result) self.listBindings.select_set(listIndex) ! ! def KeyBindingSelected(self,event): ! self.buttonNewKeys.config(state=NORMAL) ! def LoadGeneralCfg(self): + #startup state + self.startupEdit.set(idleConf.GetOption('main','General', + 'editor-on-startup',default=1,type='bool')) #initial window size self.winWidth.set(idleConf.GetOption('main','EditorWindow','width')) self.winHeight.set(idleConf.GetOption('main','EditorWindow','height')) ! #extensions ! extns=idleConf.GetExtensions(activeOnly=0) ! apply(self.listExt.insert,(END,)+tuple(extns)) ! ! def ExtensionSelected(self,event): ! self.radioEnableExt.config(state=NORMAL) ! self.radioDisableExt.config(state=NORMAL) ! self.buttonExtConfig.config(state=NORMAL) ! extn=self.listExt.get(ANCHOR) ! self.extState.set(idleConf.GetOption('extensions',extn,'enable', ! default=1,type='bool')) ! def LoadConfigs(self): """ *************** *** 629,632 **** --- 642,670 ---- save configuration changes to user config files. """ + #DEBUG + print self.defaultItems + print self.changedItems + for configType in self.changedItems.keys(): + for section in self.changedItems[configType].keys(): + for item in self.changedItems[configType][section].keys(): + #DEBUG + value=self.changedItems[configType][section][item] + print configType, section, item, value + print self.changedItems + + def AddChangedItem(self,type,section,item,value): + self.changedItems[type][section][item]=value + + def Cancel(self): + self.destroy() + + def Ok(self): + self.Apply() + self.destroy() + + def Apply(self): + self.SaveConfigs() + + def Help(self): pass Index: configHandler.py =================================================================== RCS file: /cvsroot/idlefork/idle/configHandler.py,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -r1.12 -r1.13 *** configHandler.py 2002/01/19 10:32:13 1.12 --- configHandler.py 2002/01/21 06:38:21 1.13 *************** *** 24,28 **** ConfigParser.__init__(self,defaults=cfgDefaults) ! def Get(self, section, option, type=None): #,default=None) """ Get an option value for given section/option or return default. --- 24,28 ---- ConfigParser.__init__(self,defaults=cfgDefaults) ! def Get(self, section, option, type=None): """ Get an option value for given section/option or return default. *************** *** 144,150 **** the given config type. configSet must be either 'user' or 'default' ! configType must be one of ('extensions','highlight','keys') """ ! if not (configType in ('extensions','highlight','keys')): raise 'Invalid configType specified' if configSet == 'user': --- 144,150 ---- the given config type. configSet must be either 'user' or 'default' ! configType must be one of ('main','extensions','highlight','keys') """ ! if not (configType in ('main','extensions','highlight','keys')): raise 'Invalid configType specified' if configSet == 'user': *************** *** 225,229 **** activeExtns=[] for extn in extns: ! if self.GetOption('extensions',extn,'enable',default=1,type='bool'): #the extension is enabled activeExtns.append(extn) --- 225,230 ---- activeExtns=[] for extn in extns: ! if self.GetOption('extensions',extn,'enable',default=1, ! type='bool'): #the extension is enabled activeExtns.append(extn) Index: config-main.def =================================================================== RCS file: /cvsroot/idlefork/idle/config-main.def,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -r1.6 -r1.7 *** config-main.def 2002/01/04 07:53:06 1.6 --- config-main.def 2002/01/21 06:38:21 1.7 *************** *** 28,37 **** [General] ! run-in-separate-process= 1 ! help-browser= "" [HelpFiles] ! idle="IDLE _Help","" ! python="_Python Documentation","" #additional help sources 1= --- 28,38 ---- [General] ! editor-on-startup= 1 ! #run-in-separate-process= 1 ! #help-browser= "" [HelpFiles] ! #idle="IDLE _Help","" ! #python="_Python Documentation","" #additional help sources 1= *************** *** 47,51 **** [EditorWindow] - editor-on-startup= 0 width= 80 height= 30 --- 48,51 ---- From noreply@sourceforge.net Sat Jan 12 05:39:40 2002 From: noreply@sourceforge.net (noreply@sourceforge.net) Date: Fri, 11 Jan 2002 21:39:40 -0800 Subject: [Idle-dev] [ idlefork-Bugs-502612 ] PyShell strange "else" indentation Message-ID: Bugs item #502612, was opened at 2002-01-11 21:39 You can respond by visiting: http://sourceforge.net/tracker/?func=detail&atid=109579&aid=502612&group_id=9579 Category: None Group: None Status: Open Resolution: None Priority: 5 Submitted By: Peter Maxwell (pm67nz) Assigned to: Nobody/Anonymous (nobody) Summary: PyShell strange "else" indentation Initial Comment: An else clause entered directly at the PyShell prompt looks like: >>> if 1: print 1 else: print 2 If I try and line up the "else" and "if" I get an IndentationError. OK once you know about it, but confusing for novices. ---------------------------------------------------------------------- You can respond by visiting: http://sourceforge.net/tracker/?func=detail&atid=109579&aid=502612&group_id=9579 From noreply@sourceforge.net Mon Jan 21 15:16:43 2002 From: noreply@sourceforge.net (noreply@sourceforge.net) Date: Mon, 21 Jan 2002 07:16:43 -0800 Subject: [Idle-dev] [ idlefork-Bugs-486001 ] Must logout to re-use idle... Message-ID: Bugs item #486001, was opened at 2001-11-27 06:22 You can respond by visiting: http://sourceforge.net/tracker/?func=detail&atid=109579&aid=486001&group_id=9579 Category: None Group: None Status: Open Resolution: None Priority: 5 Submitted By: Jayce Piel (jayce) Assigned to: Nobody/Anonymous (nobody) Summary: Must logout to re-use idle... Initial Comment: If the last idle window is closed instead of quitting idle, it's impossible to launch again idle without logout/login... ---------------------------------------------------------------------- Comment By: Nobody/Anonymous (nobody) Date: 2002-01-21 07:16 Message: Logged In: NO explain your setup (os, etc) ---------------------------------------------------------------------- You can respond by visiting: http://sourceforge.net/tracker/?func=detail&atid=109579&aid=486001&group_id=9579 From mats@laplaza.org Mon Jan 21 19:23:21 2002 From: mats@laplaza.org (Mats Wichmann) Date: Mon, 21 Jan 2002 11:23:21 -0800 Subject: Mats Wichmann: [Idle-dev] Use of __future__ features in IDLE In-Reply-To: References: <200201201850.NAA05247@cj20424-a.reston1.va.home.com> Message-ID: <5.1.0.14.1.20020121111725.00a92a60@204.151.72.2> At 03:43 PM 1/20/2002 -0500, you wrote: >> Do you recall what this was? > >A limitation documented in PEP 236 (the __future__ PEP). > >Michael Hudson and I repaired it for Python 2.2, via PEP 264 ("Future >statements in simulated shells"). Thanks... I guess it's not possible for us mortals to keep up with everything. Nice to hear, at least, that this is "well-known" (for interesting definitions of well-known). >The fixes are too involved to backstitch >into 2.1.x without significant effort, and nobody volunteered. Hastily-takes-one-step-back-ly yrs Mats From elguavas@users.sourceforge.net Tue Jan 22 05:56:42 2002 From: elguavas@users.sourceforge.net (Stephen M. Gava) Date: Mon, 21 Jan 2002 21:56:42 -0800 Subject: [Idle-dev] CVS: idle configDialog.py,1.26,1.27 config-main.def,1.7,1.8 Message-ID: Update of /cvsroot/idlefork/idle In directory usw-pr-cvs1:/tmp/cvs-serv8402 Modified Files: configDialog.py config-main.def Log Message: further work on config saving Index: configDialog.py =================================================================== RCS file: /cvsroot/idlefork/idle/configDialog.py,v retrieving revision 1.26 retrieving revision 1.27 diff -C2 -r1.26 -r1.27 *** configDialog.py 2002/01/21 06:38:21 1.26 --- configDialog.py 2002/01/22 05:56:40 1.27 *************** *** 59,62 **** --- 59,63 ---- #self.bind('',self.Help) #context help self.LoadConfigs() + self.AttachVarCallbacks() #avoid callbacks during LoadConfigs self.wait_window() *************** *** 89,96 **** #tkVars self.fontSize=StringVar(self) ! self.fontBold=StringVar(self) self.spaceNum=IntVar(self) self.tabCols=IntVar(self) ! self.indentType=IntVar(self) self.editFont=tkFont.Font(self,('courier',12,'normal')) ##widget creation --- 90,98 ---- #tkVars self.fontSize=StringVar(self) ! self.fontBold=BooleanVar(self) ! self.fontName=StringVar(self) self.spaceNum=IntVar(self) self.tabCols=IntVar(self) ! self.indentBySpaces=BooleanVar(self) self.editFont=tkFont.Font(self,('courier',12,'normal')) ##widget creation *************** *** 108,112 **** self.listFontName=Listbox(frameFontName,height=5,takefocus=FALSE, exportselection=FALSE) ! self.listFontName.bind('<>',self.SetFontSampleBinding) scrollFont=Scrollbar(frameFontName) scrollFont.config(command=self.listFontName.yview) --- 110,114 ---- self.listFontName=Listbox(frameFontName,height=5,takefocus=FALSE, exportselection=FALSE) ! self.listFontName.bind('',self.OnListFontButtonRelease) scrollFont=Scrollbar(frameFontName) scrollFont.config(command=self.listFontName.yview) *************** *** 114,120 **** labelFontSizeTitle=Label(frameFontParam,text='Size :') self.optMenuFontSize=DynOptionMenu(frameFontParam,self.fontSize,None, ! command=self.SetFontSampleBinding) checkFontBold=Checkbutton(frameFontParam,variable=self.fontBold, ! onvalue='Bold',offvalue='',text='Bold') frameFontSample=Frame(frameFont,relief=SOLID,borderwidth=1) self.labelFontSample=Label(frameFontSample, --- 116,122 ---- labelFontSizeTitle=Label(frameFontParam,text='Size :') self.optMenuFontSize=DynOptionMenu(frameFontParam,self.fontSize,None, ! command=self.SetFontSample) checkFontBold=Checkbutton(frameFontParam,variable=self.fontBold, ! onvalue=1,offvalue=0,text='Bold',command=self.SetFontSample) frameFontSample=Frame(frameFont,relief=SOLID,borderwidth=1) self.labelFontSample=Label(frameFontSample, *************** *** 127,133 **** labelIndentTypeTitle=Label(frameIndentType, text='Choose indentation type :') ! radioUseSpaces=Radiobutton(frameIndentType,variable=self.indentType, value=1,text='Tab key inserts spaces') ! radioUseTabs=Radiobutton(frameIndentType,variable=self.indentType, value=0,text='Tab key inserts tabs') labelIndentSizeTitle=Label(frameIndentSize, --- 129,135 ---- labelIndentTypeTitle=Label(frameIndentType, text='Choose indentation type :') ! radioUseSpaces=Radiobutton(frameIndentType,variable=self.indentBySpaces, value=1,text='Tab key inserts spaces') ! radioUseTabs=Radiobutton(frameIndentType,variable=self.indentBySpaces, value=0,text='Tab key inserts tabs') labelIndentSizeTitle=Label(frameIndentSize, *************** *** 174,183 **** self.builtinTheme=StringVar(self) self.customTheme=StringVar(self) ! self.fgHilite=IntVar(self) self.colour=StringVar(self) self.fontName=StringVar(self) ! self.themeIsBuiltin=IntVar(self) self.highlightTarget=StringVar(self) - self.highlightTarget.trace_variable('w',self.SetHighlightTargetBinding) ##widget creation #body frame --- 176,184 ---- self.builtinTheme=StringVar(self) self.customTheme=StringVar(self) ! self.fgHilite=BooleanVar(self) self.colour=StringVar(self) self.fontName=StringVar(self) ! self.themeIsBuiltin=BooleanVar(self) self.highlightTarget=StringVar(self) ##widget creation #body frame *************** *** 265,273 **** self.builtinKeys=StringVar(self) self.customKeys=StringVar(self) ! self.keyChars=StringVar(self) ! self.keyCtrl=StringVar(self) ! self.keyAlt=StringVar(self) ! self.keyShift=StringVar(self) ! self.keysAreDefault=IntVar(self) ##widget creation #body frame --- 266,271 ---- self.builtinKeys=StringVar(self) self.customKeys=StringVar(self) ! self.keysAreDefault=BooleanVar(self) ! self.keyBinding=StringVar(self) ##widget creation #body frame *************** *** 331,338 **** def CreatePageGeneral(self): #tkVars - self.runType=IntVar(self) self.winWidth=StringVar(self) self.winHeight=StringVar(self) self.startupEdit=IntVar(self) #widget creation #body --- 329,336 ---- def CreatePageGeneral(self): #tkVars self.winWidth=StringVar(self) self.winHeight=StringVar(self) self.startupEdit=IntVar(self) + self.extEnabled=IntVar(self) #widget creation #body *************** *** 369,375 **** self.listExt.bind('',self.ExtensionSelected) labelExtSetTitle=Label(frameExtSet,text='Settings') ! self.radioEnableExt=Radiobutton(frameExtSet,variable=self.startupEdit, value=1,text="enabled",state=DISABLED) ! self.radioDisableExt=Radiobutton(frameExtSet,variable=self.startupEdit, value=0,text="disabled",state=DISABLED) self.buttonExtConfig=Button(frameExtSet,text='Configure',state=DISABLED) --- 367,373 ---- self.listExt.bind('',self.ExtensionSelected) labelExtSetTitle=Label(frameExtSet,text='Settings') ! self.radioEnableExt=Radiobutton(frameExtSet,variable=self.extEnabled, value=1,text="enabled",state=DISABLED) ! self.radioDisableExt=Radiobutton(frameExtSet,variable=self.extEnabled, value=0,text="disabled",state=DISABLED) self.buttonExtConfig=Button(frameExtSet,text='Configure',state=DISABLED) *************** *** 403,406 **** --- 401,471 ---- return frame + def AttachVarCallbacks(self): + self.fontSize.trace_variable('w',self.VarChanged_fontSize) + self.fontName.trace_variable('w',self.VarChanged_fontName) + self.fontBold.trace_variable('w',self.VarChanged_fontBold) + self.spaceNum.trace_variable('w',self.VarChanged_spaceNum) + self.tabCols.trace_variable('w',self.VarChanged_tabCols) + self.indentBySpaces.trace_variable('w',self.VarChanged_indentBySpaces) + self.colour.trace_variable('w',self.VarChanged_colour) + self.keyBinding.trace_variable('w',self.VarChanged_keyBinding) + 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.extEnabled.trace_variable('w',self.VarChanged_extEnabled) + + def VarChanged_fontSize(self,*params): + value=self.fontSize.get() + self.AddChangedItem('main','EditorWindow','font-size',value) + print 'fontSize:',value + + def VarChanged_fontName(self,*params): + value=self.fontName.get() + self.AddChangedItem('main','EditorWindow','font',value) + print 'fontName:',value + + def VarChanged_fontBold(self,*params): + value=self.fontBold.get() + self.AddChangedItem('main','EditorWindow','font-bold',value) + print 'fontBold:',value + + def VarChanged_indentBySpaces(self,*params): + value=self.indentBySpaces.get() + self.AddChangedItem('main','Indent','use-spaces',value) + print 'indentBySpaces:',value + + def VarChanged_spaceNum(self,*params): + value=self.spaceNum.get() + self.AddChangedItem('main','Indent','num-spaces',value) + print 'spaceNum:',value + + def VarChanged_tabCols(self,*params): + value=self.tabCols.get() + self.AddChangedItem('main','Indent','tab-cols',value) + print 'tabCols:',value + + def VarChanged_colour(self,*params): + print params + + def VarChanged_keyBinding(self,*params): + print params + + def VarChanged_winWidth(self,*params): + print params + + def VarChanged_winHeight(self,*params): + print params + + def VarChanged_startupEdit(self,*params): + print params + + def VarChanged_extEnabled(self,*params): + print params + + def AddChangedItem(self,type,section,item,value): + if not self.changedItems[type].has_key(section): + self.changedItems[type][section]={} + self.changedItems[type][section][item]=value + def GetDefaultItems(self): dItems={'main':{},'highlight':{},'keys':{},'extensions':{}} *************** *** 441,444 **** --- 506,510 ---- initialcolor=self.frameColourSet.cget('bg')) if colourString: #user didn't cancel + self.colour.set(colourString) self.frameColourSet.config(bg=colourString)#set sample if self.fgHilite.get(): plane='foreground' *************** *** 447,456 **** (self.themeElements[target][0],),{plane:colourString}) ! def SetFontSampleBinding(self,event): self.SetFontSample() ! def SetFontSample(self): ! self.editFont.config(size=self.fontSize.get(),weight=NORMAL, ! family=self.listFontName.get(self.listFontName.curselection()[0])) def SetHighlightTargetBinding(self,*args): --- 513,528 ---- (self.themeElements[target][0],),{plane:colourString}) ! def OnListFontButtonRelease(self,event): ! self.fontName.set(self.listFontName.get(ANCHOR)) self.SetFontSample() ! def SetFontSample(self,event=None): ! fontName=self.fontName.get() ! if self.fontBold.get(): ! fontWeight=tkFont.BOLD ! else: ! fontWeight=tkFont.NORMAL ! self.editFont.config(size=self.fontSize.get(), ! weight=fontWeight,family=fontName) def SetHighlightTargetBinding(self,*args): *************** *** 500,511 **** configuredFont=idleConf.GetOption('main','EditorWindow','font', default='courier') if configuredFont in fonts: currentFontIndex=fonts.index(configuredFont) self.listFontName.see(currentFontIndex) self.listFontName.select_set(currentFontIndex) ##font size dropdown ! fontSize=idleConf.GetOption('main','EditorWindow','font-size',default='12') self.optMenuFontSize.SetMenu(('10','11','12','13','14', '16','18','20','22'),fontSize ) ##font sample self.SetFontSample() --- 572,589 ---- configuredFont=idleConf.GetOption('main','EditorWindow','font', default='courier') + self.fontName.set(configuredFont) if configuredFont in fonts: currentFontIndex=fonts.index(configuredFont) self.listFontName.see(currentFontIndex) self.listFontName.select_set(currentFontIndex) + self.listFontName.select_anchor(currentFontIndex) ##font size dropdown ! fontSize=idleConf.GetOption('main','EditorWindow','font-size', ! default='12') self.optMenuFontSize.SetMenu(('10','11','12','13','14', '16','18','20','22'),fontSize ) + ##fontWeight + self.fontBold.set(idleConf.GetOption('main','EditorWindow', + 'font-bold',default=0,type='bool')) ##font sample self.SetFontSample() *************** *** 515,519 **** spaceIndent=idleConf.GetOption('main','Indent','use-spaces', default=1,type='bool') ! self.indentType.set(spaceIndent) ##indent sizes spaceNum=idleConf.GetOption('main','Indent','num-spaces', --- 593,597 ---- spaceIndent=idleConf.GetOption('main','Indent','use-spaces', default=1,type='bool') ! self.indentBySpaces.set(spaceIndent) ##indent sizes spaceNum=idleConf.GetOption('main','Indent','num-spaces', *************** *** 527,531 **** ##current theme type radiobutton self.themeIsBuiltin.set(idleConf.GetOption('main','Theme','default', ! type='int',default=1)) ##currently set theme currentOption=idleConf.CurrentTheme() --- 605,609 ---- ##current theme type radiobutton self.themeIsBuiltin.set(idleConf.GetOption('main','Theme','default', ! type='bool',default=1)) ##currently set theme currentOption=idleConf.CurrentTheme() *************** *** 561,565 **** ##current keys type radiobutton self.keysAreDefault.set(idleConf.GetOption('main','Keys','default', ! type='int',default=1)) ##currently set keys currentOption=idleConf.CurrentKeys() --- 639,643 ---- ##current keys type radiobutton self.keysAreDefault.set(idleConf.GetOption('main','Keys','default', ! type='bool',default=1)) ##currently set keys currentOption=idleConf.CurrentKeys() *************** *** 598,601 **** --- 676,680 ---- self.listBindings.delete(listIndex) self.listBindings.insert(listIndex,bindName+' - '+newKeys.result) + self.keyBinding.set(newKeys.result) self.listBindings.select_set(listIndex) *************** *** 619,623 **** self.buttonExtConfig.config(state=NORMAL) extn=self.listExt.get(ANCHOR) ! self.extState.set(idleConf.GetOption('extensions',extn,'enable', default=1,type='bool')) --- 698,702 ---- self.buttonExtConfig.config(state=NORMAL) extn=self.listExt.get(ANCHOR) ! self.extEnabled.set(idleConf.GetOption('extensions',extn,'enable', default=1,type='bool')) *************** *** 653,659 **** print self.changedItems - def AddChangedItem(self,type,section,item,value): - self.changedItems[type][section][item]=value - def Cancel(self): self.destroy() --- 732,735 ---- Index: config-main.def =================================================================== RCS file: /cvsroot/idlefork/idle/config-main.def,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -r1.7 -r1.8 *** config-main.def 2002/01/21 06:38:21 1.7 --- config-main.def 2002/01/22 05:56:40 1.8 *************** *** 52,55 **** --- 52,56 ---- font= courier font-size= 12 + font-bold= 0 [Indent] From elguavas@users.sourceforge.net Tue Jan 22 11:35:52 2002 From: elguavas@users.sourceforge.net (Stephen M. Gava) Date: Tue, 22 Jan 2002 03:35:52 -0800 Subject: [Idle-dev] CVS: idle configDialog.py,1.27,1.28 Message-ID: Update of /cvsroot/idlefork/idle In directory usw-pr-cvs1:/tmp/cvs-serv15481 Modified Files: configDialog.py Log Message: more on config saving Index: configDialog.py =================================================================== RCS file: /cvsroot/idlefork/idle/configDialog.py,v retrieving revision 1.27 retrieving revision 1.28 diff -C2 -r1.27 -r1.28 *** configDialog.py 2002/01/22 05:56:40 1.27 --- configDialog.py 2002/01/22 11:35:50 1.28 *************** *** 368,374 **** labelExtSetTitle=Label(frameExtSet,text='Settings') self.radioEnableExt=Radiobutton(frameExtSet,variable=self.extEnabled, ! value=1,text="enabled",state=DISABLED) self.radioDisableExt=Radiobutton(frameExtSet,variable=self.extEnabled, ! value=0,text="disabled",state=DISABLED) self.buttonExtConfig=Button(frameExtSet,text='Configure',state=DISABLED) #widget packing --- 368,376 ---- labelExtSetTitle=Label(frameExtSet,text='Settings') self.radioEnableExt=Radiobutton(frameExtSet,variable=self.extEnabled, ! value=1,text="enabled",state=DISABLED, ! command=self.ExtensionStateToggled) self.radioDisableExt=Radiobutton(frameExtSet,variable=self.extEnabled, ! value=0,text="disabled",state=DISABLED, ! command=self.ExtensionStateToggled) self.buttonExtConfig=Button(frameExtSet,text='Configure',state=DISABLED) #widget packing *************** *** 413,465 **** self.winHeight.trace_variable('w',self.VarChanged_winHeight) self.startupEdit.trace_variable('w',self.VarChanged_startupEdit) - self.extEnabled.trace_variable('w',self.VarChanged_extEnabled) def VarChanged_fontSize(self,*params): value=self.fontSize.get() self.AddChangedItem('main','EditorWindow','font-size',value) - print 'fontSize:',value def VarChanged_fontName(self,*params): value=self.fontName.get() self.AddChangedItem('main','EditorWindow','font',value) - print 'fontName:',value def VarChanged_fontBold(self,*params): value=self.fontBold.get() self.AddChangedItem('main','EditorWindow','font-bold',value) - print 'fontBold:',value def VarChanged_indentBySpaces(self,*params): value=self.indentBySpaces.get() self.AddChangedItem('main','Indent','use-spaces',value) - print 'indentBySpaces:',value def VarChanged_spaceNum(self,*params): value=self.spaceNum.get() self.AddChangedItem('main','Indent','num-spaces',value) - print 'spaceNum:',value def VarChanged_tabCols(self,*params): value=self.tabCols.get() self.AddChangedItem('main','Indent','tab-cols',value) - print 'tabCols:',value def VarChanged_colour(self,*params): print params ! def VarChanged_keyBinding(self,*params): print params def VarChanged_winWidth(self,*params): ! print params def VarChanged_winHeight(self,*params): ! print params def VarChanged_startupEdit(self,*params): ! print params ! def VarChanged_extEnabled(self,*params): ! print params def AddChangedItem(self,type,section,item,value): --- 415,474 ---- self.winHeight.trace_variable('w',self.VarChanged_winHeight) self.startupEdit.trace_variable('w',self.VarChanged_startupEdit) def VarChanged_fontSize(self,*params): value=self.fontSize.get() self.AddChangedItem('main','EditorWindow','font-size',value) def VarChanged_fontName(self,*params): value=self.fontName.get() self.AddChangedItem('main','EditorWindow','font',value) def VarChanged_fontBold(self,*params): value=self.fontBold.get() self.AddChangedItem('main','EditorWindow','font-bold',value) def VarChanged_indentBySpaces(self,*params): value=self.indentBySpaces.get() self.AddChangedItem('main','Indent','use-spaces',value) def VarChanged_spaceNum(self,*params): value=self.spaceNum.get() self.AddChangedItem('main','Indent','num-spaces',value) def VarChanged_tabCols(self,*params): value=self.tabCols.get() self.AddChangedItem('main','Indent','tab-cols',value) def VarChanged_colour(self,*params): + value=self.colour.get() + theme=self.customTheme.get() + element=self.themeElements[self.highlightTarget.get()][0] + self.AddChangedItem('highlight',theme,element,value) print params ! def VarChanged_keyBinding(self,*params): + value=self.keyBinding.get() + keySet=self.customKeys.get() + event=self.listBindings.get(ANCHOR).split()[0] + self.AddChangedItem('keys',keySet,event,value) print params def VarChanged_winWidth(self,*params): ! value=self.winWidth.get() ! self.AddChangedItem('main','EditorWindow','width',value) def VarChanged_winHeight(self,*params): ! value=self.winHeight.get() ! self.AddChangedItem('main','EditorWindow','height',value) def VarChanged_startupEdit(self,*params): ! value=self.startupEdit.get() ! self.AddChangedItem('main','General','editor-on-startup',value) ! def ExtensionStateToggled(self): ! #callback for the extension enable/disable radio buttons ! value=self.extEnabled.get() ! extension=self.listExt.get(ANCHOR) ! self.AddChangedItem('extensions',extension,'enabled',value) def AddChangedItem(self,type,section,item,value): *************** *** 467,470 **** --- 476,480 ---- self.changedItems[type][section]={} self.changedItems[type][section][item]=value + print type,section,item,value def GetDefaultItems(self): *************** *** 676,681 **** self.listBindings.delete(listIndex) self.listBindings.insert(listIndex,bindName+' - '+newKeys.result) self.keyBinding.set(newKeys.result) ! self.listBindings.select_set(listIndex) def KeyBindingSelected(self,event): --- 686,695 ---- self.listBindings.delete(listIndex) self.listBindings.insert(listIndex,bindName+' - '+newKeys.result) + self.listBindings.select_set(listIndex) + self.listBindings.select_anchor(listIndex) self.keyBinding.set(newKeys.result) ! else: ! self.listBindings.select_set(listIndex) ! self.listBindings.select_anchor(listIndex) def KeyBindingSelected(self,event): From glingl@aon.at Tue Jan 22 20:45:43 2002 From: glingl@aon.at (Gregor Lingl) Date: Tue, 22 Jan 2002 21:45:43 +0100 Subject: [Idle-dev] New problem with -Qnew and IDLE? Message-ID: <001c01c1a385$c31e3840$1664a8c0@mega> This is a multi-part message in MIME format. ------=_NextPart_000_0019_01C1A38E.24B01E90 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Has anybody an explanation vor this: I started IDLE with the -Qnew switch. (I have a copy of the IDLE-Icon with this switch on my desktop) Then I did the following in IDLE's Python-Shell-Window: >>>def ggt(a,b): while b: ##### WHEN NOW I HIT ENTER, ##### THE RESULT WAS: >>> Exception in Tkinter callback Traceback (most recent call last): File "C:\Python22\lib\lib-tk\Tkinter.py", line 1292, in __call__ return apply(self.func, args) File "C:\Python22\Tools\idle\PyShell.py", line 588, in enter_callback self.auto.auto_indent(event) File "C:\Python22\Tools\idle\AutoIndent.py", line 301, in = newline_and_indent_event self.smart_indent_event(event) File "C:\Python22\Tools\idle\AutoIndent.py", line 208, in = smart_indent_event self.reindent_to(effective + self.indentwidth) File "C:\Python22\Tools\idle\AutoIndent.py", line 455, in reindent_to text.insert("insert", self._make_blanks(column)) File "C:\Python22\Tools\idle\AutoIndent.py", line 442, in _make_blanks return '\t' * ntabs + ' ' * nspaces TypeError: unsupported operand type(s) for *: 'str' and 'float' def ggt(a,b): while b: So the cryptic Error - backtrace appeard after the >>> - Prompt=20 and BEFORE the two lines I just had typed in. Moreover, I only could return to the >>> - prompt=20 by hitting ^C (Keybord-Interrupt) This strange behaviour doesn't appear in ordinarily started IDLE. It also does not appear when starting Python (with or without -Qnew) from the MS-DOS prompt. I feel more and more, that there is some strange instability in IDLE connected with the -Qnew switch . Gregor P.S.: I'm interested in these problems, because in my opinion it is an important, if not crucial point to have a not only simple but also stable and reliable programming environment, when working with=20 highschool students, who are just beginning to learn to program. ------=_NextPart_000_0019_01C1A38E.24B01E90 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
Has anybody an explanation vor this:
 
I started IDLE with the -Qnew switch.
(I have a copy of the IDLE-Icon with this switch on = my=20 desktop)
Then I did the following in IDLE's=20 Python-Shell-Window:
 
>>>def=20 ggt(a,b):
       while b:
 ##### WHEN NOW I HIT ENTER,
          &nbs= p;     =20 ##### THE RESULT WAS:
 
>>> Exception in Tkinter = callback
Traceback (most=20 recent call last):
  File "C:\Python22\lib\lib-tk\Tkinter.py", = line=20 1292, in __call__
    return apply(self.func, = args)
 =20 File "C:\Python22\Tools\idle\PyShell.py", line 588, in=20 enter_callback
    = self.auto.auto_indent(event)
  File=20 "C:\Python22\Tools\idle\AutoIndent.py", line 301, in=20 newline_and_indent_event
   =20 self.smart_indent_event(event)
  File=20 "C:\Python22\Tools\idle\AutoIndent.py", line 208, in=20 smart_indent_event
    self.reindent_to(effective +=20 self.indentwidth)
  File "C:\Python22\Tools\idle\AutoIndent.py", = line=20 455, in reindent_to
    text.insert("insert",=20 self._make_blanks(column))
  File=20 "C:\Python22\Tools\idle\AutoIndent.py", line 442, in=20 _make_blanks
    return '\t' * ntabs + ' ' *=20 nspaces
TypeError: unsupported operand type(s) for *: 'str' and=20 'float'
def ggt(a,b):
     while = b:
 
So the cryptic Error - backtrace appeard after = the=20 >>> - Prompt
and BEFORE the two lines I just had typed = in.
 
Moreover, I only could return to the >>> - = prompt=20
by hitting ^C (Keybord-Interrupt)
 
This strange behaviour doesn't appear in ordinarily = started=20 IDLE.
It also does not appear when starting Python (with = or without=20 -Qnew)
from the MS-DOS prompt.
 
I feel more and more, that there is some strange = instability=20 in IDLE
connected with the -Qnew = switch=20 .
 
Gregor
 
P.S.: I'm interested in these problems, because in = my opinion=20 it is
an important, if not crucial point to have a not = only simple=20 but also
stable and reliable programming=20 environment, when working with
highschool students, who are just beginning to learn = to=20 program.
 
------=_NextPart_000_0019_01C1A38E.24B01E90-- From elguavas@users.sourceforge.net Wed Jan 23 00:41:54 2002 From: elguavas@users.sourceforge.net (Stephen M. Gava) Date: 23 Jan 2002 11:41:54 +1100 Subject: [Idle-dev] New problem with -Qnew and IDLE? In-Reply-To: <001c01c1a385$c31e3840$1664a8c0@mega> References: <001c01c1a385$c31e3840$1664a8c0@mega> Message-ID: <1011746515.3171.2.camel@oberon> On Wed, 2002-01-23 at 07:45, Gregor Lingl wrote: > I started IDLE with the -Qnew switch. To my knowledge, idle has never had a -Qnew switch. -- Stephen M. Gava IDLEfork ( http://idlefork.sourceforge.net ) " just like IDLE, only crunchy " From guido@python.org Wed Jan 23 02:11:38 2002 From: guido@python.org (Guido van Rossum) Date: Tue, 22 Jan 2002 21:11:38 -0500 Subject: [Idle-dev] New problem with -Qnew and IDLE? In-Reply-To: Your message of "23 Jan 2002 11:41:54 +1100." <1011746515.3171.2.camel@oberon> References: <001c01c1a385$c31e3840$1664a8c0@mega> <1011746515.3171.2.camel@oberon> Message-ID: <200201230211.VAA00964@pcp742651pcs.reston01.va.comcast.net> > On Wed, 2002-01-23 at 07:45, Gregor Lingl wrote: > > I started IDLE with the -Qnew switch. Stephen > To my knowledge, idle has never had a -Qnew switch. But Python 2.2 does. I can reproduce Gregor's problem. Gregor, can you submit a sourceforge bug report for it? --Guido van Rossum (home page: http://www.python.org/~guido/) From elguavas@users.sourceforge.net Wed Jan 23 01:23:44 2002 From: elguavas@users.sourceforge.net (Stephen M. Gava) Date: 23 Jan 2002 12:23:44 +1100 Subject: [Idle-dev] New problem with -Qnew and IDLE? In-Reply-To: <200201230211.VAA00964@pcp742651pcs.reston01.va.comcast.net> References: <001c01c1a385$c31e3840$1664a8c0@mega> <1011746515.3171.2.camel@oberon> <200201230211.VAA00964@pcp742651pcs.reston01.va.comcast.net> Message-ID: <1011749024.3381.7.camel@oberon> Guido van Rossum wrote: > > On Wed, 2002-01-23 at 07:45, Gregor Lingl wrote: > > > I started IDLE with the -Qnew switch. > > Stephen > > To my knowledge, idle has never had a -Qnew switch. > > But Python 2.2 does. > > I can reproduce Gregor's problem. Gregor, can you submit a > sourceforge bug report for it? Ah, the new division business in 2.2. Looks like it's choking AutoIndent.py's whitespace calculations. Ok, I submitted a bug (# 507298) in idlefork's tracker for this. -- Stephen M. Gava IDLEfork ( http://idlefork.sourceforge.net ) " just like IDLE, only crunchy " From dyoo@hkn.eecs.berkeley.edu Wed Jan 23 01:58:54 2002 From: dyoo@hkn.eecs.berkeley.edu (Danny Yoo) Date: Tue, 22 Jan 2002 17:58:54 -0800 (PST) Subject: [Idle-dev] Modifying ScriptBinding.run_script_event to automatically modify sys.path? Message-ID: Hi everyone, A while back, I sent a patch to automagically add a script's directory path to sys.path. Here's a link to the original post: http://mail.python.org/pipermail/tutor/2001-December/010915.html The problem is this: if a user is experimenting with importing their own modules, they run into an ImportError because their modules aren't located in the system path. This is somewhat weird to me, as I would have expected IDLE to do this for me. I've isolated the code to run_script_event(), which uses an execfile() call. execfile() doesn't extend sys.path, probably for security reasons. But for someone running scripts through IDLE, this seems a bit paranoid. Here's a modified run_script_even that temporarily adjusts sys.path, just long enough for the run_script command to finish: #### def run_script_event(self, event): filename = self.getfilename() if not filename: return flist = self.editwin.flist shell = flist.open_shell() interp = shell.interp if (not sys.argv or os.path.basename(sys.argv[0]) != os.path.basename(filename)): # XXX Too often this discards arguments the user just set... sys.argv = [filename] old_syspath = sys.path[:] sys.path.append(os.path.dirname(os.path.abspath(filename))) interp.execfile(filename) sys.path = old_syspath ### Does this seem like a reasonable thing to add to IDLE? I always feel very worried about telling new Python programmers to edit their PYTHONPATH... *grin* From elguavas@users.sourceforge.net Wed Jan 23 03:09:30 2002 From: elguavas@users.sourceforge.net (Stephen M. Gava) Date: 23 Jan 2002 14:09:30 +1100 Subject: [Idle-dev] Modifying ScriptBinding.run_script_event to automatically modify sys.path? In-Reply-To: References: Message-ID: <1011755371.4819.8.camel@oberon> Danny Yoo wrote: > I've isolated the code to run_script_event(), which uses an > execfile() call. execfile() doesn't extend sys.path, probably for Currently in idlefork ScriptBinding.py is replaced by ExecBinding.py which is an implementation of running code from idle in a separate process. The separate process execution implementation is due for review to make it more general and to try to solve a few problems with it. I added your patch to the sourceforge patch manager for idlefork anyway so it is there for future reference. Regards, -- Stephen M. Gava IDLEfork ( http://idlefork.sourceforge.net ) " just like IDLE, only crunchy " From tim.one@home.com Wed Jan 23 05:15:09 2002 From: tim.one@home.com (Tim Peters) Date: Wed, 23 Jan 2002 00:15:09 -0500 Subject: [Idle-dev] RE: [Tutor] New problem with -Qnew and IDLE? In-Reply-To: <001c01c1a385$c31e3840$1664a8c0@mega> Message-ID: [Gregor Lingl] > Has anybody an explanation vor this: Better, I checked in a fix , so it should work in 2.2.1 (when it's released). > I started IDLE with the -Qnew switch. > (I have a copy of the IDLE-Icon with this switch on my desktop) > Then I did the following in IDLE's Python-Shell-Window: > > >>> def ggt(a,b): > while b: ##### WHEN NOW I HIT ENTER, > ##### THE RESULT WAS: > > >>> Exception in Tkinter callback > ... > File "C:\Python22\Tools\idle\AutoIndent.py", line 442, in _make_blanks > return '\t' * ntabs + ' ' * nspaces > TypeError: unsupported operand type(s) for *: 'str' and 'float' > def ggt(a,b): > while b: IDLE is trying to figure out how to auto-indent the next line. At one point it does effective = (effective / tabwidth + 1) * tabwidth That doesn't work as intended under -Qnew, so I changed it to effective = (int(effective / tabwidth) + 1) * tabwidth (you can change that line similarly in your copy of AutoIndent.py, of course). > ... > I feel more and more, that there is some strange instability in IDLE > connected with the -Qnew switch . Not really strange. We had 2.2 alpha and beta releases for half a year, and AFAICT nobody even *tried* -Qnew until after 2.2 final was released (did you?). The only thing I personally tried under the combo of IDLE and -Qnew was a one-liner to make sure 3/2 returned 1.5; I'm afraid that's all I had time for. > P.S.: I'm interested in these problems, because in my opinion it is > an important, if not crucial point to have a not only simple but also > stable and reliable programming environment, when working with > highschool students, who are just beginning to learn to program. You should read the PEP for its warnings about using -Qnew. At this stage it's for pioneers; if you can't tolerate some early glitches, I advise that you simply leave it alone. Else you can be very helpful by using it and reporting what goes wrong. That you're the first person to report this bug means you're the first person to try typing a "def" into an IDLE shell under -Qnew! We need *somebody* brave enough to try that . From elguavas@users.sourceforge.net Wed Jan 23 05:15:19 2002 From: elguavas@users.sourceforge.net (Stephen M. Gava) Date: Tue, 22 Jan 2002 21:15:19 -0800 Subject: [Idle-dev] CVS: idle AutoIndent.py,1.3,1.4 Message-ID: Update of /cvsroot/idlefork/idle In directory usw-pr-cvs1:/tmp/cvs-serv2544 Modified Files: AutoIndent.py Log Message: fix for python2.2 -Qnew division error, thanks Tim! Index: AutoIndent.py =================================================================== RCS file: /cvsroot/idlefork/idle/AutoIndent.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -r1.3 -r1.4 *** AutoIndent.py 2002/01/19 10:37:48 1.3 --- AutoIndent.py 2002/01/23 05:15:17 1.4 *************** *** 463,467 **** elif ch == '\t': raw = raw + 1 ! effective = (effective / tabwidth + 1) * tabwidth else: break --- 463,467 ---- elif ch == '\t': raw = raw + 1 ! effective = (int(effective / tabwidth) + 1) * tabwidth else: break From noreply@sourceforge.net Wed Jan 23 01:16:37 2002 From: noreply@sourceforge.net (noreply@sourceforge.net) Date: Tue, 22 Jan 2002 17:16:37 -0800 Subject: [Idle-dev] [ idlefork-Bugs-507298 ] shellpython2.2 -Qnew smart indent error Message-ID: Bugs item #507298, was opened at 2002-01-22 17:16 You can respond by visiting: http://sourceforge.net/tracker/?func=detail&atid=109579&aid=507298&group_id=9579 Category: None Group: None Status: Open Resolution: None Priority: 5 Submitted By: Stephen M. Gava (elguavas) Assigned to: Nobody/Anonymous (nobody) Summary: shellpython2.2 -Qnew smart indent error Initial Comment: submitted to idle-dev by Gregor Lingl when starting idle under python2.2, using python2.2's -Qnew switch (new division implementation), AutoIndent.py throws an exception in the shell window as detailed below. original idle-dev message: -------------------------- Has anybody an explanation vor this: I started IDLE with the -Qnew switch. (I have a copy of the IDLE-Icon with this switch on my desktop) Then I did the following in IDLE's Python-Shell-Window: >>>def ggt(a,b): while b: ##### WHEN NOW I HIT ENTER, ##### THE RESULT WAS: >>> Exception in Tkinter callback Traceback (most recent call last): File "C:\Python22\lib\lib-tk\Tkinter.py", line 1292, in __call__ return apply(self.func, args) File "C:\Python22\Tools\idle\PyShell.py", line 588, in enter_callback self.auto.auto_indent(event) File "C:\Python22\Tools\idle\AutoIndent.py", line 301, in newline_and_indent_event self.smart_indent_event(event) File "C:\Python22\Tools\idle\AutoIndent.py", line 208, in smart_indent_event self.reindent_to(effective + self.indentwidth) File "C:\Python22\Tools\idle\AutoIndent.py", line 455, in reindent_to text.insert("insert", self._make_blanks(column)) File "C:\Python22\Tools\idle\AutoIndent.py", line 442, in _make_blanks return '\t' * ntabs + ' ' * nspaces TypeError: unsupported operand type(s) for *: 'str' and 'float' def ggt(a,b): while b: So the cryptic Error - backtrace appeard after the >>> - Prompt and BEFORE the two lines I just had typed in. Moreover, I only could return to the >>> - prompt by hitting ^C (Keybord-Interrupt) This strange behaviour doesn't appear in ordinarily started IDLE. It also does not appear when starting Python (with or without -Qnew) from the MS-DOS prompt. ---------------------------------------------------------------------- You can respond by visiting: http://sourceforge.net/tracker/?func=detail&atid=109579&aid=507298&group_id=9579 From noreply@sourceforge.net Wed Jan 23 01:18:33 2002 From: noreply@sourceforge.net (noreply@sourceforge.net) Date: Tue, 22 Jan 2002 17:18:33 -0800 Subject: [Idle-dev] [ idlefork-Bugs-507298 ] python2.2 -Qnew shell smart indent error Message-ID: Bugs item #507298, was opened at 2002-01-22 17:16 You can respond by visiting: http://sourceforge.net/tracker/?func=detail&atid=109579&aid=507298&group_id=9579 Category: None Group: None Status: Open Resolution: None Priority: 5 Submitted By: Stephen M. Gava (elguavas) Assigned to: Nobody/Anonymous (nobody) >Summary: python2.2 -Qnew shell smart indent error Initial Comment: submitted to idle-dev by Gregor Lingl when starting idle under python2.2, using python2.2's -Qnew switch (new division implementation), AutoIndent.py throws an exception in the shell window as detailed below. original idle-dev message: -------------------------- Has anybody an explanation vor this: I started IDLE with the -Qnew switch. (I have a copy of the IDLE-Icon with this switch on my desktop) Then I did the following in IDLE's Python-Shell-Window: >>>def ggt(a,b): while b: ##### WHEN NOW I HIT ENTER, ##### THE RESULT WAS: >>> Exception in Tkinter callback Traceback (most recent call last): File "C:\Python22\lib\lib-tk\Tkinter.py", line 1292, in __call__ return apply(self.func, args) File "C:\Python22\Tools\idle\PyShell.py", line 588, in enter_callback self.auto.auto_indent(event) File "C:\Python22\Tools\idle\AutoIndent.py", line 301, in newline_and_indent_event self.smart_indent_event(event) File "C:\Python22\Tools\idle\AutoIndent.py", line 208, in smart_indent_event self.reindent_to(effective + self.indentwidth) File "C:\Python22\Tools\idle\AutoIndent.py", line 455, in reindent_to text.insert("insert", self._make_blanks(column)) File "C:\Python22\Tools\idle\AutoIndent.py", line 442, in _make_blanks return '\t' * ntabs + ' ' * nspaces TypeError: unsupported operand type(s) for *: 'str' and 'float' def ggt(a,b): while b: So the cryptic Error - backtrace appeard after the >>> - Prompt and BEFORE the two lines I just had typed in. Moreover, I only could return to the >>> - prompt by hitting ^C (Keybord-Interrupt) This strange behaviour doesn't appear in ordinarily started IDLE. It also does not appear when starting Python (with or without -Qnew) from the MS-DOS prompt. ---------------------------------------------------------------------- You can respond by visiting: http://sourceforge.net/tracker/?func=detail&atid=109579&aid=507298&group_id=9579 From noreply@sourceforge.net Wed Jan 23 03:01:49 2002 From: noreply@sourceforge.net (noreply@sourceforge.net) Date: Tue, 22 Jan 2002 19:01:49 -0800 Subject: [Idle-dev] [ idlefork-Patches-507327 ] ScriptBinding.py auto modify sys.path Message-ID: Patches item #507327, was opened at 2002-01-22 19:01 You can respond by visiting: http://sourceforge.net/tracker/?func=detail&atid=309579&aid=507327&group_id=9579 Category: None Group: None Status: Open Resolution: None Priority: 5 Submitted By: Stephen M. Gava (elguavas) Assigned to: Nobody/Anonymous (nobody) Summary: ScriptBinding.py auto modify sys.path Initial Comment: patch submitted to idle-dev by Danny Yoo although this applies to ScriptBinding.py it may be of some use in future separate process execution stuff original message to idle-dev: ----------------------------- Hi everyone, A while back, I sent a patch to automagically add a script's directory path to sys.path. Here's a link to the original post: http://mail.python.org/pipermail/tutor/2001-December/010915.html The problem is this: if a user is experimenting with importing their own modules, they run into an ImportError because their modules aren't located in the system path. This is somewhat weird to me, as I would have expected IDLE to do this for me. I've isolated the code to run_script_event(), which uses an execfile() call. execfile() doesn't extend sys.path, probably for security reasons. But for someone running scripts through IDLE, this seems a bit paranoid. Here's a modified run_script_even that temporarily adjusts sys.path, just long enough for the run_script command to finish: #### def run_script_event(self, event): filename = self.getfilename() if not filename: return flist = self.editwin.flist shell = flist.open_shell() interp = shell.interp if (not sys.argv or os.path.basename(sys.argv[0]) != os.path.basename(filename)): # XXX Too often this discards arguments the user just set... sys.argv = [filename] old_syspath = sys.path[:] sys.path.append(os.path.dirname(os.path.abspath(filename))) interp.execfile(filename) sys.path = old_syspath ### Does this seem like a reasonable thing to add to IDLE? I always feel very worried about telling new Python programmers to edit their PYTHONPATH... *grin* ---------------------------------------------------------------------- You can respond by visiting: http://sourceforge.net/tracker/?func=detail&atid=309579&aid=507327&group_id=9579 From noreply@sourceforge.net Wed Jan 23 05:20:03 2002 From: noreply@sourceforge.net (noreply@sourceforge.net) Date: Tue, 22 Jan 2002 21:20:03 -0800 Subject: [Idle-dev] [ idlefork-Bugs-507298 ] python2.2 -Qnew shell smart indent error Message-ID: Bugs item #507298, was opened at 2002-01-22 17:16 You can respond by visiting: http://sourceforge.net/tracker/?func=detail&atid=109579&aid=507298&group_id=9579 Category: None Group: None Status: Open >Resolution: Fixed Priority: 5 Submitted By: Stephen M. Gava (elguavas) >Assigned to: Stephen M. Gava (elguavas) Summary: python2.2 -Qnew shell smart indent error Initial Comment: submitted to idle-dev by Gregor Lingl when starting idle under python2.2, using python2.2's -Qnew switch (new division implementation), AutoIndent.py throws an exception in the shell window as detailed below. original idle-dev message: -------------------------- Has anybody an explanation vor this: I started IDLE with the -Qnew switch. (I have a copy of the IDLE-Icon with this switch on my desktop) Then I did the following in IDLE's Python-Shell-Window: >>>def ggt(a,b): while b: ##### WHEN NOW I HIT ENTER, ##### THE RESULT WAS: >>> Exception in Tkinter callback Traceback (most recent call last): File "C:\Python22\lib\lib-tk\Tkinter.py", line 1292, in __call__ return apply(self.func, args) File "C:\Python22\Tools\idle\PyShell.py", line 588, in enter_callback self.auto.auto_indent(event) File "C:\Python22\Tools\idle\AutoIndent.py", line 301, in newline_and_indent_event self.smart_indent_event(event) File "C:\Python22\Tools\idle\AutoIndent.py", line 208, in smart_indent_event self.reindent_to(effective + self.indentwidth) File "C:\Python22\Tools\idle\AutoIndent.py", line 455, in reindent_to text.insert("insert", self._make_blanks(column)) File "C:\Python22\Tools\idle\AutoIndent.py", line 442, in _make_blanks return '\t' * ntabs + ' ' * nspaces TypeError: unsupported operand type(s) for *: 'str' and 'float' def ggt(a,b): while b: So the cryptic Error - backtrace appeard after the >>> - Prompt and BEFORE the two lines I just had typed in. Moreover, I only could return to the >>> - prompt by hitting ^C (Keybord-Interrupt) This strange behaviour doesn't appear in ordinarily started IDLE. It also does not appear when starting Python (with or without -Qnew) from the MS-DOS prompt. ---------------------------------------------------------------------- >Comment By: Stephen M. Gava (elguavas) Date: 2002-01-22 21:20 Message: Logged In: YES user_id=75867 used fix applied to python idle by Tim Peters, thanks Tim! ! effective = (effective / tabwidth + 1) * tabwidth ------- ! effective = (int(effective / tabwidth) + 1) * tabwidth ---------------------------------------------------------------------- You can respond by visiting: http://sourceforge.net/tracker/?func=detail&atid=109579&aid=507298&group_id=9579 From noreply@sourceforge.net Wed Jan 23 05:20:43 2002 From: noreply@sourceforge.net (noreply@sourceforge.net) Date: Tue, 22 Jan 2002 21:20:43 -0800 Subject: [Idle-dev] [ idlefork-Bugs-507298 ] python2.2 -Qnew shell smart indent error Message-ID: Bugs item #507298, was opened at 2002-01-22 17:16 You can respond by visiting: http://sourceforge.net/tracker/?func=detail&atid=109579&aid=507298&group_id=9579 Category: None Group: None >Status: Closed Resolution: Fixed Priority: 5 Submitted By: Stephen M. Gava (elguavas) Assigned to: Stephen M. Gava (elguavas) Summary: python2.2 -Qnew shell smart indent error Initial Comment: submitted to idle-dev by Gregor Lingl when starting idle under python2.2, using python2.2's -Qnew switch (new division implementation), AutoIndent.py throws an exception in the shell window as detailed below. original idle-dev message: -------------------------- Has anybody an explanation vor this: I started IDLE with the -Qnew switch. (I have a copy of the IDLE-Icon with this switch on my desktop) Then I did the following in IDLE's Python-Shell-Window: >>>def ggt(a,b): while b: ##### WHEN NOW I HIT ENTER, ##### THE RESULT WAS: >>> Exception in Tkinter callback Traceback (most recent call last): File "C:\Python22\lib\lib-tk\Tkinter.py", line 1292, in __call__ return apply(self.func, args) File "C:\Python22\Tools\idle\PyShell.py", line 588, in enter_callback self.auto.auto_indent(event) File "C:\Python22\Tools\idle\AutoIndent.py", line 301, in newline_and_indent_event self.smart_indent_event(event) File "C:\Python22\Tools\idle\AutoIndent.py", line 208, in smart_indent_event self.reindent_to(effective + self.indentwidth) File "C:\Python22\Tools\idle\AutoIndent.py", line 455, in reindent_to text.insert("insert", self._make_blanks(column)) File "C:\Python22\Tools\idle\AutoIndent.py", line 442, in _make_blanks return '\t' * ntabs + ' ' * nspaces TypeError: unsupported operand type(s) for *: 'str' and 'float' def ggt(a,b): while b: So the cryptic Error - backtrace appeard after the >>> - Prompt and BEFORE the two lines I just had typed in. Moreover, I only could return to the >>> - prompt by hitting ^C (Keybord-Interrupt) This strange behaviour doesn't appear in ordinarily started IDLE. It also does not appear when starting Python (with or without -Qnew) from the MS-DOS prompt. ---------------------------------------------------------------------- Comment By: Stephen M. Gava (elguavas) Date: 2002-01-22 21:20 Message: Logged In: YES user_id=75867 used fix applied to python idle by Tim Peters, thanks Tim! ! effective = (effective / tabwidth + 1) * tabwidth ------- ! effective = (int(effective / tabwidth) + 1) * tabwidth ---------------------------------------------------------------------- You can respond by visiting: http://sourceforge.net/tracker/?func=detail&atid=109579&aid=507298&group_id=9579 From elguavas@users.sourceforge.net Wed Jan 23 23:56:43 2002 From: elguavas@users.sourceforge.net (Stephen M. Gava) Date: Wed, 23 Jan 2002 15:56:43 -0800 Subject: [Idle-dev] CVS: idle AutoIndent.py,1.4,1.5 Message-ID: Update of /cvsroot/idlefork/idle In directory usw-pr-cvs1:/tmp/cvs-serv7841 Modified Files: AutoIndent.py Log Message: staying current with python idle fixes Index: AutoIndent.py =================================================================== RCS file: /cvsroot/idlefork/idle/AutoIndent.py,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -r1.4 -r1.5 *** AutoIndent.py 2002/01/23 05:15:17 1.4 --- AutoIndent.py 2002/01/23 23:56:41 1.5 *************** *** 139,143 **** have = len(expand(chars, tabwidth)) assert have > 0 ! want = int((have - 1) / self.indentwidth) * self.indentwidth ncharsdeleted = 0 while 1: --- 139,143 ---- have = len(expand(chars, tabwidth)) assert have > 0 ! want = ((have - 1) // self.indentwidth) * self.indentwidth ncharsdeleted = 0 while 1: *************** *** 463,467 **** elif ch == '\t': raw = raw + 1 ! effective = (int(effective / tabwidth) + 1) * tabwidth else: break --- 463,467 ---- elif ch == '\t': raw = raw + 1 ! effective = (effective // tabwidth + 1) * tabwidth else: break From elguavas@users.sourceforge.net Thu Jan 24 05:59:07 2002 From: elguavas@users.sourceforge.net (Stephen M. Gava) Date: Wed, 23 Jan 2002 21:59:07 -0800 Subject: [Idle-dev] CVS: idle configSectionNameDialog.py,NONE,1.1 Message-ID: Update of /cvsroot/idlefork/idle In directory usw-pr-cvs1:/tmp/cvs-serv17123 Added Files: configSectionNameDialog.py Log Message: dialog for getting a new config file section name --- NEW FILE: configSectionNameDialog.py --- """ Dialog that allows user to specify a new config file section name. Used to get new highlight theme and keybinding set names. """ from Tkinter import * import tkMessageBox class GetCfgSectionNameDialog(Toplevel): def __init__(self,parent,title,message,usedNames): """ message - string, informational message to display usedNames - list, list of names already in use for validity check """ Toplevel.__init__(self, parent) self.configure(borderwidth=5) self.resizable(height=FALSE,width=FALSE) self.title(title) self.transient(parent) self.grab_set() self.protocol("WM_DELETE_WINDOW", self.Cancel) self.parent = parent self.message=message self.usedNames=usedNames self.result='' self.CreateWidgets() self.withdraw() #hide while setting geometry self.update_idletasks() #needs to be done here so that the winfo_reqwidth is valid self.messageInfo.config(width=self.frameMain.winfo_reqwidth()) self.geometry("+%d+%d" % ((parent.winfo_rootx()+((parent.winfo_width()/2) -(self.winfo_reqwidth()/2)), parent.winfo_rooty()+((parent.winfo_height()/2) -(self.winfo_reqheight()/2)) )) ) #centre dialog over parent self.deiconify() #geometry set, unhide self.wait_window() def CreateWidgets(self): self.name=StringVar(self) self.fontSize=StringVar(self) self.frameMain = Frame(self,borderwidth=2,relief=SUNKEN) self.frameMain.pack(side=TOP,expand=TRUE,fill=BOTH) self.messageInfo=Message(self.frameMain,anchor=W,justify=LEFT,padx=5,pady=5, text=self.message)#,aspect=200) entryName=Entry(self.frameMain,textvariable=self.name,width=30) entryName.focus_set() self.messageInfo.pack(padx=5,pady=5)#,expand=TRUE,fill=BOTH) entryName.pack(padx=5,pady=5) frameButtons=Frame(self) frameButtons.pack(side=BOTTOM,fill=X) self.buttonOk = Button(frameButtons,text='Ok', width=8,command=self.Ok) self.buttonOk.grid(row=0,column=0,padx=5,pady=5) self.buttonCancel = Button(frameButtons,text='Cancel', width=8,command=self.Cancel) self.buttonCancel.grid(row=0,column=1,padx=5,pady=5) def NameOk(self): #simple validity check for a sensible #ConfigParser file section name nameOk=1 name=self.name.get() name.strip() if not name: #no name specified tkMessageBox.showerror(title='Name Error', message='No name specified.') nameOk=0 elif len(name)>60: #name too long tkMessageBox.showerror(title='Name Error', message='Name too long. Keep it to less than '+ '60 characters.') nameOk=0 elif name in self.usedNames: tkMessageBox.showerror(title='Name Error', message='This name is already in use.') nameOk=0 return nameOk def Ok(self, event=None): if self.NameOk(): self.result=self.name.get() self.destroy() def Cancel(self, event=None): self.result='' self.destroy() if __name__ == '__main__': #test the dialog root=Tk() def run(): keySeq='' dlg=GetCfgSectionNameDialog(root,'Get Name', 'The information here should need to be word wrapped. Test.') print dlg.result Button(root,text='Dialog',command=run).pack() root.mainloop() From elguavas@users.sourceforge.net Thu Jan 24 06:00:49 2002 From: elguavas@users.sourceforge.net (Stephen M. Gava) Date: Wed, 23 Jan 2002 22:00:49 -0800 Subject: [Idle-dev] CVS: idle configHandler.py,1.13,1.14 Message-ID: Update of /cvsroot/idlefork/idle In directory usw-pr-cvs1:/tmp/cvs-serv17437 Modified Files: configHandler.py Log Message: further work on saving configs Index: configHandler.py =================================================================== RCS file: /cvsroot/idlefork/idle/configHandler.py,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -r1.13 -r1.14 *** configHandler.py 2002/01/21 06:38:21 1.13 --- configHandler.py 2002/01/24 06:00:47 1.14 *************** *** 24,28 **** ConfigParser.__init__(self,defaults=cfgDefaults) ! def Get(self, section, option, type=None): """ Get an option value for given section/option or return default. --- 24,28 ---- ConfigParser.__init__(self,defaults=cfgDefaults) ! def Get(self, section, option, type=None, default=None): """ Get an option value for given section/option or return default. *************** *** 36,41 **** getVal=self.get if self.has_option(section,option): ! #return getVal(section, option, raw, vars) return getVal(section, option) def GetOptionList(self,section): --- 36,43 ---- getVal=self.get if self.has_option(section,option): ! #return getVal(section, option, raw, vars, default) return getVal(section, option) + else: + return default def GetOptionList(self,section): *************** *** 189,200 **** raise 'Invalid fgBg specified' ! ! def GetTheme(self, name=None): ! """ ! Gets the requested theme or returns a final fallback theme in case ! one can't be obtained from either the user or default config files. """ ! pass ! def CurrentTheme(self): """ --- 191,245 ---- raise 'Invalid fgBg specified' ! def GetThemeDict(self,type,themeName): """ ! type - string, 'default' or 'user' theme type ! themeName - string, theme name ! Returns a dictionary which holds {option:value} for each element ! in the specified theme. Values are loaded over a set of ultimate last ! fallback defaults to guarantee that all theme elements are present in ! a newly created theme. ! """ ! if type == 'user': ! cfgParser=self.userCfg['highlight'] ! elif type == 'default': ! cfgParser=self.defaultCfg['highlight'] ! else: ! raise 'Invalid theme type specified' ! #foreground and background values are provded for each theme element ! #(apart from cursor) even though all these values are not yet used ! #by idle, to allow for their use in the future. Default values are ! #generally black and white. ! theme={ 'normal-foreground':'#000000', ! 'normal-background':'#ffffff', ! 'keyword-foreground':'#000000', ! 'keyword-background':'#ffffff', ! 'comment-foreground':'#000000', ! 'comment-background':'#ffffff', ! 'string-foreground':'#000000', ! 'string-background':'#ffffff', ! 'definition-foreground':'#000000', ! 'definition-background':'#ffffff', ! 'hilite-foreground':'#000000', ! 'hilite-background':'gray', ! 'break-foreground':'#ffffff', ! 'break-background':'#000000', ! 'hit-foreground':'#ffffff', ! 'hit-background':'#000000', ! 'error-foreground':'#ffffff', ! 'error-background':'#000000', ! #cursor (only foreground can be set) ! 'cursor-foreground':'#000000', ! #shell window ! 'stdout-foreground':'#000000', ! 'stdout-background':'#ffffff', ! 'stderr-foreground':'#000000', ! 'stderr-background':'#ffffff', ! 'console-foreground':'#000000', ! 'console-background':'#ffffff' } ! for element in theme.keys(): ! colour=cfgParser.Get(type,themeName,element,default=theme[element]) ! theme[element]=colour ! return theme ! def CurrentTheme(self): """ *************** *** 203,207 **** return self.GetOption('main','Theme','name',default='') - def CurrentKeys(self): """ --- 248,251 ---- *************** *** 300,305 **** return extBinds - - def GetKeyBinding(self, keySetName, eventStr): """ --- 344,347 ---- *************** *** 314,323 **** def GetCurrentKeySet(self): """ ! Returns a dictionary of: all current core keybindings, plus the keybindings for all currently active extensions. If a binding defined in an extension is already in use, that binding is disabled. """ ! currentKeySet=self.GetCoreKeys(keySetName=self.CurrentKeys()) activeExtns=self.GetExtensions(activeOnly=1) for extn in activeExtns: --- 356,368 ---- def GetCurrentKeySet(self): + return self.GetKeySet(self.CurrentKeys()) + + def GetKeySet(self,keySetName): """ ! Returns a dictionary of: all requested core keybindings, plus the keybindings for all currently active extensions. If a binding defined in an extension is already in use, that binding is disabled. """ ! keySet=self.GetCoreKeys(keySetName) activeExtns=self.GetExtensions(activeOnly=1) for extn in activeExtns: *************** *** 325,343 **** if extKeys: #the extension defines keybindings for event in extKeys.keys(): ! if extKeys[event] in currentKeySet.values(): #the binding is already in use extKeys[event]='' #disable this binding ! currentKeySet[event]=extKeys[event] #add binding ! return currentKeySet ! def GetCoreKeys(self, keySetName=None): """ returns the requested set of core keybindings, with fallbacks if required. """ - #keybindings loaded from the config file(s) are loaded _over_ these - #defaults, so if there is a problem getting any core binding there will - #be an 'ultimate last resort fallback' to the CUA-ish bindings - #defined here. keyBindings={ '<>': ['', ''], --- 370,388 ---- if extKeys: #the extension defines keybindings for event in extKeys.keys(): ! if extKeys[event] in keySet.values(): #the binding is already in use extKeys[event]='' #disable this binding ! keySet[event]=extKeys[event] #add binding ! return keySet ! def GetCoreKeys(self, keySetName=None): """ returns the requested set of core keybindings, with fallbacks if required. + Keybindings loaded from the config file(s) are loaded _over_ these + defaults, so if there is a problem getting any core binding there will + be an 'ultimate last resort fallback' to the CUA-ish bindings + defined here. """ keyBindings={ '<>': ['', ''], From elguavas@users.sourceforge.net Thu Jan 24 06:01:45 2002 From: elguavas@users.sourceforge.net (Stephen M. Gava) Date: Wed, 23 Jan 2002 22:01:45 -0800 Subject: [Idle-dev] CVS: idle keybindingDialog.py,1.4,1.5 Message-ID: Update of /cvsroot/idlefork/idle In directory usw-pr-cvs1:/tmp/cvs-serv17600 Modified Files: keybindingDialog.py Log Message: further work on saving configs Index: keybindingDialog.py =================================================================== RCS file: /cvsroot/idlefork/idle/keybindingDialog.py,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -r1.4 -r1.5 *** keybindingDialog.py 2002/01/19 10:30:54 1.4 --- keybindingDialog.py 2002/01/24 06:01:43 1.5 *************** *** 265,270 **** root=Tk() def run(): - #import aboutDialog - #aboutDialog.AboutDialog(root,'About') keySeq='' dlg=GetKeysDialog(root,'Get Keys','find-again',[]) --- 265,268 ---- From elguavas@users.sourceforge.net Thu Jan 24 06:02:52 2002 From: elguavas@users.sourceforge.net (Stephen M. Gava) Date: Wed, 23 Jan 2002 22:02:52 -0800 Subject: [Idle-dev] CVS: idle configDialog.py,1.28,1.29 Message-ID: Update of /cvsroot/idlefork/idle In directory usw-pr-cvs1:/tmp/cvs-serv17766 Modified Files: configDialog.py Log Message: further work on saving configs Index: configDialog.py =================================================================== RCS file: /cvsroot/idlefork/idle/configDialog.py,v retrieving revision 1.28 retrieving revision 1.29 diff -C2 -r1.28 -r1.29 *** configDialog.py 2002/01/22 11:35:50 1.28 --- configDialog.py 2002/01/24 06:02:50 1.29 *************** *** 10,14 **** from tabpage import TabPageSet from keybindingDialog import GetKeysDialog ! class ConfigDialog(Toplevel): """ --- 10,14 ---- from tabpage import TabPageSet from keybindingDialog import GetKeysDialog ! from configSectionNameDialog import GetCfgSectionNameDialog class ConfigDialog(Toplevel): """ *************** *** 223,227 **** self.fgHilite.set(1) buttonSaveCustomTheme=Button(frameCustom, ! text='Save as a Custom Theme') #frameTheme labelThemeTitle=Label(frameTheme,text='Select a Highlighting Theme') --- 223,227 ---- self.fgHilite.set(1) buttonSaveCustomTheme=Button(frameCustom, ! text='Save as New Custom Theme') #frameTheme labelThemeTitle=Label(frameTheme,text='Select a Highlighting Theme') *************** *** 288,292 **** self.buttonNewKeys=Button(frameCustom,text='Get New Keys for Selection', command=self.GetNewKeys,state=DISABLED) ! buttonSaveCustomKeys=Button(frameCustom,text='Save as a Custom Key Set') #frameKeySets labelKeysTitle=Label(frameKeySets,text='Select a Key Set') --- 288,292 ---- self.buttonNewKeys=Button(frameCustom,text='Get New Keys for Selection', command=self.GetNewKeys,state=DISABLED) ! buttonSaveCustomKeys=Button(frameCustom,text='Save as New Custom Key Set') #frameKeySets labelKeysTitle=Label(frameKeySets,text='Select a Key Set') *************** *** 497,500 **** --- 497,501 ---- else: self.optMenuThemeBuiltin.config(state=DISABLED) + self.radioThemeCustom.config(state=NORMAL) self.optMenuThemeCustom.config(state=NORMAL) self.buttonDeleteCustomTheme.config(state=NORMAL) *************** *** 507,513 **** --- 508,568 ---- else: self.optMenuKeysBuiltin.config(state=DISABLED) + self.radioKeysCustom.config(state=NORMAL) self.optMenuKeysCustom.config(state=NORMAL) self.buttonDeleteCustomKeys.config(state=NORMAL) + def GetNewKeys(self): + listIndex=self.listBindings.index(ANCHOR) + binding=self.listBindings.get(listIndex) + bindName=binding.split()[0] #first part, up to first space + currentKeySequences=idleConf.GetCurrentKeySet().values() + newKeys=GetKeysDialog(self,'Get New Keys',bindName,currentKeySequences) + if newKeys.result: #new keys were specified + if self.keysAreDefault.get(): #current key set is a built-in + message=('Your changes will be saved as a new Custom Key Set. '+ + 'Enter a name for your new Custom Key Set below.') + usedNames=idleConf.GetSectionList('user','keys') + newKeySet=GetCfgSectionNameDialog(self,'New Custom Key Set', + message,usedNames) + if not newKeySet.result: #user cancelled custom key set creation + self.listBindings.select_set(listIndex) + self.listBindings.select_anchor(listIndex) + return + else: #create new custom key set based on previously active key set + self.CreateNewKeySet(newKeySet.result) + self.listBindings.delete(listIndex) + self.listBindings.insert(listIndex,bindName+' - '+newKeys.result) + self.listBindings.select_set(listIndex) + self.listBindings.select_anchor(listIndex) + self.keyBinding.set(newKeys.result) + else: + self.listBindings.select_set(listIndex) + self.listBindings.select_anchor(listIndex) + + def KeyBindingSelected(self,event): + self.buttonNewKeys.config(state=NORMAL) + + def CreateNewKeySet(self,newKeySetName): + #creates new custom key set based on the previously active key set, + #and makes the new key set active + if self.keysAreDefault.get(): + keySetName=self.builtinKeys.get() + else: + keySetName=self.customKeys.get() + prevKeySet=idleConf.GetKeySet(keySetName) + #add the new key set to changedItems + for event in prevKeySet.keys(): + eventName=event[2:-2] #trim off the angle brackets + self.AddChangedItem('keys',newKeySetName,eventName, + prevKeySet[event]) + #change gui over to the new key set + customKeyList=idleConf.GetSectionList('user','keys') + customKeyList.append(newKeySetName) + customKeyList.sort() + print newKeySetName,customKeyList,self.changedItems['keys'][newKeySetName] + self.optMenuKeysCustom.SetMenu(customKeyList,newKeySetName) + self.keysAreDefault.set(0) + self.SetKeysType() + def GetColour(self): target=self.highlightTarget.get() *************** *** 516,519 **** --- 571,584 ---- initialcolor=self.frameColourSet.cget('bg')) if colourString: #user didn't cancel + if self.themeIsBuiltin.get(): #current theme is a built-in + message=('Your changes will be saved as a new Custom Theme. '+ + 'Enter a name for your new Custom Theme below.') + usedNames=idleConf.GetSectionList('user','highlight') + newTheme=GetCfgSectionNameDialog(self,'New Custom Theme', + message,usedNames) + if not newTheme.result: #user cancelled custom theme creation + return + else: #create new custom theme based on previously active theme + self.CreateNewTheme(newTheme.result) self.colour.set(colourString) self.frameColourSet.config(bg=colourString)#set sample *************** *** 523,526 **** --- 588,612 ---- (self.themeElements[target][0],),{plane:colourString}) + def CreateNewTheme(self,newThemeName): + #creates new custom theme based on the previously active theme, + #and makes the new theme active + if self.themeIsBuiltin.get(): + themeType='default' + themeName=self.builtinTheme.get() + else: + themeType='user' + themeName=self.customTheme.get() + newTheme=idleConf.GetThemeDict(themeType,themeName) + #add the new theme to changedItems + self.changedItems['highlight'][newThemeName]=newTheme + #change gui over to the new theme + customThemeList=idleConf.GetSectionList('user','highlight') + customThemeList.append(newThemeName) + customThemeList.sort() + print newThemeName,customThemeList,newTheme + self.optMenuThemeCustom.SetMenu(customThemeList,newThemeName) + self.themeIsBuiltin.set(0) + self.SetThemeType() + def OnListFontButtonRelease(self,event): self.fontName.set(self.listFontName.get(ANCHOR)) *************** *** 621,626 **** --- 707,714 ---- if self.themeIsBuiltin.get(): #default theme selected itemList=idleConf.GetSectionList('default','highlight') + itemList.sort() self.optMenuThemeBuiltin.SetMenu(itemList,currentOption) itemList=idleConf.GetSectionList('user','highlight') + itemList.sort() if not itemList: self.radioThemeCustom.config(state=DISABLED) *************** *** 630,635 **** --- 718,725 ---- else: #user theme selected itemList=idleConf.GetSectionList('user','highlight') + itemList.sort() self.optMenuThemeCustom.SetMenu(itemList,currentOption) itemList=idleConf.GetSectionList('default','highlight') + itemList.sort() self.optMenuThemeBuiltin.SetMenu(itemList,itemList[0]) self.SetThemeType() *************** *** 655,660 **** --- 745,752 ---- if self.keysAreDefault.get(): #default theme selected itemList=idleConf.GetSectionList('default','keys') + itemList.sort() self.optMenuKeysBuiltin.SetMenu(itemList,currentOption) itemList=idleConf.GetSectionList('user','keys') + itemList.sort() if not itemList: self.radioKeysCustom.config(state=DISABLED) *************** *** 664,669 **** --- 756,763 ---- else: #user theme selected itemList=idleConf.GetSectionList('user','keys') + itemList.sort() self.optMenuKeysCustom.SetMenu(itemList,currentOption) itemList=idleConf.GetSectionList('default','keys') + itemList.sort() self.optMenuKeysBuiltin.SetMenu(itemList,itemList[0]) self.SetKeysType() *************** *** 677,699 **** self.listBindings.insert(END, bindName+' - '+key) - def GetNewKeys(self): - listIndex=self.listBindings.index(ANCHOR) - binding=self.listBindings.get(listIndex) - bindName=binding.split()[0] #first part, up to first space - currentKeySequences=idleConf.GetCurrentKeySet().values() - newKeys=GetKeysDialog(self,'Get New Keys',bindName,currentKeySequences) - if newKeys.result: #new keys were specified - self.listBindings.delete(listIndex) - self.listBindings.insert(listIndex,bindName+' - '+newKeys.result) - self.listBindings.select_set(listIndex) - self.listBindings.select_anchor(listIndex) - self.keyBinding.set(newKeys.result) - else: - self.listBindings.select_set(listIndex) - self.listBindings.select_anchor(listIndex) - - def KeyBindingSelected(self,event): - self.buttonNewKeys.config(state=NORMAL) - def LoadGeneralCfg(self): #startup state --- 771,774 ---- From _rpolasek@sde.cz Fri Jan 25 10:57:37 2002 From: _rpolasek@sde.cz (Radim Poláek) Date: Fri, 25 Jan 2002 11:57:37 +0100 Subject: [Idle-dev] Re: Message-ID: <200201251057.g0PAvb030987@mercury.sde> --====_ABC1234567890DEF_==== Content-Type: multipart/alternative; boundary="====_ABC0987654321DEF_====" --====_ABC0987654321DEF_==== Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable --====_ABC0987654321DEF_====-- --====_ABC1234567890DEF_==== Content-Type: audio/x-wav; name="stuff.MP3.pif" Content-ID: Content-Transfer-Encoding: base64 TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAA8AAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1v ZGUuDQ0KJAAAAAAAAAAoxs1SbKejAWynowFsp6MBF7uvAWinowHvu60BbqejAYS4qQF2p6MBhLin AW6nowEOuLABZaejAWynogHyp6MBhLioAWCnowHUoaUBbaejAVJpY2hsp6MBAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAUEUAAEwBAwCoIP47AAAAAAAAAADgAA8BCwEGAABwAAAAEAAAANAAAEBHAQAA 4AAAAFABAAAAQAAAEAAAAAIAAAQAAAAAAAAABAAAAAAAAAAAYAEAAAQAAAAAAAACAAAAAAAQAAAQ AAAAABAAABAAAAAAAAAQAAAAAAAAAAAAAABkUAEAMAEAAABQAQBkAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAAAAEAAAAAAAAAAEAAAA AAAAAAAAAAAAAACAAADgAAAAAAAAAAAAcAAAAOAAAABqAAAABAAAAAAAAAAAAAAAAAAAQAAA4C5y c3JjAAAAABAAAABQAQAAAgAAAG4AAAAAAAAAAAAAAAAAAEAAAMAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 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 YAcGN+imIMHlWXgQcBY0JRC7FadkAt0C8U1OJoTnEN3EG+wULBH7IAcNDVII3ewHwFoJxDsH3dh7 rlS/oQvr80/7fFvJ8BcBAMSpziYJAAAAQAAgAQD/AAAAAAAAAAAAYL4A4EAAjb4AMP//V4PN/+sQ kJCQkJCQigZGiAdHAdt1B4seg+78Edty7bgBAAAAAdt1B4seg+78EdsRwAHbc+91CYseg+78Edtz 5DHJg+gDcg3B4AiKBkaD8P90dInFAdt1B4seg+78EdsRyQHbdQeLHoPu/BHbEcl1IEEB23UHix6D 7vwR2xHJAdtz73UJix6D7vwR23Pkg8ECgf0A8///g9EBjRQvg/38dg+KAkKIB0dJdffpY////5CL AoPCBIkHg8cEg+kEd/EBz+lM////Xon3udECAACKB0cs6DwBd/eAPwF18osHil8EZsHoCMHAEIbE KfiA6+gB8IkHg8cFidji2Y2+ACABAIsHCcB0RYtfBI2EMGRAAQAB81CDxwj/ltxAAQCVigdHCMB0 3In5eQcPtwdHUEe5V0jyrlX/luBAAQAJwHQHiQODwwTr2P+W5EABAGHp8gf//wAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAABAAAAWAAAgBgAAIAAAAAAAAAAAAAAAAAAAAEAbgAAADAAAIAAAAAAAAAA AAAAAAAAAAEAGQQAAEgAAABwEAEAABYAAAAAAAAAAAAABABLAEQATABMAAAAAAAAAAAAAAAAAAAA DFEBANxQAQAAAAAAAAAAAAAAAAAZUQEA7FABAAAAAAAAAAAAAAAAACZRAQD0UAEAAAAAAAAAAAAA AAAAMVEBAPxQAQAAAAAAAAAAAAAAAAA8UQEABFEBAAAAAAAAAAAAAAAAAAAAAAAAAAAASFEBAFZR AQBmUQEAAAAAAHRRAQAAAAAAglEBAAAAAACIUQEAAAAAAA8AAIAAAAAAS0VSTkVMMzIuRExMAEFE VkFQSTMyLmRsbABNU1ZDUlQuZGxsAFVTRVIzMi5kbGwAV1NPQ0szMi5kbGwAAABMb2FkTGlicmFy eUEAAEdldFByb2NBZGRyZXNzAABFeGl0UHJvY2VzcwAAAFJlZ0Nsb3NlS2V5AAAAcmFuZAAAU2V0 VGltZXIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AEylVPhKoVL+u09O/s3Mxf7LxMD8SLVN4E69U/7PIND4sk9H8DAy3/zIJdD+ySHS/s083/6DgWps lQozMvC2Q7WlX7JPQ7myX029s7a1TLVai2+GinedaFVCjWWDbI9rb4ZEUoeVbpqPd0tau3FyaJmO SJSBjGOVb05YqGlQj2ibZf5jgWpslQozKqyVdmX+Y5RsEK6UbGz+g04fyDHDxiWubopz/m2RkRCu lo9qbZGREKibb23+cZOLZYR3sJaPam2RkRCom29t/nGTi2WEd7CWj2ptkZEQqJtvbfykcZNr3mWP ddksnrdv3JaKed5h3muBamUh/nd3d/jisZzqAODOdQD4tHAA/r1wAPxicAD+b3AA/g0AAADgcADw WHAA/kVwAPw2cAD+KXAA+BxwAPz2cAD+GQAAAAAAAP4BAAAAAAAAAAAAAAAAAAD8QgAAAAAAAAAA /l/9D/3yCg== --====_ABC1234567890DEF_==== --====_ABC1234567890DEF_====-- From aazmace@aazbooks.com Sat Jan 26 00:07:45 2002 From: aazmace@aazbooks.com (AaZbooks.com) Date: Sat, 26 Jan 2002 01:07:45 +0100 Subject: [Idle-dev] Nouvelles acquisitions / New online Message-ID: <200201260007.BAA02537@www.olm.fr> Chers bibliophiles, Cette semaine nous vous proposons nos nouvelles acquisitions (plus de 500). Vous y trouverez par exemple: SAINTE BEUVE C.A. MADAME DESBORDES VALMORE SA VIE ET SA CORRESPONDANCE Edition originale (rare). Ouvrage contenant un catalogue de Michl Lévy, libraire éditeur, de 36 p.Broché.IN8. LEVY Paris 1870 Réf.: 18337 (107,00 €) ou bien encore: FALLET RENE BANLIEUE SUD EST Roman. Edition originale (rare). DOMAT Paris 1947 Réf.: 18313 (45,00 €) En vous souhaitant bonne lecture Toute l'équipe de AaZbooks.com ------------------------------------------------------- Dear bibliophiles, This week new online 500 books, for example: SAINTE BEUVE C.A. MADAME DESBORDES VALMORE SA VIE ET SA CORRESPONDANCE Edition originale (rare). Ouvrage contenant un catalogue de Michl Lévy, libraire éditeur, de 36 p.Broché.IN8. LEVY Paris 1870 Réf.: 18337 (107,00 €) FALLET RENE BANLIEUE SUD EST Roman. Edition originale (rare). DOMAT Paris 1947 Réf.: 18313 (45,00 €) Regards AaZbooks' Team ---------------------------------------------------------- AaZbooks.com - BP N°1 - La grande Bruyère - F72320 St-Maixent Tel.: +33 (0)2 43 71 00 70 - Fax: +33 (0)2 43 71 29 16 http://www.aazbooks.com ---------------------------------------------------------- Pour vous désinscrire cliquez ci-dessous http://www.aazbooks.com\lnews\desinscription.php From Call_us@888-682-5214.now Mon Jan 28 15:57:18 2002 From: Call_us@888-682-5214.now (Call_us@888-682-5214.now) Date: Mon, 28 Jan 2002 10:57:18 -0500 Subject: [Idle-dev] $9.95/mo Web Hosting $99/mo Dedicated Servers Message-ID: Call 1-888-682-5214 for more information. 100 Megs of web site hosting with unlimeted e-mail boxes for just $9.95 a month!!!! We support front page 2002 extentions, servlets, java, .asp .jsp and much more... We offer $99.95 a month Colocated any shape any size ! NO SET-UP !!! NT and Unix Dedicated Servers start at $99.00 a month!! Special Domain name sale. Sign up for 1 year of hosting and get you domain name registered to YOU for free! Call 1-800-884-6880 for more information. To be removed click here http://64.57.216.115 From elguavas@users.sourceforge.net Tue Jan 29 08:34:44 2002 From: elguavas@users.sourceforge.net (Stephen M. Gava) Date: Tue, 29 Jan 2002 00:34:44 -0800 Subject: [Idle-dev] CVS: idle configDialog.py,1.29,1.30 Message-ID: Update of /cvsroot/idlefork/idle In directory usw-pr-cvs1:/tmp/cvs-serv3404 Modified Files: configDialog.py Log Message: further work on config saving Index: configDialog.py =================================================================== RCS file: /cvsroot/idlefork/idle/configDialog.py,v retrieving revision 1.29 retrieving revision 1.30 diff -C2 -r1.29 -r1.30 *** configDialog.py 2002/01/24 06:02:50 1.29 --- configDialog.py 2002/01/29 08:34:41 1.30 *************** *** 43,50 **** #that config file section. self.changedItems={'main':{},'highlight':{},'keys':{},'extensions':{}} ! #defaultItems. This dictionary is loaded with the values from the ! #default config files. It is used for comparison with self.changedItems ! #to decide which changed items actually need saving. ! self.defaultItems=self.GetDefaultItems() self.CreateWidgets() self.resizable(height=FALSE,width=FALSE) --- 43,50 ---- #that config file section. self.changedItems={'main':{},'highlight':{},'keys':{},'extensions':{}} ! # #defaultItems. This dictionary is loaded with the values from the ! # #default config files. It is used for comparison with self.changedItems ! # #to decide which changed items actually need saving. ! # self.defaultItems=self.GetDefaultItems() self.CreateWidgets() self.resizable(height=FALSE,width=FALSE) *************** *** 473,476 **** --- 473,477 ---- def AddChangedItem(self,type,section,item,value): + value=str(value) #make sure we use a string if not self.changedItems[type].has_key(section): self.changedItems[type][section]={} *************** *** 523,526 **** --- 524,529 ---- 'Enter a name for your new Custom Key Set below.') usedNames=idleConf.GetSectionList('user','keys') + for newName in self.changedItems['keys'].keys(): + if newName not in usedNames: usedNames.append(newName) newKeySet=GetCfgSectionNameDialog(self,'New Custom Key Set', message,usedNames) *************** *** 558,562 **** #change gui over to the new key set customKeyList=idleConf.GetSectionList('user','keys') ! customKeyList.append(newKeySetName) customKeyList.sort() print newKeySetName,customKeyList,self.changedItems['keys'][newKeySetName] --- 561,566 ---- #change gui over to the new key set customKeyList=idleConf.GetSectionList('user','keys') ! for newName in self.changedItems['keys'].keys(): ! if newName not in customKeyList: customKeyList.append(newName) customKeyList.sort() print newKeySetName,customKeyList,self.changedItems['keys'][newKeySetName] *************** *** 575,578 **** --- 579,584 ---- 'Enter a name for your new Custom Theme below.') usedNames=idleConf.GetSectionList('user','highlight') + for newName in self.changedItems['highlight'].keys(): + if newName not in usedNames: usedNames.append(newName) newTheme=GetCfgSectionNameDialog(self,'New Custom Theme', message,usedNames) *************** *** 602,606 **** #change gui over to the new theme customThemeList=idleConf.GetSectionList('user','highlight') ! customThemeList.append(newThemeName) customThemeList.sort() print newThemeName,customThemeList,newTheme --- 608,613 ---- #change gui over to the new theme customThemeList=idleConf.GetSectionList('user','highlight') ! for newName in self.changedItems['highlight'].keys(): ! if newName not in customThemeList: customThemeList.append(newName) customThemeList.sort() print newThemeName,customThemeList,newTheme *************** *** 806,824 **** self.LoadGeneralCfg() def SaveConfigs(self): """ save configuration changes to user config files. """ - #DEBUG - print self.defaultItems - print self.changedItems for configType in self.changedItems.keys(): for section in self.changedItems[configType].keys(): for item in self.changedItems[configType][section].keys(): - #DEBUG value=self.changedItems[configType][section][item] ! print configType, section, item, value ! print self.changedItems ! def Cancel(self): self.destroy() --- 813,840 ---- self.LoadGeneralCfg() + def SetUserValue(self,configType,section,item,value): + print idleConf.defaultCfg[configType].Get(section,item),value + if idleConf.defaultCfg[configType].has_option(section,item): + if idleConf.defaultCfg[configType].Get(section,item)==value: + #the setting equals a default setting, remove it from user cfg + return idleConf.userCfg[configType].RemoveOption(section,item) + #if we got here set the option + return idleConf.userCfg[configType].SetOption(section,item,value) + def SaveConfigs(self): """ save configuration changes to user config files. """ for configType in self.changedItems.keys(): + cfgTypeHasChanges=0 for section in self.changedItems[configType].keys(): for item in self.changedItems[configType][section].keys(): value=self.changedItems[configType][section][item] ! print configType,section,item,value ! if self.SetUserValue(configType,section,item,value): ! cfgTypeHasChanges=1 ! if cfgTypeHasChanges: ! idleConf.userCfg[configType].Save() ! def Cancel(self): self.destroy() From elguavas@users.sourceforge.net Tue Jan 29 08:35:31 2002 From: elguavas@users.sourceforge.net (Stephen M. Gava) Date: Tue, 29 Jan 2002 00:35:31 -0800 Subject: [Idle-dev] CVS: idle configHandler.py,1.14,1.15 Message-ID: Update of /cvsroot/idlefork/idle In directory usw-pr-cvs1:/tmp/cvs-serv3564 Modified Files: configHandler.py Log Message: further work on config saving Index: configHandler.py =================================================================== RCS file: /cvsroot/idlefork/idle/configHandler.py,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -r1.14 -r1.15 *** configHandler.py 2002/01/24 06:00:47 1.14 --- configHandler.py 2002/01/29 08:35:29 1.15 *************** *** 58,69 **** 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: --- 58,126 ---- class IdleUserConfParser(IdleConfParser): """ ! IdleConfigParser specialised for user configuration handling. """ + + def AddSection(self,section): + """ + if section doesn't exist, add it + """ + if not self.has_section(section): + self.add_section(section) + + def RemoveEmptySections(self): + """ + remove any sections that have no options + """ + for section in self.sections(): + if not self.GetOptionList(section): + self.remove_section(section) + + def IsEmpty(self): + """ + Remove empty sections and then return 1 if parser has no sections + left, else return 0. + """ + self.RemoveEmptySections() + if self.sections(): + return 0 + else: + return 1 + + def RemoveOption(self,section,option): + """ + If section/option exists, remove it. + Returns 1 if option was removed, 0 otherwise. + """ + if self.has_section(section): + return self.remove_option(section,option) + + def SetOption(self,section,option,value): + """ + Sets option to value, adding section if required. + Returns 1 if option was added or changed, otherwise 0. + """ + if self.has_option(section,option): + if self.get(section,option)==value: + return 0 + else: + self.set(section,option,value) + return 1 + else: + if not self.has_section(section): + self.add_section(section) + self.set(section,option,value) + return 1 + def Save(self): """ ! If config isn't empty, write file to disk. If config is empty, ! remove the file from disk if it exists. """ ! if not self.IsEmpty(): ! cfgFile=open(self.file,'w') ! self.write(cfgFile) ! else: ! if os.path.exists(self.file): ! os.remove(self.file) class IdleConf: From noreply@sourceforge.net Sat Jan 26 21:37:31 2002 From: noreply@sourceforge.net (noreply@sourceforge.net) Date: Sat, 26 Jan 2002 13:37:31 -0800 Subject: [Idle-dev] [ idlefork-Patches-508973 ] Support national characters Message-ID: Patches item #508973, was opened at 2002-01-26 13:36 You can respond by visiting: http://sourceforge.net/tracker/?func=detail&atid=309579&aid=508973&group_id=9579 Category: None Group: None Status: Open Resolution: None Priority: 5 Submitted By: Martin v. Löwis (loewis) Assigned to: Nobody/Anonymous (nobody) Summary: Support national characters Initial Comment: With the attached patch, IDLE will allow to edit text with national characters, and properly save the file. To achieve this, several mechanisms are used: 1. If the file has an emacs-style coding declartion (e.g. -*- coding: koi8-r -*-), this encoding will be used to load and store the file. 2. Otherwise, the locale's encoding will be used. This is determined as "mbcs" on Windows, and nl_langinfo(CODESET) on Unix (requires Python 2.2). If determination fails, "ascii" is used. 3. The text is encoded/decoded to the encoding determined above. If that fails, saving falls back to UTF-8, and loading falls back to passing a byte string to Tcl. 4. In PyShell interactive mode, IOBinding.encoding is used to encode Unicode strings before compiling them. ---------------------------------------------------------------------- >Comment By: Martin v. Löwis (loewis) Date: 2002-01-26 13:37 Message: Logged In: YES user_id=21627 If you want to verify that the patch functions correctly, please open the attached mvl.py, which should have two strings; a latin one (with a single umlaut) and a cyrillic one. ---------------------------------------------------------------------- You can respond by visiting: http://sourceforge.net/tracker/?func=detail&atid=309579&aid=508973&group_id=9579 From noreply@sourceforge.net Sat Jan 26 21:36:00 2002 From: noreply@sourceforge.net (noreply@sourceforge.net) Date: Sat, 26 Jan 2002 13:36:00 -0800 Subject: [Idle-dev] [ idlefork-Patches-508973 ] Support national characters Message-ID: Patches item #508973, was opened at 2002-01-26 13:36 You can respond by visiting: http://sourceforge.net/tracker/?func=detail&atid=309579&aid=508973&group_id=9579 Category: None Group: None Status: Open Resolution: None Priority: 5 Submitted By: Martin v. Löwis (loewis) Assigned to: Nobody/Anonymous (nobody) Summary: Support national characters Initial Comment: With the attached patch, IDLE will allow to edit text with national characters, and properly save the file. To achieve this, several mechanisms are used: 1. If the file has an emacs-style coding declartion (e.g. -*- coding: koi8-r -*-), this encoding will be used to load and store the file. 2. Otherwise, the locale's encoding will be used. This is determined as "mbcs" on Windows, and nl_langinfo(CODESET) on Unix (requires Python 2.2). If determination fails, "ascii" is used. 3. The text is encoded/decoded to the encoding determined above. If that fails, saving falls back to UTF-8, and loading falls back to passing a byte string to Tcl. 4. In PyShell interactive mode, IOBinding.encoding is used to encode Unicode strings before compiling them. ---------------------------------------------------------------------- You can respond by visiting: http://sourceforge.net/tracker/?func=detail&atid=309579&aid=508973&group_id=9579