blob: dbaedc76c393fccfc6a96b0ff586b6300393d7ad [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,
Steven M. Gavab77d3432002-03-02 07:16:21 +0000186 font=('courier',12,''),cursor='hand2',width=21,height=10,
187 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
835 self.editFont.config(size=self.fontSize.get(),
836 weight=fontWeight,family=fontName)
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000837
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000838 def SetHighlightTarget(self):
839 if self.highlightTarget.get()=='Cursor': #bg not possible
840 self.radioFg.config(state=DISABLED)
841 self.radioBg.config(state=DISABLED)
842 self.fgHilite.set(1)
843 else: #both fg and bg can be set
844 self.radioFg.config(state=NORMAL)
845 self.radioBg.config(state=NORMAL)
846 self.fgHilite.set(1)
847 self.SetColourSample()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000848
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000849 def SetColourSampleBinding(self,*args):
850 self.SetColourSample()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000851
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000852 def SetColourSample(self):
853 #set the colour smaple area
854 tag=self.themeElements[self.highlightTarget.get()][0]
855 if self.fgHilite.get(): plane='foreground'
856 else: plane='background'
857 colour=self.textHighlightSample.tag_cget(tag,plane)
858 self.frameColourSet.config(bg=colour)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000859
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000860 def PaintThemeSample(self):
Steven M. Gavad0342cd2001-11-04 11:53:10 +0000861 if self.themeIsBuiltin.get(): #a default theme
Steven M. Gava99300612001-11-04 07:03:08 +0000862 theme=self.builtinTheme.get()
863 else: #a user theme
864 theme=self.customTheme.get()
Steven M. Gava052937f2002-02-11 02:20:53 +0000865 for elementTitle in self.themeElements.keys():
866 element=self.themeElements[elementTitle][0]
867 colours=idleConf.GetHighlight(theme,element)
868 if element=='cursor': #cursor sample needs special painting
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000869 colours['background']=idleConf.GetHighlight(theme,
Steven M. Gava0cae01c2002-01-04 07:53:06 +0000870 'normal', fgBg='bg')
Steven M. Gava052937f2002-02-11 02:20:53 +0000871 #handle any unsaved changes to this theme
872 if theme in self.changedItems['highlight'].keys():
873 themeDict=self.changedItems['highlight'][theme]
Benjamin Peterson6e3dbbd2009-10-09 22:15:50 +0000874 if element+'-foreground' in themeDict:
Steven M. Gava052937f2002-02-11 02:20:53 +0000875 colours['foreground']=themeDict[element+'-foreground']
Benjamin Peterson6e3dbbd2009-10-09 22:15:50 +0000876 if element+'-background' in themeDict:
Steven M. Gava052937f2002-02-11 02:20:53 +0000877 colours['background']=themeDict[element+'-background']
Raymond Hettinger931237e2003-07-09 18:48:24 +0000878 self.textHighlightSample.tag_config(element, **colours)
Steven M. Gava052937f2002-02-11 02:20:53 +0000879 self.SetColourSample()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000880
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000881 def HelpSourceSelected(self,event):
882 self.SetHelpListButtonStates()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000883
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000884 def SetHelpListButtonStates(self):
885 if self.listHelp.size()<1: #no entries in list
886 self.buttonHelpListEdit.config(state=DISABLED)
887 self.buttonHelpListRemove.config(state=DISABLED)
888 else: #there are some entries
889 if self.listHelp.curselection(): #there currently is a selection
890 self.buttonHelpListEdit.config(state=NORMAL)
891 self.buttonHelpListRemove.config(state=NORMAL)
892 else: #there currently is not a selection
893 self.buttonHelpListEdit.config(state=DISABLED)
894 self.buttonHelpListRemove.config(state=DISABLED)
895
896 def HelpListItemAdd(self):
897 helpSource=GetHelpSourceDialog(self,'New Help Source').result
898 if helpSource:
899 self.userHelpList.append( (helpSource[0],helpSource[1]) )
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +0000900 self.listHelp.insert(END,helpSource[0])
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000901 self.UpdateUserHelpChangedItems()
902 self.SetHelpListButtonStates()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000903
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000904 def HelpListItemEdit(self):
905 itemIndex=self.listHelp.index(ANCHOR)
906 helpSource=self.userHelpList[itemIndex]
Steven M. Gava0c5bc8c2002-03-27 02:25:44 +0000907 newHelpSource=GetHelpSourceDialog(self,'Edit Help Source',
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000908 menuItem=helpSource[0],filePath=helpSource[1]).result
909 if (not newHelpSource) or (newHelpSource==helpSource):
910 return #no changes
911 self.userHelpList[itemIndex]=newHelpSource
912 self.listHelp.delete(itemIndex)
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +0000913 self.listHelp.insert(itemIndex,newHelpSource[0])
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000914 self.UpdateUserHelpChangedItems()
915 self.SetHelpListButtonStates()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000916
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000917 def HelpListItemRemove(self):
918 itemIndex=self.listHelp.index(ANCHOR)
919 del(self.userHelpList[itemIndex])
920 self.listHelp.delete(itemIndex)
921 self.UpdateUserHelpChangedItems()
922 self.SetHelpListButtonStates()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000923
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000924 def UpdateUserHelpChangedItems(self):
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +0000925 "Clear and rebuild the HelpFiles section in self.changedItems"
926 self.changedItems['main']['HelpFiles'] = {}
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000927 for num in range(1,len(self.userHelpList)+1):
928 self.AddChangedItem('main','HelpFiles',str(num),
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +0000929 string.join(self.userHelpList[num-1][:2],';'))
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000930
Steven M. Gava429a86a2001-10-23 10:42:12 +0000931 def LoadFontCfg(self):
932 ##base editor font selection list
Steven M. Gavac11ccf32001-09-24 09:43:17 +0000933 fonts=list(tkFont.families(self))
934 fonts.sort()
935 for font in fonts:
936 self.listFontName.insert(END,font)
Steven M. Gava485f7b62001-10-26 06:47:09 +0000937 configuredFont=idleConf.GetOption('main','EditorWindow','font',
Steven M. Gava429a86a2001-10-23 10:42:12 +0000938 default='courier')
Kurt B. Kaiser05391692003-05-26 20:35:53 +0000939 lc_configuredFont = configuredFont.lower()
940 self.fontName.set(lc_configuredFont)
941 lc_fonts = [s.lower() for s in fonts]
942 if lc_configuredFont in lc_fonts:
943 currentFontIndex = lc_fonts.index(lc_configuredFont)
Steven M. Gava429a86a2001-10-23 10:42:12 +0000944 self.listFontName.see(currentFontIndex)
945 self.listFontName.select_set(currentFontIndex)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000946 self.listFontName.select_anchor(currentFontIndex)
Steven M. Gava429a86a2001-10-23 10:42:12 +0000947 ##font size dropdown
Steven M. Gavac112cd82002-01-22 05:56:40 +0000948 fontSize=idleConf.GetOption('main','EditorWindow','font-size',
Kurt B. Kaiser05391692003-05-26 20:35:53 +0000949 default='10')
Chui Teya178cff2002-11-04 03:17:45 +0000950 self.optMenuFontSize.SetMenu(('7','8','9','10','11','12','13','14',
Steven M. Gava485f7b62001-10-26 06:47:09 +0000951 '16','18','20','22'),fontSize )
Steven M. Gavac112cd82002-01-22 05:56:40 +0000952 ##fontWeight
953 self.fontBold.set(idleConf.GetOption('main','EditorWindow',
954 'font-bold',default=0,type='bool'))
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000955 ##font sample
Steven M. Gava429a86a2001-10-23 10:42:12 +0000956 self.SetFontSample()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000957
Steven M. Gava429a86a2001-10-23 10:42:12 +0000958 def LoadTabCfg(self):
Steven M. Gava429a86a2001-10-23 10:42:12 +0000959 ##indent sizes
Steven M. Gava485f7b62001-10-26 06:47:09 +0000960 spaceNum=idleConf.GetOption('main','Indent','num-spaces',
Steven M. Gava429a86a2001-10-23 10:42:12 +0000961 default=4,type='int')
Steven M. Gava429a86a2001-10-23 10:42:12 +0000962 self.spaceNum.set(spaceNum)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000963
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000964 def LoadThemeCfg(self):
Steven M. Gava41a85322001-10-29 08:05:34 +0000965 ##current theme type radiobutton
Steven M. Gavad0342cd2001-11-04 11:53:10 +0000966 self.themeIsBuiltin.set(idleConf.GetOption('main','Theme','default',
Steven M. Gavac112cd82002-01-22 05:56:40 +0000967 type='bool',default=1))
Steven M. Gava41a85322001-10-29 08:05:34 +0000968 ##currently set theme
Steven M. Gavaad4f5322002-01-03 12:05:17 +0000969 currentOption=idleConf.CurrentTheme()
Steven M. Gava7c017862001-10-29 11:19:46 +0000970 ##load available theme option menus
Steven M. Gavad0342cd2001-11-04 11:53:10 +0000971 if self.themeIsBuiltin.get(): #default theme selected
Steven M. Gava41a85322001-10-29 08:05:34 +0000972 itemList=idleConf.GetSectionList('default','highlight')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000973 itemList.sort()
Steven M. Gava41a85322001-10-29 08:05:34 +0000974 self.optMenuThemeBuiltin.SetMenu(itemList,currentOption)
975 itemList=idleConf.GetSectionList('user','highlight')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000976 itemList.sort()
Steven M. Gava41a85322001-10-29 08:05:34 +0000977 if not itemList:
978 self.radioThemeCustom.config(state=DISABLED)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000979 self.customTheme.set('- no custom themes -')
Steven M. Gava41a85322001-10-29 08:05:34 +0000980 else:
981 self.optMenuThemeCustom.SetMenu(itemList,itemList[0])
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000982 else: #user theme selected
Steven M. Gava41a85322001-10-29 08:05:34 +0000983 itemList=idleConf.GetSectionList('user','highlight')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000984 itemList.sort()
Steven M. Gava41a85322001-10-29 08:05:34 +0000985 self.optMenuThemeCustom.SetMenu(itemList,currentOption)
986 itemList=idleConf.GetSectionList('default','highlight')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000987 itemList.sort()
Steven M. Gava41a85322001-10-29 08:05:34 +0000988 self.optMenuThemeBuiltin.SetMenu(itemList,itemList[0])
Steven M. Gava7c017862001-10-29 11:19:46 +0000989 self.SetThemeType()
990 ##load theme element option menu
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000991 themeNames=self.themeElements.keys()
Florent Xiclunaa7f242f2010-04-02 08:15:26 +0000992 themeNames.sort(key=lambda x: self.themeElements[x][1])
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000993 self.optMenuHighlightTarget.SetMenu(themeNames,themeNames[0])
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000994 self.PaintThemeSample()
Steven M. Gava0cae01c2002-01-04 07:53:06 +0000995 self.SetHighlightTarget()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000996
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000997 def LoadKeyCfg(self):
Steven M. Gava41a85322001-10-29 08:05:34 +0000998 ##current keys type radiobutton
Steven M. Gava052937f2002-02-11 02:20:53 +0000999 self.keysAreBuiltin.set(idleConf.GetOption('main','Keys','default',
Steven M. Gavac112cd82002-01-22 05:56:40 +00001000 type='bool',default=1))
Steven M. Gava41a85322001-10-29 08:05:34 +00001001 ##currently set keys
Steven M. Gavaad4f5322002-01-03 12:05:17 +00001002 currentOption=idleConf.CurrentKeys()
Steven M. Gava7c017862001-10-29 11:19:46 +00001003 ##load available keyset option menus
Steven M. Gava052937f2002-02-11 02:20:53 +00001004 if self.keysAreBuiltin.get(): #default theme selected
Steven M. Gava41a85322001-10-29 08:05:34 +00001005 itemList=idleConf.GetSectionList('default','keys')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +00001006 itemList.sort()
Steven M. Gava41a85322001-10-29 08:05:34 +00001007 self.optMenuKeysBuiltin.SetMenu(itemList,currentOption)
1008 itemList=idleConf.GetSectionList('user','keys')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +00001009 itemList.sort()
Steven M. Gava41a85322001-10-29 08:05:34 +00001010 if not itemList:
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001011 self.radioKeysCustom.config(state=DISABLED)
1012 self.customKeys.set('- no custom keys -')
Steven M. Gava41a85322001-10-29 08:05:34 +00001013 else:
1014 self.optMenuKeysCustom.SetMenu(itemList,itemList[0])
Steven M. Gavaa498af22002-02-01 01:33:36 +00001015 else: #user key set selected
Steven M. Gava41a85322001-10-29 08:05:34 +00001016 itemList=idleConf.GetSectionList('user','keys')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +00001017 itemList.sort()
Steven M. Gava41a85322001-10-29 08:05:34 +00001018 self.optMenuKeysCustom.SetMenu(itemList,currentOption)
1019 itemList=idleConf.GetSectionList('default','keys')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +00001020 itemList.sort()
Steven M. Gava41a85322001-10-29 08:05:34 +00001021 self.optMenuKeysBuiltin.SetMenu(itemList,itemList[0])
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001022 self.SetKeysType()
Steven M. Gavafacfc092002-01-19 00:29:54 +00001023 ##load keyset element list
Steven M. Gava052937f2002-02-11 02:20:53 +00001024 keySetName=idleConf.CurrentKeys()
1025 self.LoadKeysList(keySetName)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001026
Steven M. Gavafacfc092002-01-19 00:29:54 +00001027 def LoadGeneralCfg(self):
Steven M. Gava5f28e8f2002-01-21 06:38:21 +00001028 #startup state
1029 self.startupEdit.set(idleConf.GetOption('main','General',
1030 'editor-on-startup',default=1,type='bool'))
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +00001031 #autosave state
1032 self.autoSave.set(idleConf.GetOption('main', 'General', 'autosave',
1033 default=0, type='bool'))
Steven M. Gavafacfc092002-01-19 00:29:54 +00001034 #initial window size
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001035 self.winWidth.set(idleConf.GetOption('main','EditorWindow','width'))
Steven M. Gavafacfc092002-01-19 00:29:54 +00001036 self.winHeight.set(idleConf.GetOption('main','EditorWindow','height'))
Raymond Hettinger4e49b832004-06-04 06:31:08 +00001037 #initial paragraph reformat size
1038 self.paraWidth.set(idleConf.GetOption('main','FormatParagraph','paragraph'))
Kurt B. Kaisera053f332003-05-10 00:49:56 +00001039 # default source encoding
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +00001040 self.encoding.set(idleConf.GetOption('main', 'EditorWindow',
1041 'encoding', default='none'))
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +00001042 # additional help sources
1043 self.userHelpList = idleConf.GetAllExtraHelpSourcesList()
Steven M. Gava085eb1b2002-02-05 04:52:32 +00001044 for helpItem in self.userHelpList:
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +00001045 self.listHelp.insert(END,helpItem[0])
Steven M. Gava085eb1b2002-02-05 04:52:32 +00001046 self.SetHelpListButtonStates()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001047
Steven M. Gava429a86a2001-10-23 10:42:12 +00001048 def LoadConfigs(self):
1049 """
1050 load configuration from default and user config files and populate
1051 the widgets on the config dialog pages.
1052 """
1053 ### fonts / tabs page
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001054 self.LoadFontCfg()
1055 self.LoadTabCfg()
Steven M. Gava429a86a2001-10-23 10:42:12 +00001056 ### highlighting page
Steven M. Gava9dd16b32001-11-03 14:54:25 +00001057 self.LoadThemeCfg()
Steven M. Gava429a86a2001-10-23 10:42:12 +00001058 ### keys page
Steven M. Gava9dd16b32001-11-03 14:54:25 +00001059 self.LoadKeyCfg()
Steven M. Gava429a86a2001-10-23 10:42:12 +00001060 ### general page
Steven M. Gavafacfc092002-01-19 00:29:54 +00001061 self.LoadGeneralCfg()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001062
Steven M. Gava052937f2002-02-11 02:20:53 +00001063 def SaveNewKeySet(self,keySetName,keySet):
1064 """
1065 save a newly created core key set.
1066 keySetName - string, the name of the new key set
1067 keySet - dictionary containing the new key set
1068 """
1069 if not idleConf.userCfg['keys'].has_section(keySetName):
1070 idleConf.userCfg['keys'].add_section(keySetName)
1071 for event in keySet.keys():
1072 value=keySet[event]
1073 idleConf.userCfg['keys'].SetOption(keySetName,event,value)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001074
Steven M. Gava052937f2002-02-11 02:20:53 +00001075 def SaveNewTheme(self,themeName,theme):
1076 """
1077 save a newly created theme.
1078 themeName - string, the name of the new theme
1079 theme - dictionary containing the new theme
1080 """
1081 if not idleConf.userCfg['highlight'].has_section(themeName):
1082 idleConf.userCfg['highlight'].add_section(themeName)
1083 for element in theme.keys():
1084 value=theme[element]
1085 idleConf.userCfg['highlight'].SetOption(themeName,element,value)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001086
Steven M. Gava2d7bb3f2002-01-29 08:35:29 +00001087 def SetUserValue(self,configType,section,item,value):
Steven M. Gava2d7bb3f2002-01-29 08:35:29 +00001088 if idleConf.defaultCfg[configType].has_option(section,item):
1089 if idleConf.defaultCfg[configType].Get(section,item)==value:
1090 #the setting equals a default setting, remove it from user cfg
1091 return idleConf.userCfg[configType].RemoveOption(section,item)
1092 #if we got here set the option
1093 return idleConf.userCfg[configType].SetOption(section,item,value)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001094
Steven M. Gava052937f2002-02-11 02:20:53 +00001095 def SaveAllChangedConfigs(self):
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +00001096 "Save configuration changes to the user config file."
Steven M. Gava0c5bc8c2002-03-27 02:25:44 +00001097 idleConf.userCfg['main'].Save()
Steven M. Gava5f28e8f2002-01-21 06:38:21 +00001098 for configType in self.changedItems.keys():
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +00001099 cfgTypeHasChanges = False
Steven M. Gava5f28e8f2002-01-21 06:38:21 +00001100 for section in self.changedItems[configType].keys():
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +00001101 if section == 'HelpFiles':
1102 #this section gets completely replaced
1103 idleConf.userCfg['main'].remove_section('HelpFiles')
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +00001104 cfgTypeHasChanges = True
Steven M. Gava5f28e8f2002-01-21 06:38:21 +00001105 for item in self.changedItems[configType][section].keys():
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +00001106 value = self.changedItems[configType][section][item]
Steven M. Gava2d7bb3f2002-01-29 08:35:29 +00001107 if self.SetUserValue(configType,section,item,value):
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +00001108 cfgTypeHasChanges = True
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001109 if cfgTypeHasChanges:
1110 idleConf.userCfg[configType].Save()
Kurt B. Kaiser5acdf932004-11-16 21:28:36 +00001111 for configType in ['keys', 'highlight']:
1112 # save these even if unchanged!
1113 idleConf.userCfg[configType].Save()
Steven M. Gavaa498af22002-02-01 01:33:36 +00001114 self.ResetChangedItems() #clear the changed items dict
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001115
Kurt B. Kaiserb1754452005-11-18 22:05:48 +00001116 def DeactivateCurrentConfig(self):
1117 #Before a config is saved, some cleanup of current
1118 #config must be done - remove the previous keybindings
1119 winInstances=self.parent.instance_dict.keys()
1120 for instance in winInstances:
1121 instance.RemoveKeybindings()
1122
Steven M. Gava49745752002-02-18 01:43:11 +00001123 def ActivateConfigChanges(self):
Kurt B. Kaiseracdef852005-01-31 03:34:26 +00001124 "Dynamically apply configuration changes"
Kurt B. Kaisercf6f1b62004-04-11 03:16:07 +00001125 winInstances=self.parent.instance_dict.keys()
Steven M. Gavab77d3432002-03-02 07:16:21 +00001126 for instance in winInstances:
1127 instance.ResetColorizer()
Steven M. Gavab1585412002-03-12 00:21:56 +00001128 instance.ResetFont()
Kurt B. Kaiseracdef852005-01-31 03:34:26 +00001129 instance.set_notabs_indentwidth()
Kurt B. Kaiserb1754452005-11-18 22:05:48 +00001130 instance.ApplyKeybindings()
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +00001131 instance.reset_help_menu_entries()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001132
Steven M. Gava5f28e8f2002-01-21 06:38:21 +00001133 def Cancel(self):
1134 self.destroy()
1135
1136 def Ok(self):
1137 self.Apply()
1138 self.destroy()
1139
1140 def Apply(self):
Kurt B. Kaiserb1754452005-11-18 22:05:48 +00001141 self.DeactivateCurrentConfig()
Steven M. Gava052937f2002-02-11 02:20:53 +00001142 self.SaveAllChangedConfigs()
Steven M. Gava49745752002-02-18 01:43:11 +00001143 self.ActivateConfigChanges()
Steven M. Gava5f28e8f2002-01-21 06:38:21 +00001144
1145 def Help(self):
Steven M. Gavac11ccf32001-09-24 09:43:17 +00001146 pass
1147
Steven M. Gava44d3d1a2001-07-31 06:59:02 +00001148if __name__ == '__main__':
Steven M. Gavad721c482001-07-31 10:46:53 +00001149 #test the dialog
1150 root=Tk()
1151 Button(root,text='Dialog',
Steven M. Gava3b55a892001-11-21 05:56:26 +00001152 command=lambda:ConfigDialog(root,'Settings')).pack()
Kurt B. Kaisercf6f1b62004-04-11 03:16:07 +00001153 root.instance_dict={}
Steven M. Gavad721c482001-07-31 10:46:53 +00001154 root.mainloop()