183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh"""IDLE Configuration Dialog: support user customization of IDLE by GUI
283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehCustomize font faces, sizes, and colorization attributes.  Set indentation
483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehdefaults.  Customize keybindings.  Colorization and keybindings can be
583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehsaved as user defined sets.  Select startup options including shell/editor
683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehand default window size.  Define additional help sources.
783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehNote that tab width in IDLE is currently fixed at eight due to Tk issues.
983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew HsiehRefer to comments in EditorWindow autoindent code for details.
1083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
1183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh"""
1283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehfrom Tkinter import *
1383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehimport tkMessageBox, tkColorChooser, tkFont
1483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehimport string
1583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
1683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehfrom idlelib.configHandler import idleConf
1783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehfrom idlelib.dynOptionMenuWidget import DynOptionMenu
1883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehfrom idlelib.tabbedpages import TabbedPageSet
1983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehfrom idlelib.keybindingDialog import GetKeysDialog
2083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehfrom idlelib.configSectionNameDialog import GetCfgSectionNameDialog
2183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehfrom idlelib.configHelpSourceEdit import GetHelpSourceDialog
2283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehfrom idlelib import macosxSupport
2383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
2483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehclass ConfigDialog(Toplevel):
2583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
2683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def __init__(self,parent,title):
2783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        Toplevel.__init__(self, parent)
2883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.wm_withdraw()
2983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
3083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.configure(borderwidth=5)
3183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.title('IDLE Preferences')
3283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.geometry("+%d+%d" % (parent.winfo_rootx()+20,
3383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                parent.winfo_rooty()+30))
3483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #Theme Elements. Each theme element key is its display name.
3583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #The first value of the tuple is the sample area tag name.
3683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #The second value is the display name list sort index.
3783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.themeElements={'Normal Text':('normal','00'),
3883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            'Python Keywords':('keyword','01'),
3983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            'Python Definitions':('definition','02'),
4083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            'Python Builtins':('builtin', '03'),
4183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            'Python Comments':('comment','04'),
4283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            'Python Strings':('string','05'),
4383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            'Selected Text':('hilite','06'),
4483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            'Found Text':('hit','07'),
4583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            'Cursor':('cursor','08'),
4683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            'Error Text':('error','09'),
4783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            'Shell Normal Text':('console','10'),
4883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            'Shell Stdout Text':('stdout','11'),
4983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            'Shell Stderr Text':('stderr','12'),
5083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            }
5183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.ResetChangedItems() #load initial values in changed items dict
5283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.CreateWidgets()
5383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.resizable(height=FALSE,width=FALSE)
5483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.transient(parent)
5583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.grab_set()
5683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.protocol("WM_DELETE_WINDOW", self.Cancel)
5783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.parent = parent
5883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.tabPages.focus_set()
5983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #key bindings for this dialog
6083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #self.bind('<Escape>',self.Cancel) #dismiss dialog, no save
6183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #self.bind('<Alt-a>',self.Apply) #apply changes, save
6283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #self.bind('<F1>',self.Help) #context help
6383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.LoadConfigs()
6483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.AttachVarCallbacks() #avoid callbacks during LoadConfigs
6583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
6683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.wm_deiconify()
6783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.wait_window()
6883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
6983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def CreateWidgets(self):
7083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.tabPages = TabbedPageSet(self,
7183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                page_names=['Fonts/Tabs','Highlighting','Keys','General'])
7283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        frameActionButtons = Frame(self,pady=2)
7383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #action buttons
7483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if macosxSupport.runningAsOSXApp():
7583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # Changing the default padding on OSX results in unreadable
7683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # text in the buttons
7783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            paddingArgs={}
7883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
7983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            paddingArgs={'padx':6, 'pady':3}
8083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
8183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.buttonHelp = Button(frameActionButtons,text='Help',
8283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                command=self.Help,takefocus=FALSE,
8383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                **paddingArgs)
8483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.buttonOk = Button(frameActionButtons,text='Ok',
8583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                command=self.Ok,takefocus=FALSE,
8683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                **paddingArgs)
8783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.buttonApply = Button(frameActionButtons,text='Apply',
8883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                command=self.Apply,takefocus=FALSE,
8983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                **paddingArgs)
9083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.buttonCancel = Button(frameActionButtons,text='Cancel',
9183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                command=self.Cancel,takefocus=FALSE,
9283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                **paddingArgs)
9383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.CreatePageFontTab()
9483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.CreatePageHighlight()
9583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.CreatePageKeys()
9683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.CreatePageGeneral()
9783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.buttonHelp.pack(side=RIGHT,padx=5)
9883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.buttonOk.pack(side=LEFT,padx=5)
9983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.buttonApply.pack(side=LEFT,padx=5)
10083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.buttonCancel.pack(side=LEFT,padx=5)
10183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        frameActionButtons.pack(side=BOTTOM)
10283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        Frame(self, height=2, borderwidth=0).pack(side=BOTTOM)
10383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.tabPages.pack(side=TOP,expand=TRUE,fill=BOTH)
10483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
10583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def CreatePageFontTab(self):
10683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #tkVars
10783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.fontSize=StringVar(self)
10883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.fontBold=BooleanVar(self)
10983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.fontName=StringVar(self)
11083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.spaceNum=IntVar(self)
11183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.editFont=tkFont.Font(self,('courier',10,'normal'))
11283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        ##widget creation
11383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #body frame
11483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        frame=self.tabPages.pages['Fonts/Tabs'].frame
11583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #body section frames
11683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        frameFont=LabelFrame(frame,borderwidth=2,relief=GROOVE,
11783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                             text=' Base Editor Font ')
11883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        frameIndent=LabelFrame(frame,borderwidth=2,relief=GROOVE,
11983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                               text=' Indentation Width ')
12083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #frameFont
12183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        frameFontName=Frame(frameFont)
12283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        frameFontParam=Frame(frameFont)
12383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        labelFontNameTitle=Label(frameFontName,justify=LEFT,
12483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                text='Font Face :')
12583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.listFontName=Listbox(frameFontName,height=5,takefocus=FALSE,
12683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                exportselection=FALSE)
12783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.listFontName.bind('<ButtonRelease-1>',self.OnListFontButtonRelease)
12883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        scrollFont=Scrollbar(frameFontName)
12983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        scrollFont.config(command=self.listFontName.yview)
13083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.listFontName.config(yscrollcommand=scrollFont.set)
13183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        labelFontSizeTitle=Label(frameFontParam,text='Size :')
13283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.optMenuFontSize=DynOptionMenu(frameFontParam,self.fontSize,None,
13383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            command=self.SetFontSample)
13483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        checkFontBold=Checkbutton(frameFontParam,variable=self.fontBold,
13583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            onvalue=1,offvalue=0,text='Bold',command=self.SetFontSample)
13683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        frameFontSample=Frame(frameFont,relief=SOLID,borderwidth=1)
13783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.labelFontSample=Label(frameFontSample,
13883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                text='AaBbCcDdEe\nFfGgHhIiJjK\n1234567890\n#:+=(){}[]',
13983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                justify=LEFT,font=self.editFont)
14083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #frameIndent
14183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        frameIndentSize=Frame(frameIndent)
14283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        labelSpaceNumTitle=Label(frameIndentSize, justify=LEFT,
14383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                                 text='Python Standard: 4 Spaces!')
14483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.scaleSpaceNum=Scale(frameIndentSize, variable=self.spaceNum,
14583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                                 orient='horizontal',
14683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                                 tickinterval=2, from_=2, to=16)
14783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #widget packing
14883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #body
14983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        frameFont.pack(side=LEFT,padx=5,pady=5,expand=TRUE,fill=BOTH)
15083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        frameIndent.pack(side=LEFT,padx=5,pady=5,fill=Y)
15183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #frameFont
15283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        frameFontName.pack(side=TOP,padx=5,pady=5,fill=X)
15383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        frameFontParam.pack(side=TOP,padx=5,pady=5,fill=X)
15483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        labelFontNameTitle.pack(side=TOP,anchor=W)
15583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.listFontName.pack(side=LEFT,expand=TRUE,fill=X)
15683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        scrollFont.pack(side=LEFT,fill=Y)
15783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        labelFontSizeTitle.pack(side=LEFT,anchor=W)
15883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.optMenuFontSize.pack(side=LEFT,anchor=W)
15983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        checkFontBold.pack(side=LEFT,anchor=W,padx=20)
16083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        frameFontSample.pack(side=TOP,padx=5,pady=5,expand=TRUE,fill=BOTH)
16183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.labelFontSample.pack(expand=TRUE,fill=BOTH)
16283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #frameIndent
16383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        frameIndentSize.pack(side=TOP,fill=X)
16483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        labelSpaceNumTitle.pack(side=TOP,anchor=W,padx=5)
16583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.scaleSpaceNum.pack(side=TOP,padx=5,fill=X)
16683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return frame
16783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
16883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def CreatePageHighlight(self):
16983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.builtinTheme=StringVar(self)
17083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.customTheme=StringVar(self)
17183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.fgHilite=BooleanVar(self)
17283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.colour=StringVar(self)
17383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.fontName=StringVar(self)
17483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.themeIsBuiltin=BooleanVar(self)
17583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.highlightTarget=StringVar(self)
17683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        ##widget creation
17783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #body frame
17883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        frame=self.tabPages.pages['Highlighting'].frame
17983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #body section frames
18083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        frameCustom=LabelFrame(frame,borderwidth=2,relief=GROOVE,
18183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                               text=' Custom Highlighting ')
18283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        frameTheme=LabelFrame(frame,borderwidth=2,relief=GROOVE,
18383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                              text=' Highlighting Theme ')
18483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #frameCustom
18583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.textHighlightSample=Text(frameCustom,relief=SOLID,borderwidth=1,
18683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            font=('courier',12,''),cursor='hand2',width=21,height=11,
18783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            takefocus=FALSE,highlightthickness=0,wrap=NONE)
18883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        text=self.textHighlightSample
18983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        text.bind('<Double-Button-1>',lambda e: 'break')
19083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        text.bind('<B1-Motion>',lambda e: 'break')
19183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        textAndTags=(('#you can click here','comment'),('\n','normal'),
19283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            ('#to choose items','comment'),('\n','normal'),('def','keyword'),
19383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            (' ','normal'),('func','definition'),('(param):','normal'),
19483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            ('\n  ','normal'),('"""string"""','string'),('\n  var0 = ','normal'),
19583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            ("'string'",'string'),('\n  var1 = ','normal'),("'selected'",'hilite'),
19683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            ('\n  var2 = ','normal'),("'found'",'hit'),
19783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            ('\n  var3 = ','normal'),('list', 'builtin'), ('(','normal'),
19883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            ('None', 'builtin'),(')\n\n','normal'),
19983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            (' error ','error'),(' ','normal'),('cursor |','cursor'),
20083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            ('\n ','normal'),('shell','console'),(' ','normal'),('stdout','stdout'),
20183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            (' ','normal'),('stderr','stderr'),('\n','normal'))
20283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for txTa in textAndTags:
20383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            text.insert(END,txTa[0],txTa[1])
20483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for element in self.themeElements.keys():
20583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            text.tag_bind(self.themeElements[element][0],'<ButtonPress-1>',
20683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                lambda event,elem=element: event.widget.winfo_toplevel()
20783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                .highlightTarget.set(elem))
20883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        text.config(state=DISABLED)
20983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.frameColourSet=Frame(frameCustom,relief=SOLID,borderwidth=1)
21083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        frameFgBg=Frame(frameCustom)
21183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        buttonSetColour=Button(self.frameColourSet,text='Choose Colour for :',
21283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            command=self.GetColour,highlightthickness=0)
21383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.optMenuHighlightTarget=DynOptionMenu(self.frameColourSet,
21483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.highlightTarget,None,highlightthickness=0)#,command=self.SetHighlightTargetBinding
21583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.radioFg=Radiobutton(frameFgBg,variable=self.fgHilite,
21683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            value=1,text='Foreground',command=self.SetColourSampleBinding)
21783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.radioBg=Radiobutton(frameFgBg,variable=self.fgHilite,
21883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            value=0,text='Background',command=self.SetColourSampleBinding)
21983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.fgHilite.set(1)
22083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        buttonSaveCustomTheme=Button(frameCustom,
22183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            text='Save as New Custom Theme',command=self.SaveAsNewTheme)
22283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #frameTheme
22383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        labelTypeTitle=Label(frameTheme,text='Select : ')
22483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.radioThemeBuiltin=Radiobutton(frameTheme,variable=self.themeIsBuiltin,
22583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            value=1,command=self.SetThemeType,text='a Built-in Theme')
22683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.radioThemeCustom=Radiobutton(frameTheme,variable=self.themeIsBuiltin,
22783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            value=0,command=self.SetThemeType,text='a Custom Theme')
22883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.optMenuThemeBuiltin=DynOptionMenu(frameTheme,
22983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.builtinTheme,None,command=None)
23083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.optMenuThemeCustom=DynOptionMenu(frameTheme,
23183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.customTheme,None,command=None)
23283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.buttonDeleteCustomTheme=Button(frameTheme,text='Delete Custom Theme',
23383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                command=self.DeleteCustomTheme)
23483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        ##widget packing
23583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #body
23683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        frameCustom.pack(side=LEFT,padx=5,pady=5,expand=TRUE,fill=BOTH)
23783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        frameTheme.pack(side=LEFT,padx=5,pady=5,fill=Y)
23883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #frameCustom
23983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.frameColourSet.pack(side=TOP,padx=5,pady=5,expand=TRUE,fill=X)
24083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        frameFgBg.pack(side=TOP,padx=5,pady=0)
24183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.textHighlightSample.pack(side=TOP,padx=5,pady=5,expand=TRUE,
24283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            fill=BOTH)
24383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        buttonSetColour.pack(side=TOP,expand=TRUE,fill=X,padx=8,pady=4)
24483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.optMenuHighlightTarget.pack(side=TOP,expand=TRUE,fill=X,padx=8,pady=3)
24583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.radioFg.pack(side=LEFT,anchor=E)
24683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.radioBg.pack(side=RIGHT,anchor=W)
24783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        buttonSaveCustomTheme.pack(side=BOTTOM,fill=X,padx=5,pady=5)
24883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #frameTheme
24983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        labelTypeTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
25083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.radioThemeBuiltin.pack(side=TOP,anchor=W,padx=5)
25183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.radioThemeCustom.pack(side=TOP,anchor=W,padx=5,pady=2)
25283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.optMenuThemeBuiltin.pack(side=TOP,fill=X,padx=5,pady=5)
25383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.optMenuThemeCustom.pack(side=TOP,fill=X,anchor=W,padx=5,pady=5)
25483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.buttonDeleteCustomTheme.pack(side=TOP,fill=X,padx=5,pady=5)
25583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return frame
25683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
25783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def CreatePageKeys(self):
25883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #tkVars
25983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.bindingTarget=StringVar(self)
26083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.builtinKeys=StringVar(self)
26183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.customKeys=StringVar(self)
26283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.keysAreBuiltin=BooleanVar(self)
26383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.keyBinding=StringVar(self)
26483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        ##widget creation
26583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #body frame
26683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        frame=self.tabPages.pages['Keys'].frame
26783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #body section frames
26883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        frameCustom=LabelFrame(frame,borderwidth=2,relief=GROOVE,
26983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                               text=' Custom Key Bindings ')
27083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        frameKeySets=LabelFrame(frame,borderwidth=2,relief=GROOVE,
27183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                           text=' Key Set ')
27283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #frameCustom
27383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        frameTarget=Frame(frameCustom)
27483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        labelTargetTitle=Label(frameTarget,text='Action - Key(s)')
27583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        scrollTargetY=Scrollbar(frameTarget)
27683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        scrollTargetX=Scrollbar(frameTarget,orient=HORIZONTAL)
27783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.listBindings=Listbox(frameTarget,takefocus=FALSE,
27883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                exportselection=FALSE)
27983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.listBindings.bind('<ButtonRelease-1>',self.KeyBindingSelected)
28083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        scrollTargetY.config(command=self.listBindings.yview)
28183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        scrollTargetX.config(command=self.listBindings.xview)
28283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.listBindings.config(yscrollcommand=scrollTargetY.set)
28383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.listBindings.config(xscrollcommand=scrollTargetX.set)
28483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.buttonNewKeys=Button(frameCustom,text='Get New Keys for Selection',
28583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            command=self.GetNewKeys,state=DISABLED)
28683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #frameKeySets
28783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        frames = [Frame(frameKeySets, padx=2, pady=2, borderwidth=0)
28883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                  for i in range(2)]
28983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.radioKeysBuiltin=Radiobutton(frames[0],variable=self.keysAreBuiltin,
29083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            value=1,command=self.SetKeysType,text='Use a Built-in Key Set')
29183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.radioKeysCustom=Radiobutton(frames[0],variable=self.keysAreBuiltin,
29283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            value=0,command=self.SetKeysType,text='Use a Custom Key Set')
29383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.optMenuKeysBuiltin=DynOptionMenu(frames[0],
29483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.builtinKeys,None,command=None)
29583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.optMenuKeysCustom=DynOptionMenu(frames[0],
29683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.customKeys,None,command=None)
29783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.buttonDeleteCustomKeys=Button(frames[1],text='Delete Custom Key Set',
29883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                command=self.DeleteCustomKeys)
29983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        buttonSaveCustomKeys=Button(frames[1],
30083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                text='Save as New Custom Key Set',command=self.SaveAsNewKeySet)
30183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        ##widget packing
30283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #body
30383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        frameCustom.pack(side=BOTTOM,padx=5,pady=5,expand=TRUE,fill=BOTH)
30483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        frameKeySets.pack(side=BOTTOM,padx=5,pady=5,fill=BOTH)
30583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #frameCustom
30683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.buttonNewKeys.pack(side=BOTTOM,fill=X,padx=5,pady=5)
30783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        frameTarget.pack(side=LEFT,padx=5,pady=5,expand=TRUE,fill=BOTH)
30883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #frame target
30983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        frameTarget.columnconfigure(0,weight=1)
31083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        frameTarget.rowconfigure(1,weight=1)
31183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        labelTargetTitle.grid(row=0,column=0,columnspan=2,sticky=W)
31283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.listBindings.grid(row=1,column=0,sticky=NSEW)
31383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        scrollTargetY.grid(row=1,column=1,sticky=NS)
31483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        scrollTargetX.grid(row=2,column=0,sticky=EW)
31583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #frameKeySets
31683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.radioKeysBuiltin.grid(row=0, column=0, sticky=W+NS)
31783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.radioKeysCustom.grid(row=1, column=0, sticky=W+NS)
31883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.optMenuKeysBuiltin.grid(row=0, column=1, sticky=NSEW)
31983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.optMenuKeysCustom.grid(row=1, column=1, sticky=NSEW)
32083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.buttonDeleteCustomKeys.pack(side=LEFT,fill=X,expand=True,padx=2)
32183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        buttonSaveCustomKeys.pack(side=LEFT,fill=X,expand=True,padx=2)
32283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        frames[0].pack(side=TOP, fill=BOTH, expand=True)
32383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        frames[1].pack(side=TOP, fill=X, expand=True, pady=2)
32483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return frame
32583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
32683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def CreatePageGeneral(self):
32783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #tkVars
32883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.winWidth=StringVar(self)
32983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.winHeight=StringVar(self)
33083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.paraWidth=StringVar(self)
33183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.startupEdit=IntVar(self)
33283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.autoSave=IntVar(self)
33383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.encoding=StringVar(self)
33483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.userHelpBrowser=BooleanVar(self)
33583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.helpBrowser=StringVar(self)
33683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #widget creation
33783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #body
33883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        frame=self.tabPages.pages['General'].frame
33983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #body section frames
34083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        frameRun=LabelFrame(frame,borderwidth=2,relief=GROOVE,
34183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                            text=' Startup Preferences ')
34283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        frameSave=LabelFrame(frame,borderwidth=2,relief=GROOVE,
34383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                             text=' Autosave Preferences ')
34483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        frameWinSize=Frame(frame,borderwidth=2,relief=GROOVE)
34583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        frameParaSize=Frame(frame,borderwidth=2,relief=GROOVE)
34683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        frameEncoding=Frame(frame,borderwidth=2,relief=GROOVE)
34783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        frameHelp=LabelFrame(frame,borderwidth=2,relief=GROOVE,
34883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                             text=' Additional Help Sources ')
34983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #frameRun
35083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        labelRunChoiceTitle=Label(frameRun,text='At Startup')
35183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        radioStartupEdit=Radiobutton(frameRun,variable=self.startupEdit,
35283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            value=1,command=self.SetKeysType,text="Open Edit Window")
35383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        radioStartupShell=Radiobutton(frameRun,variable=self.startupEdit,
35483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            value=0,command=self.SetKeysType,text='Open Shell Window')
35583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #frameSave
35683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        labelRunSaveTitle=Label(frameSave,text='At Start of Run (F5)  ')
35783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        radioSaveAsk=Radiobutton(frameSave,variable=self.autoSave,
35883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            value=0,command=self.SetKeysType,text="Prompt to Save")
35983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        radioSaveAuto=Radiobutton(frameSave,variable=self.autoSave,
36083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            value=1,command=self.SetKeysType,text='No Prompt')
36183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #frameWinSize
36283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        labelWinSizeTitle=Label(frameWinSize,text='Initial Window Size'+
36383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                '  (in characters)')
36483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        labelWinWidthTitle=Label(frameWinSize,text='Width')
36583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        entryWinWidth=Entry(frameWinSize,textvariable=self.winWidth,
36683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                width=3)
36783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        labelWinHeightTitle=Label(frameWinSize,text='Height')
36883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        entryWinHeight=Entry(frameWinSize,textvariable=self.winHeight,
36983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                width=3)
37083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #paragraphFormatWidth
37183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        labelParaWidthTitle=Label(frameParaSize,text='Paragraph reformat'+
37283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                ' width (in characters)')
37383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        entryParaWidth=Entry(frameParaSize,textvariable=self.paraWidth,
37483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                width=3)
37583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #frameEncoding
37683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        labelEncodingTitle=Label(frameEncoding,text="Default Source Encoding")
37783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        radioEncLocale=Radiobutton(frameEncoding,variable=self.encoding,
37883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            value="locale",text="Locale-defined")
37983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        radioEncUTF8=Radiobutton(frameEncoding,variable=self.encoding,
38083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            value="utf-8",text="UTF-8")
38183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        radioEncNone=Radiobutton(frameEncoding,variable=self.encoding,
38283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            value="none",text="None")
38383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #frameHelp
38483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        frameHelpList=Frame(frameHelp)
38583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        frameHelpListButtons=Frame(frameHelpList)
38683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        scrollHelpList=Scrollbar(frameHelpList)
38783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.listHelp=Listbox(frameHelpList,height=5,takefocus=FALSE,
38883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                exportselection=FALSE)
38983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        scrollHelpList.config(command=self.listHelp.yview)
39083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.listHelp.config(yscrollcommand=scrollHelpList.set)
39183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.listHelp.bind('<ButtonRelease-1>',self.HelpSourceSelected)
39283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.buttonHelpListEdit=Button(frameHelpListButtons,text='Edit',
39383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                state=DISABLED,width=8,command=self.HelpListItemEdit)
39483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.buttonHelpListAdd=Button(frameHelpListButtons,text='Add',
39583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                width=8,command=self.HelpListItemAdd)
39683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.buttonHelpListRemove=Button(frameHelpListButtons,text='Remove',
39783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                state=DISABLED,width=8,command=self.HelpListItemRemove)
39883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #widget packing
39983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #body
40083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        frameRun.pack(side=TOP,padx=5,pady=5,fill=X)
40183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        frameSave.pack(side=TOP,padx=5,pady=5,fill=X)
40283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        frameWinSize.pack(side=TOP,padx=5,pady=5,fill=X)
40383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        frameParaSize.pack(side=TOP,padx=5,pady=5,fill=X)
40483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        frameEncoding.pack(side=TOP,padx=5,pady=5,fill=X)
40583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        frameHelp.pack(side=TOP,padx=5,pady=5,expand=TRUE,fill=BOTH)
40683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #frameRun
40783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        labelRunChoiceTitle.pack(side=LEFT,anchor=W,padx=5,pady=5)
40883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        radioStartupShell.pack(side=RIGHT,anchor=W,padx=5,pady=5)
40983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        radioStartupEdit.pack(side=RIGHT,anchor=W,padx=5,pady=5)
41083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #frameSave
41183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        labelRunSaveTitle.pack(side=LEFT,anchor=W,padx=5,pady=5)
41283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        radioSaveAuto.pack(side=RIGHT,anchor=W,padx=5,pady=5)
41383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        radioSaveAsk.pack(side=RIGHT,anchor=W,padx=5,pady=5)
41483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #frameWinSize
41583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        labelWinSizeTitle.pack(side=LEFT,anchor=W,padx=5,pady=5)
41683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        entryWinHeight.pack(side=RIGHT,anchor=E,padx=10,pady=5)
41783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        labelWinHeightTitle.pack(side=RIGHT,anchor=E,pady=5)
41883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        entryWinWidth.pack(side=RIGHT,anchor=E,padx=10,pady=5)
41983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        labelWinWidthTitle.pack(side=RIGHT,anchor=E,pady=5)
42083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #paragraphFormatWidth
42183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        labelParaWidthTitle.pack(side=LEFT,anchor=W,padx=5,pady=5)
42283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        entryParaWidth.pack(side=RIGHT,anchor=E,padx=10,pady=5)
42383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #frameEncoding
42483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        labelEncodingTitle.pack(side=LEFT,anchor=W,padx=5,pady=5)
42583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        radioEncNone.pack(side=RIGHT,anchor=E,pady=5)
42683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        radioEncUTF8.pack(side=RIGHT,anchor=E,pady=5)
42783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        radioEncLocale.pack(side=RIGHT,anchor=E,pady=5)
42883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #frameHelp
42983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        frameHelpListButtons.pack(side=RIGHT,padx=5,pady=5,fill=Y)
43083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        frameHelpList.pack(side=TOP,padx=5,pady=5,expand=TRUE,fill=BOTH)
43183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        scrollHelpList.pack(side=RIGHT,anchor=W,fill=Y)
43283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.listHelp.pack(side=LEFT,anchor=E,expand=TRUE,fill=BOTH)
43383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.buttonHelpListEdit.pack(side=TOP,anchor=W,pady=5)
43483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.buttonHelpListAdd.pack(side=TOP,anchor=W)
43583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.buttonHelpListRemove.pack(side=TOP,anchor=W,pady=5)
43683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return frame
43783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
43883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def AttachVarCallbacks(self):
43983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.fontSize.trace_variable('w',self.VarChanged_fontSize)
44083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.fontName.trace_variable('w',self.VarChanged_fontName)
44183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.fontBold.trace_variable('w',self.VarChanged_fontBold)
44283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.spaceNum.trace_variable('w',self.VarChanged_spaceNum)
44383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.colour.trace_variable('w',self.VarChanged_colour)
44483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.builtinTheme.trace_variable('w',self.VarChanged_builtinTheme)
44583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.customTheme.trace_variable('w',self.VarChanged_customTheme)
44683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.themeIsBuiltin.trace_variable('w',self.VarChanged_themeIsBuiltin)
44783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.highlightTarget.trace_variable('w',self.VarChanged_highlightTarget)
44883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.keyBinding.trace_variable('w',self.VarChanged_keyBinding)
44983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.builtinKeys.trace_variable('w',self.VarChanged_builtinKeys)
45083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.customKeys.trace_variable('w',self.VarChanged_customKeys)
45183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.keysAreBuiltin.trace_variable('w',self.VarChanged_keysAreBuiltin)
45283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.winWidth.trace_variable('w',self.VarChanged_winWidth)
45383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.winHeight.trace_variable('w',self.VarChanged_winHeight)
45483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.paraWidth.trace_variable('w',self.VarChanged_paraWidth)
45583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.startupEdit.trace_variable('w',self.VarChanged_startupEdit)
45683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.autoSave.trace_variable('w',self.VarChanged_autoSave)
45783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.encoding.trace_variable('w',self.VarChanged_encoding)
45883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
45983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def VarChanged_fontSize(self,*params):
46083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        value=self.fontSize.get()
46183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.AddChangedItem('main','EditorWindow','font-size',value)
46283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
46383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def VarChanged_fontName(self,*params):
46483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        value=self.fontName.get()
46583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.AddChangedItem('main','EditorWindow','font',value)
46683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
46783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def VarChanged_fontBold(self,*params):
46883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        value=self.fontBold.get()
46983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.AddChangedItem('main','EditorWindow','font-bold',value)
47083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
47183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def VarChanged_spaceNum(self,*params):
47283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        value=self.spaceNum.get()
47383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.AddChangedItem('main','Indent','num-spaces',value)
47483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
47583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def VarChanged_colour(self,*params):
47683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.OnNewColourSet()
47783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
47883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def VarChanged_builtinTheme(self,*params):
47983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        value=self.builtinTheme.get()
48083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.AddChangedItem('main','Theme','name',value)
48183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.PaintThemeSample()
48283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
48383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def VarChanged_customTheme(self,*params):
48483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        value=self.customTheme.get()
48583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if value != '- no custom themes -':
48683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.AddChangedItem('main','Theme','name',value)
48783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.PaintThemeSample()
48883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
48983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def VarChanged_themeIsBuiltin(self,*params):
49083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        value=self.themeIsBuiltin.get()
49183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.AddChangedItem('main','Theme','default',value)
49283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if value:
49383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.VarChanged_builtinTheme()
49483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
49583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.VarChanged_customTheme()
49683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
49783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def VarChanged_highlightTarget(self,*params):
49883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.SetHighlightTarget()
49983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
50083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def VarChanged_keyBinding(self,*params):
50183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        value=self.keyBinding.get()
50283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        keySet=self.customKeys.get()
50383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        event=self.listBindings.get(ANCHOR).split()[0]
50483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if idleConf.IsCoreBinding(event):
50583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            #this is a core keybinding
50683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.AddChangedItem('keys',keySet,event,value)
50783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else: #this is an extension key binding
50883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            extName=idleConf.GetExtnNameForEvent(event)
50983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            extKeybindSection=extName+'_cfgBindings'
51083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.AddChangedItem('extensions',extKeybindSection,event,value)
51183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
51283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def VarChanged_builtinKeys(self,*params):
51383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        value=self.builtinKeys.get()
51483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.AddChangedItem('main','Keys','name',value)
51583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.LoadKeysList(value)
51683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
51783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def VarChanged_customKeys(self,*params):
51883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        value=self.customKeys.get()
51983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if value != '- no custom keys -':
52083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.AddChangedItem('main','Keys','name',value)
52183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.LoadKeysList(value)
52283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
52383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def VarChanged_keysAreBuiltin(self,*params):
52483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        value=self.keysAreBuiltin.get()
52583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.AddChangedItem('main','Keys','default',value)
52683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if value:
52783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.VarChanged_builtinKeys()
52883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
52983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.VarChanged_customKeys()
53083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
53183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def VarChanged_winWidth(self,*params):
53283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        value=self.winWidth.get()
53383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.AddChangedItem('main','EditorWindow','width',value)
53483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
53583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def VarChanged_winHeight(self,*params):
53683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        value=self.winHeight.get()
53783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.AddChangedItem('main','EditorWindow','height',value)
53883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
53983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def VarChanged_paraWidth(self,*params):
54083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        value=self.paraWidth.get()
54183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.AddChangedItem('main','FormatParagraph','paragraph',value)
54283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
54383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def VarChanged_startupEdit(self,*params):
54483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        value=self.startupEdit.get()
54583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.AddChangedItem('main','General','editor-on-startup',value)
54683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
54783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def VarChanged_autoSave(self,*params):
54883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        value=self.autoSave.get()
54983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.AddChangedItem('main','General','autosave',value)
55083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
55183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def VarChanged_encoding(self,*params):
55283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        value=self.encoding.get()
55383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.AddChangedItem('main','EditorWindow','encoding',value)
55483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
55583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def ResetChangedItems(self):
55683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #When any config item is changed in this dialog, an entry
55783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #should be made in the relevant section (config type) of this
55883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #dictionary. The key should be the config file section name and the
55983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #value a dictionary, whose key:value pairs are item=value pairs for
56083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #that config file section.
56183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.changedItems={'main':{},'highlight':{},'keys':{},'extensions':{}}
56283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
56383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def AddChangedItem(self,type,section,item,value):
56483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        value=str(value) #make sure we use a string
56583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if section not in self.changedItems[type]:
56683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.changedItems[type][section]={}
56783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.changedItems[type][section][item]=value
56883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
56983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def GetDefaultItems(self):
57083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        dItems={'main':{},'highlight':{},'keys':{},'extensions':{}}
57183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for configType in dItems.keys():
57283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            sections=idleConf.GetSectionList('default',configType)
57383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            for section in sections:
57483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                dItems[configType][section]={}
57583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                options=idleConf.defaultCfg[configType].GetOptionList(section)
57683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                for option in options:
57783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    dItems[configType][section][option]=(
57883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                            idleConf.defaultCfg[configType].Get(section,option))
57983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return dItems
58083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
58183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def SetThemeType(self):
58283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.themeIsBuiltin.get():
58383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.optMenuThemeBuiltin.config(state=NORMAL)
58483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.optMenuThemeCustom.config(state=DISABLED)
58583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.buttonDeleteCustomTheme.config(state=DISABLED)
58683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
58783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.optMenuThemeBuiltin.config(state=DISABLED)
58883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.radioThemeCustom.config(state=NORMAL)
58983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.optMenuThemeCustom.config(state=NORMAL)
59083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.buttonDeleteCustomTheme.config(state=NORMAL)
59183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
59283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def SetKeysType(self):
59383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.keysAreBuiltin.get():
59483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.optMenuKeysBuiltin.config(state=NORMAL)
59583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.optMenuKeysCustom.config(state=DISABLED)
59683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.buttonDeleteCustomKeys.config(state=DISABLED)
59783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
59883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.optMenuKeysBuiltin.config(state=DISABLED)
59983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.radioKeysCustom.config(state=NORMAL)
60083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.optMenuKeysCustom.config(state=NORMAL)
60183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.buttonDeleteCustomKeys.config(state=NORMAL)
60283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
60383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def GetNewKeys(self):
60483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        listIndex=self.listBindings.index(ANCHOR)
60583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        binding=self.listBindings.get(listIndex)
60683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        bindName=binding.split()[0] #first part, up to first space
60783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.keysAreBuiltin.get():
60883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            currentKeySetName=self.builtinKeys.get()
60983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
61083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            currentKeySetName=self.customKeys.get()
61183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        currentBindings=idleConf.GetCurrentKeySet()
61283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if currentKeySetName in self.changedItems['keys'].keys(): #unsaved changes
61383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            keySetChanges=self.changedItems['keys'][currentKeySetName]
61483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            for event in keySetChanges.keys():
61583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                currentBindings[event]=keySetChanges[event].split()
61683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        currentKeySequences=currentBindings.values()
61783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        newKeys=GetKeysDialog(self,'Get New Keys',bindName,
61883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                currentKeySequences).result
61983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if newKeys: #new keys were specified
62083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if self.keysAreBuiltin.get(): #current key set is a built-in
62183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                message=('Your changes will be saved as a new Custom Key Set. '+
62283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                        'Enter a name for your new Custom Key Set below.')
62383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                newKeySet=self.GetNewKeysName(message)
62483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                if not newKeySet: #user cancelled custom key set creation
62583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    self.listBindings.select_set(listIndex)
62683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    self.listBindings.select_anchor(listIndex)
62783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    return
62883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                else: #create new custom key set based on previously active key set
62983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    self.CreateNewKeySet(newKeySet)
63083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.listBindings.delete(listIndex)
63183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.listBindings.insert(listIndex,bindName+' - '+newKeys)
63283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.listBindings.select_set(listIndex)
63383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.listBindings.select_anchor(listIndex)
63483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.keyBinding.set(newKeys)
63583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
63683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.listBindings.select_set(listIndex)
63783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.listBindings.select_anchor(listIndex)
63883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
63983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def GetNewKeysName(self,message):
64083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        usedNames=(idleConf.GetSectionList('user','keys')+
64183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                idleConf.GetSectionList('default','keys'))
64283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        newKeySet=GetCfgSectionNameDialog(self,'New Custom Key Set',
64383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                message,usedNames).result
64483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return newKeySet
64583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
64683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def SaveAsNewKeySet(self):
64783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        newKeysName=self.GetNewKeysName('New Key Set Name:')
64883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if newKeysName:
64983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.CreateNewKeySet(newKeysName)
65083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
65183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def KeyBindingSelected(self,event):
65283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.buttonNewKeys.config(state=NORMAL)
65383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
65483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def CreateNewKeySet(self,newKeySetName):
65583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #creates new custom key set based on the previously active key set,
65683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #and makes the new key set active
65783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.keysAreBuiltin.get():
65883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            prevKeySetName=self.builtinKeys.get()
65983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
66083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            prevKeySetName=self.customKeys.get()
66183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        prevKeys=idleConf.GetCoreKeys(prevKeySetName)
66283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        newKeys={}
66383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for event in prevKeys.keys(): #add key set to changed items
66483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            eventName=event[2:-2] #trim off the angle brackets
66583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            binding=string.join(prevKeys[event])
66683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            newKeys[eventName]=binding
66783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #handle any unsaved changes to prev key set
66883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if prevKeySetName in self.changedItems['keys'].keys():
66983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            keySetChanges=self.changedItems['keys'][prevKeySetName]
67083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            for event in keySetChanges.keys():
67183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                newKeys[event]=keySetChanges[event]
67283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #save the new theme
67383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.SaveNewKeySet(newKeySetName,newKeys)
67483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #change gui over to the new key set
67583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        customKeyList=idleConf.GetSectionList('user','keys')
67683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        customKeyList.sort()
67783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.optMenuKeysCustom.SetMenu(customKeyList,newKeySetName)
67883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.keysAreBuiltin.set(0)
67983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.SetKeysType()
68083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
68183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def LoadKeysList(self,keySetName):
68283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        reselect=0
68383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        newKeySet=0
68483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.listBindings.curselection():
68583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            reselect=1
68683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            listIndex=self.listBindings.index(ANCHOR)
68783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        keySet=idleConf.GetKeySet(keySetName)
68883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        bindNames=keySet.keys()
68983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        bindNames.sort()
69083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.listBindings.delete(0,END)
69183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for bindName in bindNames:
69283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            key=string.join(keySet[bindName]) #make key(s) into a string
69383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            bindName=bindName[2:-2] #trim off the angle brackets
69483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if keySetName in self.changedItems['keys'].keys():
69583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                #handle any unsaved changes to this key set
69683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                if bindName in self.changedItems['keys'][keySetName].keys():
69783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    key=self.changedItems['keys'][keySetName][bindName]
69883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.listBindings.insert(END, bindName+' - '+key)
69983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if reselect:
70083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.listBindings.see(listIndex)
70183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.listBindings.select_set(listIndex)
70283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.listBindings.select_anchor(listIndex)
70383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
70483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def DeleteCustomKeys(self):
70583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        keySetName=self.customKeys.get()
70683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if not tkMessageBox.askyesno('Delete Key Set','Are you sure you wish '+
70783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                                     'to delete the key set %r ?' % (keySetName),
70883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                                     parent=self):
70983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return
71083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #remove key set from config
71183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        idleConf.userCfg['keys'].remove_section(keySetName)
71283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if keySetName in self.changedItems['keys']:
71383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            del(self.changedItems['keys'][keySetName])
71483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #write changes
71583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        idleConf.userCfg['keys'].Save()
71683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #reload user key set list
71783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        itemList=idleConf.GetSectionList('user','keys')
71883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        itemList.sort()
71983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if not itemList:
72083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.radioKeysCustom.config(state=DISABLED)
72183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.optMenuKeysCustom.SetMenu(itemList,'- no custom keys -')
72283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
72383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.optMenuKeysCustom.SetMenu(itemList,itemList[0])
72483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #revert to default key set
72583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.keysAreBuiltin.set(idleConf.defaultCfg['main'].Get('Keys','default'))
72683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.builtinKeys.set(idleConf.defaultCfg['main'].Get('Keys','name'))
72783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #user can't back out of these changes, they must be applied now
72883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.Apply()
72983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.SetKeysType()
73083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
73183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def DeleteCustomTheme(self):
73283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        themeName=self.customTheme.get()
73383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if not tkMessageBox.askyesno('Delete Theme','Are you sure you wish '+
73483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                                     'to delete the theme %r ?' % (themeName,),
73583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                                     parent=self):
73683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return
73783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #remove theme from config
73883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        idleConf.userCfg['highlight'].remove_section(themeName)
73983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if themeName in self.changedItems['highlight']:
74083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            del(self.changedItems['highlight'][themeName])
74183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #write changes
74283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        idleConf.userCfg['highlight'].Save()
74383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #reload user theme list
74483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        itemList=idleConf.GetSectionList('user','highlight')
74583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        itemList.sort()
74683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if not itemList:
74783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.radioThemeCustom.config(state=DISABLED)
74883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.optMenuThemeCustom.SetMenu(itemList,'- no custom themes -')
74983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
75083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.optMenuThemeCustom.SetMenu(itemList,itemList[0])
75183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #revert to default theme
75283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.themeIsBuiltin.set(idleConf.defaultCfg['main'].Get('Theme','default'))
75383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.builtinTheme.set(idleConf.defaultCfg['main'].Get('Theme','name'))
75483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #user can't back out of these changes, they must be applied now
75583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.Apply()
75683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.SetThemeType()
75783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
75883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def GetColour(self):
75983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        target=self.highlightTarget.get()
76083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        prevColour=self.frameColourSet.cget('bg')
76183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        rgbTuplet, colourString = tkColorChooser.askcolor(parent=self,
76283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            title='Pick new colour for : '+target,initialcolor=prevColour)
76383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if colourString and (colourString!=prevColour):
76483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            #user didn't cancel, and they chose a new colour
76583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if self.themeIsBuiltin.get(): #current theme is a built-in
76683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                message=('Your changes will be saved as a new Custom Theme. '+
76783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                        'Enter a name for your new Custom Theme below.')
76883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                newTheme=self.GetNewThemeName(message)
76983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                if not newTheme: #user cancelled custom theme creation
77083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    return
77183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                else: #create new custom theme based on previously active theme
77283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    self.CreateNewTheme(newTheme)
77383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    self.colour.set(colourString)
77483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            else: #current theme is user defined
77583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self.colour.set(colourString)
77683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
77783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def OnNewColourSet(self):
77883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        newColour=self.colour.get()
77983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.frameColourSet.config(bg=newColour)#set sample
78083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.fgHilite.get(): plane='foreground'
78183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else: plane='background'
78283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        sampleElement=self.themeElements[self.highlightTarget.get()][0]
78383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.textHighlightSample.tag_config(sampleElement, **{plane:newColour})
78483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        theme=self.customTheme.get()
78583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        themeElement=sampleElement+'-'+plane
78683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.AddChangedItem('highlight',theme,themeElement,newColour)
78783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
78883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def GetNewThemeName(self,message):
78983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        usedNames=(idleConf.GetSectionList('user','highlight')+
79083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                idleConf.GetSectionList('default','highlight'))
79183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        newTheme=GetCfgSectionNameDialog(self,'New Custom Theme',
79283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                message,usedNames).result
79383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return newTheme
79483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
79583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def SaveAsNewTheme(self):
79683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        newThemeName=self.GetNewThemeName('New Theme Name:')
79783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if newThemeName:
79883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.CreateNewTheme(newThemeName)
79983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
80083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def CreateNewTheme(self,newThemeName):
80183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #creates new custom theme based on the previously active theme,
80283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #and makes the new theme active
80383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.themeIsBuiltin.get():
80483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            themeType='default'
80583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            themeName=self.builtinTheme.get()
80683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
80783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            themeType='user'
80883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            themeName=self.customTheme.get()
80983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        newTheme=idleConf.GetThemeDict(themeType,themeName)
81083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #apply any of the old theme's unsaved changes to the new theme
81183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if themeName in self.changedItems['highlight'].keys():
81283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            themeChanges=self.changedItems['highlight'][themeName]
81383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            for element in themeChanges.keys():
81483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                newTheme[element]=themeChanges[element]
81583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #save the new theme
81683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.SaveNewTheme(newThemeName,newTheme)
81783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #change gui over to the new theme
81883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        customThemeList=idleConf.GetSectionList('user','highlight')
81983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        customThemeList.sort()
82083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.optMenuThemeCustom.SetMenu(customThemeList,newThemeName)
82183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.themeIsBuiltin.set(0)
82283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.SetThemeType()
82383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
82483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def OnListFontButtonRelease(self,event):
82583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        font = self.listFontName.get(ANCHOR)
82683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.fontName.set(font.lower())
82783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.SetFontSample()
82883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
82983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def SetFontSample(self,event=None):
83083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        fontName=self.fontName.get()
83183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.fontBold.get():
83283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            fontWeight=tkFont.BOLD
83383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else:
83483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            fontWeight=tkFont.NORMAL
83583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        newFont = (fontName, self.fontSize.get(), fontWeight)
83683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.labelFontSample.config(font=newFont)
83783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.textHighlightSample.configure(font=newFont)
83883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
83983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def SetHighlightTarget(self):
84083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.highlightTarget.get()=='Cursor': #bg not possible
84183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.radioFg.config(state=DISABLED)
84283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.radioBg.config(state=DISABLED)
84383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.fgHilite.set(1)
84483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else: #both fg and bg can be set
84583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.radioFg.config(state=NORMAL)
84683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.radioBg.config(state=NORMAL)
84783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.fgHilite.set(1)
84883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.SetColourSample()
84983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
85083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def SetColourSampleBinding(self,*args):
85183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.SetColourSample()
85283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
85383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def SetColourSample(self):
85483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #set the colour smaple area
85583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        tag=self.themeElements[self.highlightTarget.get()][0]
85683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.fgHilite.get(): plane='foreground'
85783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else: plane='background'
85883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        colour=self.textHighlightSample.tag_cget(tag,plane)
85983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.frameColourSet.config(bg=colour)
86083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
86183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def PaintThemeSample(self):
86283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.themeIsBuiltin.get(): #a default theme
86383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            theme=self.builtinTheme.get()
86483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else: #a user theme
86583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            theme=self.customTheme.get()
86683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for elementTitle in self.themeElements.keys():
86783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            element=self.themeElements[elementTitle][0]
86883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            colours=idleConf.GetHighlight(theme,element)
86983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if element=='cursor': #cursor sample needs special painting
87083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                colours['background']=idleConf.GetHighlight(theme,
87183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                        'normal', fgBg='bg')
87283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            #handle any unsaved changes to this theme
87383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if theme in self.changedItems['highlight'].keys():
87483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                themeDict=self.changedItems['highlight'][theme]
87583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                if element+'-foreground' in themeDict:
87683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    colours['foreground']=themeDict[element+'-foreground']
87783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                if element+'-background' in themeDict:
87883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    colours['background']=themeDict[element+'-background']
87983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.textHighlightSample.tag_config(element, **colours)
88083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.SetColourSample()
88183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
88283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def HelpSourceSelected(self,event):
88383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.SetHelpListButtonStates()
88483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
88583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def SetHelpListButtonStates(self):
88683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.listHelp.size()<1: #no entries in list
88783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.buttonHelpListEdit.config(state=DISABLED)
88883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.buttonHelpListRemove.config(state=DISABLED)
88983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else: #there are some entries
89083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if self.listHelp.curselection(): #there currently is a selection
89183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self.buttonHelpListEdit.config(state=NORMAL)
89283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self.buttonHelpListRemove.config(state=NORMAL)
89383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            else:  #there currently is not a selection
89483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self.buttonHelpListEdit.config(state=DISABLED)
89583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self.buttonHelpListRemove.config(state=DISABLED)
89683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
89783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def HelpListItemAdd(self):
89883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        helpSource=GetHelpSourceDialog(self,'New Help Source').result
89983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if helpSource:
90083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.userHelpList.append( (helpSource[0],helpSource[1]) )
90183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.listHelp.insert(END,helpSource[0])
90283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.UpdateUserHelpChangedItems()
90383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.SetHelpListButtonStates()
90483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
90583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def HelpListItemEdit(self):
90683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        itemIndex=self.listHelp.index(ANCHOR)
90783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        helpSource=self.userHelpList[itemIndex]
90883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        newHelpSource=GetHelpSourceDialog(self,'Edit Help Source',
90983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                menuItem=helpSource[0],filePath=helpSource[1]).result
91083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if (not newHelpSource) or (newHelpSource==helpSource):
91183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            return #no changes
91283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.userHelpList[itemIndex]=newHelpSource
91383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.listHelp.delete(itemIndex)
91483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.listHelp.insert(itemIndex,newHelpSource[0])
91583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.UpdateUserHelpChangedItems()
91683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.SetHelpListButtonStates()
91783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
91883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def HelpListItemRemove(self):
91983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        itemIndex=self.listHelp.index(ANCHOR)
92083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        del(self.userHelpList[itemIndex])
92183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.listHelp.delete(itemIndex)
92283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.UpdateUserHelpChangedItems()
92383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.SetHelpListButtonStates()
92483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
92583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def UpdateUserHelpChangedItems(self):
92683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        "Clear and rebuild the HelpFiles section in self.changedItems"
92783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.changedItems['main']['HelpFiles'] = {}
92883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for num in range(1,len(self.userHelpList)+1):
92983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.AddChangedItem('main','HelpFiles',str(num),
93083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    string.join(self.userHelpList[num-1][:2],';'))
93183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
93283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def LoadFontCfg(self):
93383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        ##base editor font selection list
93483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        fonts=list(tkFont.families(self))
93583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        fonts.sort()
93683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for font in fonts:
93783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.listFontName.insert(END,font)
93883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        configuredFont=idleConf.GetOption('main','EditorWindow','font',
93983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                default='courier')
94083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        lc_configuredFont = configuredFont.lower()
94183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.fontName.set(lc_configuredFont)
94283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        lc_fonts = [s.lower() for s in fonts]
94383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if lc_configuredFont in lc_fonts:
94483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            currentFontIndex = lc_fonts.index(lc_configuredFont)
94583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.listFontName.see(currentFontIndex)
94683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.listFontName.select_set(currentFontIndex)
94783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.listFontName.select_anchor(currentFontIndex)
94883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        ##font size dropdown
94983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        fontSize=idleConf.GetOption('main','EditorWindow','font-size',
95083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                type='int', default='10')
95183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.optMenuFontSize.SetMenu(('7','8','9','10','11','12','13','14',
95283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                '16','18','20','22'),fontSize )
95383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        ##fontWeight
95483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.fontBold.set(idleConf.GetOption('main','EditorWindow',
95583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                'font-bold',default=0,type='bool'))
95683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        ##font sample
95783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.SetFontSample()
95883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
95983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def LoadTabCfg(self):
96083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        ##indent sizes
96183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        spaceNum=idleConf.GetOption('main','Indent','num-spaces',
96283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                default=4,type='int')
96383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.spaceNum.set(spaceNum)
96483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
96583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def LoadThemeCfg(self):
96683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        ##current theme type radiobutton
96783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.themeIsBuiltin.set(idleConf.GetOption('main','Theme','default',
96883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            type='bool',default=1))
96983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        ##currently set theme
97083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        currentOption=idleConf.CurrentTheme()
97183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        ##load available theme option menus
97283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.themeIsBuiltin.get(): #default theme selected
97383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            itemList=idleConf.GetSectionList('default','highlight')
97483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            itemList.sort()
97583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.optMenuThemeBuiltin.SetMenu(itemList,currentOption)
97683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            itemList=idleConf.GetSectionList('user','highlight')
97783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            itemList.sort()
97883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if not itemList:
97983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self.radioThemeCustom.config(state=DISABLED)
98083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self.customTheme.set('- no custom themes -')
98183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            else:
98283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self.optMenuThemeCustom.SetMenu(itemList,itemList[0])
98383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else: #user theme selected
98483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            itemList=idleConf.GetSectionList('user','highlight')
98583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            itemList.sort()
98683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.optMenuThemeCustom.SetMenu(itemList,currentOption)
98783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            itemList=idleConf.GetSectionList('default','highlight')
98883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            itemList.sort()
98983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.optMenuThemeBuiltin.SetMenu(itemList,itemList[0])
99083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.SetThemeType()
99183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        ##load theme element option menu
99283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        themeNames=self.themeElements.keys()
99383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        themeNames.sort(key=lambda x: self.themeElements[x][1])
99483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.optMenuHighlightTarget.SetMenu(themeNames,themeNames[0])
99583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.PaintThemeSample()
99683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.SetHighlightTarget()
99783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
99883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def LoadKeyCfg(self):
99983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        ##current keys type radiobutton
100083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.keysAreBuiltin.set(idleConf.GetOption('main','Keys','default',
100183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            type='bool',default=1))
100283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        ##currently set keys
100383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        currentOption=idleConf.CurrentKeys()
100483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        ##load available keyset option menus
100583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if self.keysAreBuiltin.get(): #default theme selected
100683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            itemList=idleConf.GetSectionList('default','keys')
100783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            itemList.sort()
100883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.optMenuKeysBuiltin.SetMenu(itemList,currentOption)
100983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            itemList=idleConf.GetSectionList('user','keys')
101083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            itemList.sort()
101183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if not itemList:
101283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self.radioKeysCustom.config(state=DISABLED)
101383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self.customKeys.set('- no custom keys -')
101483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            else:
101583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                self.optMenuKeysCustom.SetMenu(itemList,itemList[0])
101683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        else: #user key set selected
101783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            itemList=idleConf.GetSectionList('user','keys')
101883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            itemList.sort()
101983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.optMenuKeysCustom.SetMenu(itemList,currentOption)
102083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            itemList=idleConf.GetSectionList('default','keys')
102183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            itemList.sort()
102283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.optMenuKeysBuiltin.SetMenu(itemList,itemList[0])
102383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.SetKeysType()
102483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        ##load keyset element list
102583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        keySetName=idleConf.CurrentKeys()
102683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.LoadKeysList(keySetName)
102783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
102883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def LoadGeneralCfg(self):
102983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #startup state
103083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.startupEdit.set(idleConf.GetOption('main','General',
103183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                'editor-on-startup',default=1,type='bool'))
103283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #autosave state
103383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.autoSave.set(idleConf.GetOption('main', 'General', 'autosave',
103483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                                             default=0, type='bool'))
103583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #initial window size
103683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.winWidth.set(idleConf.GetOption('main','EditorWindow','width',
103783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                                             type='int'))
103883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.winHeight.set(idleConf.GetOption('main','EditorWindow','height',
103983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                                              type='int'))
104083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #initial paragraph reformat size
104183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.paraWidth.set(idleConf.GetOption('main','FormatParagraph','paragraph',
104283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                                              type='int'))
104383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # default source encoding
104483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.encoding.set(idleConf.GetOption('main', 'EditorWindow',
104583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                                             'encoding', default='none'))
104683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        # additional help sources
104783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.userHelpList = idleConf.GetAllExtraHelpSourcesList()
104883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for helpItem in self.userHelpList:
104983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            self.listHelp.insert(END,helpItem[0])
105083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.SetHelpListButtonStates()
105183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
105283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def LoadConfigs(self):
105383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
105483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        load configuration from default and user config files and populate
105583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        the widgets on the config dialog pages.
105683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
105783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        ### fonts / tabs page
105883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.LoadFontCfg()
105983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.LoadTabCfg()
106083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        ### highlighting page
106183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.LoadThemeCfg()
106283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        ### keys page
106383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.LoadKeyCfg()
106483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        ### general page
106583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.LoadGeneralCfg()
106683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
106783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def SaveNewKeySet(self,keySetName,keySet):
106883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
106983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        save a newly created core key set.
107083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        keySetName - string, the name of the new key set
107183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        keySet - dictionary containing the new key set
107283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
107383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if not idleConf.userCfg['keys'].has_section(keySetName):
107483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            idleConf.userCfg['keys'].add_section(keySetName)
107583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for event in keySet.keys():
107683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            value=keySet[event]
107783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            idleConf.userCfg['keys'].SetOption(keySetName,event,value)
107883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
107983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def SaveNewTheme(self,themeName,theme):
108083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
108183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        save a newly created theme.
108283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        themeName - string, the name of the new theme
108383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        theme - dictionary containing the new theme
108483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        """
108583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if not idleConf.userCfg['highlight'].has_section(themeName):
108683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            idleConf.userCfg['highlight'].add_section(themeName)
108783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for element in theme.keys():
108883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            value=theme[element]
108983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            idleConf.userCfg['highlight'].SetOption(themeName,element,value)
109083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
109183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def SetUserValue(self,configType,section,item,value):
109283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        if idleConf.defaultCfg[configType].has_option(section,item):
109383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if idleConf.defaultCfg[configType].Get(section,item)==value:
109483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                #the setting equals a default setting, remove it from user cfg
109583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                return idleConf.userCfg[configType].RemoveOption(section,item)
109683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #if we got here set the option
109783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        return idleConf.userCfg[configType].SetOption(section,item,value)
109883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
109983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def SaveAllChangedConfigs(self):
110083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        "Save configuration changes to the user config file."
110183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        idleConf.userCfg['main'].Save()
110283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for configType in self.changedItems.keys():
110383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            cfgTypeHasChanges = False
110483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            for section in self.changedItems[configType].keys():
110583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                if section == 'HelpFiles':
110683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    #this section gets completely replaced
110783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    idleConf.userCfg['main'].remove_section('HelpFiles')
110883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    cfgTypeHasChanges = True
110983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                for item in self.changedItems[configType][section].keys():
111083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    value = self.changedItems[configType][section][item]
111183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                    if self.SetUserValue(configType,section,item,value):
111283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                        cfgTypeHasChanges = True
111383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            if cfgTypeHasChanges:
111483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh                idleConf.userCfg[configType].Save()
111583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for configType in ['keys', 'highlight']:
111683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            # save these even if unchanged!
111783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            idleConf.userCfg[configType].Save()
111883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.ResetChangedItems() #clear the changed items dict
111983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
112083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def DeactivateCurrentConfig(self):
112183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #Before a config is saved, some cleanup of current
112283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        #config must be done - remove the previous keybindings
112383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        winInstances=self.parent.instance_dict.keys()
112483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for instance in winInstances:
112583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            instance.RemoveKeybindings()
112683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
112783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def ActivateConfigChanges(self):
112883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        "Dynamically apply configuration changes"
112983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        winInstances=self.parent.instance_dict.keys()
113083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        for instance in winInstances:
113183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            instance.ResetColorizer()
113283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            instance.ResetFont()
113383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            instance.set_notabs_indentwidth()
113483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            instance.ApplyKeybindings()
113583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            instance.reset_help_menu_entries()
113683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
113783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def Cancel(self):
113883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.destroy()
113983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
114083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def Ok(self):
114183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.Apply()
114283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.destroy()
114383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
114483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def Apply(self):
114583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.DeactivateCurrentConfig()
114683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.SaveAllChangedConfigs()
114783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        self.ActivateConfigChanges()
114883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
114983760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    def Help(self):
115083760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh        pass
115183760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh
115283760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsiehif __name__ == '__main__':
115383760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    #test the dialog
115483760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    root=Tk()
115583760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    Button(root,text='Dialog',
115683760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh            command=lambda:ConfigDialog(root,'Settings')).pack()
115783760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    root.instance_dict={}
115883760d213fb3bec7b4117d266fcfbf6fe2ba14abAndrew Hsieh    root.mainloop()
1159