blob: db1cea6f6e39c30c7d40b7640cf8783cdd260eb1 [file] [log] [blame]
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +00001"""IDLE Configuration Dialog: support user customization of IDLE by GUI
2
3Customize font faces, sizes, and colorization attributes. Set indentation
4defaults. Customize keybindings. Colorization and keybindings can be
5saved as user defined sets. Select startup options including shell/editor
6and default window size. Define additional help sources.
7
8Note that tab width in IDLE is currently fixed at eight due to Tk issues.
Kurt B. Kaiseracdef852005-01-31 03:34:26 +00009Refer to comments in EditorWindow autoindent code for details.
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +000010
Steven M. Gava44d3d1a2001-07-31 06:59:02 +000011"""
Georg Brandl6634bf22008-05-20 07:13:37 +000012from Tkinter import *
13import tkMessageBox, tkColorChooser, tkFont
Steven M. Gava44d3d1a2001-07-31 06:59:02 +000014
Florent Xiclunad630c042010-04-02 07:24:52 +000015from idlelib.configHandler import idleConf
16from idlelib.dynOptionMenuWidget import DynOptionMenu
17from idlelib.tabbedpages import TabbedPageSet
18from idlelib.keybindingDialog import GetKeysDialog
19from idlelib.configSectionNameDialog import GetCfgSectionNameDialog
20from idlelib.configHelpSourceEdit import GetHelpSourceDialog
21from idlelib import macosxSupport
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +000022
Steven M. Gava44d3d1a2001-07-31 06:59:02 +000023class ConfigDialog(Toplevel):
Kurt B. Kaiseracdef852005-01-31 03:34:26 +000024
Terry Jan Reedyaf0dce92014-07-14 23:07:21 -040025 def __init__(self, parent, title, _htest=False, _utest=False):
Terry Jan Reedy76916e82014-05-29 01:46:16 -040026 """
27 _htest - bool, change box location when running htest
Terry Jan Reedyaf0dce92014-07-14 23:07:21 -040028 _utest - bool, don't wait_window when running unittest
Terry Jan Reedy76916e82014-05-29 01:46:16 -040029 """
Steven M. Gavad721c482001-07-31 10:46:53 +000030 Toplevel.__init__(self, parent)
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +000031 self.wm_withdraw()
32
Steven M. Gavad721c482001-07-31 10:46:53 +000033 self.configure(borderwidth=5)
Amaury Forgeot d'Arcb9ee8812009-07-15 21:29:27 +000034 self.title('IDLE Preferences')
Terry Jan Reedy76916e82014-05-29 01:46:16 -040035 if _htest:
36 parent.instance_dict = {}
Steven M. Gavad721c482001-07-31 10:46:53 +000037 self.geometry("+%d+%d" % (parent.winfo_rootx()+20,
Terry Jan Reedy76916e82014-05-29 01:46:16 -040038 parent.winfo_rooty()+(30 if not _htest else 150)))
Georg Brandl7eb4b7d2005-07-22 21:49:32 +000039 #Theme Elements. Each theme element key is its display name.
Steven M. Gava9dd16b32001-11-03 14:54:25 +000040 #The first value of the tuple is the sample area tag name.
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +000041 #The second value is the display name list sort index.
Steven M. Gavaad4f5322002-01-03 12:05:17 +000042 self.themeElements={'Normal Text':('normal','00'),
43 'Python Keywords':('keyword','01'),
44 'Python Definitions':('definition','02'),
Kurt B. Kaiser73360a32004-03-08 18:15:31 +000045 'Python Builtins':('builtin', '03'),
46 'Python Comments':('comment','04'),
47 'Python Strings':('string','05'),
48 'Selected Text':('hilite','06'),
49 'Found Text':('hit','07'),
50 'Cursor':('cursor','08'),
51 'Error Text':('error','09'),
52 'Shell Normal Text':('console','10'),
53 'Shell Stdout Text':('stdout','11'),
54 'Shell Stderr Text':('stderr','12'),
55 }
Steven M. Gavaa498af22002-02-01 01:33:36 +000056 self.ResetChangedItems() #load initial values in changed items dict
Steven M. Gavad721c482001-07-31 10:46:53 +000057 self.CreateWidgets()
58 self.resizable(height=FALSE,width=FALSE)
Steven M. Gavad721c482001-07-31 10:46:53 +000059 self.transient(parent)
60 self.grab_set()
61 self.protocol("WM_DELETE_WINDOW", self.Cancel)
62 self.parent = parent
Steven M. Gava2d4e03b2001-12-05 07:54:07 +000063 self.tabPages.focus_set()
Steven M. Gavad721c482001-07-31 10:46:53 +000064 #key bindings for this dialog
Steven M. Gava5f28e8f2002-01-21 06:38:21 +000065 #self.bind('<Escape>',self.Cancel) #dismiss dialog, no save
66 #self.bind('<Alt-a>',self.Apply) #apply changes, save
67 #self.bind('<F1>',self.Help) #context help
Steven M. Gava429a86a2001-10-23 10:42:12 +000068 self.LoadConfigs()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +000069 self.AttachVarCallbacks() #avoid callbacks during LoadConfigs
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +000070
Terry Jan Reedyaf0dce92014-07-14 23:07:21 -040071 if not _utest:
72 self.wm_deiconify()
73 self.wait_window()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +000074
Steven M. Gavad721c482001-07-31 10:46:53 +000075 def CreateWidgets(self):
Kurt B. Kaiser20172f92007-10-30 02:38:54 +000076 self.tabPages = TabbedPageSet(self,
77 page_names=['Fonts/Tabs','Highlighting','Keys','General'])
78 frameActionButtons = Frame(self,pady=2)
Steven M. Gavad721c482001-07-31 10:46:53 +000079 #action buttons
Ned Deily57847df2014-03-27 20:47:04 -070080 if macosxSupport.isAquaTk():
Ronald Oussorena97063a2009-03-04 21:35:05 +000081 # Changing the default padding on OSX results in unreadable
82 # text in the buttons
83 paddingArgs={}
84 else:
85 paddingArgs={'padx':6, 'pady':3}
86
Terry Jan Reedy1d9b9212014-01-26 22:24:17 -050087# Comment out button creation and packing until implement self.Help
88## self.buttonHelp = Button(frameActionButtons,text='Help',
89## command=self.Help,takefocus=FALSE,
90## **paddingArgs)
Steven M. Gavac01e30f2001-08-11 15:48:13 +000091 self.buttonOk = Button(frameActionButtons,text='Ok',
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +000092 command=self.Ok,takefocus=FALSE,
Ronald Oussorena97063a2009-03-04 21:35:05 +000093 **paddingArgs)
Steven M. Gavac01e30f2001-08-11 15:48:13 +000094 self.buttonApply = Button(frameActionButtons,text='Apply',
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +000095 command=self.Apply,takefocus=FALSE,
Ronald Oussorena97063a2009-03-04 21:35:05 +000096 **paddingArgs)
Steven M. Gavad721c482001-07-31 10:46:53 +000097 self.buttonCancel = Button(frameActionButtons,text='Cancel',
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +000098 command=self.Cancel,takefocus=FALSE,
Ronald Oussorena97063a2009-03-04 21:35:05 +000099 **paddingArgs)
Steven M. Gava2d4e03b2001-12-05 07:54:07 +0000100 self.CreatePageFontTab()
101 self.CreatePageHighlight()
102 self.CreatePageKeys()
103 self.CreatePageGeneral()
Terry Jan Reedy1d9b9212014-01-26 22:24:17 -0500104## self.buttonHelp.pack(side=RIGHT,padx=5)
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000105 self.buttonOk.pack(side=LEFT,padx=5)
106 self.buttonApply.pack(side=LEFT,padx=5)
107 self.buttonCancel.pack(side=LEFT,padx=5)
Steven M. Gavad721c482001-07-31 10:46:53 +0000108 frameActionButtons.pack(side=BOTTOM)
Kurt B. Kaiser28c7bcf2007-12-28 04:18:01 +0000109 Frame(self, height=2, borderwidth=0).pack(side=BOTTOM)
Steven M. Gava2d4e03b2001-12-05 07:54:07 +0000110 self.tabPages.pack(side=TOP,expand=TRUE,fill=BOTH)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000111
Steven M. Gava60fc7072001-08-04 13:58:22 +0000112 def CreatePageFontTab(self):
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000113 #tkVars
Steven M. Gava3b55a892001-11-21 05:56:26 +0000114 self.fontSize=StringVar(self)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000115 self.fontBold=BooleanVar(self)
116 self.fontName=StringVar(self)
Steven M. Gava3b55a892001-11-21 05:56:26 +0000117 self.spaceNum=IntVar(self)
Kurt B. Kaiser05391692003-05-26 20:35:53 +0000118 self.editFont=tkFont.Font(self,('courier',10,'normal'))
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000119 ##widget creation
120 #body frame
Kurt B. Kaiser20172f92007-10-30 02:38:54 +0000121 frame=self.tabPages.pages['Fonts/Tabs'].frame
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000122 #body section frames
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000123 frameFont=LabelFrame(frame,borderwidth=2,relief=GROOVE,
124 text=' Base Editor Font ')
125 frameIndent=LabelFrame(frame,borderwidth=2,relief=GROOVE,
126 text=' Indentation Width ')
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000127 #frameFont
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000128 frameFontName=Frame(frameFont)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000129 frameFontParam=Frame(frameFont)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000130 labelFontNameTitle=Label(frameFontName,justify=LEFT,
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000131 text='Font Face :')
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000132 self.listFontName=Listbox(frameFontName,height=5,takefocus=FALSE,
133 exportselection=FALSE)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000134 self.listFontName.bind('<ButtonRelease-1>',self.OnListFontButtonRelease)
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000135 scrollFont=Scrollbar(frameFontName)
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000136 scrollFont.config(command=self.listFontName.yview)
137 self.listFontName.config(yscrollcommand=scrollFont.set)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000138 labelFontSizeTitle=Label(frameFontParam,text='Size :')
139 self.optMenuFontSize=DynOptionMenu(frameFontParam,self.fontSize,None,
Steven M. Gavac112cd82002-01-22 05:56:40 +0000140 command=self.SetFontSample)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000141 checkFontBold=Checkbutton(frameFontParam,variable=self.fontBold,
Steven M. Gavac112cd82002-01-22 05:56:40 +0000142 onvalue=1,offvalue=0,text='Bold',command=self.SetFontSample)
Steven M. Gavac11ccf32001-09-24 09:43:17 +0000143 frameFontSample=Frame(frameFont,relief=SOLID,borderwidth=1)
144 self.labelFontSample=Label(frameFontSample,
145 text='AaBbCcDdEe\nFfGgHhIiJjK\n1234567890\n#:+=(){}[]',
Steven M. Gava429a86a2001-10-23 10:42:12 +0000146 justify=LEFT,font=self.editFont)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000147 #frameIndent
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000148 frameIndentSize=Frame(frameIndent)
Kurt B. Kaiseracdef852005-01-31 03:34:26 +0000149 labelSpaceNumTitle=Label(frameIndentSize, justify=LEFT,
150 text='Python Standard: 4 Spaces!')
151 self.scaleSpaceNum=Scale(frameIndentSize, variable=self.spaceNum,
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000152 orient='horizontal',
Kurt B. Kaiseracdef852005-01-31 03:34:26 +0000153 tickinterval=2, from_=2, to=16)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000154 #widget packing
155 #body
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000156 frameFont.pack(side=LEFT,padx=5,pady=5,expand=TRUE,fill=BOTH)
157 frameIndent.pack(side=LEFT,padx=5,pady=5,fill=Y)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000158 #frameFont
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000159 frameFontName.pack(side=TOP,padx=5,pady=5,fill=X)
160 frameFontParam.pack(side=TOP,padx=5,pady=5,fill=X)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000161 labelFontNameTitle.pack(side=TOP,anchor=W)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000162 self.listFontName.pack(side=LEFT,expand=TRUE,fill=X)
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000163 scrollFont.pack(side=LEFT,fill=Y)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000164 labelFontSizeTitle.pack(side=LEFT,anchor=W)
165 self.optMenuFontSize.pack(side=LEFT,anchor=W)
166 checkFontBold.pack(side=LEFT,anchor=W,padx=20)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000167 frameFontSample.pack(side=TOP,padx=5,pady=5,expand=TRUE,fill=BOTH)
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000168 self.labelFontSample.pack(expand=TRUE,fill=BOTH)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000169 #frameIndent
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000170 frameIndentSize.pack(side=TOP,fill=X)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000171 labelSpaceNumTitle.pack(side=TOP,anchor=W,padx=5)
172 self.scaleSpaceNum.pack(side=TOP,padx=5,fill=X)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000173 return frame
174
175 def CreatePageHighlight(self):
Steven M. Gava3b55a892001-11-21 05:56:26 +0000176 self.builtinTheme=StringVar(self)
177 self.customTheme=StringVar(self)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000178 self.fgHilite=BooleanVar(self)
Steven M. Gava3b55a892001-11-21 05:56:26 +0000179 self.colour=StringVar(self)
180 self.fontName=StringVar(self)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000181 self.themeIsBuiltin=BooleanVar(self)
Steven M. Gava3b55a892001-11-21 05:56:26 +0000182 self.highlightTarget=StringVar(self)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000183 ##widget creation
184 #body frame
Kurt B. Kaiser20172f92007-10-30 02:38:54 +0000185 frame=self.tabPages.pages['Highlighting'].frame
Steven M. Gava952d0a52001-08-03 04:43:44 +0000186 #body section frames
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000187 frameCustom=LabelFrame(frame,borderwidth=2,relief=GROOVE,
188 text=' Custom Highlighting ')
189 frameTheme=LabelFrame(frame,borderwidth=2,relief=GROOVE,
190 text=' Highlighting Theme ')
Steven M. Gava952d0a52001-08-03 04:43:44 +0000191 #frameCustom
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000192 self.textHighlightSample=Text(frameCustom,relief=SOLID,borderwidth=1,
Terry Jan Reedy42f7b7e2012-05-26 16:55:43 -0400193 font=('courier',12,''),cursor='hand2',width=21,height=11,
Steven M. Gavab77d3432002-03-02 07:16:21 +0000194 takefocus=FALSE,highlightthickness=0,wrap=NONE)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000195 text=self.textHighlightSample
196 text.bind('<Double-Button-1>',lambda e: 'break')
197 text.bind('<B1-Motion>',lambda e: 'break')
Steven M. Gava052937f2002-02-11 02:20:53 +0000198 textAndTags=(('#you can click here','comment'),('\n','normal'),
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000199 ('#to choose items','comment'),('\n','normal'),('def','keyword'),
200 (' ','normal'),('func','definition'),('(param):','normal'),
201 ('\n ','normal'),('"""string"""','string'),('\n var0 = ','normal'),
Steven M. Gavad0342cd2001-11-04 11:53:10 +0000202 ("'string'",'string'),('\n var1 = ','normal'),("'selected'",'hilite'),
Kurt B. Kaiser73360a32004-03-08 18:15:31 +0000203 ('\n var2 = ','normal'),("'found'",'hit'),
204 ('\n var3 = ','normal'),('list', 'builtin'), ('(','normal'),
205 ('None', 'builtin'),(')\n\n','normal'),
Steven M. Gava99300612001-11-04 07:03:08 +0000206 (' error ','error'),(' ','normal'),('cursor |','cursor'),
Steven M. Gavad0342cd2001-11-04 11:53:10 +0000207 ('\n ','normal'),('shell','console'),(' ','normal'),('stdout','stdout'),
208 (' ','normal'),('stderr','stderr'),('\n','normal'))
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000209 for txTa in textAndTags:
210 text.insert(END,txTa[0],txTa[1])
Terry Jan Reedy110796f2014-07-27 04:07:18 -0400211 for element in self.themeElements:
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000212 text.tag_bind(self.themeElements[element][0],'<ButtonPress-1>',
213 lambda event,elem=element: event.widget.winfo_toplevel()
214 .highlightTarget.set(elem))
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000215 text.config(state=DISABLED)
216 self.frameColourSet=Frame(frameCustom,relief=SOLID,borderwidth=1)
Steven M. Gava7c017862001-10-29 11:19:46 +0000217 frameFgBg=Frame(frameCustom)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000218 buttonSetColour=Button(self.frameColourSet,text='Choose Colour for :',
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000219 command=self.GetColour,highlightthickness=0)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000220 self.optMenuHighlightTarget=DynOptionMenu(self.frameColourSet,
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000221 self.highlightTarget,None,highlightthickness=0)#,command=self.SetHighlightTargetBinding
Steven M. Gava7c017862001-10-29 11:19:46 +0000222 self.radioFg=Radiobutton(frameFgBg,variable=self.fgHilite,
Steven M. Gava3b55a892001-11-21 05:56:26 +0000223 value=1,text='Foreground',command=self.SetColourSampleBinding)
Steven M. Gava7c017862001-10-29 11:19:46 +0000224 self.radioBg=Radiobutton(frameFgBg,variable=self.fgHilite,
Steven M. Gava3b55a892001-11-21 05:56:26 +0000225 value=0,text='Background',command=self.SetColourSampleBinding)
Steven M. Gava7c017862001-10-29 11:19:46 +0000226 self.fgHilite.set(1)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000227 buttonSaveCustomTheme=Button(frameCustom,
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000228 text='Save as New Custom Theme',command=self.SaveAsNewTheme)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000229 #frameTheme
Steven M. Gava952d0a52001-08-03 04:43:44 +0000230 labelTypeTitle=Label(frameTheme,text='Select : ')
Steven M. Gavad0342cd2001-11-04 11:53:10 +0000231 self.radioThemeBuiltin=Radiobutton(frameTheme,variable=self.themeIsBuiltin,
232 value=1,command=self.SetThemeType,text='a Built-in Theme')
233 self.radioThemeCustom=Radiobutton(frameTheme,variable=self.themeIsBuiltin,
234 value=0,command=self.SetThemeType,text='a Custom Theme')
Steven M. Gava41a85322001-10-29 08:05:34 +0000235 self.optMenuThemeBuiltin=DynOptionMenu(frameTheme,
Steven M. Gava7c017862001-10-29 11:19:46 +0000236 self.builtinTheme,None,command=None)
Steven M. Gava41a85322001-10-29 08:05:34 +0000237 self.optMenuThemeCustom=DynOptionMenu(frameTheme,
Steven M. Gava7c017862001-10-29 11:19:46 +0000238 self.customTheme,None,command=None)
Steven M. Gava49745752002-02-18 01:43:11 +0000239 self.buttonDeleteCustomTheme=Button(frameTheme,text='Delete Custom Theme',
240 command=self.DeleteCustomTheme)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000241 ##widget packing
242 #body
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000243 frameCustom.pack(side=LEFT,padx=5,pady=5,expand=TRUE,fill=BOTH)
244 frameTheme.pack(side=LEFT,padx=5,pady=5,fill=Y)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000245 #frameCustom
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000246 self.frameColourSet.pack(side=TOP,padx=5,pady=5,expand=TRUE,fill=X)
Steven M. Gava7c017862001-10-29 11:19:46 +0000247 frameFgBg.pack(side=TOP,padx=5,pady=0)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000248 self.textHighlightSample.pack(side=TOP,padx=5,pady=5,expand=TRUE,
249 fill=BOTH)
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000250 buttonSetColour.pack(side=TOP,expand=TRUE,fill=X,padx=8,pady=4)
251 self.optMenuHighlightTarget.pack(side=TOP,expand=TRUE,fill=X,padx=8,pady=3)
Steven M. Gava7c017862001-10-29 11:19:46 +0000252 self.radioFg.pack(side=LEFT,anchor=E)
253 self.radioBg.pack(side=RIGHT,anchor=W)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000254 buttonSaveCustomTheme.pack(side=BOTTOM,fill=X,padx=5,pady=5)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000255 #frameTheme
Steven M. Gava952d0a52001-08-03 04:43:44 +0000256 labelTypeTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
Steven M. Gava41a85322001-10-29 08:05:34 +0000257 self.radioThemeBuiltin.pack(side=TOP,anchor=W,padx=5)
258 self.radioThemeCustom.pack(side=TOP,anchor=W,padx=5,pady=2)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000259 self.optMenuThemeBuiltin.pack(side=TOP,fill=X,padx=5,pady=5)
260 self.optMenuThemeCustom.pack(side=TOP,fill=X,anchor=W,padx=5,pady=5)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000261 self.buttonDeleteCustomTheme.pack(side=TOP,fill=X,padx=5,pady=5)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000262 return frame
263
264 def CreatePageKeys(self):
Steven M. Gava60fc7072001-08-04 13:58:22 +0000265 #tkVars
Steven M. Gava3b55a892001-11-21 05:56:26 +0000266 self.bindingTarget=StringVar(self)
267 self.builtinKeys=StringVar(self)
268 self.customKeys=StringVar(self)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000269 self.keysAreBuiltin=BooleanVar(self)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000270 self.keyBinding=StringVar(self)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000271 ##widget creation
272 #body frame
Kurt B. Kaiser20172f92007-10-30 02:38:54 +0000273 frame=self.tabPages.pages['Keys'].frame
Steven M. Gava60fc7072001-08-04 13:58:22 +0000274 #body section frames
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000275 frameCustom=LabelFrame(frame,borderwidth=2,relief=GROOVE,
276 text=' Custom Key Bindings ')
277 frameKeySets=LabelFrame(frame,borderwidth=2,relief=GROOVE,
278 text=' Key Set ')
Steven M. Gava60fc7072001-08-04 13:58:22 +0000279 #frameCustom
280 frameTarget=Frame(frameCustom)
Steven M. Gavafacfc092002-01-19 00:29:54 +0000281 labelTargetTitle=Label(frameTarget,text='Action - Key(s)')
282 scrollTargetY=Scrollbar(frameTarget)
283 scrollTargetX=Scrollbar(frameTarget,orient=HORIZONTAL)
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000284 self.listBindings=Listbox(frameTarget,takefocus=FALSE,
285 exportselection=FALSE)
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000286 self.listBindings.bind('<ButtonRelease-1>',self.KeyBindingSelected)
Steven M. Gavafacfc092002-01-19 00:29:54 +0000287 scrollTargetY.config(command=self.listBindings.yview)
288 scrollTargetX.config(command=self.listBindings.xview)
289 self.listBindings.config(yscrollcommand=scrollTargetY.set)
290 self.listBindings.config(xscrollcommand=scrollTargetX.set)
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000291 self.buttonNewKeys=Button(frameCustom,text='Get New Keys for Selection',
292 command=self.GetNewKeys,state=DISABLED)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000293 #frameKeySets
Kurt B. Kaiser28c7bcf2007-12-28 04:18:01 +0000294 frames = [Frame(frameKeySets, padx=2, pady=2, borderwidth=0)
295 for i in range(2)]
296 self.radioKeysBuiltin=Radiobutton(frames[0],variable=self.keysAreBuiltin,
297 value=1,command=self.SetKeysType,text='Use a Built-in Key Set')
298 self.radioKeysCustom=Radiobutton(frames[0],variable=self.keysAreBuiltin,
299 value=0,command=self.SetKeysType,text='Use a Custom Key Set')
300 self.optMenuKeysBuiltin=DynOptionMenu(frames[0],
Steven M. Gava41a85322001-10-29 08:05:34 +0000301 self.builtinKeys,None,command=None)
Kurt B. Kaiser28c7bcf2007-12-28 04:18:01 +0000302 self.optMenuKeysCustom=DynOptionMenu(frames[0],
Steven M. Gava41a85322001-10-29 08:05:34 +0000303 self.customKeys,None,command=None)
Kurt B. Kaiser28c7bcf2007-12-28 04:18:01 +0000304 self.buttonDeleteCustomKeys=Button(frames[1],text='Delete Custom Key Set',
Steven M. Gava49745752002-02-18 01:43:11 +0000305 command=self.DeleteCustomKeys)
Kurt B. Kaiser28c7bcf2007-12-28 04:18:01 +0000306 buttonSaveCustomKeys=Button(frames[1],
307 text='Save as New Custom Key Set',command=self.SaveAsNewKeySet)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000308 ##widget packing
309 #body
Kurt B. Kaiser28c7bcf2007-12-28 04:18:01 +0000310 frameCustom.pack(side=BOTTOM,padx=5,pady=5,expand=TRUE,fill=BOTH)
311 frameKeySets.pack(side=BOTTOM,padx=5,pady=5,fill=BOTH)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000312 #frameCustom
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000313 self.buttonNewKeys.pack(side=BOTTOM,fill=X,padx=5,pady=5)
Steven M. Gavafacfc092002-01-19 00:29:54 +0000314 frameTarget.pack(side=LEFT,padx=5,pady=5,expand=TRUE,fill=BOTH)
315 #frame target
316 frameTarget.columnconfigure(0,weight=1)
317 frameTarget.rowconfigure(1,weight=1)
318 labelTargetTitle.grid(row=0,column=0,columnspan=2,sticky=W)
319 self.listBindings.grid(row=1,column=0,sticky=NSEW)
320 scrollTargetY.grid(row=1,column=1,sticky=NS)
321 scrollTargetX.grid(row=2,column=0,sticky=EW)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000322 #frameKeySets
Kurt B. Kaiser28c7bcf2007-12-28 04:18:01 +0000323 self.radioKeysBuiltin.grid(row=0, column=0, sticky=W+NS)
324 self.radioKeysCustom.grid(row=1, column=0, sticky=W+NS)
325 self.optMenuKeysBuiltin.grid(row=0, column=1, sticky=NSEW)
326 self.optMenuKeysCustom.grid(row=1, column=1, sticky=NSEW)
327 self.buttonDeleteCustomKeys.pack(side=LEFT,fill=X,expand=True,padx=2)
328 buttonSaveCustomKeys.pack(side=LEFT,fill=X,expand=True,padx=2)
329 frames[0].pack(side=TOP, fill=BOTH, expand=True)
330 frames[1].pack(side=TOP, fill=X, expand=True, pady=2)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000331 return frame
332
333 def CreatePageGeneral(self):
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000334 #tkVars
335 self.winWidth=StringVar(self)
Steven M. Gava3b55a892001-11-21 05:56:26 +0000336 self.winHeight=StringVar(self)
Raymond Hettinger4e49b832004-06-04 06:31:08 +0000337 self.paraWidth=StringVar(self)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000338 self.startupEdit=IntVar(self)
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000339 self.autoSave=IntVar(self)
Kurt B. Kaisera053f332003-05-10 00:49:56 +0000340 self.encoding=StringVar(self)
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000341 self.userHelpBrowser=BooleanVar(self)
342 self.helpBrowser=StringVar(self)
Steven M. Gava230e5782001-08-07 03:28:25 +0000343 #widget creation
344 #body
Kurt B. Kaiser20172f92007-10-30 02:38:54 +0000345 frame=self.tabPages.pages['General'].frame
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000346 #body section frames
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000347 frameRun=LabelFrame(frame,borderwidth=2,relief=GROOVE,
348 text=' Startup Preferences ')
349 frameSave=LabelFrame(frame,borderwidth=2,relief=GROOVE,
350 text=' Autosave Preferences ')
Steven M. Gava230e5782001-08-07 03:28:25 +0000351 frameWinSize=Frame(frame,borderwidth=2,relief=GROOVE)
Raymond Hettinger4e49b832004-06-04 06:31:08 +0000352 frameParaSize=Frame(frame,borderwidth=2,relief=GROOVE)
Kurt B. Kaisera053f332003-05-10 00:49:56 +0000353 frameEncoding=Frame(frame,borderwidth=2,relief=GROOVE)
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000354 frameHelp=LabelFrame(frame,borderwidth=2,relief=GROOVE,
355 text=' Additional Help Sources ')
Steven M. Gava230e5782001-08-07 03:28:25 +0000356 #frameRun
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000357 labelRunChoiceTitle=Label(frameRun,text='At Startup')
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000358 radioStartupEdit=Radiobutton(frameRun,variable=self.startupEdit,
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +0000359 value=1,command=self.SetKeysType,text="Open Edit Window")
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000360 radioStartupShell=Radiobutton(frameRun,variable=self.startupEdit,
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +0000361 value=0,command=self.SetKeysType,text='Open Shell Window')
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000362 #frameSave
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000363 labelRunSaveTitle=Label(frameSave,text='At Start of Run (F5) ')
364 radioSaveAsk=Radiobutton(frameSave,variable=self.autoSave,
365 value=0,command=self.SetKeysType,text="Prompt to Save")
366 radioSaveAuto=Radiobutton(frameSave,variable=self.autoSave,
367 value=1,command=self.SetKeysType,text='No Prompt')
Steven M. Gava230e5782001-08-07 03:28:25 +0000368 #frameWinSize
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000369 labelWinSizeTitle=Label(frameWinSize,text='Initial Window Size'+
370 ' (in characters)')
Steven M. Gava230e5782001-08-07 03:28:25 +0000371 labelWinWidthTitle=Label(frameWinSize,text='Width')
372 entryWinWidth=Entry(frameWinSize,textvariable=self.winWidth,
373 width=3)
374 labelWinHeightTitle=Label(frameWinSize,text='Height')
375 entryWinHeight=Entry(frameWinSize,textvariable=self.winHeight,
376 width=3)
Raymond Hettinger4e49b832004-06-04 06:31:08 +0000377 #paragraphFormatWidth
378 labelParaWidthTitle=Label(frameParaSize,text='Paragraph reformat'+
379 ' width (in characters)')
380 entryParaWidth=Entry(frameParaSize,textvariable=self.paraWidth,
381 width=3)
Kurt B. Kaisera053f332003-05-10 00:49:56 +0000382 #frameEncoding
383 labelEncodingTitle=Label(frameEncoding,text="Default Source Encoding")
384 radioEncLocale=Radiobutton(frameEncoding,variable=self.encoding,
385 value="locale",text="Locale-defined")
386 radioEncUTF8=Radiobutton(frameEncoding,variable=self.encoding,
387 value="utf-8",text="UTF-8")
388 radioEncNone=Radiobutton(frameEncoding,variable=self.encoding,
389 value="none",text="None")
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000390 #frameHelp
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000391 frameHelpList=Frame(frameHelp)
392 frameHelpListButtons=Frame(frameHelpList)
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000393 scrollHelpList=Scrollbar(frameHelpList)
394 self.listHelp=Listbox(frameHelpList,height=5,takefocus=FALSE,
395 exportselection=FALSE)
396 scrollHelpList.config(command=self.listHelp.yview)
397 self.listHelp.config(yscrollcommand=scrollHelpList.set)
398 self.listHelp.bind('<ButtonRelease-1>',self.HelpSourceSelected)
399 self.buttonHelpListEdit=Button(frameHelpListButtons,text='Edit',
400 state=DISABLED,width=8,command=self.HelpListItemEdit)
401 self.buttonHelpListAdd=Button(frameHelpListButtons,text='Add',
402 width=8,command=self.HelpListItemAdd)
403 self.buttonHelpListRemove=Button(frameHelpListButtons,text='Remove',
404 state=DISABLED,width=8,command=self.HelpListItemRemove)
Steven M. Gava230e5782001-08-07 03:28:25 +0000405 #widget packing
406 #body
407 frameRun.pack(side=TOP,padx=5,pady=5,fill=X)
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000408 frameSave.pack(side=TOP,padx=5,pady=5,fill=X)
Steven M. Gava230e5782001-08-07 03:28:25 +0000409 frameWinSize.pack(side=TOP,padx=5,pady=5,fill=X)
Raymond Hettinger4e49b832004-06-04 06:31:08 +0000410 frameParaSize.pack(side=TOP,padx=5,pady=5,fill=X)
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000411 frameEncoding.pack(side=TOP,padx=5,pady=5,fill=X)
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000412 frameHelp.pack(side=TOP,padx=5,pady=5,expand=TRUE,fill=BOTH)
Steven M. Gava230e5782001-08-07 03:28:25 +0000413 #frameRun
Steven M. Gava230e5782001-08-07 03:28:25 +0000414 labelRunChoiceTitle.pack(side=LEFT,anchor=W,padx=5,pady=5)
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000415 radioStartupShell.pack(side=RIGHT,anchor=W,padx=5,pady=5)
416 radioStartupEdit.pack(side=RIGHT,anchor=W,padx=5,pady=5)
417 #frameSave
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000418 labelRunSaveTitle.pack(side=LEFT,anchor=W,padx=5,pady=5)
419 radioSaveAuto.pack(side=RIGHT,anchor=W,padx=5,pady=5)
420 radioSaveAsk.pack(side=RIGHT,anchor=W,padx=5,pady=5)
Steven M. Gava230e5782001-08-07 03:28:25 +0000421 #frameWinSize
Steven M. Gavafacfc092002-01-19 00:29:54 +0000422 labelWinSizeTitle.pack(side=LEFT,anchor=W,padx=5,pady=5)
423 entryWinHeight.pack(side=RIGHT,anchor=E,padx=10,pady=5)
424 labelWinHeightTitle.pack(side=RIGHT,anchor=E,pady=5)
425 entryWinWidth.pack(side=RIGHT,anchor=E,padx=10,pady=5)
426 labelWinWidthTitle.pack(side=RIGHT,anchor=E,pady=5)
Raymond Hettinger4e49b832004-06-04 06:31:08 +0000427 #paragraphFormatWidth
428 labelParaWidthTitle.pack(side=LEFT,anchor=W,padx=5,pady=5)
429 entryParaWidth.pack(side=RIGHT,anchor=E,padx=10,pady=5)
Kurt B. Kaisera053f332003-05-10 00:49:56 +0000430 #frameEncoding
431 labelEncodingTitle.pack(side=LEFT,anchor=W,padx=5,pady=5)
432 radioEncNone.pack(side=RIGHT,anchor=E,pady=5)
433 radioEncUTF8.pack(side=RIGHT,anchor=E,pady=5)
434 radioEncLocale.pack(side=RIGHT,anchor=E,pady=5)
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000435 #frameHelp
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000436 frameHelpListButtons.pack(side=RIGHT,padx=5,pady=5,fill=Y)
437 frameHelpList.pack(side=TOP,padx=5,pady=5,expand=TRUE,fill=BOTH)
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000438 scrollHelpList.pack(side=RIGHT,anchor=W,fill=Y)
439 self.listHelp.pack(side=LEFT,anchor=E,expand=TRUE,fill=BOTH)
440 self.buttonHelpListEdit.pack(side=TOP,anchor=W,pady=5)
441 self.buttonHelpListAdd.pack(side=TOP,anchor=W)
442 self.buttonHelpListRemove.pack(side=TOP,anchor=W,pady=5)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000443 return frame
444
Steven M. Gavac112cd82002-01-22 05:56:40 +0000445 def AttachVarCallbacks(self):
446 self.fontSize.trace_variable('w',self.VarChanged_fontSize)
447 self.fontName.trace_variable('w',self.VarChanged_fontName)
448 self.fontBold.trace_variable('w',self.VarChanged_fontBold)
449 self.spaceNum.trace_variable('w',self.VarChanged_spaceNum)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000450 self.colour.trace_variable('w',self.VarChanged_colour)
Steven M. Gava052937f2002-02-11 02:20:53 +0000451 self.builtinTheme.trace_variable('w',self.VarChanged_builtinTheme)
452 self.customTheme.trace_variable('w',self.VarChanged_customTheme)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000453 self.themeIsBuiltin.trace_variable('w',self.VarChanged_themeIsBuiltin)
Steven M. Gava052937f2002-02-11 02:20:53 +0000454 self.highlightTarget.trace_variable('w',self.VarChanged_highlightTarget)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000455 self.keyBinding.trace_variable('w',self.VarChanged_keyBinding)
Steven M. Gava052937f2002-02-11 02:20:53 +0000456 self.builtinKeys.trace_variable('w',self.VarChanged_builtinKeys)
457 self.customKeys.trace_variable('w',self.VarChanged_customKeys)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000458 self.keysAreBuiltin.trace_variable('w',self.VarChanged_keysAreBuiltin)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000459 self.winWidth.trace_variable('w',self.VarChanged_winWidth)
460 self.winHeight.trace_variable('w',self.VarChanged_winHeight)
Raymond Hettinger4e49b832004-06-04 06:31:08 +0000461 self.paraWidth.trace_variable('w',self.VarChanged_paraWidth)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000462 self.startupEdit.trace_variable('w',self.VarChanged_startupEdit)
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000463 self.autoSave.trace_variable('w',self.VarChanged_autoSave)
Kurt B. Kaisera053f332003-05-10 00:49:56 +0000464 self.encoding.trace_variable('w',self.VarChanged_encoding)
Steven M. Gava052937f2002-02-11 02:20:53 +0000465
Steven M. Gavac112cd82002-01-22 05:56:40 +0000466 def VarChanged_fontSize(self,*params):
467 value=self.fontSize.get()
468 self.AddChangedItem('main','EditorWindow','font-size',value)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000469
Steven M. Gavac112cd82002-01-22 05:56:40 +0000470 def VarChanged_fontName(self,*params):
471 value=self.fontName.get()
472 self.AddChangedItem('main','EditorWindow','font',value)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000473
474 def VarChanged_fontBold(self,*params):
475 value=self.fontBold.get()
476 self.AddChangedItem('main','EditorWindow','font-bold',value)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000477
Steven M. Gavac112cd82002-01-22 05:56:40 +0000478 def VarChanged_spaceNum(self,*params):
479 value=self.spaceNum.get()
480 self.AddChangedItem('main','Indent','num-spaces',value)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000481
Steven M. Gavac112cd82002-01-22 05:56:40 +0000482 def VarChanged_colour(self,*params):
Steven M. Gava052937f2002-02-11 02:20:53 +0000483 self.OnNewColourSet()
484
485 def VarChanged_builtinTheme(self,*params):
486 value=self.builtinTheme.get()
487 self.AddChangedItem('main','Theme','name',value)
488 self.PaintThemeSample()
489
490 def VarChanged_customTheme(self,*params):
491 value=self.customTheme.get()
Steven M. Gava49745752002-02-18 01:43:11 +0000492 if value != '- no custom themes -':
493 self.AddChangedItem('main','Theme','name',value)
494 self.PaintThemeSample()
Steven M. Gava052937f2002-02-11 02:20:53 +0000495
496 def VarChanged_themeIsBuiltin(self,*params):
497 value=self.themeIsBuiltin.get()
498 self.AddChangedItem('main','Theme','default',value)
Steven M. Gavaf31eec02002-03-05 00:25:58 +0000499 if value:
500 self.VarChanged_builtinTheme()
501 else:
502 self.VarChanged_customTheme()
Steven M. Gava052937f2002-02-11 02:20:53 +0000503
504 def VarChanged_highlightTarget(self,*params):
505 self.SetHighlightTarget()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000506
Steven M. Gavac112cd82002-01-22 05:56:40 +0000507 def VarChanged_keyBinding(self,*params):
Steven M. Gavabbf5ef52002-01-22 11:35:50 +0000508 value=self.keyBinding.get()
509 keySet=self.customKeys.get()
510 event=self.listBindings.get(ANCHOR).split()[0]
Steven M. Gavaa498af22002-02-01 01:33:36 +0000511 if idleConf.IsCoreBinding(event):
512 #this is a core keybinding
513 self.AddChangedItem('keys',keySet,event,value)
514 else: #this is an extension key binding
515 extName=idleConf.GetExtnNameForEvent(event)
516 extKeybindSection=extName+'_cfgBindings'
517 self.AddChangedItem('extensions',extKeybindSection,event,value)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000518
Steven M. Gava052937f2002-02-11 02:20:53 +0000519 def VarChanged_builtinKeys(self,*params):
520 value=self.builtinKeys.get()
521 self.AddChangedItem('main','Keys','name',value)
522 self.LoadKeysList(value)
523
524 def VarChanged_customKeys(self,*params):
525 value=self.customKeys.get()
Steven M. Gava49745752002-02-18 01:43:11 +0000526 if value != '- no custom keys -':
527 self.AddChangedItem('main','Keys','name',value)
528 self.LoadKeysList(value)
Steven M. Gava052937f2002-02-11 02:20:53 +0000529
530 def VarChanged_keysAreBuiltin(self,*params):
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000531 value=self.keysAreBuiltin.get()
Steven M. Gava052937f2002-02-11 02:20:53 +0000532 self.AddChangedItem('main','Keys','default',value)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000533 if value:
Steven M. Gavaf31eec02002-03-05 00:25:58 +0000534 self.VarChanged_builtinKeys()
Steven M. Gava052937f2002-02-11 02:20:53 +0000535 else:
Steven M. Gavaf31eec02002-03-05 00:25:58 +0000536 self.VarChanged_customKeys()
Steven M. Gava052937f2002-02-11 02:20:53 +0000537
Steven M. Gavac112cd82002-01-22 05:56:40 +0000538 def VarChanged_winWidth(self,*params):
Steven M. Gavabbf5ef52002-01-22 11:35:50 +0000539 value=self.winWidth.get()
540 self.AddChangedItem('main','EditorWindow','width',value)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000541
542 def VarChanged_winHeight(self,*params):
Steven M. Gavabbf5ef52002-01-22 11:35:50 +0000543 value=self.winHeight.get()
544 self.AddChangedItem('main','EditorWindow','height',value)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000545
Raymond Hettinger4e49b832004-06-04 06:31:08 +0000546 def VarChanged_paraWidth(self,*params):
547 value=self.paraWidth.get()
548 self.AddChangedItem('main','FormatParagraph','paragraph',value)
549
Steven M. Gavac112cd82002-01-22 05:56:40 +0000550 def VarChanged_startupEdit(self,*params):
Steven M. Gavabbf5ef52002-01-22 11:35:50 +0000551 value=self.startupEdit.get()
552 self.AddChangedItem('main','General','editor-on-startup',value)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000553
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000554 def VarChanged_autoSave(self,*params):
555 value=self.autoSave.get()
556 self.AddChangedItem('main','General','autosave',value)
557
Kurt B. Kaisera053f332003-05-10 00:49:56 +0000558 def VarChanged_encoding(self,*params):
559 value=self.encoding.get()
560 self.AddChangedItem('main','EditorWindow','encoding',value)
561
Steven M. Gavaa498af22002-02-01 01:33:36 +0000562 def ResetChangedItems(self):
Steven M. Gavab77d3432002-03-02 07:16:21 +0000563 #When any config item is changed in this dialog, an entry
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000564 #should be made in the relevant section (config type) of this
565 #dictionary. The key should be the config file section name and the
Steven M. Gavaa498af22002-02-01 01:33:36 +0000566 #value a dictionary, whose key:value pairs are item=value pairs for
567 #that config file section.
568 self.changedItems={'main':{},'highlight':{},'keys':{},'extensions':{}}
569
Steven M. Gavac112cd82002-01-22 05:56:40 +0000570 def AddChangedItem(self,type,section,item,value):
Steven M. Gava2d7bb3f2002-01-29 08:35:29 +0000571 value=str(value) #make sure we use a string
Benjamin Peterson6e3dbbd2009-10-09 22:15:50 +0000572 if section not in self.changedItems[type]:
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000573 self.changedItems[type][section]={}
Steven M. Gavac112cd82002-01-22 05:56:40 +0000574 self.changedItems[type][section][item]=value
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000575
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000576 def GetDefaultItems(self):
577 dItems={'main':{},'highlight':{},'keys':{},'extensions':{}}
Terry Jan Reedy110796f2014-07-27 04:07:18 -0400578 for configType in dItems:
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000579 sections=idleConf.GetSectionList('default',configType)
580 for section in sections:
581 dItems[configType][section]={}
582 options=idleConf.defaultCfg[configType].GetOptionList(section)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000583 for option in options:
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000584 dItems[configType][section][option]=(
585 idleConf.defaultCfg[configType].Get(section,option))
586 return dItems
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000587
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000588 def SetThemeType(self):
589 if self.themeIsBuiltin.get():
590 self.optMenuThemeBuiltin.config(state=NORMAL)
591 self.optMenuThemeCustom.config(state=DISABLED)
592 self.buttonDeleteCustomTheme.config(state=DISABLED)
593 else:
594 self.optMenuThemeBuiltin.config(state=DISABLED)
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000595 self.radioThemeCustom.config(state=NORMAL)
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000596 self.optMenuThemeCustom.config(state=NORMAL)
597 self.buttonDeleteCustomTheme.config(state=NORMAL)
598
599 def SetKeysType(self):
Steven M. Gava052937f2002-02-11 02:20:53 +0000600 if self.keysAreBuiltin.get():
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000601 self.optMenuKeysBuiltin.config(state=NORMAL)
602 self.optMenuKeysCustom.config(state=DISABLED)
603 self.buttonDeleteCustomKeys.config(state=DISABLED)
604 else:
605 self.optMenuKeysBuiltin.config(state=DISABLED)
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000606 self.radioKeysCustom.config(state=NORMAL)
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000607 self.optMenuKeysCustom.config(state=NORMAL)
608 self.buttonDeleteCustomKeys.config(state=NORMAL)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000609
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000610 def GetNewKeys(self):
611 listIndex=self.listBindings.index(ANCHOR)
612 binding=self.listBindings.get(listIndex)
613 bindName=binding.split()[0] #first part, up to first space
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000614 if self.keysAreBuiltin.get():
Steven M. Gavae28ee752002-02-11 03:45:22 +0000615 currentKeySetName=self.builtinKeys.get()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000616 else:
Steven M. Gavae28ee752002-02-11 03:45:22 +0000617 currentKeySetName=self.customKeys.get()
618 currentBindings=idleConf.GetCurrentKeySet()
Terry Jan Reedy110796f2014-07-27 04:07:18 -0400619 if currentKeySetName in self.changedItems['keys']: #unsaved changes
Steven M. Gavae28ee752002-02-11 03:45:22 +0000620 keySetChanges=self.changedItems['keys'][currentKeySetName]
Terry Jan Reedy110796f2014-07-27 04:07:18 -0400621 for event in keySetChanges:
Steven M. Gavae28ee752002-02-11 03:45:22 +0000622 currentBindings[event]=keySetChanges[event].split()
623 currentKeySequences=currentBindings.values()
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000624 newKeys=GetKeysDialog(self,'Get New Keys',bindName,
625 currentKeySequences).result
626 if newKeys: #new keys were specified
Steven M. Gava052937f2002-02-11 02:20:53 +0000627 if self.keysAreBuiltin.get(): #current key set is a built-in
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000628 message=('Your changes will be saved as a new Custom Key Set. '+
629 'Enter a name for your new Custom Key Set below.')
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000630 newKeySet=self.GetNewKeysName(message)
631 if not newKeySet: #user cancelled custom key set creation
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000632 self.listBindings.select_set(listIndex)
633 self.listBindings.select_anchor(listIndex)
634 return
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000635 else: #create new custom key set based on previously active key set
636 self.CreateNewKeySet(newKeySet)
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000637 self.listBindings.delete(listIndex)
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000638 self.listBindings.insert(listIndex,bindName+' - '+newKeys)
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000639 self.listBindings.select_set(listIndex)
640 self.listBindings.select_anchor(listIndex)
Steven M. Gava052937f2002-02-11 02:20:53 +0000641 self.keyBinding.set(newKeys)
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000642 else:
643 self.listBindings.select_set(listIndex)
644 self.listBindings.select_anchor(listIndex)
645
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000646 def GetNewKeysName(self,message):
Steven M. Gava49745752002-02-18 01:43:11 +0000647 usedNames=(idleConf.GetSectionList('user','keys')+
648 idleConf.GetSectionList('default','keys'))
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000649 newKeySet=GetCfgSectionNameDialog(self,'New Custom Key Set',
650 message,usedNames).result
651 return newKeySet
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000652
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000653 def SaveAsNewKeySet(self):
654 newKeysName=self.GetNewKeysName('New Key Set Name:')
655 if newKeysName:
656 self.CreateNewKeySet(newKeysName)
657
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000658 def KeyBindingSelected(self,event):
659 self.buttonNewKeys.config(state=NORMAL)
660
661 def CreateNewKeySet(self,newKeySetName):
662 #creates new custom key set based on the previously active key set,
663 #and makes the new key set active
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000664 if self.keysAreBuiltin.get():
Steven M. Gava052937f2002-02-11 02:20:53 +0000665 prevKeySetName=self.builtinKeys.get()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000666 else:
Steven M. Gava052937f2002-02-11 02:20:53 +0000667 prevKeySetName=self.customKeys.get()
Steven M. Gava052937f2002-02-11 02:20:53 +0000668 prevKeys=idleConf.GetCoreKeys(prevKeySetName)
Steven M. Gava052937f2002-02-11 02:20:53 +0000669 newKeys={}
Terry Jan Reedy110796f2014-07-27 04:07:18 -0400670 for event in prevKeys: #add key set to changed items
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000671 eventName=event[2:-2] #trim off the angle brackets
Terry Jan Reedy110796f2014-07-27 04:07:18 -0400672 binding=' '.join(prevKeys[event])
Steven M. Gava052937f2002-02-11 02:20:53 +0000673 newKeys[eventName]=binding
Steven M. Gava052937f2002-02-11 02:20:53 +0000674 #handle any unsaved changes to prev key set
Terry Jan Reedy110796f2014-07-27 04:07:18 -0400675 if prevKeySetName in self.changedItems['keys']:
Steven M. Gava052937f2002-02-11 02:20:53 +0000676 keySetChanges=self.changedItems['keys'][prevKeySetName]
Terry Jan Reedy110796f2014-07-27 04:07:18 -0400677 for event in keySetChanges:
Steven M. Gava052937f2002-02-11 02:20:53 +0000678 newKeys[event]=keySetChanges[event]
Steven M. Gava052937f2002-02-11 02:20:53 +0000679 #save the new theme
680 self.SaveNewKeySet(newKeySetName,newKeys)
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000681 #change gui over to the new key set
682 customKeyList=idleConf.GetSectionList('user','keys')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000683 customKeyList.sort()
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000684 self.optMenuKeysCustom.SetMenu(customKeyList,newKeySetName)
Steven M. Gava052937f2002-02-11 02:20:53 +0000685 self.keysAreBuiltin.set(0)
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000686 self.SetKeysType()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000687
Steven M. Gava052937f2002-02-11 02:20:53 +0000688 def LoadKeysList(self,keySetName):
689 reselect=0
690 newKeySet=0
691 if self.listBindings.curselection():
692 reselect=1
693 listIndex=self.listBindings.index(ANCHOR)
Steven M. Gava052937f2002-02-11 02:20:53 +0000694 keySet=idleConf.GetKeySet(keySetName)
Steven M. Gava052937f2002-02-11 02:20:53 +0000695 bindNames=keySet.keys()
696 bindNames.sort()
697 self.listBindings.delete(0,END)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000698 for bindName in bindNames:
Terry Jan Reedy110796f2014-07-27 04:07:18 -0400699 key=' '.join(keySet[bindName]) #make key(s) into a string
Steven M. Gava052937f2002-02-11 02:20:53 +0000700 bindName=bindName[2:-2] #trim off the angle brackets
Terry Jan Reedy110796f2014-07-27 04:07:18 -0400701 if keySetName in self.changedItems['keys']:
Steven M. Gava052937f2002-02-11 02:20:53 +0000702 #handle any unsaved changes to this key set
Terry Jan Reedy110796f2014-07-27 04:07:18 -0400703 if bindName in self.changedItems['keys'][keySetName]:
Steven M. Gava052937f2002-02-11 02:20:53 +0000704 key=self.changedItems['keys'][keySetName][bindName]
Steven M. Gava052937f2002-02-11 02:20:53 +0000705 self.listBindings.insert(END, bindName+' - '+key)
Steven M. Gava052937f2002-02-11 02:20:53 +0000706 if reselect:
707 self.listBindings.see(listIndex)
708 self.listBindings.select_set(listIndex)
709 self.listBindings.select_anchor(listIndex)
710
Steven M. Gava49745752002-02-18 01:43:11 +0000711 def DeleteCustomKeys(self):
712 keySetName=self.customKeys.get()
713 if not tkMessageBox.askyesno('Delete Key Set','Are you sure you wish '+
Walter Dörwald70a6b492004-02-12 17:35:32 +0000714 'to delete the key set %r ?' % (keySetName),
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +0000715 parent=self):
Steven M. Gava49745752002-02-18 01:43:11 +0000716 return
717 #remove key set from config
718 idleConf.userCfg['keys'].remove_section(keySetName)
Benjamin Peterson6e3dbbd2009-10-09 22:15:50 +0000719 if keySetName in self.changedItems['keys']:
Steven M. Gava49745752002-02-18 01:43:11 +0000720 del(self.changedItems['keys'][keySetName])
721 #write changes
722 idleConf.userCfg['keys'].Save()
723 #reload user key set list
724 itemList=idleConf.GetSectionList('user','keys')
725 itemList.sort()
726 if not itemList:
727 self.radioKeysCustom.config(state=DISABLED)
728 self.optMenuKeysCustom.SetMenu(itemList,'- no custom keys -')
729 else:
730 self.optMenuKeysCustom.SetMenu(itemList,itemList[0])
731 #revert to default key set
732 self.keysAreBuiltin.set(idleConf.defaultCfg['main'].Get('Keys','default'))
733 self.builtinKeys.set(idleConf.defaultCfg['main'].Get('Keys','name'))
734 #user can't back out of these changes, they must be applied now
735 self.Apply()
736 self.SetKeysType()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000737
Steven M. Gava49745752002-02-18 01:43:11 +0000738 def DeleteCustomTheme(self):
739 themeName=self.customTheme.get()
740 if not tkMessageBox.askyesno('Delete Theme','Are you sure you wish '+
Walter Dörwald70a6b492004-02-12 17:35:32 +0000741 'to delete the theme %r ?' % (themeName,),
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +0000742 parent=self):
Steven M. Gava49745752002-02-18 01:43:11 +0000743 return
744 #remove theme from config
745 idleConf.userCfg['highlight'].remove_section(themeName)
Benjamin Peterson6e3dbbd2009-10-09 22:15:50 +0000746 if themeName in self.changedItems['highlight']:
Steven M. Gava49745752002-02-18 01:43:11 +0000747 del(self.changedItems['highlight'][themeName])
748 #write changes
749 idleConf.userCfg['highlight'].Save()
750 #reload user theme list
751 itemList=idleConf.GetSectionList('user','highlight')
752 itemList.sort()
753 if not itemList:
754 self.radioThemeCustom.config(state=DISABLED)
755 self.optMenuThemeCustom.SetMenu(itemList,'- no custom themes -')
756 else:
757 self.optMenuThemeCustom.SetMenu(itemList,itemList[0])
758 #revert to default theme
759 self.themeIsBuiltin.set(idleConf.defaultCfg['main'].Get('Theme','default'))
760 self.builtinTheme.set(idleConf.defaultCfg['main'].Get('Theme','name'))
761 #user can't back out of these changes, they must be applied now
762 self.Apply()
763 self.SetThemeType()
764
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000765 def GetColour(self):
766 target=self.highlightTarget.get()
Steven M. Gava052937f2002-02-11 02:20:53 +0000767 prevColour=self.frameColourSet.cget('bg')
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000768 rgbTuplet, colourString = tkColorChooser.askcolor(parent=self,
Steven M. Gava052937f2002-02-11 02:20:53 +0000769 title='Pick new colour for : '+target,initialcolor=prevColour)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000770 if colourString and (colourString!=prevColour):
Steven M. Gava052937f2002-02-11 02:20:53 +0000771 #user didn't cancel, and they chose a new colour
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000772 if self.themeIsBuiltin.get(): #current theme is a built-in
773 message=('Your changes will be saved as a new Custom Theme. '+
774 'Enter a name for your new Custom Theme below.')
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000775 newTheme=self.GetNewThemeName(message)
776 if not newTheme: #user cancelled custom theme creation
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000777 return
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000778 else: #create new custom theme based on previously active theme
779 self.CreateNewTheme(newTheme)
Steven M. Gava052937f2002-02-11 02:20:53 +0000780 self.colour.set(colourString)
781 else: #current theme is user defined
782 self.colour.set(colourString)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000783
Steven M. Gava052937f2002-02-11 02:20:53 +0000784 def OnNewColourSet(self):
785 newColour=self.colour.get()
786 self.frameColourSet.config(bg=newColour)#set sample
787 if self.fgHilite.get(): plane='foreground'
788 else: plane='background'
789 sampleElement=self.themeElements[self.highlightTarget.get()][0]
Raymond Hettinger931237e2003-07-09 18:48:24 +0000790 self.textHighlightSample.tag_config(sampleElement, **{plane:newColour})
Steven M. Gava052937f2002-02-11 02:20:53 +0000791 theme=self.customTheme.get()
792 themeElement=sampleElement+'-'+plane
793 self.AddChangedItem('highlight',theme,themeElement,newColour)
Steven M. Gava052937f2002-02-11 02:20:53 +0000794
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000795 def GetNewThemeName(self,message):
Steven M. Gava49745752002-02-18 01:43:11 +0000796 usedNames=(idleConf.GetSectionList('user','highlight')+
797 idleConf.GetSectionList('default','highlight'))
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000798 newTheme=GetCfgSectionNameDialog(self,'New Custom Theme',
799 message,usedNames).result
800 return newTheme
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000801
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000802 def SaveAsNewTheme(self):
803 newThemeName=self.GetNewThemeName('New Theme Name:')
804 if newThemeName:
805 self.CreateNewTheme(newThemeName)
806
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000807 def CreateNewTheme(self,newThemeName):
808 #creates new custom theme based on the previously active theme,
809 #and makes the new theme active
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000810 if self.themeIsBuiltin.get():
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000811 themeType='default'
812 themeName=self.builtinTheme.get()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000813 else:
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000814 themeType='user'
815 themeName=self.customTheme.get()
816 newTheme=idleConf.GetThemeDict(themeType,themeName)
Steven M. Gava052937f2002-02-11 02:20:53 +0000817 #apply any of the old theme's unsaved changes to the new theme
Terry Jan Reedy110796f2014-07-27 04:07:18 -0400818 if themeName in self.changedItems['highlight']:
Steven M. Gava052937f2002-02-11 02:20:53 +0000819 themeChanges=self.changedItems['highlight'][themeName]
Terry Jan Reedy110796f2014-07-27 04:07:18 -0400820 for element in themeChanges:
Steven M. Gava052937f2002-02-11 02:20:53 +0000821 newTheme[element]=themeChanges[element]
822 #save the new theme
823 self.SaveNewTheme(newThemeName,newTheme)
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000824 #change gui over to the new theme
825 customThemeList=idleConf.GetSectionList('user','highlight')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000826 customThemeList.sort()
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000827 self.optMenuThemeCustom.SetMenu(customThemeList,newThemeName)
828 self.themeIsBuiltin.set(0)
829 self.SetThemeType()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000830
Steven M. Gavac112cd82002-01-22 05:56:40 +0000831 def OnListFontButtonRelease(self,event):
Kurt B. Kaiser05391692003-05-26 20:35:53 +0000832 font = self.listFontName.get(ANCHOR)
833 self.fontName.set(font.lower())
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000834 self.SetFontSample()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000835
Steven M. Gavac112cd82002-01-22 05:56:40 +0000836 def SetFontSample(self,event=None):
837 fontName=self.fontName.get()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000838 if self.fontBold.get():
Steven M. Gavac112cd82002-01-22 05:56:40 +0000839 fontWeight=tkFont.BOLD
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000840 else:
Steven M. Gavac112cd82002-01-22 05:56:40 +0000841 fontWeight=tkFont.NORMAL
Ned Deilye3d47122012-10-22 15:13:01 -0700842 newFont = (fontName, self.fontSize.get(), fontWeight)
843 self.labelFontSample.config(font=newFont)
844 self.textHighlightSample.configure(font=newFont)
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000845
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000846 def SetHighlightTarget(self):
847 if self.highlightTarget.get()=='Cursor': #bg not possible
848 self.radioFg.config(state=DISABLED)
849 self.radioBg.config(state=DISABLED)
850 self.fgHilite.set(1)
851 else: #both fg and bg can be set
852 self.radioFg.config(state=NORMAL)
853 self.radioBg.config(state=NORMAL)
854 self.fgHilite.set(1)
855 self.SetColourSample()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000856
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000857 def SetColourSampleBinding(self,*args):
858 self.SetColourSample()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000859
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000860 def SetColourSample(self):
861 #set the colour smaple area
862 tag=self.themeElements[self.highlightTarget.get()][0]
863 if self.fgHilite.get(): plane='foreground'
864 else: plane='background'
865 colour=self.textHighlightSample.tag_cget(tag,plane)
866 self.frameColourSet.config(bg=colour)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000867
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000868 def PaintThemeSample(self):
Steven M. Gavad0342cd2001-11-04 11:53:10 +0000869 if self.themeIsBuiltin.get(): #a default theme
Steven M. Gava99300612001-11-04 07:03:08 +0000870 theme=self.builtinTheme.get()
871 else: #a user theme
872 theme=self.customTheme.get()
Terry Jan Reedy110796f2014-07-27 04:07:18 -0400873 for elementTitle in self.themeElements:
Steven M. Gava052937f2002-02-11 02:20:53 +0000874 element=self.themeElements[elementTitle][0]
875 colours=idleConf.GetHighlight(theme,element)
876 if element=='cursor': #cursor sample needs special painting
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000877 colours['background']=idleConf.GetHighlight(theme,
Steven M. Gava0cae01c2002-01-04 07:53:06 +0000878 'normal', fgBg='bg')
Steven M. Gava052937f2002-02-11 02:20:53 +0000879 #handle any unsaved changes to this theme
Terry Jan Reedy110796f2014-07-27 04:07:18 -0400880 if theme in self.changedItems['highlight']:
Steven M. Gava052937f2002-02-11 02:20:53 +0000881 themeDict=self.changedItems['highlight'][theme]
Benjamin Peterson6e3dbbd2009-10-09 22:15:50 +0000882 if element+'-foreground' in themeDict:
Steven M. Gava052937f2002-02-11 02:20:53 +0000883 colours['foreground']=themeDict[element+'-foreground']
Benjamin Peterson6e3dbbd2009-10-09 22:15:50 +0000884 if element+'-background' in themeDict:
Steven M. Gava052937f2002-02-11 02:20:53 +0000885 colours['background']=themeDict[element+'-background']
Raymond Hettinger931237e2003-07-09 18:48:24 +0000886 self.textHighlightSample.tag_config(element, **colours)
Steven M. Gava052937f2002-02-11 02:20:53 +0000887 self.SetColourSample()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000888
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000889 def HelpSourceSelected(self,event):
890 self.SetHelpListButtonStates()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000891
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000892 def SetHelpListButtonStates(self):
893 if self.listHelp.size()<1: #no entries in list
894 self.buttonHelpListEdit.config(state=DISABLED)
895 self.buttonHelpListRemove.config(state=DISABLED)
896 else: #there are some entries
897 if self.listHelp.curselection(): #there currently is a selection
898 self.buttonHelpListEdit.config(state=NORMAL)
899 self.buttonHelpListRemove.config(state=NORMAL)
900 else: #there currently is not a selection
901 self.buttonHelpListEdit.config(state=DISABLED)
902 self.buttonHelpListRemove.config(state=DISABLED)
903
904 def HelpListItemAdd(self):
905 helpSource=GetHelpSourceDialog(self,'New Help Source').result
906 if helpSource:
907 self.userHelpList.append( (helpSource[0],helpSource[1]) )
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +0000908 self.listHelp.insert(END,helpSource[0])
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000909 self.UpdateUserHelpChangedItems()
910 self.SetHelpListButtonStates()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000911
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000912 def HelpListItemEdit(self):
913 itemIndex=self.listHelp.index(ANCHOR)
914 helpSource=self.userHelpList[itemIndex]
Steven M. Gava0c5bc8c2002-03-27 02:25:44 +0000915 newHelpSource=GetHelpSourceDialog(self,'Edit Help Source',
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000916 menuItem=helpSource[0],filePath=helpSource[1]).result
917 if (not newHelpSource) or (newHelpSource==helpSource):
918 return #no changes
919 self.userHelpList[itemIndex]=newHelpSource
920 self.listHelp.delete(itemIndex)
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +0000921 self.listHelp.insert(itemIndex,newHelpSource[0])
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000922 self.UpdateUserHelpChangedItems()
923 self.SetHelpListButtonStates()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000924
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000925 def HelpListItemRemove(self):
926 itemIndex=self.listHelp.index(ANCHOR)
927 del(self.userHelpList[itemIndex])
928 self.listHelp.delete(itemIndex)
929 self.UpdateUserHelpChangedItems()
930 self.SetHelpListButtonStates()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000931
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000932 def UpdateUserHelpChangedItems(self):
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +0000933 "Clear and rebuild the HelpFiles section in self.changedItems"
934 self.changedItems['main']['HelpFiles'] = {}
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000935 for num in range(1,len(self.userHelpList)+1):
936 self.AddChangedItem('main','HelpFiles',str(num),
Terry Jan Reedy110796f2014-07-27 04:07:18 -0400937 ';'.join(self.userHelpList[num-1][:2]))
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000938
Steven M. Gava429a86a2001-10-23 10:42:12 +0000939 def LoadFontCfg(self):
940 ##base editor font selection list
Steven M. Gavac11ccf32001-09-24 09:43:17 +0000941 fonts=list(tkFont.families(self))
942 fonts.sort()
943 for font in fonts:
944 self.listFontName.insert(END,font)
Steven M. Gava485f7b62001-10-26 06:47:09 +0000945 configuredFont=idleConf.GetOption('main','EditorWindow','font',
Terry Jan Reedy110796f2014-07-27 04:07:18 -0400946 default='courier')
Kurt B. Kaiser05391692003-05-26 20:35:53 +0000947 lc_configuredFont = configuredFont.lower()
948 self.fontName.set(lc_configuredFont)
949 lc_fonts = [s.lower() for s in fonts]
950 if lc_configuredFont in lc_fonts:
951 currentFontIndex = lc_fonts.index(lc_configuredFont)
Steven M. Gava429a86a2001-10-23 10:42:12 +0000952 self.listFontName.see(currentFontIndex)
953 self.listFontName.select_set(currentFontIndex)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000954 self.listFontName.select_anchor(currentFontIndex)
Steven M. Gava429a86a2001-10-23 10:42:12 +0000955 ##font size dropdown
Terry Jan Reedy110796f2014-07-27 04:07:18 -0400956 fontSize=idleConf.GetOption('main', 'EditorWindow', 'font-size',
957 type='int', default='10')
Chui Teya178cff2002-11-04 03:17:45 +0000958 self.optMenuFontSize.SetMenu(('7','8','9','10','11','12','13','14',
Terry Jan Reedy110796f2014-07-27 04:07:18 -0400959 '16','18','20','22'), fontSize )
Steven M. Gavac112cd82002-01-22 05:56:40 +0000960 ##fontWeight
961 self.fontBold.set(idleConf.GetOption('main','EditorWindow',
Terry Jan Reedy110796f2014-07-27 04:07:18 -0400962 'font-bold',default=0,type='bool'))
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000963 ##font sample
Steven M. Gava429a86a2001-10-23 10:42:12 +0000964 self.SetFontSample()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000965
Steven M. Gava429a86a2001-10-23 10:42:12 +0000966 def LoadTabCfg(self):
Steven M. Gava429a86a2001-10-23 10:42:12 +0000967 ##indent sizes
Steven M. Gava485f7b62001-10-26 06:47:09 +0000968 spaceNum=idleConf.GetOption('main','Indent','num-spaces',
Steven M. Gava429a86a2001-10-23 10:42:12 +0000969 default=4,type='int')
Steven M. Gava429a86a2001-10-23 10:42:12 +0000970 self.spaceNum.set(spaceNum)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000971
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000972 def LoadThemeCfg(self):
Steven M. Gava41a85322001-10-29 08:05:34 +0000973 ##current theme type radiobutton
Steven M. Gavad0342cd2001-11-04 11:53:10 +0000974 self.themeIsBuiltin.set(idleConf.GetOption('main','Theme','default',
Steven M. Gavac112cd82002-01-22 05:56:40 +0000975 type='bool',default=1))
Steven M. Gava41a85322001-10-29 08:05:34 +0000976 ##currently set theme
Steven M. Gavaad4f5322002-01-03 12:05:17 +0000977 currentOption=idleConf.CurrentTheme()
Steven M. Gava7c017862001-10-29 11:19:46 +0000978 ##load available theme option menus
Steven M. Gavad0342cd2001-11-04 11:53:10 +0000979 if self.themeIsBuiltin.get(): #default theme selected
Steven M. Gava41a85322001-10-29 08:05:34 +0000980 itemList=idleConf.GetSectionList('default','highlight')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000981 itemList.sort()
Steven M. Gava41a85322001-10-29 08:05:34 +0000982 self.optMenuThemeBuiltin.SetMenu(itemList,currentOption)
983 itemList=idleConf.GetSectionList('user','highlight')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000984 itemList.sort()
Steven M. Gava41a85322001-10-29 08:05:34 +0000985 if not itemList:
986 self.radioThemeCustom.config(state=DISABLED)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000987 self.customTheme.set('- no custom themes -')
Steven M. Gava41a85322001-10-29 08:05:34 +0000988 else:
989 self.optMenuThemeCustom.SetMenu(itemList,itemList[0])
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000990 else: #user theme selected
Steven M. Gava41a85322001-10-29 08:05:34 +0000991 itemList=idleConf.GetSectionList('user','highlight')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000992 itemList.sort()
Steven M. Gava41a85322001-10-29 08:05:34 +0000993 self.optMenuThemeCustom.SetMenu(itemList,currentOption)
994 itemList=idleConf.GetSectionList('default','highlight')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000995 itemList.sort()
Steven M. Gava41a85322001-10-29 08:05:34 +0000996 self.optMenuThemeBuiltin.SetMenu(itemList,itemList[0])
Steven M. Gava7c017862001-10-29 11:19:46 +0000997 self.SetThemeType()
998 ##load theme element option menu
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000999 themeNames=self.themeElements.keys()
Florent Xiclunaa7f242f2010-04-02 08:15:26 +00001000 themeNames.sort(key=lambda x: self.themeElements[x][1])
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001001 self.optMenuHighlightTarget.SetMenu(themeNames,themeNames[0])
Steven M. Gava9dd16b32001-11-03 14:54:25 +00001002 self.PaintThemeSample()
Steven M. Gava0cae01c2002-01-04 07:53:06 +00001003 self.SetHighlightTarget()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001004
Steven M. Gava9dd16b32001-11-03 14:54:25 +00001005 def LoadKeyCfg(self):
Steven M. Gava41a85322001-10-29 08:05:34 +00001006 ##current keys type radiobutton
Steven M. Gava052937f2002-02-11 02:20:53 +00001007 self.keysAreBuiltin.set(idleConf.GetOption('main','Keys','default',
Steven M. Gavac112cd82002-01-22 05:56:40 +00001008 type='bool',default=1))
Steven M. Gava41a85322001-10-29 08:05:34 +00001009 ##currently set keys
Steven M. Gavaad4f5322002-01-03 12:05:17 +00001010 currentOption=idleConf.CurrentKeys()
Steven M. Gava7c017862001-10-29 11:19:46 +00001011 ##load available keyset option menus
Steven M. Gava052937f2002-02-11 02:20:53 +00001012 if self.keysAreBuiltin.get(): #default theme selected
Steven M. Gava41a85322001-10-29 08:05:34 +00001013 itemList=idleConf.GetSectionList('default','keys')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +00001014 itemList.sort()
Steven M. Gava41a85322001-10-29 08:05:34 +00001015 self.optMenuKeysBuiltin.SetMenu(itemList,currentOption)
1016 itemList=idleConf.GetSectionList('user','keys')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +00001017 itemList.sort()
Steven M. Gava41a85322001-10-29 08:05:34 +00001018 if not itemList:
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001019 self.radioKeysCustom.config(state=DISABLED)
1020 self.customKeys.set('- no custom keys -')
Steven M. Gava41a85322001-10-29 08:05:34 +00001021 else:
1022 self.optMenuKeysCustom.SetMenu(itemList,itemList[0])
Steven M. Gavaa498af22002-02-01 01:33:36 +00001023 else: #user key set selected
Steven M. Gava41a85322001-10-29 08:05:34 +00001024 itemList=idleConf.GetSectionList('user','keys')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +00001025 itemList.sort()
Steven M. Gava41a85322001-10-29 08:05:34 +00001026 self.optMenuKeysCustom.SetMenu(itemList,currentOption)
1027 itemList=idleConf.GetSectionList('default','keys')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +00001028 itemList.sort()
Steven M. Gava41a85322001-10-29 08:05:34 +00001029 self.optMenuKeysBuiltin.SetMenu(itemList,itemList[0])
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001030 self.SetKeysType()
Steven M. Gavafacfc092002-01-19 00:29:54 +00001031 ##load keyset element list
Steven M. Gava052937f2002-02-11 02:20:53 +00001032 keySetName=idleConf.CurrentKeys()
1033 self.LoadKeysList(keySetName)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001034
Steven M. Gavafacfc092002-01-19 00:29:54 +00001035 def LoadGeneralCfg(self):
Steven M. Gava5f28e8f2002-01-21 06:38:21 +00001036 #startup state
1037 self.startupEdit.set(idleConf.GetOption('main','General',
1038 'editor-on-startup',default=1,type='bool'))
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +00001039 #autosave state
1040 self.autoSave.set(idleConf.GetOption('main', 'General', 'autosave',
1041 default=0, type='bool'))
Steven M. Gavafacfc092002-01-19 00:29:54 +00001042 #initial window size
Andrew Svetlovd8590ff2012-12-24 13:17:59 +02001043 self.winWidth.set(idleConf.GetOption('main','EditorWindow','width',
1044 type='int'))
1045 self.winHeight.set(idleConf.GetOption('main','EditorWindow','height',
1046 type='int'))
Raymond Hettinger4e49b832004-06-04 06:31:08 +00001047 #initial paragraph reformat size
Andrew Svetlovd8590ff2012-12-24 13:17:59 +02001048 self.paraWidth.set(idleConf.GetOption('main','FormatParagraph','paragraph',
1049 type='int'))
Kurt B. Kaisera053f332003-05-10 00:49:56 +00001050 # default source encoding
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +00001051 self.encoding.set(idleConf.GetOption('main', 'EditorWindow',
1052 'encoding', default='none'))
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +00001053 # additional help sources
1054 self.userHelpList = idleConf.GetAllExtraHelpSourcesList()
Steven M. Gava085eb1b2002-02-05 04:52:32 +00001055 for helpItem in self.userHelpList:
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +00001056 self.listHelp.insert(END,helpItem[0])
Steven M. Gava085eb1b2002-02-05 04:52:32 +00001057 self.SetHelpListButtonStates()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001058
Steven M. Gava429a86a2001-10-23 10:42:12 +00001059 def LoadConfigs(self):
1060 """
1061 load configuration from default and user config files and populate
1062 the widgets on the config dialog pages.
1063 """
1064 ### fonts / tabs page
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001065 self.LoadFontCfg()
1066 self.LoadTabCfg()
Steven M. Gava429a86a2001-10-23 10:42:12 +00001067 ### highlighting page
Steven M. Gava9dd16b32001-11-03 14:54:25 +00001068 self.LoadThemeCfg()
Steven M. Gava429a86a2001-10-23 10:42:12 +00001069 ### keys page
Steven M. Gava9dd16b32001-11-03 14:54:25 +00001070 self.LoadKeyCfg()
Steven M. Gava429a86a2001-10-23 10:42:12 +00001071 ### general page
Steven M. Gavafacfc092002-01-19 00:29:54 +00001072 self.LoadGeneralCfg()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001073
Steven M. Gava052937f2002-02-11 02:20:53 +00001074 def SaveNewKeySet(self,keySetName,keySet):
1075 """
1076 save a newly created core key set.
1077 keySetName - string, the name of the new key set
1078 keySet - dictionary containing the new key set
1079 """
1080 if not idleConf.userCfg['keys'].has_section(keySetName):
1081 idleConf.userCfg['keys'].add_section(keySetName)
Terry Jan Reedy110796f2014-07-27 04:07:18 -04001082 for event in keySet:
Steven M. Gava052937f2002-02-11 02:20:53 +00001083 value=keySet[event]
1084 idleConf.userCfg['keys'].SetOption(keySetName,event,value)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001085
Steven M. Gava052937f2002-02-11 02:20:53 +00001086 def SaveNewTheme(self,themeName,theme):
1087 """
1088 save a newly created theme.
1089 themeName - string, the name of the new theme
1090 theme - dictionary containing the new theme
1091 """
1092 if not idleConf.userCfg['highlight'].has_section(themeName):
1093 idleConf.userCfg['highlight'].add_section(themeName)
Terry Jan Reedy110796f2014-07-27 04:07:18 -04001094 for element in theme:
Steven M. Gava052937f2002-02-11 02:20:53 +00001095 value=theme[element]
1096 idleConf.userCfg['highlight'].SetOption(themeName,element,value)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001097
Steven M. Gava2d7bb3f2002-01-29 08:35:29 +00001098 def SetUserValue(self,configType,section,item,value):
Steven M. Gava2d7bb3f2002-01-29 08:35:29 +00001099 if idleConf.defaultCfg[configType].has_option(section,item):
1100 if idleConf.defaultCfg[configType].Get(section,item)==value:
1101 #the setting equals a default setting, remove it from user cfg
1102 return idleConf.userCfg[configType].RemoveOption(section,item)
1103 #if we got here set the option
1104 return idleConf.userCfg[configType].SetOption(section,item,value)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001105
Steven M. Gava052937f2002-02-11 02:20:53 +00001106 def SaveAllChangedConfigs(self):
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +00001107 "Save configuration changes to the user config file."
Steven M. Gava0c5bc8c2002-03-27 02:25:44 +00001108 idleConf.userCfg['main'].Save()
Terry Jan Reedy110796f2014-07-27 04:07:18 -04001109 for configType in self.changedItems:
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +00001110 cfgTypeHasChanges = False
Terry Jan Reedy110796f2014-07-27 04:07:18 -04001111 for section in self.changedItems[configType]:
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +00001112 if section == 'HelpFiles':
1113 #this section gets completely replaced
1114 idleConf.userCfg['main'].remove_section('HelpFiles')
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +00001115 cfgTypeHasChanges = True
Terry Jan Reedy110796f2014-07-27 04:07:18 -04001116 for item in self.changedItems[configType][section]:
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +00001117 value = self.changedItems[configType][section][item]
Steven M. Gava2d7bb3f2002-01-29 08:35:29 +00001118 if self.SetUserValue(configType,section,item,value):
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +00001119 cfgTypeHasChanges = True
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001120 if cfgTypeHasChanges:
1121 idleConf.userCfg[configType].Save()
Kurt B. Kaiser5acdf932004-11-16 21:28:36 +00001122 for configType in ['keys', 'highlight']:
1123 # save these even if unchanged!
1124 idleConf.userCfg[configType].Save()
Steven M. Gavaa498af22002-02-01 01:33:36 +00001125 self.ResetChangedItems() #clear the changed items dict
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001126
Kurt B. Kaiserb1754452005-11-18 22:05:48 +00001127 def DeactivateCurrentConfig(self):
1128 #Before a config is saved, some cleanup of current
1129 #config must be done - remove the previous keybindings
Terry Jan Reedy110796f2014-07-27 04:07:18 -04001130 winInstances=self.parent.instance_dict
Kurt B. Kaiserb1754452005-11-18 22:05:48 +00001131 for instance in winInstances:
1132 instance.RemoveKeybindings()
1133
Steven M. Gava49745752002-02-18 01:43:11 +00001134 def ActivateConfigChanges(self):
Kurt B. Kaiseracdef852005-01-31 03:34:26 +00001135 "Dynamically apply configuration changes"
Terry Jan Reedy110796f2014-07-27 04:07:18 -04001136 winInstances = self.parent.instance_dict.keys()
Steven M. Gavab77d3432002-03-02 07:16:21 +00001137 for instance in winInstances:
1138 instance.ResetColorizer()
Steven M. Gavab1585412002-03-12 00:21:56 +00001139 instance.ResetFont()
Kurt B. Kaiseracdef852005-01-31 03:34:26 +00001140 instance.set_notabs_indentwidth()
Kurt B. Kaiserb1754452005-11-18 22:05:48 +00001141 instance.ApplyKeybindings()
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +00001142 instance.reset_help_menu_entries()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001143
Steven M. Gava5f28e8f2002-01-21 06:38:21 +00001144 def Cancel(self):
1145 self.destroy()
1146
1147 def Ok(self):
1148 self.Apply()
1149 self.destroy()
1150
1151 def Apply(self):
Kurt B. Kaiserb1754452005-11-18 22:05:48 +00001152 self.DeactivateCurrentConfig()
Steven M. Gava052937f2002-02-11 02:20:53 +00001153 self.SaveAllChangedConfigs()
Steven M. Gava49745752002-02-18 01:43:11 +00001154 self.ActivateConfigChanges()
Steven M. Gava5f28e8f2002-01-21 06:38:21 +00001155
1156 def Help(self):
Steven M. Gavac11ccf32001-09-24 09:43:17 +00001157 pass
1158
Steven M. Gava44d3d1a2001-07-31 06:59:02 +00001159if __name__ == '__main__':
Terry Jan Reedyaf0dce92014-07-14 23:07:21 -04001160 import unittest
1161 unittest.main('idlelib.idle_test.test_configdialog',
1162 verbosity=2, exit=False)
1163
Terry Jan Reedy76916e82014-05-29 01:46:16 -04001164 from idlelib.idle_test.htest import run
1165 run(ConfigDialog)