blob: 11aac9ebcf0d18a7eeebe90d603f2701a59dbbb3 [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
Christian Heimesc5f05e42008-02-23 17:40:11 +000014import string
Steven M. Gava44d3d1a2001-07-31 06:59:02 +000015
Florent Xiclunad630c042010-04-02 07:24:52 +000016from idlelib.configHandler import idleConf
17from idlelib.dynOptionMenuWidget import DynOptionMenu
18from idlelib.tabbedpages import TabbedPageSet
19from idlelib.keybindingDialog import GetKeysDialog
20from idlelib.configSectionNameDialog import GetCfgSectionNameDialog
21from idlelib.configHelpSourceEdit import GetHelpSourceDialog
22from idlelib import macosxSupport
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +000023
Steven M. Gava44d3d1a2001-07-31 06:59:02 +000024class ConfigDialog(Toplevel):
Kurt B. Kaiseracdef852005-01-31 03:34:26 +000025
Steven M. Gava3b55a892001-11-21 05:56:26 +000026 def __init__(self,parent,title):
Steven M. Gavad721c482001-07-31 10:46:53 +000027 Toplevel.__init__(self, parent)
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +000028 self.wm_withdraw()
29
Steven M. Gavad721c482001-07-31 10:46:53 +000030 self.configure(borderwidth=5)
Amaury Forgeot d'Arcb9ee8812009-07-15 21:29:27 +000031 self.title('IDLE Preferences')
Steven M. Gavad721c482001-07-31 10:46:53 +000032 self.geometry("+%d+%d" % (parent.winfo_rootx()+20,
33 parent.winfo_rooty()+30))
Georg Brandl7eb4b7d2005-07-22 21:49:32 +000034 #Theme Elements. Each theme element key is its display name.
Steven M. Gava9dd16b32001-11-03 14:54:25 +000035 #The first value of the tuple is the sample area tag name.
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +000036 #The second value is the display name list sort index.
Steven M. Gavaad4f5322002-01-03 12:05:17 +000037 self.themeElements={'Normal Text':('normal','00'),
38 'Python Keywords':('keyword','01'),
39 'Python Definitions':('definition','02'),
Kurt B. Kaiser73360a32004-03-08 18:15:31 +000040 'Python Builtins':('builtin', '03'),
41 'Python Comments':('comment','04'),
42 'Python Strings':('string','05'),
43 'Selected Text':('hilite','06'),
44 'Found Text':('hit','07'),
45 'Cursor':('cursor','08'),
46 'Error Text':('error','09'),
47 'Shell Normal Text':('console','10'),
48 'Shell Stdout Text':('stdout','11'),
49 'Shell Stderr Text':('stderr','12'),
50 }
Steven M. Gavaa498af22002-02-01 01:33:36 +000051 self.ResetChangedItems() #load initial values in changed items dict
Steven M. Gavad721c482001-07-31 10:46:53 +000052 self.CreateWidgets()
53 self.resizable(height=FALSE,width=FALSE)
Steven M. Gavad721c482001-07-31 10:46:53 +000054 self.transient(parent)
55 self.grab_set()
56 self.protocol("WM_DELETE_WINDOW", self.Cancel)
57 self.parent = parent
Steven M. Gava2d4e03b2001-12-05 07:54:07 +000058 self.tabPages.focus_set()
Steven M. Gavad721c482001-07-31 10:46:53 +000059 #key bindings for this dialog
Steven M. Gava5f28e8f2002-01-21 06:38:21 +000060 #self.bind('<Escape>',self.Cancel) #dismiss dialog, no save
61 #self.bind('<Alt-a>',self.Apply) #apply changes, save
62 #self.bind('<F1>',self.Help) #context help
Steven M. Gava429a86a2001-10-23 10:42:12 +000063 self.LoadConfigs()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +000064 self.AttachVarCallbacks() #avoid callbacks during LoadConfigs
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +000065
66 self.wm_deiconify()
Steven M. Gavad721c482001-07-31 10:46:53 +000067 self.wait_window()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +000068
Steven M. Gavad721c482001-07-31 10:46:53 +000069 def CreateWidgets(self):
Kurt B. Kaiser20172f92007-10-30 02:38:54 +000070 self.tabPages = TabbedPageSet(self,
71 page_names=['Fonts/Tabs','Highlighting','Keys','General'])
72 frameActionButtons = Frame(self,pady=2)
Steven M. Gavad721c482001-07-31 10:46:53 +000073 #action buttons
Ronald Oussorena97063a2009-03-04 21:35:05 +000074 if macosxSupport.runningAsOSXApp():
75 # Changing the default padding on OSX results in unreadable
76 # text in the buttons
77 paddingArgs={}
78 else:
79 paddingArgs={'padx':6, 'pady':3}
80
Steven M. Gava952d0a52001-08-03 04:43:44 +000081 self.buttonHelp = Button(frameActionButtons,text='Help',
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +000082 command=self.Help,takefocus=FALSE,
Ronald Oussorena97063a2009-03-04 21:35:05 +000083 **paddingArgs)
Steven M. Gavac01e30f2001-08-11 15:48:13 +000084 self.buttonOk = Button(frameActionButtons,text='Ok',
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +000085 command=self.Ok,takefocus=FALSE,
Ronald Oussorena97063a2009-03-04 21:35:05 +000086 **paddingArgs)
Steven M. Gavac01e30f2001-08-11 15:48:13 +000087 self.buttonApply = Button(frameActionButtons,text='Apply',
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +000088 command=self.Apply,takefocus=FALSE,
Ronald Oussorena97063a2009-03-04 21:35:05 +000089 **paddingArgs)
Steven M. Gavad721c482001-07-31 10:46:53 +000090 self.buttonCancel = Button(frameActionButtons,text='Cancel',
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +000091 command=self.Cancel,takefocus=FALSE,
Ronald Oussorena97063a2009-03-04 21:35:05 +000092 **paddingArgs)
Steven M. Gava2d4e03b2001-12-05 07:54:07 +000093 self.CreatePageFontTab()
94 self.CreatePageHighlight()
95 self.CreatePageKeys()
96 self.CreatePageGeneral()
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +000097 self.buttonHelp.pack(side=RIGHT,padx=5)
98 self.buttonOk.pack(side=LEFT,padx=5)
99 self.buttonApply.pack(side=LEFT,padx=5)
100 self.buttonCancel.pack(side=LEFT,padx=5)
Steven M. Gavad721c482001-07-31 10:46:53 +0000101 frameActionButtons.pack(side=BOTTOM)
Kurt B. Kaiser28c7bcf2007-12-28 04:18:01 +0000102 Frame(self, height=2, borderwidth=0).pack(side=BOTTOM)
Steven M. Gava2d4e03b2001-12-05 07:54:07 +0000103 self.tabPages.pack(side=TOP,expand=TRUE,fill=BOTH)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000104
Steven M. Gava60fc7072001-08-04 13:58:22 +0000105 def CreatePageFontTab(self):
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000106 #tkVars
Steven M. Gava3b55a892001-11-21 05:56:26 +0000107 self.fontSize=StringVar(self)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000108 self.fontBold=BooleanVar(self)
109 self.fontName=StringVar(self)
Steven M. Gava3b55a892001-11-21 05:56:26 +0000110 self.spaceNum=IntVar(self)
Kurt B. Kaiser05391692003-05-26 20:35:53 +0000111 self.editFont=tkFont.Font(self,('courier',10,'normal'))
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000112 ##widget creation
113 #body frame
Kurt B. Kaiser20172f92007-10-30 02:38:54 +0000114 frame=self.tabPages.pages['Fonts/Tabs'].frame
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000115 #body section frames
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000116 frameFont=LabelFrame(frame,borderwidth=2,relief=GROOVE,
117 text=' Base Editor Font ')
118 frameIndent=LabelFrame(frame,borderwidth=2,relief=GROOVE,
119 text=' Indentation Width ')
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000120 #frameFont
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000121 frameFontName=Frame(frameFont)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000122 frameFontParam=Frame(frameFont)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000123 labelFontNameTitle=Label(frameFontName,justify=LEFT,
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000124 text='Font Face :')
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000125 self.listFontName=Listbox(frameFontName,height=5,takefocus=FALSE,
126 exportselection=FALSE)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000127 self.listFontName.bind('<ButtonRelease-1>',self.OnListFontButtonRelease)
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000128 scrollFont=Scrollbar(frameFontName)
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000129 scrollFont.config(command=self.listFontName.yview)
130 self.listFontName.config(yscrollcommand=scrollFont.set)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000131 labelFontSizeTitle=Label(frameFontParam,text='Size :')
132 self.optMenuFontSize=DynOptionMenu(frameFontParam,self.fontSize,None,
Steven M. Gavac112cd82002-01-22 05:56:40 +0000133 command=self.SetFontSample)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000134 checkFontBold=Checkbutton(frameFontParam,variable=self.fontBold,
Steven M. Gavac112cd82002-01-22 05:56:40 +0000135 onvalue=1,offvalue=0,text='Bold',command=self.SetFontSample)
Steven M. Gavac11ccf32001-09-24 09:43:17 +0000136 frameFontSample=Frame(frameFont,relief=SOLID,borderwidth=1)
137 self.labelFontSample=Label(frameFontSample,
138 text='AaBbCcDdEe\nFfGgHhIiJjK\n1234567890\n#:+=(){}[]',
Steven M. Gava429a86a2001-10-23 10:42:12 +0000139 justify=LEFT,font=self.editFont)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000140 #frameIndent
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000141 frameIndentSize=Frame(frameIndent)
Kurt B. Kaiseracdef852005-01-31 03:34:26 +0000142 labelSpaceNumTitle=Label(frameIndentSize, justify=LEFT,
143 text='Python Standard: 4 Spaces!')
144 self.scaleSpaceNum=Scale(frameIndentSize, variable=self.spaceNum,
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000145 orient='horizontal',
Kurt B. Kaiseracdef852005-01-31 03:34:26 +0000146 tickinterval=2, from_=2, to=16)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000147 #widget packing
148 #body
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000149 frameFont.pack(side=LEFT,padx=5,pady=5,expand=TRUE,fill=BOTH)
150 frameIndent.pack(side=LEFT,padx=5,pady=5,fill=Y)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000151 #frameFont
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000152 frameFontName.pack(side=TOP,padx=5,pady=5,fill=X)
153 frameFontParam.pack(side=TOP,padx=5,pady=5,fill=X)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000154 labelFontNameTitle.pack(side=TOP,anchor=W)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000155 self.listFontName.pack(side=LEFT,expand=TRUE,fill=X)
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000156 scrollFont.pack(side=LEFT,fill=Y)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000157 labelFontSizeTitle.pack(side=LEFT,anchor=W)
158 self.optMenuFontSize.pack(side=LEFT,anchor=W)
159 checkFontBold.pack(side=LEFT,anchor=W,padx=20)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000160 frameFontSample.pack(side=TOP,padx=5,pady=5,expand=TRUE,fill=BOTH)
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000161 self.labelFontSample.pack(expand=TRUE,fill=BOTH)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000162 #frameIndent
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000163 frameIndentSize.pack(side=TOP,fill=X)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000164 labelSpaceNumTitle.pack(side=TOP,anchor=W,padx=5)
165 self.scaleSpaceNum.pack(side=TOP,padx=5,fill=X)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000166 return frame
167
168 def CreatePageHighlight(self):
Steven M. Gava3b55a892001-11-21 05:56:26 +0000169 self.builtinTheme=StringVar(self)
170 self.customTheme=StringVar(self)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000171 self.fgHilite=BooleanVar(self)
Steven M. Gava3b55a892001-11-21 05:56:26 +0000172 self.colour=StringVar(self)
173 self.fontName=StringVar(self)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000174 self.themeIsBuiltin=BooleanVar(self)
Steven M. Gava3b55a892001-11-21 05:56:26 +0000175 self.highlightTarget=StringVar(self)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000176 ##widget creation
177 #body frame
Kurt B. Kaiser20172f92007-10-30 02:38:54 +0000178 frame=self.tabPages.pages['Highlighting'].frame
Steven M. Gava952d0a52001-08-03 04:43:44 +0000179 #body section frames
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000180 frameCustom=LabelFrame(frame,borderwidth=2,relief=GROOVE,
181 text=' Custom Highlighting ')
182 frameTheme=LabelFrame(frame,borderwidth=2,relief=GROOVE,
183 text=' Highlighting Theme ')
Steven M. Gava952d0a52001-08-03 04:43:44 +0000184 #frameCustom
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000185 self.textHighlightSample=Text(frameCustom,relief=SOLID,borderwidth=1,
Terry Jan Reedy42f7b7e2012-05-26 16:55:43 -0400186 font=('courier',12,''),cursor='hand2',width=21,height=11,
Steven M. Gavab77d3432002-03-02 07:16:21 +0000187 takefocus=FALSE,highlightthickness=0,wrap=NONE)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000188 text=self.textHighlightSample
189 text.bind('<Double-Button-1>',lambda e: 'break')
190 text.bind('<B1-Motion>',lambda e: 'break')
Steven M. Gava052937f2002-02-11 02:20:53 +0000191 textAndTags=(('#you can click here','comment'),('\n','normal'),
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000192 ('#to choose items','comment'),('\n','normal'),('def','keyword'),
193 (' ','normal'),('func','definition'),('(param):','normal'),
194 ('\n ','normal'),('"""string"""','string'),('\n var0 = ','normal'),
Steven M. Gavad0342cd2001-11-04 11:53:10 +0000195 ("'string'",'string'),('\n var1 = ','normal'),("'selected'",'hilite'),
Kurt B. Kaiser73360a32004-03-08 18:15:31 +0000196 ('\n var2 = ','normal'),("'found'",'hit'),
197 ('\n var3 = ','normal'),('list', 'builtin'), ('(','normal'),
198 ('None', 'builtin'),(')\n\n','normal'),
Steven M. Gava99300612001-11-04 07:03:08 +0000199 (' error ','error'),(' ','normal'),('cursor |','cursor'),
Steven M. Gavad0342cd2001-11-04 11:53:10 +0000200 ('\n ','normal'),('shell','console'),(' ','normal'),('stdout','stdout'),
201 (' ','normal'),('stderr','stderr'),('\n','normal'))
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000202 for txTa in textAndTags:
203 text.insert(END,txTa[0],txTa[1])
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000204 for element in self.themeElements.keys():
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000205 text.tag_bind(self.themeElements[element][0],'<ButtonPress-1>',
206 lambda event,elem=element: event.widget.winfo_toplevel()
207 .highlightTarget.set(elem))
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000208 text.config(state=DISABLED)
209 self.frameColourSet=Frame(frameCustom,relief=SOLID,borderwidth=1)
Steven M. Gava7c017862001-10-29 11:19:46 +0000210 frameFgBg=Frame(frameCustom)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000211 buttonSetColour=Button(self.frameColourSet,text='Choose Colour for :',
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000212 command=self.GetColour,highlightthickness=0)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000213 self.optMenuHighlightTarget=DynOptionMenu(self.frameColourSet,
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000214 self.highlightTarget,None,highlightthickness=0)#,command=self.SetHighlightTargetBinding
Steven M. Gava7c017862001-10-29 11:19:46 +0000215 self.radioFg=Radiobutton(frameFgBg,variable=self.fgHilite,
Steven M. Gava3b55a892001-11-21 05:56:26 +0000216 value=1,text='Foreground',command=self.SetColourSampleBinding)
Steven M. Gava7c017862001-10-29 11:19:46 +0000217 self.radioBg=Radiobutton(frameFgBg,variable=self.fgHilite,
Steven M. Gava3b55a892001-11-21 05:56:26 +0000218 value=0,text='Background',command=self.SetColourSampleBinding)
Steven M. Gava7c017862001-10-29 11:19:46 +0000219 self.fgHilite.set(1)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000220 buttonSaveCustomTheme=Button(frameCustom,
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000221 text='Save as New Custom Theme',command=self.SaveAsNewTheme)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000222 #frameTheme
Steven M. Gava952d0a52001-08-03 04:43:44 +0000223 labelTypeTitle=Label(frameTheme,text='Select : ')
Steven M. Gavad0342cd2001-11-04 11:53:10 +0000224 self.radioThemeBuiltin=Radiobutton(frameTheme,variable=self.themeIsBuiltin,
225 value=1,command=self.SetThemeType,text='a Built-in Theme')
226 self.radioThemeCustom=Radiobutton(frameTheme,variable=self.themeIsBuiltin,
227 value=0,command=self.SetThemeType,text='a Custom Theme')
Steven M. Gava41a85322001-10-29 08:05:34 +0000228 self.optMenuThemeBuiltin=DynOptionMenu(frameTheme,
Steven M. Gava7c017862001-10-29 11:19:46 +0000229 self.builtinTheme,None,command=None)
Steven M. Gava41a85322001-10-29 08:05:34 +0000230 self.optMenuThemeCustom=DynOptionMenu(frameTheme,
Steven M. Gava7c017862001-10-29 11:19:46 +0000231 self.customTheme,None,command=None)
Steven M. Gava49745752002-02-18 01:43:11 +0000232 self.buttonDeleteCustomTheme=Button(frameTheme,text='Delete Custom Theme',
233 command=self.DeleteCustomTheme)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000234 ##widget packing
235 #body
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000236 frameCustom.pack(side=LEFT,padx=5,pady=5,expand=TRUE,fill=BOTH)
237 frameTheme.pack(side=LEFT,padx=5,pady=5,fill=Y)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000238 #frameCustom
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000239 self.frameColourSet.pack(side=TOP,padx=5,pady=5,expand=TRUE,fill=X)
Steven M. Gava7c017862001-10-29 11:19:46 +0000240 frameFgBg.pack(side=TOP,padx=5,pady=0)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000241 self.textHighlightSample.pack(side=TOP,padx=5,pady=5,expand=TRUE,
242 fill=BOTH)
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000243 buttonSetColour.pack(side=TOP,expand=TRUE,fill=X,padx=8,pady=4)
244 self.optMenuHighlightTarget.pack(side=TOP,expand=TRUE,fill=X,padx=8,pady=3)
Steven M. Gava7c017862001-10-29 11:19:46 +0000245 self.radioFg.pack(side=LEFT,anchor=E)
246 self.radioBg.pack(side=RIGHT,anchor=W)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000247 buttonSaveCustomTheme.pack(side=BOTTOM,fill=X,padx=5,pady=5)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000248 #frameTheme
Steven M. Gava952d0a52001-08-03 04:43:44 +0000249 labelTypeTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
Steven M. Gava41a85322001-10-29 08:05:34 +0000250 self.radioThemeBuiltin.pack(side=TOP,anchor=W,padx=5)
251 self.radioThemeCustom.pack(side=TOP,anchor=W,padx=5,pady=2)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000252 self.optMenuThemeBuiltin.pack(side=TOP,fill=X,padx=5,pady=5)
253 self.optMenuThemeCustom.pack(side=TOP,fill=X,anchor=W,padx=5,pady=5)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000254 self.buttonDeleteCustomTheme.pack(side=TOP,fill=X,padx=5,pady=5)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000255 return frame
256
257 def CreatePageKeys(self):
Steven M. Gava60fc7072001-08-04 13:58:22 +0000258 #tkVars
Steven M. Gava3b55a892001-11-21 05:56:26 +0000259 self.bindingTarget=StringVar(self)
260 self.builtinKeys=StringVar(self)
261 self.customKeys=StringVar(self)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000262 self.keysAreBuiltin=BooleanVar(self)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000263 self.keyBinding=StringVar(self)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000264 ##widget creation
265 #body frame
Kurt B. Kaiser20172f92007-10-30 02:38:54 +0000266 frame=self.tabPages.pages['Keys'].frame
Steven M. Gava60fc7072001-08-04 13:58:22 +0000267 #body section frames
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000268 frameCustom=LabelFrame(frame,borderwidth=2,relief=GROOVE,
269 text=' Custom Key Bindings ')
270 frameKeySets=LabelFrame(frame,borderwidth=2,relief=GROOVE,
271 text=' Key Set ')
Steven M. Gava60fc7072001-08-04 13:58:22 +0000272 #frameCustom
273 frameTarget=Frame(frameCustom)
Steven M. Gavafacfc092002-01-19 00:29:54 +0000274 labelTargetTitle=Label(frameTarget,text='Action - Key(s)')
275 scrollTargetY=Scrollbar(frameTarget)
276 scrollTargetX=Scrollbar(frameTarget,orient=HORIZONTAL)
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000277 self.listBindings=Listbox(frameTarget,takefocus=FALSE,
278 exportselection=FALSE)
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000279 self.listBindings.bind('<ButtonRelease-1>',self.KeyBindingSelected)
Steven M. Gavafacfc092002-01-19 00:29:54 +0000280 scrollTargetY.config(command=self.listBindings.yview)
281 scrollTargetX.config(command=self.listBindings.xview)
282 self.listBindings.config(yscrollcommand=scrollTargetY.set)
283 self.listBindings.config(xscrollcommand=scrollTargetX.set)
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000284 self.buttonNewKeys=Button(frameCustom,text='Get New Keys for Selection',
285 command=self.GetNewKeys,state=DISABLED)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000286 #frameKeySets
Kurt B. Kaiser28c7bcf2007-12-28 04:18:01 +0000287 frames = [Frame(frameKeySets, padx=2, pady=2, borderwidth=0)
288 for i in range(2)]
289 self.radioKeysBuiltin=Radiobutton(frames[0],variable=self.keysAreBuiltin,
290 value=1,command=self.SetKeysType,text='Use a Built-in Key Set')
291 self.radioKeysCustom=Radiobutton(frames[0],variable=self.keysAreBuiltin,
292 value=0,command=self.SetKeysType,text='Use a Custom Key Set')
293 self.optMenuKeysBuiltin=DynOptionMenu(frames[0],
Steven M. Gava41a85322001-10-29 08:05:34 +0000294 self.builtinKeys,None,command=None)
Kurt B. Kaiser28c7bcf2007-12-28 04:18:01 +0000295 self.optMenuKeysCustom=DynOptionMenu(frames[0],
Steven M. Gava41a85322001-10-29 08:05:34 +0000296 self.customKeys,None,command=None)
Kurt B. Kaiser28c7bcf2007-12-28 04:18:01 +0000297 self.buttonDeleteCustomKeys=Button(frames[1],text='Delete Custom Key Set',
Steven M. Gava49745752002-02-18 01:43:11 +0000298 command=self.DeleteCustomKeys)
Kurt B. Kaiser28c7bcf2007-12-28 04:18:01 +0000299 buttonSaveCustomKeys=Button(frames[1],
300 text='Save as New Custom Key Set',command=self.SaveAsNewKeySet)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000301 ##widget packing
302 #body
Kurt B. Kaiser28c7bcf2007-12-28 04:18:01 +0000303 frameCustom.pack(side=BOTTOM,padx=5,pady=5,expand=TRUE,fill=BOTH)
304 frameKeySets.pack(side=BOTTOM,padx=5,pady=5,fill=BOTH)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000305 #frameCustom
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000306 self.buttonNewKeys.pack(side=BOTTOM,fill=X,padx=5,pady=5)
Steven M. Gavafacfc092002-01-19 00:29:54 +0000307 frameTarget.pack(side=LEFT,padx=5,pady=5,expand=TRUE,fill=BOTH)
308 #frame target
309 frameTarget.columnconfigure(0,weight=1)
310 frameTarget.rowconfigure(1,weight=1)
311 labelTargetTitle.grid(row=0,column=0,columnspan=2,sticky=W)
312 self.listBindings.grid(row=1,column=0,sticky=NSEW)
313 scrollTargetY.grid(row=1,column=1,sticky=NS)
314 scrollTargetX.grid(row=2,column=0,sticky=EW)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000315 #frameKeySets
Kurt B. Kaiser28c7bcf2007-12-28 04:18:01 +0000316 self.radioKeysBuiltin.grid(row=0, column=0, sticky=W+NS)
317 self.radioKeysCustom.grid(row=1, column=0, sticky=W+NS)
318 self.optMenuKeysBuiltin.grid(row=0, column=1, sticky=NSEW)
319 self.optMenuKeysCustom.grid(row=1, column=1, sticky=NSEW)
320 self.buttonDeleteCustomKeys.pack(side=LEFT,fill=X,expand=True,padx=2)
321 buttonSaveCustomKeys.pack(side=LEFT,fill=X,expand=True,padx=2)
322 frames[0].pack(side=TOP, fill=BOTH, expand=True)
323 frames[1].pack(side=TOP, fill=X, expand=True, pady=2)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000324 return frame
325
326 def CreatePageGeneral(self):
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000327 #tkVars
328 self.winWidth=StringVar(self)
Steven M. Gava3b55a892001-11-21 05:56:26 +0000329 self.winHeight=StringVar(self)
Raymond Hettinger4e49b832004-06-04 06:31:08 +0000330 self.paraWidth=StringVar(self)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000331 self.startupEdit=IntVar(self)
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000332 self.autoSave=IntVar(self)
Kurt B. Kaisera053f332003-05-10 00:49:56 +0000333 self.encoding=StringVar(self)
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000334 self.userHelpBrowser=BooleanVar(self)
335 self.helpBrowser=StringVar(self)
Steven M. Gava230e5782001-08-07 03:28:25 +0000336 #widget creation
337 #body
Kurt B. Kaiser20172f92007-10-30 02:38:54 +0000338 frame=self.tabPages.pages['General'].frame
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000339 #body section frames
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000340 frameRun=LabelFrame(frame,borderwidth=2,relief=GROOVE,
341 text=' Startup Preferences ')
342 frameSave=LabelFrame(frame,borderwidth=2,relief=GROOVE,
343 text=' Autosave Preferences ')
Steven M. Gava230e5782001-08-07 03:28:25 +0000344 frameWinSize=Frame(frame,borderwidth=2,relief=GROOVE)
Raymond Hettinger4e49b832004-06-04 06:31:08 +0000345 frameParaSize=Frame(frame,borderwidth=2,relief=GROOVE)
Kurt B. Kaisera053f332003-05-10 00:49:56 +0000346 frameEncoding=Frame(frame,borderwidth=2,relief=GROOVE)
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000347 frameHelp=LabelFrame(frame,borderwidth=2,relief=GROOVE,
348 text=' Additional Help Sources ')
Steven M. Gava230e5782001-08-07 03:28:25 +0000349 #frameRun
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000350 labelRunChoiceTitle=Label(frameRun,text='At Startup')
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000351 radioStartupEdit=Radiobutton(frameRun,variable=self.startupEdit,
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +0000352 value=1,command=self.SetKeysType,text="Open Edit Window")
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000353 radioStartupShell=Radiobutton(frameRun,variable=self.startupEdit,
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +0000354 value=0,command=self.SetKeysType,text='Open Shell Window')
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000355 #frameSave
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000356 labelRunSaveTitle=Label(frameSave,text='At Start of Run (F5) ')
357 radioSaveAsk=Radiobutton(frameSave,variable=self.autoSave,
358 value=0,command=self.SetKeysType,text="Prompt to Save")
359 radioSaveAuto=Radiobutton(frameSave,variable=self.autoSave,
360 value=1,command=self.SetKeysType,text='No Prompt')
Steven M. Gava230e5782001-08-07 03:28:25 +0000361 #frameWinSize
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000362 labelWinSizeTitle=Label(frameWinSize,text='Initial Window Size'+
363 ' (in characters)')
Steven M. Gava230e5782001-08-07 03:28:25 +0000364 labelWinWidthTitle=Label(frameWinSize,text='Width')
365 entryWinWidth=Entry(frameWinSize,textvariable=self.winWidth,
366 width=3)
367 labelWinHeightTitle=Label(frameWinSize,text='Height')
368 entryWinHeight=Entry(frameWinSize,textvariable=self.winHeight,
369 width=3)
Raymond Hettinger4e49b832004-06-04 06:31:08 +0000370 #paragraphFormatWidth
371 labelParaWidthTitle=Label(frameParaSize,text='Paragraph reformat'+
372 ' width (in characters)')
373 entryParaWidth=Entry(frameParaSize,textvariable=self.paraWidth,
374 width=3)
Kurt B. Kaisera053f332003-05-10 00:49:56 +0000375 #frameEncoding
376 labelEncodingTitle=Label(frameEncoding,text="Default Source Encoding")
377 radioEncLocale=Radiobutton(frameEncoding,variable=self.encoding,
378 value="locale",text="Locale-defined")
379 radioEncUTF8=Radiobutton(frameEncoding,variable=self.encoding,
380 value="utf-8",text="UTF-8")
381 radioEncNone=Radiobutton(frameEncoding,variable=self.encoding,
382 value="none",text="None")
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000383 #frameHelp
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000384 frameHelpList=Frame(frameHelp)
385 frameHelpListButtons=Frame(frameHelpList)
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000386 scrollHelpList=Scrollbar(frameHelpList)
387 self.listHelp=Listbox(frameHelpList,height=5,takefocus=FALSE,
388 exportselection=FALSE)
389 scrollHelpList.config(command=self.listHelp.yview)
390 self.listHelp.config(yscrollcommand=scrollHelpList.set)
391 self.listHelp.bind('<ButtonRelease-1>',self.HelpSourceSelected)
392 self.buttonHelpListEdit=Button(frameHelpListButtons,text='Edit',
393 state=DISABLED,width=8,command=self.HelpListItemEdit)
394 self.buttonHelpListAdd=Button(frameHelpListButtons,text='Add',
395 width=8,command=self.HelpListItemAdd)
396 self.buttonHelpListRemove=Button(frameHelpListButtons,text='Remove',
397 state=DISABLED,width=8,command=self.HelpListItemRemove)
Steven M. Gava230e5782001-08-07 03:28:25 +0000398 #widget packing
399 #body
400 frameRun.pack(side=TOP,padx=5,pady=5,fill=X)
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000401 frameSave.pack(side=TOP,padx=5,pady=5,fill=X)
Steven M. Gava230e5782001-08-07 03:28:25 +0000402 frameWinSize.pack(side=TOP,padx=5,pady=5,fill=X)
Raymond Hettinger4e49b832004-06-04 06:31:08 +0000403 frameParaSize.pack(side=TOP,padx=5,pady=5,fill=X)
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000404 frameEncoding.pack(side=TOP,padx=5,pady=5,fill=X)
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000405 frameHelp.pack(side=TOP,padx=5,pady=5,expand=TRUE,fill=BOTH)
Steven M. Gava230e5782001-08-07 03:28:25 +0000406 #frameRun
Steven M. Gava230e5782001-08-07 03:28:25 +0000407 labelRunChoiceTitle.pack(side=LEFT,anchor=W,padx=5,pady=5)
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000408 radioStartupShell.pack(side=RIGHT,anchor=W,padx=5,pady=5)
409 radioStartupEdit.pack(side=RIGHT,anchor=W,padx=5,pady=5)
410 #frameSave
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000411 labelRunSaveTitle.pack(side=LEFT,anchor=W,padx=5,pady=5)
412 radioSaveAuto.pack(side=RIGHT,anchor=W,padx=5,pady=5)
413 radioSaveAsk.pack(side=RIGHT,anchor=W,padx=5,pady=5)
Steven M. Gava230e5782001-08-07 03:28:25 +0000414 #frameWinSize
Steven M. Gavafacfc092002-01-19 00:29:54 +0000415 labelWinSizeTitle.pack(side=LEFT,anchor=W,padx=5,pady=5)
416 entryWinHeight.pack(side=RIGHT,anchor=E,padx=10,pady=5)
417 labelWinHeightTitle.pack(side=RIGHT,anchor=E,pady=5)
418 entryWinWidth.pack(side=RIGHT,anchor=E,padx=10,pady=5)
419 labelWinWidthTitle.pack(side=RIGHT,anchor=E,pady=5)
Raymond Hettinger4e49b832004-06-04 06:31:08 +0000420 #paragraphFormatWidth
421 labelParaWidthTitle.pack(side=LEFT,anchor=W,padx=5,pady=5)
422 entryParaWidth.pack(side=RIGHT,anchor=E,padx=10,pady=5)
Kurt B. Kaisera053f332003-05-10 00:49:56 +0000423 #frameEncoding
424 labelEncodingTitle.pack(side=LEFT,anchor=W,padx=5,pady=5)
425 radioEncNone.pack(side=RIGHT,anchor=E,pady=5)
426 radioEncUTF8.pack(side=RIGHT,anchor=E,pady=5)
427 radioEncLocale.pack(side=RIGHT,anchor=E,pady=5)
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000428 #frameHelp
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000429 frameHelpListButtons.pack(side=RIGHT,padx=5,pady=5,fill=Y)
430 frameHelpList.pack(side=TOP,padx=5,pady=5,expand=TRUE,fill=BOTH)
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000431 scrollHelpList.pack(side=RIGHT,anchor=W,fill=Y)
432 self.listHelp.pack(side=LEFT,anchor=E,expand=TRUE,fill=BOTH)
433 self.buttonHelpListEdit.pack(side=TOP,anchor=W,pady=5)
434 self.buttonHelpListAdd.pack(side=TOP,anchor=W)
435 self.buttonHelpListRemove.pack(side=TOP,anchor=W,pady=5)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000436 return frame
437
Steven M. Gavac112cd82002-01-22 05:56:40 +0000438 def AttachVarCallbacks(self):
439 self.fontSize.trace_variable('w',self.VarChanged_fontSize)
440 self.fontName.trace_variable('w',self.VarChanged_fontName)
441 self.fontBold.trace_variable('w',self.VarChanged_fontBold)
442 self.spaceNum.trace_variable('w',self.VarChanged_spaceNum)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000443 self.colour.trace_variable('w',self.VarChanged_colour)
Steven M. Gava052937f2002-02-11 02:20:53 +0000444 self.builtinTheme.trace_variable('w',self.VarChanged_builtinTheme)
445 self.customTheme.trace_variable('w',self.VarChanged_customTheme)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000446 self.themeIsBuiltin.trace_variable('w',self.VarChanged_themeIsBuiltin)
Steven M. Gava052937f2002-02-11 02:20:53 +0000447 self.highlightTarget.trace_variable('w',self.VarChanged_highlightTarget)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000448 self.keyBinding.trace_variable('w',self.VarChanged_keyBinding)
Steven M. Gava052937f2002-02-11 02:20:53 +0000449 self.builtinKeys.trace_variable('w',self.VarChanged_builtinKeys)
450 self.customKeys.trace_variable('w',self.VarChanged_customKeys)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000451 self.keysAreBuiltin.trace_variable('w',self.VarChanged_keysAreBuiltin)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000452 self.winWidth.trace_variable('w',self.VarChanged_winWidth)
453 self.winHeight.trace_variable('w',self.VarChanged_winHeight)
Raymond Hettinger4e49b832004-06-04 06:31:08 +0000454 self.paraWidth.trace_variable('w',self.VarChanged_paraWidth)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000455 self.startupEdit.trace_variable('w',self.VarChanged_startupEdit)
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000456 self.autoSave.trace_variable('w',self.VarChanged_autoSave)
Kurt B. Kaisera053f332003-05-10 00:49:56 +0000457 self.encoding.trace_variable('w',self.VarChanged_encoding)
Steven M. Gava052937f2002-02-11 02:20:53 +0000458
Steven M. Gavac112cd82002-01-22 05:56:40 +0000459 def VarChanged_fontSize(self,*params):
460 value=self.fontSize.get()
461 self.AddChangedItem('main','EditorWindow','font-size',value)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000462
Steven M. Gavac112cd82002-01-22 05:56:40 +0000463 def VarChanged_fontName(self,*params):
464 value=self.fontName.get()
465 self.AddChangedItem('main','EditorWindow','font',value)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000466
467 def VarChanged_fontBold(self,*params):
468 value=self.fontBold.get()
469 self.AddChangedItem('main','EditorWindow','font-bold',value)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000470
Steven M. Gavac112cd82002-01-22 05:56:40 +0000471 def VarChanged_spaceNum(self,*params):
472 value=self.spaceNum.get()
473 self.AddChangedItem('main','Indent','num-spaces',value)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000474
Steven M. Gavac112cd82002-01-22 05:56:40 +0000475 def VarChanged_colour(self,*params):
Steven M. Gava052937f2002-02-11 02:20:53 +0000476 self.OnNewColourSet()
477
478 def VarChanged_builtinTheme(self,*params):
479 value=self.builtinTheme.get()
480 self.AddChangedItem('main','Theme','name',value)
481 self.PaintThemeSample()
482
483 def VarChanged_customTheme(self,*params):
484 value=self.customTheme.get()
Steven M. Gava49745752002-02-18 01:43:11 +0000485 if value != '- no custom themes -':
486 self.AddChangedItem('main','Theme','name',value)
487 self.PaintThemeSample()
Steven M. Gava052937f2002-02-11 02:20:53 +0000488
489 def VarChanged_themeIsBuiltin(self,*params):
490 value=self.themeIsBuiltin.get()
491 self.AddChangedItem('main','Theme','default',value)
Steven M. Gavaf31eec02002-03-05 00:25:58 +0000492 if value:
493 self.VarChanged_builtinTheme()
494 else:
495 self.VarChanged_customTheme()
Steven M. Gava052937f2002-02-11 02:20:53 +0000496
497 def VarChanged_highlightTarget(self,*params):
498 self.SetHighlightTarget()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000499
Steven M. Gavac112cd82002-01-22 05:56:40 +0000500 def VarChanged_keyBinding(self,*params):
Steven M. Gavabbf5ef52002-01-22 11:35:50 +0000501 value=self.keyBinding.get()
502 keySet=self.customKeys.get()
503 event=self.listBindings.get(ANCHOR).split()[0]
Steven M. Gavaa498af22002-02-01 01:33:36 +0000504 if idleConf.IsCoreBinding(event):
505 #this is a core keybinding
506 self.AddChangedItem('keys',keySet,event,value)
507 else: #this is an extension key binding
508 extName=idleConf.GetExtnNameForEvent(event)
509 extKeybindSection=extName+'_cfgBindings'
510 self.AddChangedItem('extensions',extKeybindSection,event,value)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000511
Steven M. Gava052937f2002-02-11 02:20:53 +0000512 def VarChanged_builtinKeys(self,*params):
513 value=self.builtinKeys.get()
514 self.AddChangedItem('main','Keys','name',value)
515 self.LoadKeysList(value)
516
517 def VarChanged_customKeys(self,*params):
518 value=self.customKeys.get()
Steven M. Gava49745752002-02-18 01:43:11 +0000519 if value != '- no custom keys -':
520 self.AddChangedItem('main','Keys','name',value)
521 self.LoadKeysList(value)
Steven M. Gava052937f2002-02-11 02:20:53 +0000522
523 def VarChanged_keysAreBuiltin(self,*params):
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000524 value=self.keysAreBuiltin.get()
Steven M. Gava052937f2002-02-11 02:20:53 +0000525 self.AddChangedItem('main','Keys','default',value)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000526 if value:
Steven M. Gavaf31eec02002-03-05 00:25:58 +0000527 self.VarChanged_builtinKeys()
Steven M. Gava052937f2002-02-11 02:20:53 +0000528 else:
Steven M. Gavaf31eec02002-03-05 00:25:58 +0000529 self.VarChanged_customKeys()
Steven M. Gava052937f2002-02-11 02:20:53 +0000530
Steven M. Gavac112cd82002-01-22 05:56:40 +0000531 def VarChanged_winWidth(self,*params):
Steven M. Gavabbf5ef52002-01-22 11:35:50 +0000532 value=self.winWidth.get()
533 self.AddChangedItem('main','EditorWindow','width',value)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000534
535 def VarChanged_winHeight(self,*params):
Steven M. Gavabbf5ef52002-01-22 11:35:50 +0000536 value=self.winHeight.get()
537 self.AddChangedItem('main','EditorWindow','height',value)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000538
Raymond Hettinger4e49b832004-06-04 06:31:08 +0000539 def VarChanged_paraWidth(self,*params):
540 value=self.paraWidth.get()
541 self.AddChangedItem('main','FormatParagraph','paragraph',value)
542
Steven M. Gavac112cd82002-01-22 05:56:40 +0000543 def VarChanged_startupEdit(self,*params):
Steven M. Gavabbf5ef52002-01-22 11:35:50 +0000544 value=self.startupEdit.get()
545 self.AddChangedItem('main','General','editor-on-startup',value)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000546
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000547 def VarChanged_autoSave(self,*params):
548 value=self.autoSave.get()
549 self.AddChangedItem('main','General','autosave',value)
550
Kurt B. Kaisera053f332003-05-10 00:49:56 +0000551 def VarChanged_encoding(self,*params):
552 value=self.encoding.get()
553 self.AddChangedItem('main','EditorWindow','encoding',value)
554
Steven M. Gavaa498af22002-02-01 01:33:36 +0000555 def ResetChangedItems(self):
Steven M. Gavab77d3432002-03-02 07:16:21 +0000556 #When any config item is changed in this dialog, an entry
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000557 #should be made in the relevant section (config type) of this
558 #dictionary. The key should be the config file section name and the
Steven M. Gavaa498af22002-02-01 01:33:36 +0000559 #value a dictionary, whose key:value pairs are item=value pairs for
560 #that config file section.
561 self.changedItems={'main':{},'highlight':{},'keys':{},'extensions':{}}
562
Steven M. Gavac112cd82002-01-22 05:56:40 +0000563 def AddChangedItem(self,type,section,item,value):
Steven M. Gava2d7bb3f2002-01-29 08:35:29 +0000564 value=str(value) #make sure we use a string
Benjamin Peterson6e3dbbd2009-10-09 22:15:50 +0000565 if section not in self.changedItems[type]:
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000566 self.changedItems[type][section]={}
Steven M. Gavac112cd82002-01-22 05:56:40 +0000567 self.changedItems[type][section][item]=value
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000568
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000569 def GetDefaultItems(self):
570 dItems={'main':{},'highlight':{},'keys':{},'extensions':{}}
571 for configType in dItems.keys():
572 sections=idleConf.GetSectionList('default',configType)
573 for section in sections:
574 dItems[configType][section]={}
575 options=idleConf.defaultCfg[configType].GetOptionList(section)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000576 for option in options:
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000577 dItems[configType][section][option]=(
578 idleConf.defaultCfg[configType].Get(section,option))
579 return dItems
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000580
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000581 def SetThemeType(self):
582 if self.themeIsBuiltin.get():
583 self.optMenuThemeBuiltin.config(state=NORMAL)
584 self.optMenuThemeCustom.config(state=DISABLED)
585 self.buttonDeleteCustomTheme.config(state=DISABLED)
586 else:
587 self.optMenuThemeBuiltin.config(state=DISABLED)
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000588 self.radioThemeCustom.config(state=NORMAL)
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000589 self.optMenuThemeCustom.config(state=NORMAL)
590 self.buttonDeleteCustomTheme.config(state=NORMAL)
591
592 def SetKeysType(self):
Steven M. Gava052937f2002-02-11 02:20:53 +0000593 if self.keysAreBuiltin.get():
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000594 self.optMenuKeysBuiltin.config(state=NORMAL)
595 self.optMenuKeysCustom.config(state=DISABLED)
596 self.buttonDeleteCustomKeys.config(state=DISABLED)
597 else:
598 self.optMenuKeysBuiltin.config(state=DISABLED)
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000599 self.radioKeysCustom.config(state=NORMAL)
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000600 self.optMenuKeysCustom.config(state=NORMAL)
601 self.buttonDeleteCustomKeys.config(state=NORMAL)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000602
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000603 def GetNewKeys(self):
604 listIndex=self.listBindings.index(ANCHOR)
605 binding=self.listBindings.get(listIndex)
606 bindName=binding.split()[0] #first part, up to first space
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000607 if self.keysAreBuiltin.get():
Steven M. Gavae28ee752002-02-11 03:45:22 +0000608 currentKeySetName=self.builtinKeys.get()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000609 else:
Steven M. Gavae28ee752002-02-11 03:45:22 +0000610 currentKeySetName=self.customKeys.get()
611 currentBindings=idleConf.GetCurrentKeySet()
612 if currentKeySetName in self.changedItems['keys'].keys(): #unsaved changes
613 keySetChanges=self.changedItems['keys'][currentKeySetName]
614 for event in keySetChanges.keys():
615 currentBindings[event]=keySetChanges[event].split()
616 currentKeySequences=currentBindings.values()
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000617 newKeys=GetKeysDialog(self,'Get New Keys',bindName,
618 currentKeySequences).result
619 if newKeys: #new keys were specified
Steven M. Gava052937f2002-02-11 02:20:53 +0000620 if self.keysAreBuiltin.get(): #current key set is a built-in
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000621 message=('Your changes will be saved as a new Custom Key Set. '+
622 'Enter a name for your new Custom Key Set below.')
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000623 newKeySet=self.GetNewKeysName(message)
624 if not newKeySet: #user cancelled custom key set creation
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000625 self.listBindings.select_set(listIndex)
626 self.listBindings.select_anchor(listIndex)
627 return
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000628 else: #create new custom key set based on previously active key set
629 self.CreateNewKeySet(newKeySet)
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000630 self.listBindings.delete(listIndex)
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000631 self.listBindings.insert(listIndex,bindName+' - '+newKeys)
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000632 self.listBindings.select_set(listIndex)
633 self.listBindings.select_anchor(listIndex)
Steven M. Gava052937f2002-02-11 02:20:53 +0000634 self.keyBinding.set(newKeys)
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000635 else:
636 self.listBindings.select_set(listIndex)
637 self.listBindings.select_anchor(listIndex)
638
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000639 def GetNewKeysName(self,message):
Steven M. Gava49745752002-02-18 01:43:11 +0000640 usedNames=(idleConf.GetSectionList('user','keys')+
641 idleConf.GetSectionList('default','keys'))
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000642 newKeySet=GetCfgSectionNameDialog(self,'New Custom Key Set',
643 message,usedNames).result
644 return newKeySet
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000645
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000646 def SaveAsNewKeySet(self):
647 newKeysName=self.GetNewKeysName('New Key Set Name:')
648 if newKeysName:
649 self.CreateNewKeySet(newKeysName)
650
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000651 def KeyBindingSelected(self,event):
652 self.buttonNewKeys.config(state=NORMAL)
653
654 def CreateNewKeySet(self,newKeySetName):
655 #creates new custom key set based on the previously active key set,
656 #and makes the new key set active
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000657 if self.keysAreBuiltin.get():
Steven M. Gava052937f2002-02-11 02:20:53 +0000658 prevKeySetName=self.builtinKeys.get()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000659 else:
Steven M. Gava052937f2002-02-11 02:20:53 +0000660 prevKeySetName=self.customKeys.get()
Steven M. Gava052937f2002-02-11 02:20:53 +0000661 prevKeys=idleConf.GetCoreKeys(prevKeySetName)
Steven M. Gava052937f2002-02-11 02:20:53 +0000662 newKeys={}
663 for event in prevKeys.keys(): #add key set to changed items
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000664 eventName=event[2:-2] #trim off the angle brackets
Steven M. Gava052937f2002-02-11 02:20:53 +0000665 binding=string.join(prevKeys[event])
666 newKeys[eventName]=binding
Steven M. Gava052937f2002-02-11 02:20:53 +0000667 #handle any unsaved changes to prev key set
668 if prevKeySetName in self.changedItems['keys'].keys():
669 keySetChanges=self.changedItems['keys'][prevKeySetName]
670 for event in keySetChanges.keys():
671 newKeys[event]=keySetChanges[event]
Steven M. Gava052937f2002-02-11 02:20:53 +0000672 #save the new theme
673 self.SaveNewKeySet(newKeySetName,newKeys)
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000674 #change gui over to the new key set
675 customKeyList=idleConf.GetSectionList('user','keys')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000676 customKeyList.sort()
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000677 self.optMenuKeysCustom.SetMenu(customKeyList,newKeySetName)
Steven M. Gava052937f2002-02-11 02:20:53 +0000678 self.keysAreBuiltin.set(0)
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000679 self.SetKeysType()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000680
Steven M. Gava052937f2002-02-11 02:20:53 +0000681 def LoadKeysList(self,keySetName):
682 reselect=0
683 newKeySet=0
684 if self.listBindings.curselection():
685 reselect=1
686 listIndex=self.listBindings.index(ANCHOR)
Steven M. Gava052937f2002-02-11 02:20:53 +0000687 keySet=idleConf.GetKeySet(keySetName)
Steven M. Gava052937f2002-02-11 02:20:53 +0000688 bindNames=keySet.keys()
689 bindNames.sort()
690 self.listBindings.delete(0,END)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000691 for bindName in bindNames:
Steven M. Gava052937f2002-02-11 02:20:53 +0000692 key=string.join(keySet[bindName]) #make key(s) into a string
693 bindName=bindName[2:-2] #trim off the angle brackets
Steven M. Gava052937f2002-02-11 02:20:53 +0000694 if keySetName in self.changedItems['keys'].keys():
695 #handle any unsaved changes to this key set
696 if bindName in self.changedItems['keys'][keySetName].keys():
697 key=self.changedItems['keys'][keySetName][bindName]
Steven M. Gava052937f2002-02-11 02:20:53 +0000698 self.listBindings.insert(END, bindName+' - '+key)
Steven M. Gava052937f2002-02-11 02:20:53 +0000699 if reselect:
700 self.listBindings.see(listIndex)
701 self.listBindings.select_set(listIndex)
702 self.listBindings.select_anchor(listIndex)
703
Steven M. Gava49745752002-02-18 01:43:11 +0000704 def DeleteCustomKeys(self):
705 keySetName=self.customKeys.get()
706 if not tkMessageBox.askyesno('Delete Key Set','Are you sure you wish '+
Walter Dörwald70a6b492004-02-12 17:35:32 +0000707 'to delete the key set %r ?' % (keySetName),
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +0000708 parent=self):
Steven M. Gava49745752002-02-18 01:43:11 +0000709 return
710 #remove key set from config
711 idleConf.userCfg['keys'].remove_section(keySetName)
Benjamin Peterson6e3dbbd2009-10-09 22:15:50 +0000712 if keySetName in self.changedItems['keys']:
Steven M. Gava49745752002-02-18 01:43:11 +0000713 del(self.changedItems['keys'][keySetName])
714 #write changes
715 idleConf.userCfg['keys'].Save()
716 #reload user key set list
717 itemList=idleConf.GetSectionList('user','keys')
718 itemList.sort()
719 if not itemList:
720 self.radioKeysCustom.config(state=DISABLED)
721 self.optMenuKeysCustom.SetMenu(itemList,'- no custom keys -')
722 else:
723 self.optMenuKeysCustom.SetMenu(itemList,itemList[0])
724 #revert to default key set
725 self.keysAreBuiltin.set(idleConf.defaultCfg['main'].Get('Keys','default'))
726 self.builtinKeys.set(idleConf.defaultCfg['main'].Get('Keys','name'))
727 #user can't back out of these changes, they must be applied now
728 self.Apply()
729 self.SetKeysType()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000730
Steven M. Gava49745752002-02-18 01:43:11 +0000731 def DeleteCustomTheme(self):
732 themeName=self.customTheme.get()
733 if not tkMessageBox.askyesno('Delete Theme','Are you sure you wish '+
Walter Dörwald70a6b492004-02-12 17:35:32 +0000734 'to delete the theme %r ?' % (themeName,),
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +0000735 parent=self):
Steven M. Gava49745752002-02-18 01:43:11 +0000736 return
737 #remove theme from config
738 idleConf.userCfg['highlight'].remove_section(themeName)
Benjamin Peterson6e3dbbd2009-10-09 22:15:50 +0000739 if themeName in self.changedItems['highlight']:
Steven M. Gava49745752002-02-18 01:43:11 +0000740 del(self.changedItems['highlight'][themeName])
741 #write changes
742 idleConf.userCfg['highlight'].Save()
743 #reload user theme list
744 itemList=idleConf.GetSectionList('user','highlight')
745 itemList.sort()
746 if not itemList:
747 self.radioThemeCustom.config(state=DISABLED)
748 self.optMenuThemeCustom.SetMenu(itemList,'- no custom themes -')
749 else:
750 self.optMenuThemeCustom.SetMenu(itemList,itemList[0])
751 #revert to default theme
752 self.themeIsBuiltin.set(idleConf.defaultCfg['main'].Get('Theme','default'))
753 self.builtinTheme.set(idleConf.defaultCfg['main'].Get('Theme','name'))
754 #user can't back out of these changes, they must be applied now
755 self.Apply()
756 self.SetThemeType()
757
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000758 def GetColour(self):
759 target=self.highlightTarget.get()
Steven M. Gava052937f2002-02-11 02:20:53 +0000760 prevColour=self.frameColourSet.cget('bg')
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000761 rgbTuplet, colourString = tkColorChooser.askcolor(parent=self,
Steven M. Gava052937f2002-02-11 02:20:53 +0000762 title='Pick new colour for : '+target,initialcolor=prevColour)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000763 if colourString and (colourString!=prevColour):
Steven M. Gava052937f2002-02-11 02:20:53 +0000764 #user didn't cancel, and they chose a new colour
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000765 if self.themeIsBuiltin.get(): #current theme is a built-in
766 message=('Your changes will be saved as a new Custom Theme. '+
767 'Enter a name for your new Custom Theme below.')
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000768 newTheme=self.GetNewThemeName(message)
769 if not newTheme: #user cancelled custom theme creation
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000770 return
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000771 else: #create new custom theme based on previously active theme
772 self.CreateNewTheme(newTheme)
Steven M. Gava052937f2002-02-11 02:20:53 +0000773 self.colour.set(colourString)
774 else: #current theme is user defined
775 self.colour.set(colourString)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000776
Steven M. Gava052937f2002-02-11 02:20:53 +0000777 def OnNewColourSet(self):
778 newColour=self.colour.get()
779 self.frameColourSet.config(bg=newColour)#set sample
780 if self.fgHilite.get(): plane='foreground'
781 else: plane='background'
782 sampleElement=self.themeElements[self.highlightTarget.get()][0]
Raymond Hettinger931237e2003-07-09 18:48:24 +0000783 self.textHighlightSample.tag_config(sampleElement, **{plane:newColour})
Steven M. Gava052937f2002-02-11 02:20:53 +0000784 theme=self.customTheme.get()
785 themeElement=sampleElement+'-'+plane
786 self.AddChangedItem('highlight',theme,themeElement,newColour)
Steven M. Gava052937f2002-02-11 02:20:53 +0000787
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000788 def GetNewThemeName(self,message):
Steven M. Gava49745752002-02-18 01:43:11 +0000789 usedNames=(idleConf.GetSectionList('user','highlight')+
790 idleConf.GetSectionList('default','highlight'))
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000791 newTheme=GetCfgSectionNameDialog(self,'New Custom Theme',
792 message,usedNames).result
793 return newTheme
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000794
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000795 def SaveAsNewTheme(self):
796 newThemeName=self.GetNewThemeName('New Theme Name:')
797 if newThemeName:
798 self.CreateNewTheme(newThemeName)
799
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000800 def CreateNewTheme(self,newThemeName):
801 #creates new custom theme based on the previously active theme,
802 #and makes the new theme active
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000803 if self.themeIsBuiltin.get():
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000804 themeType='default'
805 themeName=self.builtinTheme.get()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000806 else:
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000807 themeType='user'
808 themeName=self.customTheme.get()
809 newTheme=idleConf.GetThemeDict(themeType,themeName)
Steven M. Gava052937f2002-02-11 02:20:53 +0000810 #apply any of the old theme's unsaved changes to the new theme
811 if themeName in self.changedItems['highlight'].keys():
812 themeChanges=self.changedItems['highlight'][themeName]
813 for element in themeChanges.keys():
814 newTheme[element]=themeChanges[element]
815 #save the new theme
816 self.SaveNewTheme(newThemeName,newTheme)
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000817 #change gui over to the new theme
818 customThemeList=idleConf.GetSectionList('user','highlight')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000819 customThemeList.sort()
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000820 self.optMenuThemeCustom.SetMenu(customThemeList,newThemeName)
821 self.themeIsBuiltin.set(0)
822 self.SetThemeType()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000823
Steven M. Gavac112cd82002-01-22 05:56:40 +0000824 def OnListFontButtonRelease(self,event):
Kurt B. Kaiser05391692003-05-26 20:35:53 +0000825 font = self.listFontName.get(ANCHOR)
826 self.fontName.set(font.lower())
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000827 self.SetFontSample()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000828
Steven M. Gavac112cd82002-01-22 05:56:40 +0000829 def SetFontSample(self,event=None):
830 fontName=self.fontName.get()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000831 if self.fontBold.get():
Steven M. Gavac112cd82002-01-22 05:56:40 +0000832 fontWeight=tkFont.BOLD
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000833 else:
Steven M. Gavac112cd82002-01-22 05:56:40 +0000834 fontWeight=tkFont.NORMAL
Terry Jan Reedy42f7b7e2012-05-26 16:55:43 -0400835 size=self.fontSize.get()
836 self.editFont.config(size=size,
Steven M. Gavac112cd82002-01-22 05:56:40 +0000837 weight=fontWeight,family=fontName)
Terry Jan Reedy42f7b7e2012-05-26 16:55:43 -0400838 self.textHighlightSample.configure(font=(fontName, size, fontWeight))
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000839
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000840 def SetHighlightTarget(self):
841 if self.highlightTarget.get()=='Cursor': #bg not possible
842 self.radioFg.config(state=DISABLED)
843 self.radioBg.config(state=DISABLED)
844 self.fgHilite.set(1)
845 else: #both fg and bg can be set
846 self.radioFg.config(state=NORMAL)
847 self.radioBg.config(state=NORMAL)
848 self.fgHilite.set(1)
849 self.SetColourSample()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000850
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000851 def SetColourSampleBinding(self,*args):
852 self.SetColourSample()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000853
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000854 def SetColourSample(self):
855 #set the colour smaple area
856 tag=self.themeElements[self.highlightTarget.get()][0]
857 if self.fgHilite.get(): plane='foreground'
858 else: plane='background'
859 colour=self.textHighlightSample.tag_cget(tag,plane)
860 self.frameColourSet.config(bg=colour)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000861
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000862 def PaintThemeSample(self):
Steven M. Gavad0342cd2001-11-04 11:53:10 +0000863 if self.themeIsBuiltin.get(): #a default theme
Steven M. Gava99300612001-11-04 07:03:08 +0000864 theme=self.builtinTheme.get()
865 else: #a user theme
866 theme=self.customTheme.get()
Steven M. Gava052937f2002-02-11 02:20:53 +0000867 for elementTitle in self.themeElements.keys():
868 element=self.themeElements[elementTitle][0]
869 colours=idleConf.GetHighlight(theme,element)
870 if element=='cursor': #cursor sample needs special painting
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000871 colours['background']=idleConf.GetHighlight(theme,
Steven M. Gava0cae01c2002-01-04 07:53:06 +0000872 'normal', fgBg='bg')
Steven M. Gava052937f2002-02-11 02:20:53 +0000873 #handle any unsaved changes to this theme
874 if theme in self.changedItems['highlight'].keys():
875 themeDict=self.changedItems['highlight'][theme]
Benjamin Peterson6e3dbbd2009-10-09 22:15:50 +0000876 if element+'-foreground' in themeDict:
Steven M. Gava052937f2002-02-11 02:20:53 +0000877 colours['foreground']=themeDict[element+'-foreground']
Benjamin Peterson6e3dbbd2009-10-09 22:15:50 +0000878 if element+'-background' in themeDict:
Steven M. Gava052937f2002-02-11 02:20:53 +0000879 colours['background']=themeDict[element+'-background']
Raymond Hettinger931237e2003-07-09 18:48:24 +0000880 self.textHighlightSample.tag_config(element, **colours)
Steven M. Gava052937f2002-02-11 02:20:53 +0000881 self.SetColourSample()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000882
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000883 def HelpSourceSelected(self,event):
884 self.SetHelpListButtonStates()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000885
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000886 def SetHelpListButtonStates(self):
887 if self.listHelp.size()<1: #no entries in list
888 self.buttonHelpListEdit.config(state=DISABLED)
889 self.buttonHelpListRemove.config(state=DISABLED)
890 else: #there are some entries
891 if self.listHelp.curselection(): #there currently is a selection
892 self.buttonHelpListEdit.config(state=NORMAL)
893 self.buttonHelpListRemove.config(state=NORMAL)
894 else: #there currently is not a selection
895 self.buttonHelpListEdit.config(state=DISABLED)
896 self.buttonHelpListRemove.config(state=DISABLED)
897
898 def HelpListItemAdd(self):
899 helpSource=GetHelpSourceDialog(self,'New Help Source').result
900 if helpSource:
901 self.userHelpList.append( (helpSource[0],helpSource[1]) )
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +0000902 self.listHelp.insert(END,helpSource[0])
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000903 self.UpdateUserHelpChangedItems()
904 self.SetHelpListButtonStates()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000905
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000906 def HelpListItemEdit(self):
907 itemIndex=self.listHelp.index(ANCHOR)
908 helpSource=self.userHelpList[itemIndex]
Steven M. Gava0c5bc8c2002-03-27 02:25:44 +0000909 newHelpSource=GetHelpSourceDialog(self,'Edit Help Source',
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000910 menuItem=helpSource[0],filePath=helpSource[1]).result
911 if (not newHelpSource) or (newHelpSource==helpSource):
912 return #no changes
913 self.userHelpList[itemIndex]=newHelpSource
914 self.listHelp.delete(itemIndex)
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +0000915 self.listHelp.insert(itemIndex,newHelpSource[0])
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000916 self.UpdateUserHelpChangedItems()
917 self.SetHelpListButtonStates()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000918
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000919 def HelpListItemRemove(self):
920 itemIndex=self.listHelp.index(ANCHOR)
921 del(self.userHelpList[itemIndex])
922 self.listHelp.delete(itemIndex)
923 self.UpdateUserHelpChangedItems()
924 self.SetHelpListButtonStates()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000925
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000926 def UpdateUserHelpChangedItems(self):
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +0000927 "Clear and rebuild the HelpFiles section in self.changedItems"
928 self.changedItems['main']['HelpFiles'] = {}
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000929 for num in range(1,len(self.userHelpList)+1):
930 self.AddChangedItem('main','HelpFiles',str(num),
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +0000931 string.join(self.userHelpList[num-1][:2],';'))
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000932
Steven M. Gava429a86a2001-10-23 10:42:12 +0000933 def LoadFontCfg(self):
934 ##base editor font selection list
Steven M. Gavac11ccf32001-09-24 09:43:17 +0000935 fonts=list(tkFont.families(self))
936 fonts.sort()
937 for font in fonts:
938 self.listFontName.insert(END,font)
Steven M. Gava485f7b62001-10-26 06:47:09 +0000939 configuredFont=idleConf.GetOption('main','EditorWindow','font',
Steven M. Gava429a86a2001-10-23 10:42:12 +0000940 default='courier')
Kurt B. Kaiser05391692003-05-26 20:35:53 +0000941 lc_configuredFont = configuredFont.lower()
942 self.fontName.set(lc_configuredFont)
943 lc_fonts = [s.lower() for s in fonts]
944 if lc_configuredFont in lc_fonts:
945 currentFontIndex = lc_fonts.index(lc_configuredFont)
Steven M. Gava429a86a2001-10-23 10:42:12 +0000946 self.listFontName.see(currentFontIndex)
947 self.listFontName.select_set(currentFontIndex)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000948 self.listFontName.select_anchor(currentFontIndex)
Steven M. Gava429a86a2001-10-23 10:42:12 +0000949 ##font size dropdown
Steven M. Gavac112cd82002-01-22 05:56:40 +0000950 fontSize=idleConf.GetOption('main','EditorWindow','font-size',
Kurt B. Kaiser05391692003-05-26 20:35:53 +0000951 default='10')
Chui Teya178cff2002-11-04 03:17:45 +0000952 self.optMenuFontSize.SetMenu(('7','8','9','10','11','12','13','14',
Steven M. Gava485f7b62001-10-26 06:47:09 +0000953 '16','18','20','22'),fontSize )
Steven M. Gavac112cd82002-01-22 05:56:40 +0000954 ##fontWeight
955 self.fontBold.set(idleConf.GetOption('main','EditorWindow',
956 'font-bold',default=0,type='bool'))
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000957 ##font sample
Steven M. Gava429a86a2001-10-23 10:42:12 +0000958 self.SetFontSample()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000959
Steven M. Gava429a86a2001-10-23 10:42:12 +0000960 def LoadTabCfg(self):
Steven M. Gava429a86a2001-10-23 10:42:12 +0000961 ##indent sizes
Steven M. Gava485f7b62001-10-26 06:47:09 +0000962 spaceNum=idleConf.GetOption('main','Indent','num-spaces',
Steven M. Gava429a86a2001-10-23 10:42:12 +0000963 default=4,type='int')
Steven M. Gava429a86a2001-10-23 10:42:12 +0000964 self.spaceNum.set(spaceNum)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000965
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000966 def LoadThemeCfg(self):
Steven M. Gava41a85322001-10-29 08:05:34 +0000967 ##current theme type radiobutton
Steven M. Gavad0342cd2001-11-04 11:53:10 +0000968 self.themeIsBuiltin.set(idleConf.GetOption('main','Theme','default',
Steven M. Gavac112cd82002-01-22 05:56:40 +0000969 type='bool',default=1))
Steven M. Gava41a85322001-10-29 08:05:34 +0000970 ##currently set theme
Steven M. Gavaad4f5322002-01-03 12:05:17 +0000971 currentOption=idleConf.CurrentTheme()
Steven M. Gava7c017862001-10-29 11:19:46 +0000972 ##load available theme option menus
Steven M. Gavad0342cd2001-11-04 11:53:10 +0000973 if self.themeIsBuiltin.get(): #default theme selected
Steven M. Gava41a85322001-10-29 08:05:34 +0000974 itemList=idleConf.GetSectionList('default','highlight')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000975 itemList.sort()
Steven M. Gava41a85322001-10-29 08:05:34 +0000976 self.optMenuThemeBuiltin.SetMenu(itemList,currentOption)
977 itemList=idleConf.GetSectionList('user','highlight')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000978 itemList.sort()
Steven M. Gava41a85322001-10-29 08:05:34 +0000979 if not itemList:
980 self.radioThemeCustom.config(state=DISABLED)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000981 self.customTheme.set('- no custom themes -')
Steven M. Gava41a85322001-10-29 08:05:34 +0000982 else:
983 self.optMenuThemeCustom.SetMenu(itemList,itemList[0])
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000984 else: #user theme selected
Steven M. Gava41a85322001-10-29 08:05:34 +0000985 itemList=idleConf.GetSectionList('user','highlight')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000986 itemList.sort()
Steven M. Gava41a85322001-10-29 08:05:34 +0000987 self.optMenuThemeCustom.SetMenu(itemList,currentOption)
988 itemList=idleConf.GetSectionList('default','highlight')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000989 itemList.sort()
Steven M. Gava41a85322001-10-29 08:05:34 +0000990 self.optMenuThemeBuiltin.SetMenu(itemList,itemList[0])
Steven M. Gava7c017862001-10-29 11:19:46 +0000991 self.SetThemeType()
992 ##load theme element option menu
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000993 themeNames=self.themeElements.keys()
Florent Xiclunaa7f242f2010-04-02 08:15:26 +0000994 themeNames.sort(key=lambda x: self.themeElements[x][1])
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000995 self.optMenuHighlightTarget.SetMenu(themeNames,themeNames[0])
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000996 self.PaintThemeSample()
Steven M. Gava0cae01c2002-01-04 07:53:06 +0000997 self.SetHighlightTarget()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000998
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000999 def LoadKeyCfg(self):
Steven M. Gava41a85322001-10-29 08:05:34 +00001000 ##current keys type radiobutton
Steven M. Gava052937f2002-02-11 02:20:53 +00001001 self.keysAreBuiltin.set(idleConf.GetOption('main','Keys','default',
Steven M. Gavac112cd82002-01-22 05:56:40 +00001002 type='bool',default=1))
Steven M. Gava41a85322001-10-29 08:05:34 +00001003 ##currently set keys
Steven M. Gavaad4f5322002-01-03 12:05:17 +00001004 currentOption=idleConf.CurrentKeys()
Steven M. Gava7c017862001-10-29 11:19:46 +00001005 ##load available keyset option menus
Steven M. Gava052937f2002-02-11 02:20:53 +00001006 if self.keysAreBuiltin.get(): #default theme selected
Steven M. Gava41a85322001-10-29 08:05:34 +00001007 itemList=idleConf.GetSectionList('default','keys')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +00001008 itemList.sort()
Steven M. Gava41a85322001-10-29 08:05:34 +00001009 self.optMenuKeysBuiltin.SetMenu(itemList,currentOption)
1010 itemList=idleConf.GetSectionList('user','keys')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +00001011 itemList.sort()
Steven M. Gava41a85322001-10-29 08:05:34 +00001012 if not itemList:
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001013 self.radioKeysCustom.config(state=DISABLED)
1014 self.customKeys.set('- no custom keys -')
Steven M. Gava41a85322001-10-29 08:05:34 +00001015 else:
1016 self.optMenuKeysCustom.SetMenu(itemList,itemList[0])
Steven M. Gavaa498af22002-02-01 01:33:36 +00001017 else: #user key set selected
Steven M. Gava41a85322001-10-29 08:05:34 +00001018 itemList=idleConf.GetSectionList('user','keys')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +00001019 itemList.sort()
Steven M. Gava41a85322001-10-29 08:05:34 +00001020 self.optMenuKeysCustom.SetMenu(itemList,currentOption)
1021 itemList=idleConf.GetSectionList('default','keys')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +00001022 itemList.sort()
Steven M. Gava41a85322001-10-29 08:05:34 +00001023 self.optMenuKeysBuiltin.SetMenu(itemList,itemList[0])
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001024 self.SetKeysType()
Steven M. Gavafacfc092002-01-19 00:29:54 +00001025 ##load keyset element list
Steven M. Gava052937f2002-02-11 02:20:53 +00001026 keySetName=idleConf.CurrentKeys()
1027 self.LoadKeysList(keySetName)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001028
Steven M. Gavafacfc092002-01-19 00:29:54 +00001029 def LoadGeneralCfg(self):
Steven M. Gava5f28e8f2002-01-21 06:38:21 +00001030 #startup state
1031 self.startupEdit.set(idleConf.GetOption('main','General',
1032 'editor-on-startup',default=1,type='bool'))
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +00001033 #autosave state
1034 self.autoSave.set(idleConf.GetOption('main', 'General', 'autosave',
1035 default=0, type='bool'))
Steven M. Gavafacfc092002-01-19 00:29:54 +00001036 #initial window size
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001037 self.winWidth.set(idleConf.GetOption('main','EditorWindow','width'))
Steven M. Gavafacfc092002-01-19 00:29:54 +00001038 self.winHeight.set(idleConf.GetOption('main','EditorWindow','height'))
Raymond Hettinger4e49b832004-06-04 06:31:08 +00001039 #initial paragraph reformat size
1040 self.paraWidth.set(idleConf.GetOption('main','FormatParagraph','paragraph'))
Kurt B. Kaisera053f332003-05-10 00:49:56 +00001041 # default source encoding
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +00001042 self.encoding.set(idleConf.GetOption('main', 'EditorWindow',
1043 'encoding', default='none'))
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +00001044 # additional help sources
1045 self.userHelpList = idleConf.GetAllExtraHelpSourcesList()
Steven M. Gava085eb1b2002-02-05 04:52:32 +00001046 for helpItem in self.userHelpList:
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +00001047 self.listHelp.insert(END,helpItem[0])
Steven M. Gava085eb1b2002-02-05 04:52:32 +00001048 self.SetHelpListButtonStates()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001049
Steven M. Gava429a86a2001-10-23 10:42:12 +00001050 def LoadConfigs(self):
1051 """
1052 load configuration from default and user config files and populate
1053 the widgets on the config dialog pages.
1054 """
1055 ### fonts / tabs page
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001056 self.LoadFontCfg()
1057 self.LoadTabCfg()
Steven M. Gava429a86a2001-10-23 10:42:12 +00001058 ### highlighting page
Steven M. Gava9dd16b32001-11-03 14:54:25 +00001059 self.LoadThemeCfg()
Steven M. Gava429a86a2001-10-23 10:42:12 +00001060 ### keys page
Steven M. Gava9dd16b32001-11-03 14:54:25 +00001061 self.LoadKeyCfg()
Steven M. Gava429a86a2001-10-23 10:42:12 +00001062 ### general page
Steven M. Gavafacfc092002-01-19 00:29:54 +00001063 self.LoadGeneralCfg()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001064
Steven M. Gava052937f2002-02-11 02:20:53 +00001065 def SaveNewKeySet(self,keySetName,keySet):
1066 """
1067 save a newly created core key set.
1068 keySetName - string, the name of the new key set
1069 keySet - dictionary containing the new key set
1070 """
1071 if not idleConf.userCfg['keys'].has_section(keySetName):
1072 idleConf.userCfg['keys'].add_section(keySetName)
1073 for event in keySet.keys():
1074 value=keySet[event]
1075 idleConf.userCfg['keys'].SetOption(keySetName,event,value)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001076
Steven M. Gava052937f2002-02-11 02:20:53 +00001077 def SaveNewTheme(self,themeName,theme):
1078 """
1079 save a newly created theme.
1080 themeName - string, the name of the new theme
1081 theme - dictionary containing the new theme
1082 """
1083 if not idleConf.userCfg['highlight'].has_section(themeName):
1084 idleConf.userCfg['highlight'].add_section(themeName)
1085 for element in theme.keys():
1086 value=theme[element]
1087 idleConf.userCfg['highlight'].SetOption(themeName,element,value)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001088
Steven M. Gava2d7bb3f2002-01-29 08:35:29 +00001089 def SetUserValue(self,configType,section,item,value):
Steven M. Gava2d7bb3f2002-01-29 08:35:29 +00001090 if idleConf.defaultCfg[configType].has_option(section,item):
1091 if idleConf.defaultCfg[configType].Get(section,item)==value:
1092 #the setting equals a default setting, remove it from user cfg
1093 return idleConf.userCfg[configType].RemoveOption(section,item)
1094 #if we got here set the option
1095 return idleConf.userCfg[configType].SetOption(section,item,value)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001096
Steven M. Gava052937f2002-02-11 02:20:53 +00001097 def SaveAllChangedConfigs(self):
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +00001098 "Save configuration changes to the user config file."
Steven M. Gava0c5bc8c2002-03-27 02:25:44 +00001099 idleConf.userCfg['main'].Save()
Steven M. Gava5f28e8f2002-01-21 06:38:21 +00001100 for configType in self.changedItems.keys():
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +00001101 cfgTypeHasChanges = False
Steven M. Gava5f28e8f2002-01-21 06:38:21 +00001102 for section in self.changedItems[configType].keys():
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +00001103 if section == 'HelpFiles':
1104 #this section gets completely replaced
1105 idleConf.userCfg['main'].remove_section('HelpFiles')
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +00001106 cfgTypeHasChanges = True
Steven M. Gava5f28e8f2002-01-21 06:38:21 +00001107 for item in self.changedItems[configType][section].keys():
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +00001108 value = self.changedItems[configType][section][item]
Steven M. Gava2d7bb3f2002-01-29 08:35:29 +00001109 if self.SetUserValue(configType,section,item,value):
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +00001110 cfgTypeHasChanges = True
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001111 if cfgTypeHasChanges:
1112 idleConf.userCfg[configType].Save()
Kurt B. Kaiser5acdf932004-11-16 21:28:36 +00001113 for configType in ['keys', 'highlight']:
1114 # save these even if unchanged!
1115 idleConf.userCfg[configType].Save()
Steven M. Gavaa498af22002-02-01 01:33:36 +00001116 self.ResetChangedItems() #clear the changed items dict
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001117
Kurt B. Kaiserb1754452005-11-18 22:05:48 +00001118 def DeactivateCurrentConfig(self):
1119 #Before a config is saved, some cleanup of current
1120 #config must be done - remove the previous keybindings
1121 winInstances=self.parent.instance_dict.keys()
1122 for instance in winInstances:
1123 instance.RemoveKeybindings()
1124
Steven M. Gava49745752002-02-18 01:43:11 +00001125 def ActivateConfigChanges(self):
Kurt B. Kaiseracdef852005-01-31 03:34:26 +00001126 "Dynamically apply configuration changes"
Kurt B. Kaisercf6f1b62004-04-11 03:16:07 +00001127 winInstances=self.parent.instance_dict.keys()
Steven M. Gavab77d3432002-03-02 07:16:21 +00001128 for instance in winInstances:
1129 instance.ResetColorizer()
Steven M. Gavab1585412002-03-12 00:21:56 +00001130 instance.ResetFont()
Kurt B. Kaiseracdef852005-01-31 03:34:26 +00001131 instance.set_notabs_indentwidth()
Kurt B. Kaiserb1754452005-11-18 22:05:48 +00001132 instance.ApplyKeybindings()
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +00001133 instance.reset_help_menu_entries()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001134
Steven M. Gava5f28e8f2002-01-21 06:38:21 +00001135 def Cancel(self):
1136 self.destroy()
1137
1138 def Ok(self):
1139 self.Apply()
1140 self.destroy()
1141
1142 def Apply(self):
Kurt B. Kaiserb1754452005-11-18 22:05:48 +00001143 self.DeactivateCurrentConfig()
Steven M. Gava052937f2002-02-11 02:20:53 +00001144 self.SaveAllChangedConfigs()
Steven M. Gava49745752002-02-18 01:43:11 +00001145 self.ActivateConfigChanges()
Steven M. Gava5f28e8f2002-01-21 06:38:21 +00001146
1147 def Help(self):
Steven M. Gavac11ccf32001-09-24 09:43:17 +00001148 pass
1149
Steven M. Gava44d3d1a2001-07-31 06:59:02 +00001150if __name__ == '__main__':
Steven M. Gavad721c482001-07-31 10:46:53 +00001151 #test the dialog
1152 root=Tk()
1153 Button(root,text='Dialog',
Steven M. Gava3b55a892001-11-21 05:56:26 +00001154 command=lambda:ConfigDialog(root,'Settings')).pack()
Kurt B. Kaisercf6f1b62004-04-11 03:16:07 +00001155 root.instance_dict={}
Steven M. Gavad721c482001-07-31 10:46:53 +00001156 root.mainloop()