blob: 267ed93c53fd416d306d854a81476f9725c27338 [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
Terry Jan Reedy1d9b9212014-01-26 22:24:17 -050081# Comment out button creation and packing until implement self.Help
82## self.buttonHelp = Button(frameActionButtons,text='Help',
83## command=self.Help,takefocus=FALSE,
84## **paddingArgs)
Steven M. Gavac01e30f2001-08-11 15:48:13 +000085 self.buttonOk = Button(frameActionButtons,text='Ok',
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +000086 command=self.Ok,takefocus=FALSE,
Ronald Oussorena97063a2009-03-04 21:35:05 +000087 **paddingArgs)
Steven M. Gavac01e30f2001-08-11 15:48:13 +000088 self.buttonApply = Button(frameActionButtons,text='Apply',
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +000089 command=self.Apply,takefocus=FALSE,
Ronald Oussorena97063a2009-03-04 21:35:05 +000090 **paddingArgs)
Steven M. Gavad721c482001-07-31 10:46:53 +000091 self.buttonCancel = Button(frameActionButtons,text='Cancel',
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +000092 command=self.Cancel,takefocus=FALSE,
Ronald Oussorena97063a2009-03-04 21:35:05 +000093 **paddingArgs)
Steven M. Gava2d4e03b2001-12-05 07:54:07 +000094 self.CreatePageFontTab()
95 self.CreatePageHighlight()
96 self.CreatePageKeys()
97 self.CreatePageGeneral()
Terry Jan Reedy1d9b9212014-01-26 22:24:17 -050098## self.buttonHelp.pack(side=RIGHT,padx=5)
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +000099 self.buttonOk.pack(side=LEFT,padx=5)
100 self.buttonApply.pack(side=LEFT,padx=5)
101 self.buttonCancel.pack(side=LEFT,padx=5)
Steven M. Gavad721c482001-07-31 10:46:53 +0000102 frameActionButtons.pack(side=BOTTOM)
Kurt B. Kaiser28c7bcf2007-12-28 04:18:01 +0000103 Frame(self, height=2, borderwidth=0).pack(side=BOTTOM)
Steven M. Gava2d4e03b2001-12-05 07:54:07 +0000104 self.tabPages.pack(side=TOP,expand=TRUE,fill=BOTH)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000105
Steven M. Gava60fc7072001-08-04 13:58:22 +0000106 def CreatePageFontTab(self):
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000107 #tkVars
Steven M. Gava3b55a892001-11-21 05:56:26 +0000108 self.fontSize=StringVar(self)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000109 self.fontBold=BooleanVar(self)
110 self.fontName=StringVar(self)
Steven M. Gava3b55a892001-11-21 05:56:26 +0000111 self.spaceNum=IntVar(self)
Kurt B. Kaiser05391692003-05-26 20:35:53 +0000112 self.editFont=tkFont.Font(self,('courier',10,'normal'))
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000113 ##widget creation
114 #body frame
Kurt B. Kaiser20172f92007-10-30 02:38:54 +0000115 frame=self.tabPages.pages['Fonts/Tabs'].frame
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000116 #body section frames
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000117 frameFont=LabelFrame(frame,borderwidth=2,relief=GROOVE,
118 text=' Base Editor Font ')
119 frameIndent=LabelFrame(frame,borderwidth=2,relief=GROOVE,
120 text=' Indentation Width ')
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000121 #frameFont
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000122 frameFontName=Frame(frameFont)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000123 frameFontParam=Frame(frameFont)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000124 labelFontNameTitle=Label(frameFontName,justify=LEFT,
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000125 text='Font Face :')
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000126 self.listFontName=Listbox(frameFontName,height=5,takefocus=FALSE,
127 exportselection=FALSE)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000128 self.listFontName.bind('<ButtonRelease-1>',self.OnListFontButtonRelease)
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000129 scrollFont=Scrollbar(frameFontName)
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000130 scrollFont.config(command=self.listFontName.yview)
131 self.listFontName.config(yscrollcommand=scrollFont.set)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000132 labelFontSizeTitle=Label(frameFontParam,text='Size :')
133 self.optMenuFontSize=DynOptionMenu(frameFontParam,self.fontSize,None,
Steven M. Gavac112cd82002-01-22 05:56:40 +0000134 command=self.SetFontSample)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000135 checkFontBold=Checkbutton(frameFontParam,variable=self.fontBold,
Steven M. Gavac112cd82002-01-22 05:56:40 +0000136 onvalue=1,offvalue=0,text='Bold',command=self.SetFontSample)
Steven M. Gavac11ccf32001-09-24 09:43:17 +0000137 frameFontSample=Frame(frameFont,relief=SOLID,borderwidth=1)
138 self.labelFontSample=Label(frameFontSample,
139 text='AaBbCcDdEe\nFfGgHhIiJjK\n1234567890\n#:+=(){}[]',
Steven M. Gava429a86a2001-10-23 10:42:12 +0000140 justify=LEFT,font=self.editFont)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000141 #frameIndent
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000142 frameIndentSize=Frame(frameIndent)
Kurt B. Kaiseracdef852005-01-31 03:34:26 +0000143 labelSpaceNumTitle=Label(frameIndentSize, justify=LEFT,
144 text='Python Standard: 4 Spaces!')
145 self.scaleSpaceNum=Scale(frameIndentSize, variable=self.spaceNum,
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000146 orient='horizontal',
Kurt B. Kaiseracdef852005-01-31 03:34:26 +0000147 tickinterval=2, from_=2, to=16)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000148 #widget packing
149 #body
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000150 frameFont.pack(side=LEFT,padx=5,pady=5,expand=TRUE,fill=BOTH)
151 frameIndent.pack(side=LEFT,padx=5,pady=5,fill=Y)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000152 #frameFont
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000153 frameFontName.pack(side=TOP,padx=5,pady=5,fill=X)
154 frameFontParam.pack(side=TOP,padx=5,pady=5,fill=X)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000155 labelFontNameTitle.pack(side=TOP,anchor=W)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000156 self.listFontName.pack(side=LEFT,expand=TRUE,fill=X)
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000157 scrollFont.pack(side=LEFT,fill=Y)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000158 labelFontSizeTitle.pack(side=LEFT,anchor=W)
159 self.optMenuFontSize.pack(side=LEFT,anchor=W)
160 checkFontBold.pack(side=LEFT,anchor=W,padx=20)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000161 frameFontSample.pack(side=TOP,padx=5,pady=5,expand=TRUE,fill=BOTH)
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000162 self.labelFontSample.pack(expand=TRUE,fill=BOTH)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000163 #frameIndent
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000164 frameIndentSize.pack(side=TOP,fill=X)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000165 labelSpaceNumTitle.pack(side=TOP,anchor=W,padx=5)
166 self.scaleSpaceNum.pack(side=TOP,padx=5,fill=X)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000167 return frame
168
169 def CreatePageHighlight(self):
Steven M. Gava3b55a892001-11-21 05:56:26 +0000170 self.builtinTheme=StringVar(self)
171 self.customTheme=StringVar(self)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000172 self.fgHilite=BooleanVar(self)
Steven M. Gava3b55a892001-11-21 05:56:26 +0000173 self.colour=StringVar(self)
174 self.fontName=StringVar(self)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000175 self.themeIsBuiltin=BooleanVar(self)
Steven M. Gava3b55a892001-11-21 05:56:26 +0000176 self.highlightTarget=StringVar(self)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000177 ##widget creation
178 #body frame
Kurt B. Kaiser20172f92007-10-30 02:38:54 +0000179 frame=self.tabPages.pages['Highlighting'].frame
Steven M. Gava952d0a52001-08-03 04:43:44 +0000180 #body section frames
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000181 frameCustom=LabelFrame(frame,borderwidth=2,relief=GROOVE,
182 text=' Custom Highlighting ')
183 frameTheme=LabelFrame(frame,borderwidth=2,relief=GROOVE,
184 text=' Highlighting Theme ')
Steven M. Gava952d0a52001-08-03 04:43:44 +0000185 #frameCustom
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000186 self.textHighlightSample=Text(frameCustom,relief=SOLID,borderwidth=1,
Terry Jan Reedy42f7b7e2012-05-26 16:55:43 -0400187 font=('courier',12,''),cursor='hand2',width=21,height=11,
Steven M. Gavab77d3432002-03-02 07:16:21 +0000188 takefocus=FALSE,highlightthickness=0,wrap=NONE)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000189 text=self.textHighlightSample
190 text.bind('<Double-Button-1>',lambda e: 'break')
191 text.bind('<B1-Motion>',lambda e: 'break')
Steven M. Gava052937f2002-02-11 02:20:53 +0000192 textAndTags=(('#you can click here','comment'),('\n','normal'),
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000193 ('#to choose items','comment'),('\n','normal'),('def','keyword'),
194 (' ','normal'),('func','definition'),('(param):','normal'),
195 ('\n ','normal'),('"""string"""','string'),('\n var0 = ','normal'),
Steven M. Gavad0342cd2001-11-04 11:53:10 +0000196 ("'string'",'string'),('\n var1 = ','normal'),("'selected'",'hilite'),
Kurt B. Kaiser73360a32004-03-08 18:15:31 +0000197 ('\n var2 = ','normal'),("'found'",'hit'),
198 ('\n var3 = ','normal'),('list', 'builtin'), ('(','normal'),
199 ('None', 'builtin'),(')\n\n','normal'),
Steven M. Gava99300612001-11-04 07:03:08 +0000200 (' error ','error'),(' ','normal'),('cursor |','cursor'),
Steven M. Gavad0342cd2001-11-04 11:53:10 +0000201 ('\n ','normal'),('shell','console'),(' ','normal'),('stdout','stdout'),
202 (' ','normal'),('stderr','stderr'),('\n','normal'))
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000203 for txTa in textAndTags:
204 text.insert(END,txTa[0],txTa[1])
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000205 for element in self.themeElements.keys():
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000206 text.tag_bind(self.themeElements[element][0],'<ButtonPress-1>',
207 lambda event,elem=element: event.widget.winfo_toplevel()
208 .highlightTarget.set(elem))
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000209 text.config(state=DISABLED)
210 self.frameColourSet=Frame(frameCustom,relief=SOLID,borderwidth=1)
Steven M. Gava7c017862001-10-29 11:19:46 +0000211 frameFgBg=Frame(frameCustom)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000212 buttonSetColour=Button(self.frameColourSet,text='Choose Colour for :',
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000213 command=self.GetColour,highlightthickness=0)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000214 self.optMenuHighlightTarget=DynOptionMenu(self.frameColourSet,
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000215 self.highlightTarget,None,highlightthickness=0)#,command=self.SetHighlightTargetBinding
Steven M. Gava7c017862001-10-29 11:19:46 +0000216 self.radioFg=Radiobutton(frameFgBg,variable=self.fgHilite,
Steven M. Gava3b55a892001-11-21 05:56:26 +0000217 value=1,text='Foreground',command=self.SetColourSampleBinding)
Steven M. Gava7c017862001-10-29 11:19:46 +0000218 self.radioBg=Radiobutton(frameFgBg,variable=self.fgHilite,
Steven M. Gava3b55a892001-11-21 05:56:26 +0000219 value=0,text='Background',command=self.SetColourSampleBinding)
Steven M. Gava7c017862001-10-29 11:19:46 +0000220 self.fgHilite.set(1)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000221 buttonSaveCustomTheme=Button(frameCustom,
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000222 text='Save as New Custom Theme',command=self.SaveAsNewTheme)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000223 #frameTheme
Steven M. Gava952d0a52001-08-03 04:43:44 +0000224 labelTypeTitle=Label(frameTheme,text='Select : ')
Steven M. Gavad0342cd2001-11-04 11:53:10 +0000225 self.radioThemeBuiltin=Radiobutton(frameTheme,variable=self.themeIsBuiltin,
226 value=1,command=self.SetThemeType,text='a Built-in Theme')
227 self.radioThemeCustom=Radiobutton(frameTheme,variable=self.themeIsBuiltin,
228 value=0,command=self.SetThemeType,text='a Custom Theme')
Steven M. Gava41a85322001-10-29 08:05:34 +0000229 self.optMenuThemeBuiltin=DynOptionMenu(frameTheme,
Steven M. Gava7c017862001-10-29 11:19:46 +0000230 self.builtinTheme,None,command=None)
Steven M. Gava41a85322001-10-29 08:05:34 +0000231 self.optMenuThemeCustom=DynOptionMenu(frameTheme,
Steven M. Gava7c017862001-10-29 11:19:46 +0000232 self.customTheme,None,command=None)
Steven M. Gava49745752002-02-18 01:43:11 +0000233 self.buttonDeleteCustomTheme=Button(frameTheme,text='Delete Custom Theme',
234 command=self.DeleteCustomTheme)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000235 ##widget packing
236 #body
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000237 frameCustom.pack(side=LEFT,padx=5,pady=5,expand=TRUE,fill=BOTH)
238 frameTheme.pack(side=LEFT,padx=5,pady=5,fill=Y)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000239 #frameCustom
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000240 self.frameColourSet.pack(side=TOP,padx=5,pady=5,expand=TRUE,fill=X)
Steven M. Gava7c017862001-10-29 11:19:46 +0000241 frameFgBg.pack(side=TOP,padx=5,pady=0)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000242 self.textHighlightSample.pack(side=TOP,padx=5,pady=5,expand=TRUE,
243 fill=BOTH)
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000244 buttonSetColour.pack(side=TOP,expand=TRUE,fill=X,padx=8,pady=4)
245 self.optMenuHighlightTarget.pack(side=TOP,expand=TRUE,fill=X,padx=8,pady=3)
Steven M. Gava7c017862001-10-29 11:19:46 +0000246 self.radioFg.pack(side=LEFT,anchor=E)
247 self.radioBg.pack(side=RIGHT,anchor=W)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000248 buttonSaveCustomTheme.pack(side=BOTTOM,fill=X,padx=5,pady=5)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000249 #frameTheme
Steven M. Gava952d0a52001-08-03 04:43:44 +0000250 labelTypeTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
Steven M. Gava41a85322001-10-29 08:05:34 +0000251 self.radioThemeBuiltin.pack(side=TOP,anchor=W,padx=5)
252 self.radioThemeCustom.pack(side=TOP,anchor=W,padx=5,pady=2)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000253 self.optMenuThemeBuiltin.pack(side=TOP,fill=X,padx=5,pady=5)
254 self.optMenuThemeCustom.pack(side=TOP,fill=X,anchor=W,padx=5,pady=5)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000255 self.buttonDeleteCustomTheme.pack(side=TOP,fill=X,padx=5,pady=5)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000256 return frame
257
258 def CreatePageKeys(self):
Steven M. Gava60fc7072001-08-04 13:58:22 +0000259 #tkVars
Steven M. Gava3b55a892001-11-21 05:56:26 +0000260 self.bindingTarget=StringVar(self)
261 self.builtinKeys=StringVar(self)
262 self.customKeys=StringVar(self)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000263 self.keysAreBuiltin=BooleanVar(self)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000264 self.keyBinding=StringVar(self)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000265 ##widget creation
266 #body frame
Kurt B. Kaiser20172f92007-10-30 02:38:54 +0000267 frame=self.tabPages.pages['Keys'].frame
Steven M. Gava60fc7072001-08-04 13:58:22 +0000268 #body section frames
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000269 frameCustom=LabelFrame(frame,borderwidth=2,relief=GROOVE,
270 text=' Custom Key Bindings ')
271 frameKeySets=LabelFrame(frame,borderwidth=2,relief=GROOVE,
272 text=' Key Set ')
Steven M. Gava60fc7072001-08-04 13:58:22 +0000273 #frameCustom
274 frameTarget=Frame(frameCustom)
Steven M. Gavafacfc092002-01-19 00:29:54 +0000275 labelTargetTitle=Label(frameTarget,text='Action - Key(s)')
276 scrollTargetY=Scrollbar(frameTarget)
277 scrollTargetX=Scrollbar(frameTarget,orient=HORIZONTAL)
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000278 self.listBindings=Listbox(frameTarget,takefocus=FALSE,
279 exportselection=FALSE)
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000280 self.listBindings.bind('<ButtonRelease-1>',self.KeyBindingSelected)
Steven M. Gavafacfc092002-01-19 00:29:54 +0000281 scrollTargetY.config(command=self.listBindings.yview)
282 scrollTargetX.config(command=self.listBindings.xview)
283 self.listBindings.config(yscrollcommand=scrollTargetY.set)
284 self.listBindings.config(xscrollcommand=scrollTargetX.set)
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000285 self.buttonNewKeys=Button(frameCustom,text='Get New Keys for Selection',
286 command=self.GetNewKeys,state=DISABLED)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000287 #frameKeySets
Kurt B. Kaiser28c7bcf2007-12-28 04:18:01 +0000288 frames = [Frame(frameKeySets, padx=2, pady=2, borderwidth=0)
289 for i in range(2)]
290 self.radioKeysBuiltin=Radiobutton(frames[0],variable=self.keysAreBuiltin,
291 value=1,command=self.SetKeysType,text='Use a Built-in Key Set')
292 self.radioKeysCustom=Radiobutton(frames[0],variable=self.keysAreBuiltin,
293 value=0,command=self.SetKeysType,text='Use a Custom Key Set')
294 self.optMenuKeysBuiltin=DynOptionMenu(frames[0],
Steven M. Gava41a85322001-10-29 08:05:34 +0000295 self.builtinKeys,None,command=None)
Kurt B. Kaiser28c7bcf2007-12-28 04:18:01 +0000296 self.optMenuKeysCustom=DynOptionMenu(frames[0],
Steven M. Gava41a85322001-10-29 08:05:34 +0000297 self.customKeys,None,command=None)
Kurt B. Kaiser28c7bcf2007-12-28 04:18:01 +0000298 self.buttonDeleteCustomKeys=Button(frames[1],text='Delete Custom Key Set',
Steven M. Gava49745752002-02-18 01:43:11 +0000299 command=self.DeleteCustomKeys)
Kurt B. Kaiser28c7bcf2007-12-28 04:18:01 +0000300 buttonSaveCustomKeys=Button(frames[1],
301 text='Save as New Custom Key Set',command=self.SaveAsNewKeySet)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000302 ##widget packing
303 #body
Kurt B. Kaiser28c7bcf2007-12-28 04:18:01 +0000304 frameCustom.pack(side=BOTTOM,padx=5,pady=5,expand=TRUE,fill=BOTH)
305 frameKeySets.pack(side=BOTTOM,padx=5,pady=5,fill=BOTH)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000306 #frameCustom
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000307 self.buttonNewKeys.pack(side=BOTTOM,fill=X,padx=5,pady=5)
Steven M. Gavafacfc092002-01-19 00:29:54 +0000308 frameTarget.pack(side=LEFT,padx=5,pady=5,expand=TRUE,fill=BOTH)
309 #frame target
310 frameTarget.columnconfigure(0,weight=1)
311 frameTarget.rowconfigure(1,weight=1)
312 labelTargetTitle.grid(row=0,column=0,columnspan=2,sticky=W)
313 self.listBindings.grid(row=1,column=0,sticky=NSEW)
314 scrollTargetY.grid(row=1,column=1,sticky=NS)
315 scrollTargetX.grid(row=2,column=0,sticky=EW)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000316 #frameKeySets
Kurt B. Kaiser28c7bcf2007-12-28 04:18:01 +0000317 self.radioKeysBuiltin.grid(row=0, column=0, sticky=W+NS)
318 self.radioKeysCustom.grid(row=1, column=0, sticky=W+NS)
319 self.optMenuKeysBuiltin.grid(row=0, column=1, sticky=NSEW)
320 self.optMenuKeysCustom.grid(row=1, column=1, sticky=NSEW)
321 self.buttonDeleteCustomKeys.pack(side=LEFT,fill=X,expand=True,padx=2)
322 buttonSaveCustomKeys.pack(side=LEFT,fill=X,expand=True,padx=2)
323 frames[0].pack(side=TOP, fill=BOTH, expand=True)
324 frames[1].pack(side=TOP, fill=X, expand=True, pady=2)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000325 return frame
326
327 def CreatePageGeneral(self):
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000328 #tkVars
329 self.winWidth=StringVar(self)
Steven M. Gava3b55a892001-11-21 05:56:26 +0000330 self.winHeight=StringVar(self)
Raymond Hettinger4e49b832004-06-04 06:31:08 +0000331 self.paraWidth=StringVar(self)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000332 self.startupEdit=IntVar(self)
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000333 self.autoSave=IntVar(self)
Kurt B. Kaisera053f332003-05-10 00:49:56 +0000334 self.encoding=StringVar(self)
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000335 self.userHelpBrowser=BooleanVar(self)
336 self.helpBrowser=StringVar(self)
Steven M. Gava230e5782001-08-07 03:28:25 +0000337 #widget creation
338 #body
Kurt B. Kaiser20172f92007-10-30 02:38:54 +0000339 frame=self.tabPages.pages['General'].frame
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000340 #body section frames
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000341 frameRun=LabelFrame(frame,borderwidth=2,relief=GROOVE,
342 text=' Startup Preferences ')
343 frameSave=LabelFrame(frame,borderwidth=2,relief=GROOVE,
344 text=' Autosave Preferences ')
Steven M. Gava230e5782001-08-07 03:28:25 +0000345 frameWinSize=Frame(frame,borderwidth=2,relief=GROOVE)
Raymond Hettinger4e49b832004-06-04 06:31:08 +0000346 frameParaSize=Frame(frame,borderwidth=2,relief=GROOVE)
Kurt B. Kaisera053f332003-05-10 00:49:56 +0000347 frameEncoding=Frame(frame,borderwidth=2,relief=GROOVE)
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000348 frameHelp=LabelFrame(frame,borderwidth=2,relief=GROOVE,
349 text=' Additional Help Sources ')
Steven M. Gava230e5782001-08-07 03:28:25 +0000350 #frameRun
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000351 labelRunChoiceTitle=Label(frameRun,text='At Startup')
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000352 radioStartupEdit=Radiobutton(frameRun,variable=self.startupEdit,
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +0000353 value=1,command=self.SetKeysType,text="Open Edit Window")
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000354 radioStartupShell=Radiobutton(frameRun,variable=self.startupEdit,
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +0000355 value=0,command=self.SetKeysType,text='Open Shell Window')
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000356 #frameSave
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000357 labelRunSaveTitle=Label(frameSave,text='At Start of Run (F5) ')
358 radioSaveAsk=Radiobutton(frameSave,variable=self.autoSave,
359 value=0,command=self.SetKeysType,text="Prompt to Save")
360 radioSaveAuto=Radiobutton(frameSave,variable=self.autoSave,
361 value=1,command=self.SetKeysType,text='No Prompt')
Steven M. Gava230e5782001-08-07 03:28:25 +0000362 #frameWinSize
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000363 labelWinSizeTitle=Label(frameWinSize,text='Initial Window Size'+
364 ' (in characters)')
Steven M. Gava230e5782001-08-07 03:28:25 +0000365 labelWinWidthTitle=Label(frameWinSize,text='Width')
366 entryWinWidth=Entry(frameWinSize,textvariable=self.winWidth,
367 width=3)
368 labelWinHeightTitle=Label(frameWinSize,text='Height')
369 entryWinHeight=Entry(frameWinSize,textvariable=self.winHeight,
370 width=3)
Raymond Hettinger4e49b832004-06-04 06:31:08 +0000371 #paragraphFormatWidth
372 labelParaWidthTitle=Label(frameParaSize,text='Paragraph reformat'+
373 ' width (in characters)')
374 entryParaWidth=Entry(frameParaSize,textvariable=self.paraWidth,
375 width=3)
Kurt B. Kaisera053f332003-05-10 00:49:56 +0000376 #frameEncoding
377 labelEncodingTitle=Label(frameEncoding,text="Default Source Encoding")
378 radioEncLocale=Radiobutton(frameEncoding,variable=self.encoding,
379 value="locale",text="Locale-defined")
380 radioEncUTF8=Radiobutton(frameEncoding,variable=self.encoding,
381 value="utf-8",text="UTF-8")
382 radioEncNone=Radiobutton(frameEncoding,variable=self.encoding,
383 value="none",text="None")
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000384 #frameHelp
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000385 frameHelpList=Frame(frameHelp)
386 frameHelpListButtons=Frame(frameHelpList)
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000387 scrollHelpList=Scrollbar(frameHelpList)
388 self.listHelp=Listbox(frameHelpList,height=5,takefocus=FALSE,
389 exportselection=FALSE)
390 scrollHelpList.config(command=self.listHelp.yview)
391 self.listHelp.config(yscrollcommand=scrollHelpList.set)
392 self.listHelp.bind('<ButtonRelease-1>',self.HelpSourceSelected)
393 self.buttonHelpListEdit=Button(frameHelpListButtons,text='Edit',
394 state=DISABLED,width=8,command=self.HelpListItemEdit)
395 self.buttonHelpListAdd=Button(frameHelpListButtons,text='Add',
396 width=8,command=self.HelpListItemAdd)
397 self.buttonHelpListRemove=Button(frameHelpListButtons,text='Remove',
398 state=DISABLED,width=8,command=self.HelpListItemRemove)
Steven M. Gava230e5782001-08-07 03:28:25 +0000399 #widget packing
400 #body
401 frameRun.pack(side=TOP,padx=5,pady=5,fill=X)
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000402 frameSave.pack(side=TOP,padx=5,pady=5,fill=X)
Steven M. Gava230e5782001-08-07 03:28:25 +0000403 frameWinSize.pack(side=TOP,padx=5,pady=5,fill=X)
Raymond Hettinger4e49b832004-06-04 06:31:08 +0000404 frameParaSize.pack(side=TOP,padx=5,pady=5,fill=X)
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000405 frameEncoding.pack(side=TOP,padx=5,pady=5,fill=X)
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000406 frameHelp.pack(side=TOP,padx=5,pady=5,expand=TRUE,fill=BOTH)
Steven M. Gava230e5782001-08-07 03:28:25 +0000407 #frameRun
Steven M. Gava230e5782001-08-07 03:28:25 +0000408 labelRunChoiceTitle.pack(side=LEFT,anchor=W,padx=5,pady=5)
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000409 radioStartupShell.pack(side=RIGHT,anchor=W,padx=5,pady=5)
410 radioStartupEdit.pack(side=RIGHT,anchor=W,padx=5,pady=5)
411 #frameSave
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000412 labelRunSaveTitle.pack(side=LEFT,anchor=W,padx=5,pady=5)
413 radioSaveAuto.pack(side=RIGHT,anchor=W,padx=5,pady=5)
414 radioSaveAsk.pack(side=RIGHT,anchor=W,padx=5,pady=5)
Steven M. Gava230e5782001-08-07 03:28:25 +0000415 #frameWinSize
Steven M. Gavafacfc092002-01-19 00:29:54 +0000416 labelWinSizeTitle.pack(side=LEFT,anchor=W,padx=5,pady=5)
417 entryWinHeight.pack(side=RIGHT,anchor=E,padx=10,pady=5)
418 labelWinHeightTitle.pack(side=RIGHT,anchor=E,pady=5)
419 entryWinWidth.pack(side=RIGHT,anchor=E,padx=10,pady=5)
420 labelWinWidthTitle.pack(side=RIGHT,anchor=E,pady=5)
Raymond Hettinger4e49b832004-06-04 06:31:08 +0000421 #paragraphFormatWidth
422 labelParaWidthTitle.pack(side=LEFT,anchor=W,padx=5,pady=5)
423 entryParaWidth.pack(side=RIGHT,anchor=E,padx=10,pady=5)
Kurt B. Kaisera053f332003-05-10 00:49:56 +0000424 #frameEncoding
425 labelEncodingTitle.pack(side=LEFT,anchor=W,padx=5,pady=5)
426 radioEncNone.pack(side=RIGHT,anchor=E,pady=5)
427 radioEncUTF8.pack(side=RIGHT,anchor=E,pady=5)
428 radioEncLocale.pack(side=RIGHT,anchor=E,pady=5)
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000429 #frameHelp
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000430 frameHelpListButtons.pack(side=RIGHT,padx=5,pady=5,fill=Y)
431 frameHelpList.pack(side=TOP,padx=5,pady=5,expand=TRUE,fill=BOTH)
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000432 scrollHelpList.pack(side=RIGHT,anchor=W,fill=Y)
433 self.listHelp.pack(side=LEFT,anchor=E,expand=TRUE,fill=BOTH)
434 self.buttonHelpListEdit.pack(side=TOP,anchor=W,pady=5)
435 self.buttonHelpListAdd.pack(side=TOP,anchor=W)
436 self.buttonHelpListRemove.pack(side=TOP,anchor=W,pady=5)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000437 return frame
438
Steven M. Gavac112cd82002-01-22 05:56:40 +0000439 def AttachVarCallbacks(self):
440 self.fontSize.trace_variable('w',self.VarChanged_fontSize)
441 self.fontName.trace_variable('w',self.VarChanged_fontName)
442 self.fontBold.trace_variable('w',self.VarChanged_fontBold)
443 self.spaceNum.trace_variable('w',self.VarChanged_spaceNum)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000444 self.colour.trace_variable('w',self.VarChanged_colour)
Steven M. Gava052937f2002-02-11 02:20:53 +0000445 self.builtinTheme.trace_variable('w',self.VarChanged_builtinTheme)
446 self.customTheme.trace_variable('w',self.VarChanged_customTheme)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000447 self.themeIsBuiltin.trace_variable('w',self.VarChanged_themeIsBuiltin)
Steven M. Gava052937f2002-02-11 02:20:53 +0000448 self.highlightTarget.trace_variable('w',self.VarChanged_highlightTarget)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000449 self.keyBinding.trace_variable('w',self.VarChanged_keyBinding)
Steven M. Gava052937f2002-02-11 02:20:53 +0000450 self.builtinKeys.trace_variable('w',self.VarChanged_builtinKeys)
451 self.customKeys.trace_variable('w',self.VarChanged_customKeys)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000452 self.keysAreBuiltin.trace_variable('w',self.VarChanged_keysAreBuiltin)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000453 self.winWidth.trace_variable('w',self.VarChanged_winWidth)
454 self.winHeight.trace_variable('w',self.VarChanged_winHeight)
Raymond Hettinger4e49b832004-06-04 06:31:08 +0000455 self.paraWidth.trace_variable('w',self.VarChanged_paraWidth)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000456 self.startupEdit.trace_variable('w',self.VarChanged_startupEdit)
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000457 self.autoSave.trace_variable('w',self.VarChanged_autoSave)
Kurt B. Kaisera053f332003-05-10 00:49:56 +0000458 self.encoding.trace_variable('w',self.VarChanged_encoding)
Steven M. Gava052937f2002-02-11 02:20:53 +0000459
Steven M. Gavac112cd82002-01-22 05:56:40 +0000460 def VarChanged_fontSize(self,*params):
461 value=self.fontSize.get()
462 self.AddChangedItem('main','EditorWindow','font-size',value)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000463
Steven M. Gavac112cd82002-01-22 05:56:40 +0000464 def VarChanged_fontName(self,*params):
465 value=self.fontName.get()
466 self.AddChangedItem('main','EditorWindow','font',value)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000467
468 def VarChanged_fontBold(self,*params):
469 value=self.fontBold.get()
470 self.AddChangedItem('main','EditorWindow','font-bold',value)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000471
Steven M. Gavac112cd82002-01-22 05:56:40 +0000472 def VarChanged_spaceNum(self,*params):
473 value=self.spaceNum.get()
474 self.AddChangedItem('main','Indent','num-spaces',value)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000475
Steven M. Gavac112cd82002-01-22 05:56:40 +0000476 def VarChanged_colour(self,*params):
Steven M. Gava052937f2002-02-11 02:20:53 +0000477 self.OnNewColourSet()
478
479 def VarChanged_builtinTheme(self,*params):
480 value=self.builtinTheme.get()
481 self.AddChangedItem('main','Theme','name',value)
482 self.PaintThemeSample()
483
484 def VarChanged_customTheme(self,*params):
485 value=self.customTheme.get()
Steven M. Gava49745752002-02-18 01:43:11 +0000486 if value != '- no custom themes -':
487 self.AddChangedItem('main','Theme','name',value)
488 self.PaintThemeSample()
Steven M. Gava052937f2002-02-11 02:20:53 +0000489
490 def VarChanged_themeIsBuiltin(self,*params):
491 value=self.themeIsBuiltin.get()
492 self.AddChangedItem('main','Theme','default',value)
Steven M. Gavaf31eec02002-03-05 00:25:58 +0000493 if value:
494 self.VarChanged_builtinTheme()
495 else:
496 self.VarChanged_customTheme()
Steven M. Gava052937f2002-02-11 02:20:53 +0000497
498 def VarChanged_highlightTarget(self,*params):
499 self.SetHighlightTarget()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000500
Steven M. Gavac112cd82002-01-22 05:56:40 +0000501 def VarChanged_keyBinding(self,*params):
Steven M. Gavabbf5ef52002-01-22 11:35:50 +0000502 value=self.keyBinding.get()
503 keySet=self.customKeys.get()
504 event=self.listBindings.get(ANCHOR).split()[0]
Steven M. Gavaa498af22002-02-01 01:33:36 +0000505 if idleConf.IsCoreBinding(event):
506 #this is a core keybinding
507 self.AddChangedItem('keys',keySet,event,value)
508 else: #this is an extension key binding
509 extName=idleConf.GetExtnNameForEvent(event)
510 extKeybindSection=extName+'_cfgBindings'
511 self.AddChangedItem('extensions',extKeybindSection,event,value)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000512
Steven M. Gava052937f2002-02-11 02:20:53 +0000513 def VarChanged_builtinKeys(self,*params):
514 value=self.builtinKeys.get()
515 self.AddChangedItem('main','Keys','name',value)
516 self.LoadKeysList(value)
517
518 def VarChanged_customKeys(self,*params):
519 value=self.customKeys.get()
Steven M. Gava49745752002-02-18 01:43:11 +0000520 if value != '- no custom keys -':
521 self.AddChangedItem('main','Keys','name',value)
522 self.LoadKeysList(value)
Steven M. Gava052937f2002-02-11 02:20:53 +0000523
524 def VarChanged_keysAreBuiltin(self,*params):
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000525 value=self.keysAreBuiltin.get()
Steven M. Gava052937f2002-02-11 02:20:53 +0000526 self.AddChangedItem('main','Keys','default',value)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000527 if value:
Steven M. Gavaf31eec02002-03-05 00:25:58 +0000528 self.VarChanged_builtinKeys()
Steven M. Gava052937f2002-02-11 02:20:53 +0000529 else:
Steven M. Gavaf31eec02002-03-05 00:25:58 +0000530 self.VarChanged_customKeys()
Steven M. Gava052937f2002-02-11 02:20:53 +0000531
Steven M. Gavac112cd82002-01-22 05:56:40 +0000532 def VarChanged_winWidth(self,*params):
Steven M. Gavabbf5ef52002-01-22 11:35:50 +0000533 value=self.winWidth.get()
534 self.AddChangedItem('main','EditorWindow','width',value)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000535
536 def VarChanged_winHeight(self,*params):
Steven M. Gavabbf5ef52002-01-22 11:35:50 +0000537 value=self.winHeight.get()
538 self.AddChangedItem('main','EditorWindow','height',value)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000539
Raymond Hettinger4e49b832004-06-04 06:31:08 +0000540 def VarChanged_paraWidth(self,*params):
541 value=self.paraWidth.get()
542 self.AddChangedItem('main','FormatParagraph','paragraph',value)
543
Steven M. Gavac112cd82002-01-22 05:56:40 +0000544 def VarChanged_startupEdit(self,*params):
Steven M. Gavabbf5ef52002-01-22 11:35:50 +0000545 value=self.startupEdit.get()
546 self.AddChangedItem('main','General','editor-on-startup',value)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000547
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000548 def VarChanged_autoSave(self,*params):
549 value=self.autoSave.get()
550 self.AddChangedItem('main','General','autosave',value)
551
Kurt B. Kaisera053f332003-05-10 00:49:56 +0000552 def VarChanged_encoding(self,*params):
553 value=self.encoding.get()
554 self.AddChangedItem('main','EditorWindow','encoding',value)
555
Steven M. Gavaa498af22002-02-01 01:33:36 +0000556 def ResetChangedItems(self):
Steven M. Gavab77d3432002-03-02 07:16:21 +0000557 #When any config item is changed in this dialog, an entry
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000558 #should be made in the relevant section (config type) of this
559 #dictionary. The key should be the config file section name and the
Steven M. Gavaa498af22002-02-01 01:33:36 +0000560 #value a dictionary, whose key:value pairs are item=value pairs for
561 #that config file section.
562 self.changedItems={'main':{},'highlight':{},'keys':{},'extensions':{}}
563
Steven M. Gavac112cd82002-01-22 05:56:40 +0000564 def AddChangedItem(self,type,section,item,value):
Steven M. Gava2d7bb3f2002-01-29 08:35:29 +0000565 value=str(value) #make sure we use a string
Benjamin Peterson6e3dbbd2009-10-09 22:15:50 +0000566 if section not in self.changedItems[type]:
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000567 self.changedItems[type][section]={}
Steven M. Gavac112cd82002-01-22 05:56:40 +0000568 self.changedItems[type][section][item]=value
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000569
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000570 def GetDefaultItems(self):
571 dItems={'main':{},'highlight':{},'keys':{},'extensions':{}}
572 for configType in dItems.keys():
573 sections=idleConf.GetSectionList('default',configType)
574 for section in sections:
575 dItems[configType][section]={}
576 options=idleConf.defaultCfg[configType].GetOptionList(section)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000577 for option in options:
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000578 dItems[configType][section][option]=(
579 idleConf.defaultCfg[configType].Get(section,option))
580 return dItems
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000581
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000582 def SetThemeType(self):
583 if self.themeIsBuiltin.get():
584 self.optMenuThemeBuiltin.config(state=NORMAL)
585 self.optMenuThemeCustom.config(state=DISABLED)
586 self.buttonDeleteCustomTheme.config(state=DISABLED)
587 else:
588 self.optMenuThemeBuiltin.config(state=DISABLED)
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000589 self.radioThemeCustom.config(state=NORMAL)
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000590 self.optMenuThemeCustom.config(state=NORMAL)
591 self.buttonDeleteCustomTheme.config(state=NORMAL)
592
593 def SetKeysType(self):
Steven M. Gava052937f2002-02-11 02:20:53 +0000594 if self.keysAreBuiltin.get():
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000595 self.optMenuKeysBuiltin.config(state=NORMAL)
596 self.optMenuKeysCustom.config(state=DISABLED)
597 self.buttonDeleteCustomKeys.config(state=DISABLED)
598 else:
599 self.optMenuKeysBuiltin.config(state=DISABLED)
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000600 self.radioKeysCustom.config(state=NORMAL)
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000601 self.optMenuKeysCustom.config(state=NORMAL)
602 self.buttonDeleteCustomKeys.config(state=NORMAL)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000603
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000604 def GetNewKeys(self):
605 listIndex=self.listBindings.index(ANCHOR)
606 binding=self.listBindings.get(listIndex)
607 bindName=binding.split()[0] #first part, up to first space
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000608 if self.keysAreBuiltin.get():
Steven M. Gavae28ee752002-02-11 03:45:22 +0000609 currentKeySetName=self.builtinKeys.get()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000610 else:
Steven M. Gavae28ee752002-02-11 03:45:22 +0000611 currentKeySetName=self.customKeys.get()
612 currentBindings=idleConf.GetCurrentKeySet()
613 if currentKeySetName in self.changedItems['keys'].keys(): #unsaved changes
614 keySetChanges=self.changedItems['keys'][currentKeySetName]
615 for event in keySetChanges.keys():
616 currentBindings[event]=keySetChanges[event].split()
617 currentKeySequences=currentBindings.values()
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000618 newKeys=GetKeysDialog(self,'Get New Keys',bindName,
619 currentKeySequences).result
620 if newKeys: #new keys were specified
Steven M. Gava052937f2002-02-11 02:20:53 +0000621 if self.keysAreBuiltin.get(): #current key set is a built-in
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000622 message=('Your changes will be saved as a new Custom Key Set. '+
623 'Enter a name for your new Custom Key Set below.')
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000624 newKeySet=self.GetNewKeysName(message)
625 if not newKeySet: #user cancelled custom key set creation
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000626 self.listBindings.select_set(listIndex)
627 self.listBindings.select_anchor(listIndex)
628 return
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000629 else: #create new custom key set based on previously active key set
630 self.CreateNewKeySet(newKeySet)
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000631 self.listBindings.delete(listIndex)
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000632 self.listBindings.insert(listIndex,bindName+' - '+newKeys)
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000633 self.listBindings.select_set(listIndex)
634 self.listBindings.select_anchor(listIndex)
Steven M. Gava052937f2002-02-11 02:20:53 +0000635 self.keyBinding.set(newKeys)
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000636 else:
637 self.listBindings.select_set(listIndex)
638 self.listBindings.select_anchor(listIndex)
639
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000640 def GetNewKeysName(self,message):
Steven M. Gava49745752002-02-18 01:43:11 +0000641 usedNames=(idleConf.GetSectionList('user','keys')+
642 idleConf.GetSectionList('default','keys'))
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000643 newKeySet=GetCfgSectionNameDialog(self,'New Custom Key Set',
644 message,usedNames).result
645 return newKeySet
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000646
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000647 def SaveAsNewKeySet(self):
648 newKeysName=self.GetNewKeysName('New Key Set Name:')
649 if newKeysName:
650 self.CreateNewKeySet(newKeysName)
651
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000652 def KeyBindingSelected(self,event):
653 self.buttonNewKeys.config(state=NORMAL)
654
655 def CreateNewKeySet(self,newKeySetName):
656 #creates new custom key set based on the previously active key set,
657 #and makes the new key set active
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000658 if self.keysAreBuiltin.get():
Steven M. Gava052937f2002-02-11 02:20:53 +0000659 prevKeySetName=self.builtinKeys.get()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000660 else:
Steven M. Gava052937f2002-02-11 02:20:53 +0000661 prevKeySetName=self.customKeys.get()
Steven M. Gava052937f2002-02-11 02:20:53 +0000662 prevKeys=idleConf.GetCoreKeys(prevKeySetName)
Steven M. Gava052937f2002-02-11 02:20:53 +0000663 newKeys={}
664 for event in prevKeys.keys(): #add key set to changed items
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000665 eventName=event[2:-2] #trim off the angle brackets
Steven M. Gava052937f2002-02-11 02:20:53 +0000666 binding=string.join(prevKeys[event])
667 newKeys[eventName]=binding
Steven M. Gava052937f2002-02-11 02:20:53 +0000668 #handle any unsaved changes to prev key set
669 if prevKeySetName in self.changedItems['keys'].keys():
670 keySetChanges=self.changedItems['keys'][prevKeySetName]
671 for event in keySetChanges.keys():
672 newKeys[event]=keySetChanges[event]
Steven M. Gava052937f2002-02-11 02:20:53 +0000673 #save the new theme
674 self.SaveNewKeySet(newKeySetName,newKeys)
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000675 #change gui over to the new key set
676 customKeyList=idleConf.GetSectionList('user','keys')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000677 customKeyList.sort()
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000678 self.optMenuKeysCustom.SetMenu(customKeyList,newKeySetName)
Steven M. Gava052937f2002-02-11 02:20:53 +0000679 self.keysAreBuiltin.set(0)
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000680 self.SetKeysType()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000681
Steven M. Gava052937f2002-02-11 02:20:53 +0000682 def LoadKeysList(self,keySetName):
683 reselect=0
684 newKeySet=0
685 if self.listBindings.curselection():
686 reselect=1
687 listIndex=self.listBindings.index(ANCHOR)
Steven M. Gava052937f2002-02-11 02:20:53 +0000688 keySet=idleConf.GetKeySet(keySetName)
Steven M. Gava052937f2002-02-11 02:20:53 +0000689 bindNames=keySet.keys()
690 bindNames.sort()
691 self.listBindings.delete(0,END)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000692 for bindName in bindNames:
Steven M. Gava052937f2002-02-11 02:20:53 +0000693 key=string.join(keySet[bindName]) #make key(s) into a string
694 bindName=bindName[2:-2] #trim off the angle brackets
Steven M. Gava052937f2002-02-11 02:20:53 +0000695 if keySetName in self.changedItems['keys'].keys():
696 #handle any unsaved changes to this key set
697 if bindName in self.changedItems['keys'][keySetName].keys():
698 key=self.changedItems['keys'][keySetName][bindName]
Steven M. Gava052937f2002-02-11 02:20:53 +0000699 self.listBindings.insert(END, bindName+' - '+key)
Steven M. Gava052937f2002-02-11 02:20:53 +0000700 if reselect:
701 self.listBindings.see(listIndex)
702 self.listBindings.select_set(listIndex)
703 self.listBindings.select_anchor(listIndex)
704
Steven M. Gava49745752002-02-18 01:43:11 +0000705 def DeleteCustomKeys(self):
706 keySetName=self.customKeys.get()
707 if not tkMessageBox.askyesno('Delete Key Set','Are you sure you wish '+
Walter Dörwald70a6b492004-02-12 17:35:32 +0000708 'to delete the key set %r ?' % (keySetName),
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +0000709 parent=self):
Steven M. Gava49745752002-02-18 01:43:11 +0000710 return
711 #remove key set from config
712 idleConf.userCfg['keys'].remove_section(keySetName)
Benjamin Peterson6e3dbbd2009-10-09 22:15:50 +0000713 if keySetName in self.changedItems['keys']:
Steven M. Gava49745752002-02-18 01:43:11 +0000714 del(self.changedItems['keys'][keySetName])
715 #write changes
716 idleConf.userCfg['keys'].Save()
717 #reload user key set list
718 itemList=idleConf.GetSectionList('user','keys')
719 itemList.sort()
720 if not itemList:
721 self.radioKeysCustom.config(state=DISABLED)
722 self.optMenuKeysCustom.SetMenu(itemList,'- no custom keys -')
723 else:
724 self.optMenuKeysCustom.SetMenu(itemList,itemList[0])
725 #revert to default key set
726 self.keysAreBuiltin.set(idleConf.defaultCfg['main'].Get('Keys','default'))
727 self.builtinKeys.set(idleConf.defaultCfg['main'].Get('Keys','name'))
728 #user can't back out of these changes, they must be applied now
729 self.Apply()
730 self.SetKeysType()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000731
Steven M. Gava49745752002-02-18 01:43:11 +0000732 def DeleteCustomTheme(self):
733 themeName=self.customTheme.get()
734 if not tkMessageBox.askyesno('Delete Theme','Are you sure you wish '+
Walter Dörwald70a6b492004-02-12 17:35:32 +0000735 'to delete the theme %r ?' % (themeName,),
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +0000736 parent=self):
Steven M. Gava49745752002-02-18 01:43:11 +0000737 return
738 #remove theme from config
739 idleConf.userCfg['highlight'].remove_section(themeName)
Benjamin Peterson6e3dbbd2009-10-09 22:15:50 +0000740 if themeName in self.changedItems['highlight']:
Steven M. Gava49745752002-02-18 01:43:11 +0000741 del(self.changedItems['highlight'][themeName])
742 #write changes
743 idleConf.userCfg['highlight'].Save()
744 #reload user theme list
745 itemList=idleConf.GetSectionList('user','highlight')
746 itemList.sort()
747 if not itemList:
748 self.radioThemeCustom.config(state=DISABLED)
749 self.optMenuThemeCustom.SetMenu(itemList,'- no custom themes -')
750 else:
751 self.optMenuThemeCustom.SetMenu(itemList,itemList[0])
752 #revert to default theme
753 self.themeIsBuiltin.set(idleConf.defaultCfg['main'].Get('Theme','default'))
754 self.builtinTheme.set(idleConf.defaultCfg['main'].Get('Theme','name'))
755 #user can't back out of these changes, they must be applied now
756 self.Apply()
757 self.SetThemeType()
758
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000759 def GetColour(self):
760 target=self.highlightTarget.get()
Steven M. Gava052937f2002-02-11 02:20:53 +0000761 prevColour=self.frameColourSet.cget('bg')
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000762 rgbTuplet, colourString = tkColorChooser.askcolor(parent=self,
Steven M. Gava052937f2002-02-11 02:20:53 +0000763 title='Pick new colour for : '+target,initialcolor=prevColour)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000764 if colourString and (colourString!=prevColour):
Steven M. Gava052937f2002-02-11 02:20:53 +0000765 #user didn't cancel, and they chose a new colour
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000766 if self.themeIsBuiltin.get(): #current theme is a built-in
767 message=('Your changes will be saved as a new Custom Theme. '+
768 'Enter a name for your new Custom Theme below.')
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000769 newTheme=self.GetNewThemeName(message)
770 if not newTheme: #user cancelled custom theme creation
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000771 return
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000772 else: #create new custom theme based on previously active theme
773 self.CreateNewTheme(newTheme)
Steven M. Gava052937f2002-02-11 02:20:53 +0000774 self.colour.set(colourString)
775 else: #current theme is user defined
776 self.colour.set(colourString)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000777
Steven M. Gava052937f2002-02-11 02:20:53 +0000778 def OnNewColourSet(self):
779 newColour=self.colour.get()
780 self.frameColourSet.config(bg=newColour)#set sample
781 if self.fgHilite.get(): plane='foreground'
782 else: plane='background'
783 sampleElement=self.themeElements[self.highlightTarget.get()][0]
Raymond Hettinger931237e2003-07-09 18:48:24 +0000784 self.textHighlightSample.tag_config(sampleElement, **{plane:newColour})
Steven M. Gava052937f2002-02-11 02:20:53 +0000785 theme=self.customTheme.get()
786 themeElement=sampleElement+'-'+plane
787 self.AddChangedItem('highlight',theme,themeElement,newColour)
Steven M. Gava052937f2002-02-11 02:20:53 +0000788
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000789 def GetNewThemeName(self,message):
Steven M. Gava49745752002-02-18 01:43:11 +0000790 usedNames=(idleConf.GetSectionList('user','highlight')+
791 idleConf.GetSectionList('default','highlight'))
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000792 newTheme=GetCfgSectionNameDialog(self,'New Custom Theme',
793 message,usedNames).result
794 return newTheme
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000795
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000796 def SaveAsNewTheme(self):
797 newThemeName=self.GetNewThemeName('New Theme Name:')
798 if newThemeName:
799 self.CreateNewTheme(newThemeName)
800
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000801 def CreateNewTheme(self,newThemeName):
802 #creates new custom theme based on the previously active theme,
803 #and makes the new theme active
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000804 if self.themeIsBuiltin.get():
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000805 themeType='default'
806 themeName=self.builtinTheme.get()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000807 else:
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000808 themeType='user'
809 themeName=self.customTheme.get()
810 newTheme=idleConf.GetThemeDict(themeType,themeName)
Steven M. Gava052937f2002-02-11 02:20:53 +0000811 #apply any of the old theme's unsaved changes to the new theme
812 if themeName in self.changedItems['highlight'].keys():
813 themeChanges=self.changedItems['highlight'][themeName]
814 for element in themeChanges.keys():
815 newTheme[element]=themeChanges[element]
816 #save the new theme
817 self.SaveNewTheme(newThemeName,newTheme)
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000818 #change gui over to the new theme
819 customThemeList=idleConf.GetSectionList('user','highlight')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000820 customThemeList.sort()
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000821 self.optMenuThemeCustom.SetMenu(customThemeList,newThemeName)
822 self.themeIsBuiltin.set(0)
823 self.SetThemeType()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000824
Steven M. Gavac112cd82002-01-22 05:56:40 +0000825 def OnListFontButtonRelease(self,event):
Kurt B. Kaiser05391692003-05-26 20:35:53 +0000826 font = self.listFontName.get(ANCHOR)
827 self.fontName.set(font.lower())
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000828 self.SetFontSample()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000829
Steven M. Gavac112cd82002-01-22 05:56:40 +0000830 def SetFontSample(self,event=None):
831 fontName=self.fontName.get()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000832 if self.fontBold.get():
Steven M. Gavac112cd82002-01-22 05:56:40 +0000833 fontWeight=tkFont.BOLD
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000834 else:
Steven M. Gavac112cd82002-01-22 05:56:40 +0000835 fontWeight=tkFont.NORMAL
Ned Deilye3d47122012-10-22 15:13:01 -0700836 newFont = (fontName, self.fontSize.get(), fontWeight)
837 self.labelFontSample.config(font=newFont)
838 self.textHighlightSample.configure(font=newFont)
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',
Andrew Svetlovd8590ff2012-12-24 13:17:59 +0200951 type='int', 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
Andrew Svetlovd8590ff2012-12-24 13:17:59 +02001037 self.winWidth.set(idleConf.GetOption('main','EditorWindow','width',
1038 type='int'))
1039 self.winHeight.set(idleConf.GetOption('main','EditorWindow','height',
1040 type='int'))
Raymond Hettinger4e49b832004-06-04 06:31:08 +00001041 #initial paragraph reformat size
Andrew Svetlovd8590ff2012-12-24 13:17:59 +02001042 self.paraWidth.set(idleConf.GetOption('main','FormatParagraph','paragraph',
1043 type='int'))
Kurt B. Kaisera053f332003-05-10 00:49:56 +00001044 # default source encoding
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +00001045 self.encoding.set(idleConf.GetOption('main', 'EditorWindow',
1046 'encoding', default='none'))
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +00001047 # additional help sources
1048 self.userHelpList = idleConf.GetAllExtraHelpSourcesList()
Steven M. Gava085eb1b2002-02-05 04:52:32 +00001049 for helpItem in self.userHelpList:
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +00001050 self.listHelp.insert(END,helpItem[0])
Steven M. Gava085eb1b2002-02-05 04:52:32 +00001051 self.SetHelpListButtonStates()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001052
Steven M. Gava429a86a2001-10-23 10:42:12 +00001053 def LoadConfigs(self):
1054 """
1055 load configuration from default and user config files and populate
1056 the widgets on the config dialog pages.
1057 """
1058 ### fonts / tabs page
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001059 self.LoadFontCfg()
1060 self.LoadTabCfg()
Steven M. Gava429a86a2001-10-23 10:42:12 +00001061 ### highlighting page
Steven M. Gava9dd16b32001-11-03 14:54:25 +00001062 self.LoadThemeCfg()
Steven M. Gava429a86a2001-10-23 10:42:12 +00001063 ### keys page
Steven M. Gava9dd16b32001-11-03 14:54:25 +00001064 self.LoadKeyCfg()
Steven M. Gava429a86a2001-10-23 10:42:12 +00001065 ### general page
Steven M. Gavafacfc092002-01-19 00:29:54 +00001066 self.LoadGeneralCfg()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001067
Steven M. Gava052937f2002-02-11 02:20:53 +00001068 def SaveNewKeySet(self,keySetName,keySet):
1069 """
1070 save a newly created core key set.
1071 keySetName - string, the name of the new key set
1072 keySet - dictionary containing the new key set
1073 """
1074 if not idleConf.userCfg['keys'].has_section(keySetName):
1075 idleConf.userCfg['keys'].add_section(keySetName)
1076 for event in keySet.keys():
1077 value=keySet[event]
1078 idleConf.userCfg['keys'].SetOption(keySetName,event,value)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001079
Steven M. Gava052937f2002-02-11 02:20:53 +00001080 def SaveNewTheme(self,themeName,theme):
1081 """
1082 save a newly created theme.
1083 themeName - string, the name of the new theme
1084 theme - dictionary containing the new theme
1085 """
1086 if not idleConf.userCfg['highlight'].has_section(themeName):
1087 idleConf.userCfg['highlight'].add_section(themeName)
1088 for element in theme.keys():
1089 value=theme[element]
1090 idleConf.userCfg['highlight'].SetOption(themeName,element,value)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001091
Steven M. Gava2d7bb3f2002-01-29 08:35:29 +00001092 def SetUserValue(self,configType,section,item,value):
Steven M. Gava2d7bb3f2002-01-29 08:35:29 +00001093 if idleConf.defaultCfg[configType].has_option(section,item):
1094 if idleConf.defaultCfg[configType].Get(section,item)==value:
1095 #the setting equals a default setting, remove it from user cfg
1096 return idleConf.userCfg[configType].RemoveOption(section,item)
1097 #if we got here set the option
1098 return idleConf.userCfg[configType].SetOption(section,item,value)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001099
Steven M. Gava052937f2002-02-11 02:20:53 +00001100 def SaveAllChangedConfigs(self):
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +00001101 "Save configuration changes to the user config file."
Steven M. Gava0c5bc8c2002-03-27 02:25:44 +00001102 idleConf.userCfg['main'].Save()
Steven M. Gava5f28e8f2002-01-21 06:38:21 +00001103 for configType in self.changedItems.keys():
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +00001104 cfgTypeHasChanges = False
Steven M. Gava5f28e8f2002-01-21 06:38:21 +00001105 for section in self.changedItems[configType].keys():
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +00001106 if section == 'HelpFiles':
1107 #this section gets completely replaced
1108 idleConf.userCfg['main'].remove_section('HelpFiles')
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +00001109 cfgTypeHasChanges = True
Steven M. Gava5f28e8f2002-01-21 06:38:21 +00001110 for item in self.changedItems[configType][section].keys():
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +00001111 value = self.changedItems[configType][section][item]
Steven M. Gava2d7bb3f2002-01-29 08:35:29 +00001112 if self.SetUserValue(configType,section,item,value):
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +00001113 cfgTypeHasChanges = True
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001114 if cfgTypeHasChanges:
1115 idleConf.userCfg[configType].Save()
Kurt B. Kaiser5acdf932004-11-16 21:28:36 +00001116 for configType in ['keys', 'highlight']:
1117 # save these even if unchanged!
1118 idleConf.userCfg[configType].Save()
Steven M. Gavaa498af22002-02-01 01:33:36 +00001119 self.ResetChangedItems() #clear the changed items dict
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001120
Kurt B. Kaiserb1754452005-11-18 22:05:48 +00001121 def DeactivateCurrentConfig(self):
1122 #Before a config is saved, some cleanup of current
1123 #config must be done - remove the previous keybindings
1124 winInstances=self.parent.instance_dict.keys()
1125 for instance in winInstances:
1126 instance.RemoveKeybindings()
1127
Steven M. Gava49745752002-02-18 01:43:11 +00001128 def ActivateConfigChanges(self):
Kurt B. Kaiseracdef852005-01-31 03:34:26 +00001129 "Dynamically apply configuration changes"
Kurt B. Kaisercf6f1b62004-04-11 03:16:07 +00001130 winInstances=self.parent.instance_dict.keys()
Steven M. Gavab77d3432002-03-02 07:16:21 +00001131 for instance in winInstances:
1132 instance.ResetColorizer()
Steven M. Gavab1585412002-03-12 00:21:56 +00001133 instance.ResetFont()
Kurt B. Kaiseracdef852005-01-31 03:34:26 +00001134 instance.set_notabs_indentwidth()
Kurt B. Kaiserb1754452005-11-18 22:05:48 +00001135 instance.ApplyKeybindings()
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +00001136 instance.reset_help_menu_entries()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001137
Steven M. Gava5f28e8f2002-01-21 06:38:21 +00001138 def Cancel(self):
1139 self.destroy()
1140
1141 def Ok(self):
1142 self.Apply()
1143 self.destroy()
1144
1145 def Apply(self):
Kurt B. Kaiserb1754452005-11-18 22:05:48 +00001146 self.DeactivateCurrentConfig()
Steven M. Gava052937f2002-02-11 02:20:53 +00001147 self.SaveAllChangedConfigs()
Steven M. Gava49745752002-02-18 01:43:11 +00001148 self.ActivateConfigChanges()
Steven M. Gava5f28e8f2002-01-21 06:38:21 +00001149
1150 def Help(self):
Steven M. Gavac11ccf32001-09-24 09:43:17 +00001151 pass
1152
Steven M. Gava44d3d1a2001-07-31 06:59:02 +00001153if __name__ == '__main__':
Steven M. Gavad721c482001-07-31 10:46:53 +00001154 #test the dialog
1155 root=Tk()
1156 Button(root,text='Dialog',
Steven M. Gava3b55a892001-11-21 05:56:26 +00001157 command=lambda:ConfigDialog(root,'Settings')).pack()
Kurt B. Kaisercf6f1b62004-04-11 03:16:07 +00001158 root.instance_dict={}
Steven M. Gavad721c482001-07-31 10:46:53 +00001159 root.mainloop()