blob: bcf39c3e56e613316ac96f86acf16cfc56b2266d [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)
Terry Jan Reedy19b7a752014-07-30 19:24:26 -040031 self.parent = parent
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +000032 self.wm_withdraw()
33
Steven M. Gavad721c482001-07-31 10:46:53 +000034 self.configure(borderwidth=5)
Amaury Forgeot d'Arcb9ee8812009-07-15 21:29:27 +000035 self.title('IDLE Preferences')
Terry Jan Reedy76916e82014-05-29 01:46:16 -040036 if _htest:
37 parent.instance_dict = {}
Steven M. Gavad721c482001-07-31 10:46:53 +000038 self.geometry("+%d+%d" % (parent.winfo_rootx()+20,
Terry Jan Reedy76916e82014-05-29 01:46:16 -040039 parent.winfo_rooty()+(30 if not _htest else 150)))
Georg Brandl7eb4b7d2005-07-22 21:49:32 +000040 #Theme Elements. Each theme element key is its display name.
Steven M. Gava9dd16b32001-11-03 14:54:25 +000041 #The first value of the tuple is the sample area tag name.
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +000042 #The second value is the display name list sort index.
Steven M. Gavaad4f5322002-01-03 12:05:17 +000043 self.themeElements={'Normal Text':('normal','00'),
44 'Python Keywords':('keyword','01'),
45 'Python Definitions':('definition','02'),
Kurt B. Kaiser73360a32004-03-08 18:15:31 +000046 'Python Builtins':('builtin', '03'),
47 'Python Comments':('comment','04'),
48 'Python Strings':('string','05'),
49 'Selected Text':('hilite','06'),
50 'Found Text':('hit','07'),
51 'Cursor':('cursor','08'),
52 'Error Text':('error','09'),
53 'Shell Normal Text':('console','10'),
54 'Shell Stdout Text':('stdout','11'),
55 'Shell Stderr Text':('stderr','12'),
56 }
Steven M. Gavaa498af22002-02-01 01:33:36 +000057 self.ResetChangedItems() #load initial values in changed items dict
Steven M. Gavad721c482001-07-31 10:46:53 +000058 self.CreateWidgets()
59 self.resizable(height=FALSE,width=FALSE)
Steven M. Gavad721c482001-07-31 10:46:53 +000060 self.transient(parent)
61 self.grab_set()
62 self.protocol("WM_DELETE_WINDOW", self.Cancel)
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):
Terry Jan Reedy19b7a752014-07-30 19:24:26 -0400113 parent = self.parent
114 self.fontSize = StringVar(parent)
115 self.fontBold = BooleanVar(parent)
116 self.fontName = StringVar(parent)
117 self.spaceNum = IntVar(parent)
118 self.editFont = tkFont.Font(parent,('courier',10,'normal'))
119
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000120 ##widget creation
121 #body frame
Kurt B. Kaiser20172f92007-10-30 02:38:54 +0000122 frame=self.tabPages.pages['Fonts/Tabs'].frame
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000123 #body section frames
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000124 frameFont=LabelFrame(frame,borderwidth=2,relief=GROOVE,
125 text=' Base Editor Font ')
126 frameIndent=LabelFrame(frame,borderwidth=2,relief=GROOVE,
127 text=' Indentation Width ')
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000128 #frameFont
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000129 frameFontName=Frame(frameFont)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000130 frameFontParam=Frame(frameFont)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000131 labelFontNameTitle=Label(frameFontName,justify=LEFT,
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000132 text='Font Face :')
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000133 self.listFontName=Listbox(frameFontName,height=5,takefocus=FALSE,
134 exportselection=FALSE)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000135 self.listFontName.bind('<ButtonRelease-1>',self.OnListFontButtonRelease)
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000136 scrollFont=Scrollbar(frameFontName)
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000137 scrollFont.config(command=self.listFontName.yview)
138 self.listFontName.config(yscrollcommand=scrollFont.set)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000139 labelFontSizeTitle=Label(frameFontParam,text='Size :')
140 self.optMenuFontSize=DynOptionMenu(frameFontParam,self.fontSize,None,
Steven M. Gavac112cd82002-01-22 05:56:40 +0000141 command=self.SetFontSample)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000142 checkFontBold=Checkbutton(frameFontParam,variable=self.fontBold,
Steven M. Gavac112cd82002-01-22 05:56:40 +0000143 onvalue=1,offvalue=0,text='Bold',command=self.SetFontSample)
Steven M. Gavac11ccf32001-09-24 09:43:17 +0000144 frameFontSample=Frame(frameFont,relief=SOLID,borderwidth=1)
145 self.labelFontSample=Label(frameFontSample,
146 text='AaBbCcDdEe\nFfGgHhIiJjK\n1234567890\n#:+=(){}[]',
Steven M. Gava429a86a2001-10-23 10:42:12 +0000147 justify=LEFT,font=self.editFont)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000148 #frameIndent
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000149 frameIndentSize=Frame(frameIndent)
Kurt B. Kaiseracdef852005-01-31 03:34:26 +0000150 labelSpaceNumTitle=Label(frameIndentSize, justify=LEFT,
151 text='Python Standard: 4 Spaces!')
152 self.scaleSpaceNum=Scale(frameIndentSize, variable=self.spaceNum,
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000153 orient='horizontal',
Kurt B. Kaiseracdef852005-01-31 03:34:26 +0000154 tickinterval=2, from_=2, to=16)
Terry Jan Reedy19b7a752014-07-30 19:24:26 -0400155
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000156 #widget packing
157 #body
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000158 frameFont.pack(side=LEFT,padx=5,pady=5,expand=TRUE,fill=BOTH)
159 frameIndent.pack(side=LEFT,padx=5,pady=5,fill=Y)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000160 #frameFont
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000161 frameFontName.pack(side=TOP,padx=5,pady=5,fill=X)
162 frameFontParam.pack(side=TOP,padx=5,pady=5,fill=X)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000163 labelFontNameTitle.pack(side=TOP,anchor=W)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000164 self.listFontName.pack(side=LEFT,expand=TRUE,fill=X)
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000165 scrollFont.pack(side=LEFT,fill=Y)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000166 labelFontSizeTitle.pack(side=LEFT,anchor=W)
167 self.optMenuFontSize.pack(side=LEFT,anchor=W)
168 checkFontBold.pack(side=LEFT,anchor=W,padx=20)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000169 frameFontSample.pack(side=TOP,padx=5,pady=5,expand=TRUE,fill=BOTH)
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000170 self.labelFontSample.pack(expand=TRUE,fill=BOTH)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000171 #frameIndent
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000172 frameIndentSize.pack(side=TOP,fill=X)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000173 labelSpaceNumTitle.pack(side=TOP,anchor=W,padx=5)
174 self.scaleSpaceNum.pack(side=TOP,padx=5,fill=X)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000175 return frame
176
177 def CreatePageHighlight(self):
Terry Jan Reedy19b7a752014-07-30 19:24:26 -0400178 parent = self.parent
179 self.builtinTheme = StringVar(parent)
180 self.customTheme = StringVar(parent)
181 self.fgHilite = BooleanVar(parent)
182 self.colour = StringVar(parent)
183 self.fontName = StringVar(parent)
184 self.themeIsBuiltin = BooleanVar(parent)
185 self.highlightTarget = StringVar(parent)
186
Steven M. Gava952d0a52001-08-03 04:43:44 +0000187 ##widget creation
188 #body frame
Kurt B. Kaiser20172f92007-10-30 02:38:54 +0000189 frame=self.tabPages.pages['Highlighting'].frame
Steven M. Gava952d0a52001-08-03 04:43:44 +0000190 #body section frames
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000191 frameCustom=LabelFrame(frame,borderwidth=2,relief=GROOVE,
192 text=' Custom Highlighting ')
193 frameTheme=LabelFrame(frame,borderwidth=2,relief=GROOVE,
194 text=' Highlighting Theme ')
Steven M. Gava952d0a52001-08-03 04:43:44 +0000195 #frameCustom
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000196 self.textHighlightSample=Text(frameCustom,relief=SOLID,borderwidth=1,
Terry Jan Reedy42f7b7e2012-05-26 16:55:43 -0400197 font=('courier',12,''),cursor='hand2',width=21,height=11,
Steven M. Gavab77d3432002-03-02 07:16:21 +0000198 takefocus=FALSE,highlightthickness=0,wrap=NONE)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000199 text=self.textHighlightSample
200 text.bind('<Double-Button-1>',lambda e: 'break')
201 text.bind('<B1-Motion>',lambda e: 'break')
Steven M. Gava052937f2002-02-11 02:20:53 +0000202 textAndTags=(('#you can click here','comment'),('\n','normal'),
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000203 ('#to choose items','comment'),('\n','normal'),('def','keyword'),
204 (' ','normal'),('func','definition'),('(param):','normal'),
205 ('\n ','normal'),('"""string"""','string'),('\n var0 = ','normal'),
Steven M. Gavad0342cd2001-11-04 11:53:10 +0000206 ("'string'",'string'),('\n var1 = ','normal'),("'selected'",'hilite'),
Kurt B. Kaiser73360a32004-03-08 18:15:31 +0000207 ('\n var2 = ','normal'),("'found'",'hit'),
208 ('\n var3 = ','normal'),('list', 'builtin'), ('(','normal'),
209 ('None', 'builtin'),(')\n\n','normal'),
Steven M. Gava99300612001-11-04 07:03:08 +0000210 (' error ','error'),(' ','normal'),('cursor |','cursor'),
Steven M. Gavad0342cd2001-11-04 11:53:10 +0000211 ('\n ','normal'),('shell','console'),(' ','normal'),('stdout','stdout'),
212 (' ','normal'),('stderr','stderr'),('\n','normal'))
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000213 for txTa in textAndTags:
214 text.insert(END,txTa[0],txTa[1])
Terry Jan Reedy110796f2014-07-27 04:07:18 -0400215 for element in self.themeElements:
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000216 text.tag_bind(self.themeElements[element][0],'<ButtonPress-1>',
217 lambda event,elem=element: event.widget.winfo_toplevel()
218 .highlightTarget.set(elem))
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000219 text.config(state=DISABLED)
220 self.frameColourSet=Frame(frameCustom,relief=SOLID,borderwidth=1)
Steven M. Gava7c017862001-10-29 11:19:46 +0000221 frameFgBg=Frame(frameCustom)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000222 buttonSetColour=Button(self.frameColourSet,text='Choose Colour for :',
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000223 command=self.GetColour,highlightthickness=0)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000224 self.optMenuHighlightTarget=DynOptionMenu(self.frameColourSet,
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000225 self.highlightTarget,None,highlightthickness=0)#,command=self.SetHighlightTargetBinding
Steven M. Gava7c017862001-10-29 11:19:46 +0000226 self.radioFg=Radiobutton(frameFgBg,variable=self.fgHilite,
Steven M. Gava3b55a892001-11-21 05:56:26 +0000227 value=1,text='Foreground',command=self.SetColourSampleBinding)
Steven M. Gava7c017862001-10-29 11:19:46 +0000228 self.radioBg=Radiobutton(frameFgBg,variable=self.fgHilite,
Steven M. Gava3b55a892001-11-21 05:56:26 +0000229 value=0,text='Background',command=self.SetColourSampleBinding)
Steven M. Gava7c017862001-10-29 11:19:46 +0000230 self.fgHilite.set(1)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000231 buttonSaveCustomTheme=Button(frameCustom,
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000232 text='Save as New Custom Theme',command=self.SaveAsNewTheme)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000233 #frameTheme
Steven M. Gava952d0a52001-08-03 04:43:44 +0000234 labelTypeTitle=Label(frameTheme,text='Select : ')
Steven M. Gavad0342cd2001-11-04 11:53:10 +0000235 self.radioThemeBuiltin=Radiobutton(frameTheme,variable=self.themeIsBuiltin,
236 value=1,command=self.SetThemeType,text='a Built-in Theme')
237 self.radioThemeCustom=Radiobutton(frameTheme,variable=self.themeIsBuiltin,
238 value=0,command=self.SetThemeType,text='a Custom Theme')
Steven M. Gava41a85322001-10-29 08:05:34 +0000239 self.optMenuThemeBuiltin=DynOptionMenu(frameTheme,
Steven M. Gava7c017862001-10-29 11:19:46 +0000240 self.builtinTheme,None,command=None)
Steven M. Gava41a85322001-10-29 08:05:34 +0000241 self.optMenuThemeCustom=DynOptionMenu(frameTheme,
Steven M. Gava7c017862001-10-29 11:19:46 +0000242 self.customTheme,None,command=None)
Steven M. Gava49745752002-02-18 01:43:11 +0000243 self.buttonDeleteCustomTheme=Button(frameTheme,text='Delete Custom Theme',
244 command=self.DeleteCustomTheme)
Terry Jan Reedy19b7a752014-07-30 19:24:26 -0400245
Steven M. Gava952d0a52001-08-03 04:43:44 +0000246 ##widget packing
247 #body
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000248 frameCustom.pack(side=LEFT,padx=5,pady=5,expand=TRUE,fill=BOTH)
249 frameTheme.pack(side=LEFT,padx=5,pady=5,fill=Y)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000250 #frameCustom
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000251 self.frameColourSet.pack(side=TOP,padx=5,pady=5,expand=TRUE,fill=X)
Steven M. Gava7c017862001-10-29 11:19:46 +0000252 frameFgBg.pack(side=TOP,padx=5,pady=0)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000253 self.textHighlightSample.pack(side=TOP,padx=5,pady=5,expand=TRUE,
254 fill=BOTH)
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000255 buttonSetColour.pack(side=TOP,expand=TRUE,fill=X,padx=8,pady=4)
256 self.optMenuHighlightTarget.pack(side=TOP,expand=TRUE,fill=X,padx=8,pady=3)
Steven M. Gava7c017862001-10-29 11:19:46 +0000257 self.radioFg.pack(side=LEFT,anchor=E)
258 self.radioBg.pack(side=RIGHT,anchor=W)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000259 buttonSaveCustomTheme.pack(side=BOTTOM,fill=X,padx=5,pady=5)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000260 #frameTheme
Steven M. Gava952d0a52001-08-03 04:43:44 +0000261 labelTypeTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
Steven M. Gava41a85322001-10-29 08:05:34 +0000262 self.radioThemeBuiltin.pack(side=TOP,anchor=W,padx=5)
263 self.radioThemeCustom.pack(side=TOP,anchor=W,padx=5,pady=2)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000264 self.optMenuThemeBuiltin.pack(side=TOP,fill=X,padx=5,pady=5)
265 self.optMenuThemeCustom.pack(side=TOP,fill=X,anchor=W,padx=5,pady=5)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000266 self.buttonDeleteCustomTheme.pack(side=TOP,fill=X,padx=5,pady=5)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000267 return frame
268
269 def CreatePageKeys(self):
Terry Jan Reedy19b7a752014-07-30 19:24:26 -0400270 parent = self.parent
271 self.bindingTarget = StringVar(parent)
272 self.builtinKeys = StringVar(parent)
273 self.customKeys = StringVar(parent)
274 self.keysAreBuiltin = BooleanVar(parent)
275 self.keyBinding = StringVar(parent)
276
Steven M. Gava60fc7072001-08-04 13:58:22 +0000277 ##widget creation
278 #body frame
Kurt B. Kaiser20172f92007-10-30 02:38:54 +0000279 frame=self.tabPages.pages['Keys'].frame
Steven M. Gava60fc7072001-08-04 13:58:22 +0000280 #body section frames
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000281 frameCustom=LabelFrame(frame,borderwidth=2,relief=GROOVE,
282 text=' Custom Key Bindings ')
283 frameKeySets=LabelFrame(frame,borderwidth=2,relief=GROOVE,
284 text=' Key Set ')
Steven M. Gava60fc7072001-08-04 13:58:22 +0000285 #frameCustom
286 frameTarget=Frame(frameCustom)
Steven M. Gavafacfc092002-01-19 00:29:54 +0000287 labelTargetTitle=Label(frameTarget,text='Action - Key(s)')
288 scrollTargetY=Scrollbar(frameTarget)
289 scrollTargetX=Scrollbar(frameTarget,orient=HORIZONTAL)
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000290 self.listBindings=Listbox(frameTarget,takefocus=FALSE,
291 exportselection=FALSE)
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000292 self.listBindings.bind('<ButtonRelease-1>',self.KeyBindingSelected)
Steven M. Gavafacfc092002-01-19 00:29:54 +0000293 scrollTargetY.config(command=self.listBindings.yview)
294 scrollTargetX.config(command=self.listBindings.xview)
295 self.listBindings.config(yscrollcommand=scrollTargetY.set)
296 self.listBindings.config(xscrollcommand=scrollTargetX.set)
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000297 self.buttonNewKeys=Button(frameCustom,text='Get New Keys for Selection',
298 command=self.GetNewKeys,state=DISABLED)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000299 #frameKeySets
Kurt B. Kaiser28c7bcf2007-12-28 04:18:01 +0000300 frames = [Frame(frameKeySets, padx=2, pady=2, borderwidth=0)
301 for i in range(2)]
302 self.radioKeysBuiltin=Radiobutton(frames[0],variable=self.keysAreBuiltin,
303 value=1,command=self.SetKeysType,text='Use a Built-in Key Set')
304 self.radioKeysCustom=Radiobutton(frames[0],variable=self.keysAreBuiltin,
305 value=0,command=self.SetKeysType,text='Use a Custom Key Set')
306 self.optMenuKeysBuiltin=DynOptionMenu(frames[0],
Steven M. Gava41a85322001-10-29 08:05:34 +0000307 self.builtinKeys,None,command=None)
Kurt B. Kaiser28c7bcf2007-12-28 04:18:01 +0000308 self.optMenuKeysCustom=DynOptionMenu(frames[0],
Steven M. Gava41a85322001-10-29 08:05:34 +0000309 self.customKeys,None,command=None)
Kurt B. Kaiser28c7bcf2007-12-28 04:18:01 +0000310 self.buttonDeleteCustomKeys=Button(frames[1],text='Delete Custom Key Set',
Steven M. Gava49745752002-02-18 01:43:11 +0000311 command=self.DeleteCustomKeys)
Kurt B. Kaiser28c7bcf2007-12-28 04:18:01 +0000312 buttonSaveCustomKeys=Button(frames[1],
313 text='Save as New Custom Key Set',command=self.SaveAsNewKeySet)
Terry Jan Reedy19b7a752014-07-30 19:24:26 -0400314
Steven M. Gava60fc7072001-08-04 13:58:22 +0000315 ##widget packing
316 #body
Kurt B. Kaiser28c7bcf2007-12-28 04:18:01 +0000317 frameCustom.pack(side=BOTTOM,padx=5,pady=5,expand=TRUE,fill=BOTH)
318 frameKeySets.pack(side=BOTTOM,padx=5,pady=5,fill=BOTH)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000319 #frameCustom
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000320 self.buttonNewKeys.pack(side=BOTTOM,fill=X,padx=5,pady=5)
Steven M. Gavafacfc092002-01-19 00:29:54 +0000321 frameTarget.pack(side=LEFT,padx=5,pady=5,expand=TRUE,fill=BOTH)
322 #frame target
323 frameTarget.columnconfigure(0,weight=1)
324 frameTarget.rowconfigure(1,weight=1)
325 labelTargetTitle.grid(row=0,column=0,columnspan=2,sticky=W)
326 self.listBindings.grid(row=1,column=0,sticky=NSEW)
327 scrollTargetY.grid(row=1,column=1,sticky=NS)
328 scrollTargetX.grid(row=2,column=0,sticky=EW)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000329 #frameKeySets
Kurt B. Kaiser28c7bcf2007-12-28 04:18:01 +0000330 self.radioKeysBuiltin.grid(row=0, column=0, sticky=W+NS)
331 self.radioKeysCustom.grid(row=1, column=0, sticky=W+NS)
332 self.optMenuKeysBuiltin.grid(row=0, column=1, sticky=NSEW)
333 self.optMenuKeysCustom.grid(row=1, column=1, sticky=NSEW)
334 self.buttonDeleteCustomKeys.pack(side=LEFT,fill=X,expand=True,padx=2)
335 buttonSaveCustomKeys.pack(side=LEFT,fill=X,expand=True,padx=2)
336 frames[0].pack(side=TOP, fill=BOTH, expand=True)
337 frames[1].pack(side=TOP, fill=X, expand=True, pady=2)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000338 return frame
339
340 def CreatePageGeneral(self):
Terry Jan Reedy19b7a752014-07-30 19:24:26 -0400341 parent = self.parent
342 self.winWidth = StringVar(parent)
343 self.winHeight = StringVar(parent)
344 self.paraWidth = StringVar(parent)
345 self.startupEdit = IntVar(parent)
346 self.autoSave = IntVar(parent)
347 self.encoding = StringVar(parent)
348 self.userHelpBrowser = BooleanVar(parent)
349 self.helpBrowser = StringVar(parent)
350
Steven M. Gava230e5782001-08-07 03:28:25 +0000351 #widget creation
352 #body
Kurt B. Kaiser20172f92007-10-30 02:38:54 +0000353 frame=self.tabPages.pages['General'].frame
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000354 #body section frames
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000355 frameRun=LabelFrame(frame,borderwidth=2,relief=GROOVE,
356 text=' Startup Preferences ')
357 frameSave=LabelFrame(frame,borderwidth=2,relief=GROOVE,
358 text=' Autosave Preferences ')
Steven M. Gava230e5782001-08-07 03:28:25 +0000359 frameWinSize=Frame(frame,borderwidth=2,relief=GROOVE)
Raymond Hettinger4e49b832004-06-04 06:31:08 +0000360 frameParaSize=Frame(frame,borderwidth=2,relief=GROOVE)
Kurt B. Kaisera053f332003-05-10 00:49:56 +0000361 frameEncoding=Frame(frame,borderwidth=2,relief=GROOVE)
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000362 frameHelp=LabelFrame(frame,borderwidth=2,relief=GROOVE,
363 text=' Additional Help Sources ')
Steven M. Gava230e5782001-08-07 03:28:25 +0000364 #frameRun
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000365 labelRunChoiceTitle=Label(frameRun,text='At Startup')
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000366 radioStartupEdit=Radiobutton(frameRun,variable=self.startupEdit,
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +0000367 value=1,command=self.SetKeysType,text="Open Edit Window")
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000368 radioStartupShell=Radiobutton(frameRun,variable=self.startupEdit,
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +0000369 value=0,command=self.SetKeysType,text='Open Shell Window')
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000370 #frameSave
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000371 labelRunSaveTitle=Label(frameSave,text='At Start of Run (F5) ')
372 radioSaveAsk=Radiobutton(frameSave,variable=self.autoSave,
373 value=0,command=self.SetKeysType,text="Prompt to Save")
374 radioSaveAuto=Radiobutton(frameSave,variable=self.autoSave,
375 value=1,command=self.SetKeysType,text='No Prompt')
Steven M. Gava230e5782001-08-07 03:28:25 +0000376 #frameWinSize
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000377 labelWinSizeTitle=Label(frameWinSize,text='Initial Window Size'+
378 ' (in characters)')
Steven M. Gava230e5782001-08-07 03:28:25 +0000379 labelWinWidthTitle=Label(frameWinSize,text='Width')
380 entryWinWidth=Entry(frameWinSize,textvariable=self.winWidth,
381 width=3)
382 labelWinHeightTitle=Label(frameWinSize,text='Height')
383 entryWinHeight=Entry(frameWinSize,textvariable=self.winHeight,
384 width=3)
Raymond Hettinger4e49b832004-06-04 06:31:08 +0000385 #paragraphFormatWidth
386 labelParaWidthTitle=Label(frameParaSize,text='Paragraph reformat'+
387 ' width (in characters)')
388 entryParaWidth=Entry(frameParaSize,textvariable=self.paraWidth,
389 width=3)
Kurt B. Kaisera053f332003-05-10 00:49:56 +0000390 #frameEncoding
391 labelEncodingTitle=Label(frameEncoding,text="Default Source Encoding")
392 radioEncLocale=Radiobutton(frameEncoding,variable=self.encoding,
393 value="locale",text="Locale-defined")
394 radioEncUTF8=Radiobutton(frameEncoding,variable=self.encoding,
395 value="utf-8",text="UTF-8")
396 radioEncNone=Radiobutton(frameEncoding,variable=self.encoding,
397 value="none",text="None")
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000398 #frameHelp
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000399 frameHelpList=Frame(frameHelp)
400 frameHelpListButtons=Frame(frameHelpList)
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000401 scrollHelpList=Scrollbar(frameHelpList)
402 self.listHelp=Listbox(frameHelpList,height=5,takefocus=FALSE,
403 exportselection=FALSE)
404 scrollHelpList.config(command=self.listHelp.yview)
405 self.listHelp.config(yscrollcommand=scrollHelpList.set)
406 self.listHelp.bind('<ButtonRelease-1>',self.HelpSourceSelected)
407 self.buttonHelpListEdit=Button(frameHelpListButtons,text='Edit',
408 state=DISABLED,width=8,command=self.HelpListItemEdit)
409 self.buttonHelpListAdd=Button(frameHelpListButtons,text='Add',
410 width=8,command=self.HelpListItemAdd)
411 self.buttonHelpListRemove=Button(frameHelpListButtons,text='Remove',
412 state=DISABLED,width=8,command=self.HelpListItemRemove)
Terry Jan Reedy19b7a752014-07-30 19:24:26 -0400413
Steven M. Gava230e5782001-08-07 03:28:25 +0000414 #widget packing
415 #body
416 frameRun.pack(side=TOP,padx=5,pady=5,fill=X)
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000417 frameSave.pack(side=TOP,padx=5,pady=5,fill=X)
Steven M. Gava230e5782001-08-07 03:28:25 +0000418 frameWinSize.pack(side=TOP,padx=5,pady=5,fill=X)
Raymond Hettinger4e49b832004-06-04 06:31:08 +0000419 frameParaSize.pack(side=TOP,padx=5,pady=5,fill=X)
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000420 frameEncoding.pack(side=TOP,padx=5,pady=5,fill=X)
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000421 frameHelp.pack(side=TOP,padx=5,pady=5,expand=TRUE,fill=BOTH)
Steven M. Gava230e5782001-08-07 03:28:25 +0000422 #frameRun
Steven M. Gava230e5782001-08-07 03:28:25 +0000423 labelRunChoiceTitle.pack(side=LEFT,anchor=W,padx=5,pady=5)
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000424 radioStartupShell.pack(side=RIGHT,anchor=W,padx=5,pady=5)
425 radioStartupEdit.pack(side=RIGHT,anchor=W,padx=5,pady=5)
426 #frameSave
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000427 labelRunSaveTitle.pack(side=LEFT,anchor=W,padx=5,pady=5)
428 radioSaveAuto.pack(side=RIGHT,anchor=W,padx=5,pady=5)
429 radioSaveAsk.pack(side=RIGHT,anchor=W,padx=5,pady=5)
Steven M. Gava230e5782001-08-07 03:28:25 +0000430 #frameWinSize
Steven M. Gavafacfc092002-01-19 00:29:54 +0000431 labelWinSizeTitle.pack(side=LEFT,anchor=W,padx=5,pady=5)
432 entryWinHeight.pack(side=RIGHT,anchor=E,padx=10,pady=5)
433 labelWinHeightTitle.pack(side=RIGHT,anchor=E,pady=5)
434 entryWinWidth.pack(side=RIGHT,anchor=E,padx=10,pady=5)
435 labelWinWidthTitle.pack(side=RIGHT,anchor=E,pady=5)
Raymond Hettinger4e49b832004-06-04 06:31:08 +0000436 #paragraphFormatWidth
437 labelParaWidthTitle.pack(side=LEFT,anchor=W,padx=5,pady=5)
438 entryParaWidth.pack(side=RIGHT,anchor=E,padx=10,pady=5)
Kurt B. Kaisera053f332003-05-10 00:49:56 +0000439 #frameEncoding
440 labelEncodingTitle.pack(side=LEFT,anchor=W,padx=5,pady=5)
441 radioEncNone.pack(side=RIGHT,anchor=E,pady=5)
442 radioEncUTF8.pack(side=RIGHT,anchor=E,pady=5)
443 radioEncLocale.pack(side=RIGHT,anchor=E,pady=5)
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000444 #frameHelp
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000445 frameHelpListButtons.pack(side=RIGHT,padx=5,pady=5,fill=Y)
446 frameHelpList.pack(side=TOP,padx=5,pady=5,expand=TRUE,fill=BOTH)
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000447 scrollHelpList.pack(side=RIGHT,anchor=W,fill=Y)
448 self.listHelp.pack(side=LEFT,anchor=E,expand=TRUE,fill=BOTH)
449 self.buttonHelpListEdit.pack(side=TOP,anchor=W,pady=5)
450 self.buttonHelpListAdd.pack(side=TOP,anchor=W)
451 self.buttonHelpListRemove.pack(side=TOP,anchor=W,pady=5)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000452 return frame
453
Steven M. Gavac112cd82002-01-22 05:56:40 +0000454 def AttachVarCallbacks(self):
455 self.fontSize.trace_variable('w',self.VarChanged_fontSize)
456 self.fontName.trace_variable('w',self.VarChanged_fontName)
457 self.fontBold.trace_variable('w',self.VarChanged_fontBold)
458 self.spaceNum.trace_variable('w',self.VarChanged_spaceNum)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000459 self.colour.trace_variable('w',self.VarChanged_colour)
Steven M. Gava052937f2002-02-11 02:20:53 +0000460 self.builtinTheme.trace_variable('w',self.VarChanged_builtinTheme)
461 self.customTheme.trace_variable('w',self.VarChanged_customTheme)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000462 self.themeIsBuiltin.trace_variable('w',self.VarChanged_themeIsBuiltin)
Steven M. Gava052937f2002-02-11 02:20:53 +0000463 self.highlightTarget.trace_variable('w',self.VarChanged_highlightTarget)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000464 self.keyBinding.trace_variable('w',self.VarChanged_keyBinding)
Steven M. Gava052937f2002-02-11 02:20:53 +0000465 self.builtinKeys.trace_variable('w',self.VarChanged_builtinKeys)
466 self.customKeys.trace_variable('w',self.VarChanged_customKeys)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000467 self.keysAreBuiltin.trace_variable('w',self.VarChanged_keysAreBuiltin)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000468 self.winWidth.trace_variable('w',self.VarChanged_winWidth)
469 self.winHeight.trace_variable('w',self.VarChanged_winHeight)
Raymond Hettinger4e49b832004-06-04 06:31:08 +0000470 self.paraWidth.trace_variable('w',self.VarChanged_paraWidth)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000471 self.startupEdit.trace_variable('w',self.VarChanged_startupEdit)
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000472 self.autoSave.trace_variable('w',self.VarChanged_autoSave)
Kurt B. Kaisera053f332003-05-10 00:49:56 +0000473 self.encoding.trace_variable('w',self.VarChanged_encoding)
Steven M. Gava052937f2002-02-11 02:20:53 +0000474
Steven M. Gavac112cd82002-01-22 05:56:40 +0000475 def VarChanged_fontSize(self,*params):
476 value=self.fontSize.get()
477 self.AddChangedItem('main','EditorWindow','font-size',value)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000478
Steven M. Gavac112cd82002-01-22 05:56:40 +0000479 def VarChanged_fontName(self,*params):
480 value=self.fontName.get()
481 self.AddChangedItem('main','EditorWindow','font',value)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000482
483 def VarChanged_fontBold(self,*params):
484 value=self.fontBold.get()
485 self.AddChangedItem('main','EditorWindow','font-bold',value)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000486
Steven M. Gavac112cd82002-01-22 05:56:40 +0000487 def VarChanged_spaceNum(self,*params):
488 value=self.spaceNum.get()
489 self.AddChangedItem('main','Indent','num-spaces',value)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000490
Steven M. Gavac112cd82002-01-22 05:56:40 +0000491 def VarChanged_colour(self,*params):
Steven M. Gava052937f2002-02-11 02:20:53 +0000492 self.OnNewColourSet()
493
494 def VarChanged_builtinTheme(self,*params):
495 value=self.builtinTheme.get()
496 self.AddChangedItem('main','Theme','name',value)
497 self.PaintThemeSample()
498
499 def VarChanged_customTheme(self,*params):
500 value=self.customTheme.get()
Steven M. Gava49745752002-02-18 01:43:11 +0000501 if value != '- no custom themes -':
502 self.AddChangedItem('main','Theme','name',value)
503 self.PaintThemeSample()
Steven M. Gava052937f2002-02-11 02:20:53 +0000504
505 def VarChanged_themeIsBuiltin(self,*params):
506 value=self.themeIsBuiltin.get()
507 self.AddChangedItem('main','Theme','default',value)
Steven M. Gavaf31eec02002-03-05 00:25:58 +0000508 if value:
509 self.VarChanged_builtinTheme()
510 else:
511 self.VarChanged_customTheme()
Steven M. Gava052937f2002-02-11 02:20:53 +0000512
513 def VarChanged_highlightTarget(self,*params):
514 self.SetHighlightTarget()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000515
Steven M. Gavac112cd82002-01-22 05:56:40 +0000516 def VarChanged_keyBinding(self,*params):
Steven M. Gavabbf5ef52002-01-22 11:35:50 +0000517 value=self.keyBinding.get()
518 keySet=self.customKeys.get()
519 event=self.listBindings.get(ANCHOR).split()[0]
Steven M. Gavaa498af22002-02-01 01:33:36 +0000520 if idleConf.IsCoreBinding(event):
521 #this is a core keybinding
522 self.AddChangedItem('keys',keySet,event,value)
523 else: #this is an extension key binding
524 extName=idleConf.GetExtnNameForEvent(event)
525 extKeybindSection=extName+'_cfgBindings'
526 self.AddChangedItem('extensions',extKeybindSection,event,value)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000527
Steven M. Gava052937f2002-02-11 02:20:53 +0000528 def VarChanged_builtinKeys(self,*params):
529 value=self.builtinKeys.get()
530 self.AddChangedItem('main','Keys','name',value)
531 self.LoadKeysList(value)
532
533 def VarChanged_customKeys(self,*params):
534 value=self.customKeys.get()
Steven M. Gava49745752002-02-18 01:43:11 +0000535 if value != '- no custom keys -':
536 self.AddChangedItem('main','Keys','name',value)
537 self.LoadKeysList(value)
Steven M. Gava052937f2002-02-11 02:20:53 +0000538
539 def VarChanged_keysAreBuiltin(self,*params):
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000540 value=self.keysAreBuiltin.get()
Steven M. Gava052937f2002-02-11 02:20:53 +0000541 self.AddChangedItem('main','Keys','default',value)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000542 if value:
Steven M. Gavaf31eec02002-03-05 00:25:58 +0000543 self.VarChanged_builtinKeys()
Steven M. Gava052937f2002-02-11 02:20:53 +0000544 else:
Steven M. Gavaf31eec02002-03-05 00:25:58 +0000545 self.VarChanged_customKeys()
Steven M. Gava052937f2002-02-11 02:20:53 +0000546
Steven M. Gavac112cd82002-01-22 05:56:40 +0000547 def VarChanged_winWidth(self,*params):
Steven M. Gavabbf5ef52002-01-22 11:35:50 +0000548 value=self.winWidth.get()
549 self.AddChangedItem('main','EditorWindow','width',value)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000550
551 def VarChanged_winHeight(self,*params):
Steven M. Gavabbf5ef52002-01-22 11:35:50 +0000552 value=self.winHeight.get()
553 self.AddChangedItem('main','EditorWindow','height',value)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000554
Raymond Hettinger4e49b832004-06-04 06:31:08 +0000555 def VarChanged_paraWidth(self,*params):
556 value=self.paraWidth.get()
557 self.AddChangedItem('main','FormatParagraph','paragraph',value)
558
Steven M. Gavac112cd82002-01-22 05:56:40 +0000559 def VarChanged_startupEdit(self,*params):
Steven M. Gavabbf5ef52002-01-22 11:35:50 +0000560 value=self.startupEdit.get()
561 self.AddChangedItem('main','General','editor-on-startup',value)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000562
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000563 def VarChanged_autoSave(self,*params):
564 value=self.autoSave.get()
565 self.AddChangedItem('main','General','autosave',value)
566
Kurt B. Kaisera053f332003-05-10 00:49:56 +0000567 def VarChanged_encoding(self,*params):
568 value=self.encoding.get()
569 self.AddChangedItem('main','EditorWindow','encoding',value)
570
Steven M. Gavaa498af22002-02-01 01:33:36 +0000571 def ResetChangedItems(self):
Steven M. Gavab77d3432002-03-02 07:16:21 +0000572 #When any config item is changed in this dialog, an entry
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000573 #should be made in the relevant section (config type) of this
574 #dictionary. The key should be the config file section name and the
Steven M. Gavaa498af22002-02-01 01:33:36 +0000575 #value a dictionary, whose key:value pairs are item=value pairs for
576 #that config file section.
577 self.changedItems={'main':{},'highlight':{},'keys':{},'extensions':{}}
578
Steven M. Gavac112cd82002-01-22 05:56:40 +0000579 def AddChangedItem(self,type,section,item,value):
Steven M. Gava2d7bb3f2002-01-29 08:35:29 +0000580 value=str(value) #make sure we use a string
Benjamin Peterson6e3dbbd2009-10-09 22:15:50 +0000581 if section not in self.changedItems[type]:
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000582 self.changedItems[type][section]={}
Steven M. Gavac112cd82002-01-22 05:56:40 +0000583 self.changedItems[type][section][item]=value
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000584
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000585 def GetDefaultItems(self):
586 dItems={'main':{},'highlight':{},'keys':{},'extensions':{}}
Terry Jan Reedy110796f2014-07-27 04:07:18 -0400587 for configType in dItems:
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000588 sections=idleConf.GetSectionList('default',configType)
589 for section in sections:
590 dItems[configType][section]={}
591 options=idleConf.defaultCfg[configType].GetOptionList(section)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000592 for option in options:
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000593 dItems[configType][section][option]=(
594 idleConf.defaultCfg[configType].Get(section,option))
595 return dItems
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000596
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000597 def SetThemeType(self):
598 if self.themeIsBuiltin.get():
599 self.optMenuThemeBuiltin.config(state=NORMAL)
600 self.optMenuThemeCustom.config(state=DISABLED)
601 self.buttonDeleteCustomTheme.config(state=DISABLED)
602 else:
603 self.optMenuThemeBuiltin.config(state=DISABLED)
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000604 self.radioThemeCustom.config(state=NORMAL)
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000605 self.optMenuThemeCustom.config(state=NORMAL)
606 self.buttonDeleteCustomTheme.config(state=NORMAL)
607
608 def SetKeysType(self):
Steven M. Gava052937f2002-02-11 02:20:53 +0000609 if self.keysAreBuiltin.get():
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000610 self.optMenuKeysBuiltin.config(state=NORMAL)
611 self.optMenuKeysCustom.config(state=DISABLED)
612 self.buttonDeleteCustomKeys.config(state=DISABLED)
613 else:
614 self.optMenuKeysBuiltin.config(state=DISABLED)
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000615 self.radioKeysCustom.config(state=NORMAL)
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000616 self.optMenuKeysCustom.config(state=NORMAL)
617 self.buttonDeleteCustomKeys.config(state=NORMAL)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000618
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000619 def GetNewKeys(self):
620 listIndex=self.listBindings.index(ANCHOR)
621 binding=self.listBindings.get(listIndex)
622 bindName=binding.split()[0] #first part, up to first space
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000623 if self.keysAreBuiltin.get():
Steven M. Gavae28ee752002-02-11 03:45:22 +0000624 currentKeySetName=self.builtinKeys.get()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000625 else:
Steven M. Gavae28ee752002-02-11 03:45:22 +0000626 currentKeySetName=self.customKeys.get()
627 currentBindings=idleConf.GetCurrentKeySet()
Terry Jan Reedy110796f2014-07-27 04:07:18 -0400628 if currentKeySetName in self.changedItems['keys']: #unsaved changes
Steven M. Gavae28ee752002-02-11 03:45:22 +0000629 keySetChanges=self.changedItems['keys'][currentKeySetName]
Terry Jan Reedy110796f2014-07-27 04:07:18 -0400630 for event in keySetChanges:
Steven M. Gavae28ee752002-02-11 03:45:22 +0000631 currentBindings[event]=keySetChanges[event].split()
632 currentKeySequences=currentBindings.values()
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000633 newKeys=GetKeysDialog(self,'Get New Keys',bindName,
634 currentKeySequences).result
635 if newKeys: #new keys were specified
Steven M. Gava052937f2002-02-11 02:20:53 +0000636 if self.keysAreBuiltin.get(): #current key set is a built-in
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000637 message=('Your changes will be saved as a new Custom Key Set. '+
638 'Enter a name for your new Custom Key Set below.')
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000639 newKeySet=self.GetNewKeysName(message)
640 if not newKeySet: #user cancelled custom key set creation
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000641 self.listBindings.select_set(listIndex)
642 self.listBindings.select_anchor(listIndex)
643 return
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000644 else: #create new custom key set based on previously active key set
645 self.CreateNewKeySet(newKeySet)
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000646 self.listBindings.delete(listIndex)
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000647 self.listBindings.insert(listIndex,bindName+' - '+newKeys)
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000648 self.listBindings.select_set(listIndex)
649 self.listBindings.select_anchor(listIndex)
Steven M. Gava052937f2002-02-11 02:20:53 +0000650 self.keyBinding.set(newKeys)
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000651 else:
652 self.listBindings.select_set(listIndex)
653 self.listBindings.select_anchor(listIndex)
654
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000655 def GetNewKeysName(self,message):
Steven M. Gava49745752002-02-18 01:43:11 +0000656 usedNames=(idleConf.GetSectionList('user','keys')+
657 idleConf.GetSectionList('default','keys'))
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000658 newKeySet=GetCfgSectionNameDialog(self,'New Custom Key Set',
659 message,usedNames).result
660 return newKeySet
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000661
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000662 def SaveAsNewKeySet(self):
663 newKeysName=self.GetNewKeysName('New Key Set Name:')
664 if newKeysName:
665 self.CreateNewKeySet(newKeysName)
666
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000667 def KeyBindingSelected(self,event):
668 self.buttonNewKeys.config(state=NORMAL)
669
670 def CreateNewKeySet(self,newKeySetName):
671 #creates new custom key set based on the previously active key set,
672 #and makes the new key set active
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000673 if self.keysAreBuiltin.get():
Steven M. Gava052937f2002-02-11 02:20:53 +0000674 prevKeySetName=self.builtinKeys.get()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000675 else:
Steven M. Gava052937f2002-02-11 02:20:53 +0000676 prevKeySetName=self.customKeys.get()
Steven M. Gava052937f2002-02-11 02:20:53 +0000677 prevKeys=idleConf.GetCoreKeys(prevKeySetName)
Steven M. Gava052937f2002-02-11 02:20:53 +0000678 newKeys={}
Terry Jan Reedy110796f2014-07-27 04:07:18 -0400679 for event in prevKeys: #add key set to changed items
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000680 eventName=event[2:-2] #trim off the angle brackets
Terry Jan Reedy110796f2014-07-27 04:07:18 -0400681 binding=' '.join(prevKeys[event])
Steven M. Gava052937f2002-02-11 02:20:53 +0000682 newKeys[eventName]=binding
Steven M. Gava052937f2002-02-11 02:20:53 +0000683 #handle any unsaved changes to prev key set
Terry Jan Reedy110796f2014-07-27 04:07:18 -0400684 if prevKeySetName in self.changedItems['keys']:
Steven M. Gava052937f2002-02-11 02:20:53 +0000685 keySetChanges=self.changedItems['keys'][prevKeySetName]
Terry Jan Reedy110796f2014-07-27 04:07:18 -0400686 for event in keySetChanges:
Steven M. Gava052937f2002-02-11 02:20:53 +0000687 newKeys[event]=keySetChanges[event]
Steven M. Gava052937f2002-02-11 02:20:53 +0000688 #save the new theme
689 self.SaveNewKeySet(newKeySetName,newKeys)
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000690 #change gui over to the new key set
691 customKeyList=idleConf.GetSectionList('user','keys')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000692 customKeyList.sort()
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000693 self.optMenuKeysCustom.SetMenu(customKeyList,newKeySetName)
Steven M. Gava052937f2002-02-11 02:20:53 +0000694 self.keysAreBuiltin.set(0)
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000695 self.SetKeysType()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000696
Steven M. Gava052937f2002-02-11 02:20:53 +0000697 def LoadKeysList(self,keySetName):
698 reselect=0
699 newKeySet=0
700 if self.listBindings.curselection():
701 reselect=1
702 listIndex=self.listBindings.index(ANCHOR)
Steven M. Gava052937f2002-02-11 02:20:53 +0000703 keySet=idleConf.GetKeySet(keySetName)
Steven M. Gava052937f2002-02-11 02:20:53 +0000704 bindNames=keySet.keys()
705 bindNames.sort()
706 self.listBindings.delete(0,END)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000707 for bindName in bindNames:
Terry Jan Reedy110796f2014-07-27 04:07:18 -0400708 key=' '.join(keySet[bindName]) #make key(s) into a string
Steven M. Gava052937f2002-02-11 02:20:53 +0000709 bindName=bindName[2:-2] #trim off the angle brackets
Terry Jan Reedy110796f2014-07-27 04:07:18 -0400710 if keySetName in self.changedItems['keys']:
Steven M. Gava052937f2002-02-11 02:20:53 +0000711 #handle any unsaved changes to this key set
Terry Jan Reedy110796f2014-07-27 04:07:18 -0400712 if bindName in self.changedItems['keys'][keySetName]:
Steven M. Gava052937f2002-02-11 02:20:53 +0000713 key=self.changedItems['keys'][keySetName][bindName]
Steven M. Gava052937f2002-02-11 02:20:53 +0000714 self.listBindings.insert(END, bindName+' - '+key)
Steven M. Gava052937f2002-02-11 02:20:53 +0000715 if reselect:
716 self.listBindings.see(listIndex)
717 self.listBindings.select_set(listIndex)
718 self.listBindings.select_anchor(listIndex)
719
Steven M. Gava49745752002-02-18 01:43:11 +0000720 def DeleteCustomKeys(self):
721 keySetName=self.customKeys.get()
722 if not tkMessageBox.askyesno('Delete Key Set','Are you sure you wish '+
Walter Dörwald70a6b492004-02-12 17:35:32 +0000723 'to delete the key set %r ?' % (keySetName),
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +0000724 parent=self):
Steven M. Gava49745752002-02-18 01:43:11 +0000725 return
726 #remove key set from config
727 idleConf.userCfg['keys'].remove_section(keySetName)
Benjamin Peterson6e3dbbd2009-10-09 22:15:50 +0000728 if keySetName in self.changedItems['keys']:
Steven M. Gava49745752002-02-18 01:43:11 +0000729 del(self.changedItems['keys'][keySetName])
730 #write changes
731 idleConf.userCfg['keys'].Save()
732 #reload user key set list
733 itemList=idleConf.GetSectionList('user','keys')
734 itemList.sort()
735 if not itemList:
736 self.radioKeysCustom.config(state=DISABLED)
737 self.optMenuKeysCustom.SetMenu(itemList,'- no custom keys -')
738 else:
739 self.optMenuKeysCustom.SetMenu(itemList,itemList[0])
740 #revert to default key set
741 self.keysAreBuiltin.set(idleConf.defaultCfg['main'].Get('Keys','default'))
742 self.builtinKeys.set(idleConf.defaultCfg['main'].Get('Keys','name'))
743 #user can't back out of these changes, they must be applied now
744 self.Apply()
745 self.SetKeysType()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000746
Steven M. Gava49745752002-02-18 01:43:11 +0000747 def DeleteCustomTheme(self):
748 themeName=self.customTheme.get()
749 if not tkMessageBox.askyesno('Delete Theme','Are you sure you wish '+
Walter Dörwald70a6b492004-02-12 17:35:32 +0000750 'to delete the theme %r ?' % (themeName,),
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +0000751 parent=self):
Steven M. Gava49745752002-02-18 01:43:11 +0000752 return
753 #remove theme from config
754 idleConf.userCfg['highlight'].remove_section(themeName)
Benjamin Peterson6e3dbbd2009-10-09 22:15:50 +0000755 if themeName in self.changedItems['highlight']:
Steven M. Gava49745752002-02-18 01:43:11 +0000756 del(self.changedItems['highlight'][themeName])
757 #write changes
758 idleConf.userCfg['highlight'].Save()
759 #reload user theme list
760 itemList=idleConf.GetSectionList('user','highlight')
761 itemList.sort()
762 if not itemList:
763 self.radioThemeCustom.config(state=DISABLED)
764 self.optMenuThemeCustom.SetMenu(itemList,'- no custom themes -')
765 else:
766 self.optMenuThemeCustom.SetMenu(itemList,itemList[0])
767 #revert to default theme
768 self.themeIsBuiltin.set(idleConf.defaultCfg['main'].Get('Theme','default'))
769 self.builtinTheme.set(idleConf.defaultCfg['main'].Get('Theme','name'))
770 #user can't back out of these changes, they must be applied now
771 self.Apply()
772 self.SetThemeType()
773
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000774 def GetColour(self):
775 target=self.highlightTarget.get()
Steven M. Gava052937f2002-02-11 02:20:53 +0000776 prevColour=self.frameColourSet.cget('bg')
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000777 rgbTuplet, colourString = tkColorChooser.askcolor(parent=self,
Steven M. Gava052937f2002-02-11 02:20:53 +0000778 title='Pick new colour for : '+target,initialcolor=prevColour)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000779 if colourString and (colourString!=prevColour):
Steven M. Gava052937f2002-02-11 02:20:53 +0000780 #user didn't cancel, and they chose a new colour
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000781 if self.themeIsBuiltin.get(): #current theme is a built-in
782 message=('Your changes will be saved as a new Custom Theme. '+
783 'Enter a name for your new Custom Theme below.')
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000784 newTheme=self.GetNewThemeName(message)
785 if not newTheme: #user cancelled custom theme creation
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000786 return
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000787 else: #create new custom theme based on previously active theme
788 self.CreateNewTheme(newTheme)
Steven M. Gava052937f2002-02-11 02:20:53 +0000789 self.colour.set(colourString)
790 else: #current theme is user defined
791 self.colour.set(colourString)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000792
Steven M. Gava052937f2002-02-11 02:20:53 +0000793 def OnNewColourSet(self):
794 newColour=self.colour.get()
795 self.frameColourSet.config(bg=newColour)#set sample
796 if self.fgHilite.get(): plane='foreground'
797 else: plane='background'
798 sampleElement=self.themeElements[self.highlightTarget.get()][0]
Raymond Hettinger931237e2003-07-09 18:48:24 +0000799 self.textHighlightSample.tag_config(sampleElement, **{plane:newColour})
Steven M. Gava052937f2002-02-11 02:20:53 +0000800 theme=self.customTheme.get()
801 themeElement=sampleElement+'-'+plane
802 self.AddChangedItem('highlight',theme,themeElement,newColour)
Steven M. Gava052937f2002-02-11 02:20:53 +0000803
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000804 def GetNewThemeName(self,message):
Steven M. Gava49745752002-02-18 01:43:11 +0000805 usedNames=(idleConf.GetSectionList('user','highlight')+
806 idleConf.GetSectionList('default','highlight'))
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000807 newTheme=GetCfgSectionNameDialog(self,'New Custom Theme',
808 message,usedNames).result
809 return newTheme
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000810
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000811 def SaveAsNewTheme(self):
812 newThemeName=self.GetNewThemeName('New Theme Name:')
813 if newThemeName:
814 self.CreateNewTheme(newThemeName)
815
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000816 def CreateNewTheme(self,newThemeName):
817 #creates new custom theme based on the previously active theme,
818 #and makes the new theme active
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000819 if self.themeIsBuiltin.get():
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000820 themeType='default'
821 themeName=self.builtinTheme.get()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000822 else:
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000823 themeType='user'
824 themeName=self.customTheme.get()
825 newTheme=idleConf.GetThemeDict(themeType,themeName)
Steven M. Gava052937f2002-02-11 02:20:53 +0000826 #apply any of the old theme's unsaved changes to the new theme
Terry Jan Reedy110796f2014-07-27 04:07:18 -0400827 if themeName in self.changedItems['highlight']:
Steven M. Gava052937f2002-02-11 02:20:53 +0000828 themeChanges=self.changedItems['highlight'][themeName]
Terry Jan Reedy110796f2014-07-27 04:07:18 -0400829 for element in themeChanges:
Steven M. Gava052937f2002-02-11 02:20:53 +0000830 newTheme[element]=themeChanges[element]
831 #save the new theme
832 self.SaveNewTheme(newThemeName,newTheme)
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000833 #change gui over to the new theme
834 customThemeList=idleConf.GetSectionList('user','highlight')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000835 customThemeList.sort()
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000836 self.optMenuThemeCustom.SetMenu(customThemeList,newThemeName)
837 self.themeIsBuiltin.set(0)
838 self.SetThemeType()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000839
Steven M. Gavac112cd82002-01-22 05:56:40 +0000840 def OnListFontButtonRelease(self,event):
Kurt B. Kaiser05391692003-05-26 20:35:53 +0000841 font = self.listFontName.get(ANCHOR)
842 self.fontName.set(font.lower())
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000843 self.SetFontSample()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000844
Steven M. Gavac112cd82002-01-22 05:56:40 +0000845 def SetFontSample(self,event=None):
846 fontName=self.fontName.get()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000847 if self.fontBold.get():
Steven M. Gavac112cd82002-01-22 05:56:40 +0000848 fontWeight=tkFont.BOLD
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000849 else:
Steven M. Gavac112cd82002-01-22 05:56:40 +0000850 fontWeight=tkFont.NORMAL
Ned Deilye3d47122012-10-22 15:13:01 -0700851 newFont = (fontName, self.fontSize.get(), fontWeight)
852 self.labelFontSample.config(font=newFont)
853 self.textHighlightSample.configure(font=newFont)
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000854
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000855 def SetHighlightTarget(self):
856 if self.highlightTarget.get()=='Cursor': #bg not possible
857 self.radioFg.config(state=DISABLED)
858 self.radioBg.config(state=DISABLED)
859 self.fgHilite.set(1)
860 else: #both fg and bg can be set
861 self.radioFg.config(state=NORMAL)
862 self.radioBg.config(state=NORMAL)
863 self.fgHilite.set(1)
864 self.SetColourSample()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000865
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000866 def SetColourSampleBinding(self,*args):
867 self.SetColourSample()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000868
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000869 def SetColourSample(self):
870 #set the colour smaple area
871 tag=self.themeElements[self.highlightTarget.get()][0]
872 if self.fgHilite.get(): plane='foreground'
873 else: plane='background'
874 colour=self.textHighlightSample.tag_cget(tag,plane)
875 self.frameColourSet.config(bg=colour)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000876
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000877 def PaintThemeSample(self):
Steven M. Gavad0342cd2001-11-04 11:53:10 +0000878 if self.themeIsBuiltin.get(): #a default theme
Steven M. Gava99300612001-11-04 07:03:08 +0000879 theme=self.builtinTheme.get()
880 else: #a user theme
881 theme=self.customTheme.get()
Terry Jan Reedy110796f2014-07-27 04:07:18 -0400882 for elementTitle in self.themeElements:
Steven M. Gava052937f2002-02-11 02:20:53 +0000883 element=self.themeElements[elementTitle][0]
884 colours=idleConf.GetHighlight(theme,element)
885 if element=='cursor': #cursor sample needs special painting
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000886 colours['background']=idleConf.GetHighlight(theme,
Steven M. Gava0cae01c2002-01-04 07:53:06 +0000887 'normal', fgBg='bg')
Steven M. Gava052937f2002-02-11 02:20:53 +0000888 #handle any unsaved changes to this theme
Terry Jan Reedy110796f2014-07-27 04:07:18 -0400889 if theme in self.changedItems['highlight']:
Steven M. Gava052937f2002-02-11 02:20:53 +0000890 themeDict=self.changedItems['highlight'][theme]
Benjamin Peterson6e3dbbd2009-10-09 22:15:50 +0000891 if element+'-foreground' in themeDict:
Steven M. Gava052937f2002-02-11 02:20:53 +0000892 colours['foreground']=themeDict[element+'-foreground']
Benjamin Peterson6e3dbbd2009-10-09 22:15:50 +0000893 if element+'-background' in themeDict:
Steven M. Gava052937f2002-02-11 02:20:53 +0000894 colours['background']=themeDict[element+'-background']
Raymond Hettinger931237e2003-07-09 18:48:24 +0000895 self.textHighlightSample.tag_config(element, **colours)
Steven M. Gava052937f2002-02-11 02:20:53 +0000896 self.SetColourSample()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000897
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000898 def HelpSourceSelected(self,event):
899 self.SetHelpListButtonStates()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000900
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000901 def SetHelpListButtonStates(self):
902 if self.listHelp.size()<1: #no entries in list
903 self.buttonHelpListEdit.config(state=DISABLED)
904 self.buttonHelpListRemove.config(state=DISABLED)
905 else: #there are some entries
906 if self.listHelp.curselection(): #there currently is a selection
907 self.buttonHelpListEdit.config(state=NORMAL)
908 self.buttonHelpListRemove.config(state=NORMAL)
909 else: #there currently is not a selection
910 self.buttonHelpListEdit.config(state=DISABLED)
911 self.buttonHelpListRemove.config(state=DISABLED)
912
913 def HelpListItemAdd(self):
914 helpSource=GetHelpSourceDialog(self,'New Help Source').result
915 if helpSource:
916 self.userHelpList.append( (helpSource[0],helpSource[1]) )
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +0000917 self.listHelp.insert(END,helpSource[0])
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000918 self.UpdateUserHelpChangedItems()
919 self.SetHelpListButtonStates()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000920
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000921 def HelpListItemEdit(self):
922 itemIndex=self.listHelp.index(ANCHOR)
923 helpSource=self.userHelpList[itemIndex]
Steven M. Gava0c5bc8c2002-03-27 02:25:44 +0000924 newHelpSource=GetHelpSourceDialog(self,'Edit Help Source',
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000925 menuItem=helpSource[0],filePath=helpSource[1]).result
926 if (not newHelpSource) or (newHelpSource==helpSource):
927 return #no changes
928 self.userHelpList[itemIndex]=newHelpSource
929 self.listHelp.delete(itemIndex)
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +0000930 self.listHelp.insert(itemIndex,newHelpSource[0])
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000931 self.UpdateUserHelpChangedItems()
932 self.SetHelpListButtonStates()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000933
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000934 def HelpListItemRemove(self):
935 itemIndex=self.listHelp.index(ANCHOR)
936 del(self.userHelpList[itemIndex])
937 self.listHelp.delete(itemIndex)
938 self.UpdateUserHelpChangedItems()
939 self.SetHelpListButtonStates()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000940
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000941 def UpdateUserHelpChangedItems(self):
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +0000942 "Clear and rebuild the HelpFiles section in self.changedItems"
943 self.changedItems['main']['HelpFiles'] = {}
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000944 for num in range(1,len(self.userHelpList)+1):
945 self.AddChangedItem('main','HelpFiles',str(num),
Terry Jan Reedy110796f2014-07-27 04:07:18 -0400946 ';'.join(self.userHelpList[num-1][:2]))
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000947
Steven M. Gava429a86a2001-10-23 10:42:12 +0000948 def LoadFontCfg(self):
949 ##base editor font selection list
Steven M. Gavac11ccf32001-09-24 09:43:17 +0000950 fonts=list(tkFont.families(self))
951 fonts.sort()
952 for font in fonts:
953 self.listFontName.insert(END,font)
Steven M. Gava485f7b62001-10-26 06:47:09 +0000954 configuredFont=idleConf.GetOption('main','EditorWindow','font',
Terry Jan Reedy110796f2014-07-27 04:07:18 -0400955 default='courier')
Kurt B. Kaiser05391692003-05-26 20:35:53 +0000956 lc_configuredFont = configuredFont.lower()
957 self.fontName.set(lc_configuredFont)
958 lc_fonts = [s.lower() for s in fonts]
959 if lc_configuredFont in lc_fonts:
960 currentFontIndex = lc_fonts.index(lc_configuredFont)
Steven M. Gava429a86a2001-10-23 10:42:12 +0000961 self.listFontName.see(currentFontIndex)
962 self.listFontName.select_set(currentFontIndex)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000963 self.listFontName.select_anchor(currentFontIndex)
Steven M. Gava429a86a2001-10-23 10:42:12 +0000964 ##font size dropdown
Terry Jan Reedy110796f2014-07-27 04:07:18 -0400965 fontSize=idleConf.GetOption('main', 'EditorWindow', 'font-size',
966 type='int', default='10')
Chui Teya178cff2002-11-04 03:17:45 +0000967 self.optMenuFontSize.SetMenu(('7','8','9','10','11','12','13','14',
Terry Jan Reedy110796f2014-07-27 04:07:18 -0400968 '16','18','20','22'), fontSize )
Steven M. Gavac112cd82002-01-22 05:56:40 +0000969 ##fontWeight
970 self.fontBold.set(idleConf.GetOption('main','EditorWindow',
Terry Jan Reedy110796f2014-07-27 04:07:18 -0400971 'font-bold',default=0,type='bool'))
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000972 ##font sample
Steven M. Gava429a86a2001-10-23 10:42:12 +0000973 self.SetFontSample()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000974
Steven M. Gava429a86a2001-10-23 10:42:12 +0000975 def LoadTabCfg(self):
Steven M. Gava429a86a2001-10-23 10:42:12 +0000976 ##indent sizes
Steven M. Gava485f7b62001-10-26 06:47:09 +0000977 spaceNum=idleConf.GetOption('main','Indent','num-spaces',
Steven M. Gava429a86a2001-10-23 10:42:12 +0000978 default=4,type='int')
Steven M. Gava429a86a2001-10-23 10:42:12 +0000979 self.spaceNum.set(spaceNum)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000980
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000981 def LoadThemeCfg(self):
Steven M. Gava41a85322001-10-29 08:05:34 +0000982 ##current theme type radiobutton
Steven M. Gavad0342cd2001-11-04 11:53:10 +0000983 self.themeIsBuiltin.set(idleConf.GetOption('main','Theme','default',
Steven M. Gavac112cd82002-01-22 05:56:40 +0000984 type='bool',default=1))
Steven M. Gava41a85322001-10-29 08:05:34 +0000985 ##currently set theme
Steven M. Gavaad4f5322002-01-03 12:05:17 +0000986 currentOption=idleConf.CurrentTheme()
Steven M. Gava7c017862001-10-29 11:19:46 +0000987 ##load available theme option menus
Steven M. Gavad0342cd2001-11-04 11:53:10 +0000988 if self.themeIsBuiltin.get(): #default theme selected
Steven M. Gava41a85322001-10-29 08:05:34 +0000989 itemList=idleConf.GetSectionList('default','highlight')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000990 itemList.sort()
Steven M. Gava41a85322001-10-29 08:05:34 +0000991 self.optMenuThemeBuiltin.SetMenu(itemList,currentOption)
992 itemList=idleConf.GetSectionList('user','highlight')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000993 itemList.sort()
Steven M. Gava41a85322001-10-29 08:05:34 +0000994 if not itemList:
995 self.radioThemeCustom.config(state=DISABLED)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000996 self.customTheme.set('- no custom themes -')
Steven M. Gava41a85322001-10-29 08:05:34 +0000997 else:
998 self.optMenuThemeCustom.SetMenu(itemList,itemList[0])
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000999 else: #user theme selected
Steven M. Gava41a85322001-10-29 08:05:34 +00001000 itemList=idleConf.GetSectionList('user','highlight')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +00001001 itemList.sort()
Steven M. Gava41a85322001-10-29 08:05:34 +00001002 self.optMenuThemeCustom.SetMenu(itemList,currentOption)
1003 itemList=idleConf.GetSectionList('default','highlight')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +00001004 itemList.sort()
Steven M. Gava41a85322001-10-29 08:05:34 +00001005 self.optMenuThemeBuiltin.SetMenu(itemList,itemList[0])
Steven M. Gava7c017862001-10-29 11:19:46 +00001006 self.SetThemeType()
1007 ##load theme element option menu
Steven M. Gava9dd16b32001-11-03 14:54:25 +00001008 themeNames=self.themeElements.keys()
Florent Xiclunaa7f242f2010-04-02 08:15:26 +00001009 themeNames.sort(key=lambda x: self.themeElements[x][1])
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001010 self.optMenuHighlightTarget.SetMenu(themeNames,themeNames[0])
Steven M. Gava9dd16b32001-11-03 14:54:25 +00001011 self.PaintThemeSample()
Steven M. Gava0cae01c2002-01-04 07:53:06 +00001012 self.SetHighlightTarget()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001013
Steven M. Gava9dd16b32001-11-03 14:54:25 +00001014 def LoadKeyCfg(self):
Steven M. Gava41a85322001-10-29 08:05:34 +00001015 ##current keys type radiobutton
Steven M. Gava052937f2002-02-11 02:20:53 +00001016 self.keysAreBuiltin.set(idleConf.GetOption('main','Keys','default',
Steven M. Gavac112cd82002-01-22 05:56:40 +00001017 type='bool',default=1))
Steven M. Gava41a85322001-10-29 08:05:34 +00001018 ##currently set keys
Steven M. Gavaad4f5322002-01-03 12:05:17 +00001019 currentOption=idleConf.CurrentKeys()
Steven M. Gava7c017862001-10-29 11:19:46 +00001020 ##load available keyset option menus
Steven M. Gava052937f2002-02-11 02:20:53 +00001021 if self.keysAreBuiltin.get(): #default theme selected
Steven M. Gava41a85322001-10-29 08:05:34 +00001022 itemList=idleConf.GetSectionList('default','keys')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +00001023 itemList.sort()
Steven M. Gava41a85322001-10-29 08:05:34 +00001024 self.optMenuKeysBuiltin.SetMenu(itemList,currentOption)
1025 itemList=idleConf.GetSectionList('user','keys')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +00001026 itemList.sort()
Steven M. Gava41a85322001-10-29 08:05:34 +00001027 if not itemList:
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001028 self.radioKeysCustom.config(state=DISABLED)
1029 self.customKeys.set('- no custom keys -')
Steven M. Gava41a85322001-10-29 08:05:34 +00001030 else:
1031 self.optMenuKeysCustom.SetMenu(itemList,itemList[0])
Steven M. Gavaa498af22002-02-01 01:33:36 +00001032 else: #user key set selected
Steven M. Gava41a85322001-10-29 08:05:34 +00001033 itemList=idleConf.GetSectionList('user','keys')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +00001034 itemList.sort()
Steven M. Gava41a85322001-10-29 08:05:34 +00001035 self.optMenuKeysCustom.SetMenu(itemList,currentOption)
1036 itemList=idleConf.GetSectionList('default','keys')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +00001037 itemList.sort()
Steven M. Gava41a85322001-10-29 08:05:34 +00001038 self.optMenuKeysBuiltin.SetMenu(itemList,itemList[0])
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001039 self.SetKeysType()
Steven M. Gavafacfc092002-01-19 00:29:54 +00001040 ##load keyset element list
Steven M. Gava052937f2002-02-11 02:20:53 +00001041 keySetName=idleConf.CurrentKeys()
1042 self.LoadKeysList(keySetName)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001043
Steven M. Gavafacfc092002-01-19 00:29:54 +00001044 def LoadGeneralCfg(self):
Steven M. Gava5f28e8f2002-01-21 06:38:21 +00001045 #startup state
1046 self.startupEdit.set(idleConf.GetOption('main','General',
1047 'editor-on-startup',default=1,type='bool'))
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +00001048 #autosave state
1049 self.autoSave.set(idleConf.GetOption('main', 'General', 'autosave',
1050 default=0, type='bool'))
Steven M. Gavafacfc092002-01-19 00:29:54 +00001051 #initial window size
Andrew Svetlovd8590ff2012-12-24 13:17:59 +02001052 self.winWidth.set(idleConf.GetOption('main','EditorWindow','width',
1053 type='int'))
1054 self.winHeight.set(idleConf.GetOption('main','EditorWindow','height',
1055 type='int'))
Raymond Hettinger4e49b832004-06-04 06:31:08 +00001056 #initial paragraph reformat size
Andrew Svetlovd8590ff2012-12-24 13:17:59 +02001057 self.paraWidth.set(idleConf.GetOption('main','FormatParagraph','paragraph',
1058 type='int'))
Kurt B. Kaisera053f332003-05-10 00:49:56 +00001059 # default source encoding
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +00001060 self.encoding.set(idleConf.GetOption('main', 'EditorWindow',
1061 'encoding', default='none'))
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +00001062 # additional help sources
1063 self.userHelpList = idleConf.GetAllExtraHelpSourcesList()
Steven M. Gava085eb1b2002-02-05 04:52:32 +00001064 for helpItem in self.userHelpList:
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +00001065 self.listHelp.insert(END,helpItem[0])
Steven M. Gava085eb1b2002-02-05 04:52:32 +00001066 self.SetHelpListButtonStates()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001067
Steven M. Gava429a86a2001-10-23 10:42:12 +00001068 def LoadConfigs(self):
1069 """
1070 load configuration from default and user config files and populate
1071 the widgets on the config dialog pages.
1072 """
1073 ### fonts / tabs page
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001074 self.LoadFontCfg()
1075 self.LoadTabCfg()
Steven M. Gava429a86a2001-10-23 10:42:12 +00001076 ### highlighting page
Steven M. Gava9dd16b32001-11-03 14:54:25 +00001077 self.LoadThemeCfg()
Steven M. Gava429a86a2001-10-23 10:42:12 +00001078 ### keys page
Steven M. Gava9dd16b32001-11-03 14:54:25 +00001079 self.LoadKeyCfg()
Steven M. Gava429a86a2001-10-23 10:42:12 +00001080 ### general page
Steven M. Gavafacfc092002-01-19 00:29:54 +00001081 self.LoadGeneralCfg()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001082
Steven M. Gava052937f2002-02-11 02:20:53 +00001083 def SaveNewKeySet(self,keySetName,keySet):
1084 """
1085 save a newly created core key set.
1086 keySetName - string, the name of the new key set
1087 keySet - dictionary containing the new key set
1088 """
1089 if not idleConf.userCfg['keys'].has_section(keySetName):
1090 idleConf.userCfg['keys'].add_section(keySetName)
Terry Jan Reedy110796f2014-07-27 04:07:18 -04001091 for event in keySet:
Steven M. Gava052937f2002-02-11 02:20:53 +00001092 value=keySet[event]
1093 idleConf.userCfg['keys'].SetOption(keySetName,event,value)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001094
Steven M. Gava052937f2002-02-11 02:20:53 +00001095 def SaveNewTheme(self,themeName,theme):
1096 """
1097 save a newly created theme.
1098 themeName - string, the name of the new theme
1099 theme - dictionary containing the new theme
1100 """
1101 if not idleConf.userCfg['highlight'].has_section(themeName):
1102 idleConf.userCfg['highlight'].add_section(themeName)
Terry Jan Reedy110796f2014-07-27 04:07:18 -04001103 for element in theme:
Steven M. Gava052937f2002-02-11 02:20:53 +00001104 value=theme[element]
1105 idleConf.userCfg['highlight'].SetOption(themeName,element,value)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001106
Steven M. Gava2d7bb3f2002-01-29 08:35:29 +00001107 def SetUserValue(self,configType,section,item,value):
Steven M. Gava2d7bb3f2002-01-29 08:35:29 +00001108 if idleConf.defaultCfg[configType].has_option(section,item):
1109 if idleConf.defaultCfg[configType].Get(section,item)==value:
1110 #the setting equals a default setting, remove it from user cfg
1111 return idleConf.userCfg[configType].RemoveOption(section,item)
1112 #if we got here set the option
1113 return idleConf.userCfg[configType].SetOption(section,item,value)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001114
Steven M. Gava052937f2002-02-11 02:20:53 +00001115 def SaveAllChangedConfigs(self):
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +00001116 "Save configuration changes to the user config file."
Steven M. Gava0c5bc8c2002-03-27 02:25:44 +00001117 idleConf.userCfg['main'].Save()
Terry Jan Reedy110796f2014-07-27 04:07:18 -04001118 for configType in self.changedItems:
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +00001119 cfgTypeHasChanges = False
Terry Jan Reedy110796f2014-07-27 04:07:18 -04001120 for section in self.changedItems[configType]:
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +00001121 if section == 'HelpFiles':
1122 #this section gets completely replaced
1123 idleConf.userCfg['main'].remove_section('HelpFiles')
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +00001124 cfgTypeHasChanges = True
Terry Jan Reedy110796f2014-07-27 04:07:18 -04001125 for item in self.changedItems[configType][section]:
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +00001126 value = self.changedItems[configType][section][item]
Steven M. Gava2d7bb3f2002-01-29 08:35:29 +00001127 if self.SetUserValue(configType,section,item,value):
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +00001128 cfgTypeHasChanges = True
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001129 if cfgTypeHasChanges:
1130 idleConf.userCfg[configType].Save()
Kurt B. Kaiser5acdf932004-11-16 21:28:36 +00001131 for configType in ['keys', 'highlight']:
1132 # save these even if unchanged!
1133 idleConf.userCfg[configType].Save()
Steven M. Gavaa498af22002-02-01 01:33:36 +00001134 self.ResetChangedItems() #clear the changed items dict
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001135
Kurt B. Kaiserb1754452005-11-18 22:05:48 +00001136 def DeactivateCurrentConfig(self):
1137 #Before a config is saved, some cleanup of current
1138 #config must be done - remove the previous keybindings
Terry Jan Reedy110796f2014-07-27 04:07:18 -04001139 winInstances=self.parent.instance_dict
Kurt B. Kaiserb1754452005-11-18 22:05:48 +00001140 for instance in winInstances:
1141 instance.RemoveKeybindings()
1142
Steven M. Gava49745752002-02-18 01:43:11 +00001143 def ActivateConfigChanges(self):
Kurt B. Kaiseracdef852005-01-31 03:34:26 +00001144 "Dynamically apply configuration changes"
Terry Jan Reedy110796f2014-07-27 04:07:18 -04001145 winInstances = self.parent.instance_dict.keys()
Steven M. Gavab77d3432002-03-02 07:16:21 +00001146 for instance in winInstances:
1147 instance.ResetColorizer()
Steven M. Gavab1585412002-03-12 00:21:56 +00001148 instance.ResetFont()
Kurt B. Kaiseracdef852005-01-31 03:34:26 +00001149 instance.set_notabs_indentwidth()
Kurt B. Kaiserb1754452005-11-18 22:05:48 +00001150 instance.ApplyKeybindings()
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +00001151 instance.reset_help_menu_entries()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001152
Steven M. Gava5f28e8f2002-01-21 06:38:21 +00001153 def Cancel(self):
1154 self.destroy()
1155
1156 def Ok(self):
1157 self.Apply()
1158 self.destroy()
1159
1160 def Apply(self):
Kurt B. Kaiserb1754452005-11-18 22:05:48 +00001161 self.DeactivateCurrentConfig()
Steven M. Gava052937f2002-02-11 02:20:53 +00001162 self.SaveAllChangedConfigs()
Steven M. Gava49745752002-02-18 01:43:11 +00001163 self.ActivateConfigChanges()
Steven M. Gava5f28e8f2002-01-21 06:38:21 +00001164
1165 def Help(self):
Steven M. Gavac11ccf32001-09-24 09:43:17 +00001166 pass
1167
Steven M. Gava44d3d1a2001-07-31 06:59:02 +00001168if __name__ == '__main__':
Terry Jan Reedyaf0dce92014-07-14 23:07:21 -04001169 import unittest
1170 unittest.main('idlelib.idle_test.test_configdialog',
1171 verbosity=2, exit=False)
1172
Terry Jan Reedy76916e82014-05-29 01:46:16 -04001173 from idlelib.idle_test.htest import run
1174 run(ConfigDialog)