blob: 56c1bb80fad4f1b9f4c0ed21e5060433404442e8 [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
Terry Jan Reedy76916e82014-05-29 01:46:16 -040026 def __init__(self,parent,title,_htest=False):
27 """
28 _htest - bool, change box location when running htest
29 """
Steven M. Gavad721c482001-07-31 10:46:53 +000030 Toplevel.__init__(self, parent)
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +000031 self.wm_withdraw()
32
Steven M. Gavad721c482001-07-31 10:46:53 +000033 self.configure(borderwidth=5)
Amaury Forgeot d'Arcb9ee8812009-07-15 21:29:27 +000034 self.title('IDLE Preferences')
Terry Jan Reedy76916e82014-05-29 01:46:16 -040035 if _htest:
36 parent.instance_dict = {}
Steven M. Gavad721c482001-07-31 10:46:53 +000037 self.geometry("+%d+%d" % (parent.winfo_rootx()+20,
Terry Jan Reedy76916e82014-05-29 01:46:16 -040038 parent.winfo_rooty()+(30 if not _htest else 150)))
Georg Brandl7eb4b7d2005-07-22 21:49:32 +000039 #Theme Elements. Each theme element key is its display name.
Steven M. Gava9dd16b32001-11-03 14:54:25 +000040 #The first value of the tuple is the sample area tag name.
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +000041 #The second value is the display name list sort index.
Steven M. Gavaad4f5322002-01-03 12:05:17 +000042 self.themeElements={'Normal Text':('normal','00'),
43 'Python Keywords':('keyword','01'),
44 'Python Definitions':('definition','02'),
Kurt B. Kaiser73360a32004-03-08 18:15:31 +000045 'Python Builtins':('builtin', '03'),
46 'Python Comments':('comment','04'),
47 'Python Strings':('string','05'),
48 'Selected Text':('hilite','06'),
49 'Found Text':('hit','07'),
50 'Cursor':('cursor','08'),
51 'Error Text':('error','09'),
52 'Shell Normal Text':('console','10'),
53 'Shell Stdout Text':('stdout','11'),
54 'Shell Stderr Text':('stderr','12'),
55 }
Steven M. Gavaa498af22002-02-01 01:33:36 +000056 self.ResetChangedItems() #load initial values in changed items dict
Steven M. Gavad721c482001-07-31 10:46:53 +000057 self.CreateWidgets()
58 self.resizable(height=FALSE,width=FALSE)
Steven M. Gavad721c482001-07-31 10:46:53 +000059 self.transient(parent)
60 self.grab_set()
61 self.protocol("WM_DELETE_WINDOW", self.Cancel)
62 self.parent = parent
Steven M. Gava2d4e03b2001-12-05 07:54:07 +000063 self.tabPages.focus_set()
Steven M. Gavad721c482001-07-31 10:46:53 +000064 #key bindings for this dialog
Steven M. Gava5f28e8f2002-01-21 06:38:21 +000065 #self.bind('<Escape>',self.Cancel) #dismiss dialog, no save
66 #self.bind('<Alt-a>',self.Apply) #apply changes, save
67 #self.bind('<F1>',self.Help) #context help
Steven M. Gava429a86a2001-10-23 10:42:12 +000068 self.LoadConfigs()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +000069 self.AttachVarCallbacks() #avoid callbacks during LoadConfigs
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +000070
71 self.wm_deiconify()
Steven M. Gavad721c482001-07-31 10:46:53 +000072 self.wait_window()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +000073
Steven M. Gavad721c482001-07-31 10:46:53 +000074 def CreateWidgets(self):
Kurt B. Kaiser20172f92007-10-30 02:38:54 +000075 self.tabPages = TabbedPageSet(self,
76 page_names=['Fonts/Tabs','Highlighting','Keys','General'])
77 frameActionButtons = Frame(self,pady=2)
Steven M. Gavad721c482001-07-31 10:46:53 +000078 #action buttons
Ned Deily57847df2014-03-27 20:47:04 -070079 if macosxSupport.isAquaTk():
Ronald Oussorena97063a2009-03-04 21:35:05 +000080 # Changing the default padding on OSX results in unreadable
81 # text in the buttons
82 paddingArgs={}
83 else:
84 paddingArgs={'padx':6, 'pady':3}
85
Terry Jan Reedy1d9b9212014-01-26 22:24:17 -050086# Comment out button creation and packing until implement self.Help
87## self.buttonHelp = Button(frameActionButtons,text='Help',
88## command=self.Help,takefocus=FALSE,
89## **paddingArgs)
Steven M. Gavac01e30f2001-08-11 15:48:13 +000090 self.buttonOk = Button(frameActionButtons,text='Ok',
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +000091 command=self.Ok,takefocus=FALSE,
Ronald Oussorena97063a2009-03-04 21:35:05 +000092 **paddingArgs)
Steven M. Gavac01e30f2001-08-11 15:48:13 +000093 self.buttonApply = Button(frameActionButtons,text='Apply',
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +000094 command=self.Apply,takefocus=FALSE,
Ronald Oussorena97063a2009-03-04 21:35:05 +000095 **paddingArgs)
Steven M. Gavad721c482001-07-31 10:46:53 +000096 self.buttonCancel = Button(frameActionButtons,text='Cancel',
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +000097 command=self.Cancel,takefocus=FALSE,
Ronald Oussorena97063a2009-03-04 21:35:05 +000098 **paddingArgs)
Steven M. Gava2d4e03b2001-12-05 07:54:07 +000099 self.CreatePageFontTab()
100 self.CreatePageHighlight()
101 self.CreatePageKeys()
102 self.CreatePageGeneral()
Terry Jan Reedy1d9b9212014-01-26 22:24:17 -0500103## self.buttonHelp.pack(side=RIGHT,padx=5)
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000104 self.buttonOk.pack(side=LEFT,padx=5)
105 self.buttonApply.pack(side=LEFT,padx=5)
106 self.buttonCancel.pack(side=LEFT,padx=5)
Steven M. Gavad721c482001-07-31 10:46:53 +0000107 frameActionButtons.pack(side=BOTTOM)
Kurt B. Kaiser28c7bcf2007-12-28 04:18:01 +0000108 Frame(self, height=2, borderwidth=0).pack(side=BOTTOM)
Steven M. Gava2d4e03b2001-12-05 07:54:07 +0000109 self.tabPages.pack(side=TOP,expand=TRUE,fill=BOTH)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000110
Steven M. Gava60fc7072001-08-04 13:58:22 +0000111 def CreatePageFontTab(self):
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000112 #tkVars
Steven M. Gava3b55a892001-11-21 05:56:26 +0000113 self.fontSize=StringVar(self)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000114 self.fontBold=BooleanVar(self)
115 self.fontName=StringVar(self)
Steven M. Gava3b55a892001-11-21 05:56:26 +0000116 self.spaceNum=IntVar(self)
Kurt B. Kaiser05391692003-05-26 20:35:53 +0000117 self.editFont=tkFont.Font(self,('courier',10,'normal'))
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000118 ##widget creation
119 #body frame
Kurt B. Kaiser20172f92007-10-30 02:38:54 +0000120 frame=self.tabPages.pages['Fonts/Tabs'].frame
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000121 #body section frames
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000122 frameFont=LabelFrame(frame,borderwidth=2,relief=GROOVE,
123 text=' Base Editor Font ')
124 frameIndent=LabelFrame(frame,borderwidth=2,relief=GROOVE,
125 text=' Indentation Width ')
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000126 #frameFont
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000127 frameFontName=Frame(frameFont)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000128 frameFontParam=Frame(frameFont)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000129 labelFontNameTitle=Label(frameFontName,justify=LEFT,
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000130 text='Font Face :')
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000131 self.listFontName=Listbox(frameFontName,height=5,takefocus=FALSE,
132 exportselection=FALSE)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000133 self.listFontName.bind('<ButtonRelease-1>',self.OnListFontButtonRelease)
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000134 scrollFont=Scrollbar(frameFontName)
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000135 scrollFont.config(command=self.listFontName.yview)
136 self.listFontName.config(yscrollcommand=scrollFont.set)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000137 labelFontSizeTitle=Label(frameFontParam,text='Size :')
138 self.optMenuFontSize=DynOptionMenu(frameFontParam,self.fontSize,None,
Steven M. Gavac112cd82002-01-22 05:56:40 +0000139 command=self.SetFontSample)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000140 checkFontBold=Checkbutton(frameFontParam,variable=self.fontBold,
Steven M. Gavac112cd82002-01-22 05:56:40 +0000141 onvalue=1,offvalue=0,text='Bold',command=self.SetFontSample)
Steven M. Gavac11ccf32001-09-24 09:43:17 +0000142 frameFontSample=Frame(frameFont,relief=SOLID,borderwidth=1)
143 self.labelFontSample=Label(frameFontSample,
144 text='AaBbCcDdEe\nFfGgHhIiJjK\n1234567890\n#:+=(){}[]',
Steven M. Gava429a86a2001-10-23 10:42:12 +0000145 justify=LEFT,font=self.editFont)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000146 #frameIndent
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000147 frameIndentSize=Frame(frameIndent)
Kurt B. Kaiseracdef852005-01-31 03:34:26 +0000148 labelSpaceNumTitle=Label(frameIndentSize, justify=LEFT,
149 text='Python Standard: 4 Spaces!')
150 self.scaleSpaceNum=Scale(frameIndentSize, variable=self.spaceNum,
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000151 orient='horizontal',
Kurt B. Kaiseracdef852005-01-31 03:34:26 +0000152 tickinterval=2, from_=2, to=16)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000153 #widget packing
154 #body
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000155 frameFont.pack(side=LEFT,padx=5,pady=5,expand=TRUE,fill=BOTH)
156 frameIndent.pack(side=LEFT,padx=5,pady=5,fill=Y)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000157 #frameFont
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000158 frameFontName.pack(side=TOP,padx=5,pady=5,fill=X)
159 frameFontParam.pack(side=TOP,padx=5,pady=5,fill=X)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000160 labelFontNameTitle.pack(side=TOP,anchor=W)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000161 self.listFontName.pack(side=LEFT,expand=TRUE,fill=X)
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000162 scrollFont.pack(side=LEFT,fill=Y)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000163 labelFontSizeTitle.pack(side=LEFT,anchor=W)
164 self.optMenuFontSize.pack(side=LEFT,anchor=W)
165 checkFontBold.pack(side=LEFT,anchor=W,padx=20)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000166 frameFontSample.pack(side=TOP,padx=5,pady=5,expand=TRUE,fill=BOTH)
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000167 self.labelFontSample.pack(expand=TRUE,fill=BOTH)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000168 #frameIndent
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000169 frameIndentSize.pack(side=TOP,fill=X)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000170 labelSpaceNumTitle.pack(side=TOP,anchor=W,padx=5)
171 self.scaleSpaceNum.pack(side=TOP,padx=5,fill=X)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000172 return frame
173
174 def CreatePageHighlight(self):
Steven M. Gava3b55a892001-11-21 05:56:26 +0000175 self.builtinTheme=StringVar(self)
176 self.customTheme=StringVar(self)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000177 self.fgHilite=BooleanVar(self)
Steven M. Gava3b55a892001-11-21 05:56:26 +0000178 self.colour=StringVar(self)
179 self.fontName=StringVar(self)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000180 self.themeIsBuiltin=BooleanVar(self)
Steven M. Gava3b55a892001-11-21 05:56:26 +0000181 self.highlightTarget=StringVar(self)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000182 ##widget creation
183 #body frame
Kurt B. Kaiser20172f92007-10-30 02:38:54 +0000184 frame=self.tabPages.pages['Highlighting'].frame
Steven M. Gava952d0a52001-08-03 04:43:44 +0000185 #body section frames
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000186 frameCustom=LabelFrame(frame,borderwidth=2,relief=GROOVE,
187 text=' Custom Highlighting ')
188 frameTheme=LabelFrame(frame,borderwidth=2,relief=GROOVE,
189 text=' Highlighting Theme ')
Steven M. Gava952d0a52001-08-03 04:43:44 +0000190 #frameCustom
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000191 self.textHighlightSample=Text(frameCustom,relief=SOLID,borderwidth=1,
Terry Jan Reedy42f7b7e2012-05-26 16:55:43 -0400192 font=('courier',12,''),cursor='hand2',width=21,height=11,
Steven M. Gavab77d3432002-03-02 07:16:21 +0000193 takefocus=FALSE,highlightthickness=0,wrap=NONE)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000194 text=self.textHighlightSample
195 text.bind('<Double-Button-1>',lambda e: 'break')
196 text.bind('<B1-Motion>',lambda e: 'break')
Steven M. Gava052937f2002-02-11 02:20:53 +0000197 textAndTags=(('#you can click here','comment'),('\n','normal'),
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000198 ('#to choose items','comment'),('\n','normal'),('def','keyword'),
199 (' ','normal'),('func','definition'),('(param):','normal'),
200 ('\n ','normal'),('"""string"""','string'),('\n var0 = ','normal'),
Steven M. Gavad0342cd2001-11-04 11:53:10 +0000201 ("'string'",'string'),('\n var1 = ','normal'),("'selected'",'hilite'),
Kurt B. Kaiser73360a32004-03-08 18:15:31 +0000202 ('\n var2 = ','normal'),("'found'",'hit'),
203 ('\n var3 = ','normal'),('list', 'builtin'), ('(','normal'),
204 ('None', 'builtin'),(')\n\n','normal'),
Steven M. Gava99300612001-11-04 07:03:08 +0000205 (' error ','error'),(' ','normal'),('cursor |','cursor'),
Steven M. Gavad0342cd2001-11-04 11:53:10 +0000206 ('\n ','normal'),('shell','console'),(' ','normal'),('stdout','stdout'),
207 (' ','normal'),('stderr','stderr'),('\n','normal'))
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000208 for txTa in textAndTags:
209 text.insert(END,txTa[0],txTa[1])
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000210 for element in self.themeElements.keys():
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000211 text.tag_bind(self.themeElements[element][0],'<ButtonPress-1>',
212 lambda event,elem=element: event.widget.winfo_toplevel()
213 .highlightTarget.set(elem))
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000214 text.config(state=DISABLED)
215 self.frameColourSet=Frame(frameCustom,relief=SOLID,borderwidth=1)
Steven M. Gava7c017862001-10-29 11:19:46 +0000216 frameFgBg=Frame(frameCustom)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000217 buttonSetColour=Button(self.frameColourSet,text='Choose Colour for :',
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000218 command=self.GetColour,highlightthickness=0)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000219 self.optMenuHighlightTarget=DynOptionMenu(self.frameColourSet,
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000220 self.highlightTarget,None,highlightthickness=0)#,command=self.SetHighlightTargetBinding
Steven M. Gava7c017862001-10-29 11:19:46 +0000221 self.radioFg=Radiobutton(frameFgBg,variable=self.fgHilite,
Steven M. Gava3b55a892001-11-21 05:56:26 +0000222 value=1,text='Foreground',command=self.SetColourSampleBinding)
Steven M. Gava7c017862001-10-29 11:19:46 +0000223 self.radioBg=Radiobutton(frameFgBg,variable=self.fgHilite,
Steven M. Gava3b55a892001-11-21 05:56:26 +0000224 value=0,text='Background',command=self.SetColourSampleBinding)
Steven M. Gava7c017862001-10-29 11:19:46 +0000225 self.fgHilite.set(1)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000226 buttonSaveCustomTheme=Button(frameCustom,
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000227 text='Save as New Custom Theme',command=self.SaveAsNewTheme)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000228 #frameTheme
Steven M. Gava952d0a52001-08-03 04:43:44 +0000229 labelTypeTitle=Label(frameTheme,text='Select : ')
Steven M. Gavad0342cd2001-11-04 11:53:10 +0000230 self.radioThemeBuiltin=Radiobutton(frameTheme,variable=self.themeIsBuiltin,
231 value=1,command=self.SetThemeType,text='a Built-in Theme')
232 self.radioThemeCustom=Radiobutton(frameTheme,variable=self.themeIsBuiltin,
233 value=0,command=self.SetThemeType,text='a Custom Theme')
Steven M. Gava41a85322001-10-29 08:05:34 +0000234 self.optMenuThemeBuiltin=DynOptionMenu(frameTheme,
Steven M. Gava7c017862001-10-29 11:19:46 +0000235 self.builtinTheme,None,command=None)
Steven M. Gava41a85322001-10-29 08:05:34 +0000236 self.optMenuThemeCustom=DynOptionMenu(frameTheme,
Steven M. Gava7c017862001-10-29 11:19:46 +0000237 self.customTheme,None,command=None)
Steven M. Gava49745752002-02-18 01:43:11 +0000238 self.buttonDeleteCustomTheme=Button(frameTheme,text='Delete Custom Theme',
239 command=self.DeleteCustomTheme)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000240 ##widget packing
241 #body
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000242 frameCustom.pack(side=LEFT,padx=5,pady=5,expand=TRUE,fill=BOTH)
243 frameTheme.pack(side=LEFT,padx=5,pady=5,fill=Y)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000244 #frameCustom
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000245 self.frameColourSet.pack(side=TOP,padx=5,pady=5,expand=TRUE,fill=X)
Steven M. Gava7c017862001-10-29 11:19:46 +0000246 frameFgBg.pack(side=TOP,padx=5,pady=0)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000247 self.textHighlightSample.pack(side=TOP,padx=5,pady=5,expand=TRUE,
248 fill=BOTH)
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000249 buttonSetColour.pack(side=TOP,expand=TRUE,fill=X,padx=8,pady=4)
250 self.optMenuHighlightTarget.pack(side=TOP,expand=TRUE,fill=X,padx=8,pady=3)
Steven M. Gava7c017862001-10-29 11:19:46 +0000251 self.radioFg.pack(side=LEFT,anchor=E)
252 self.radioBg.pack(side=RIGHT,anchor=W)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000253 buttonSaveCustomTheme.pack(side=BOTTOM,fill=X,padx=5,pady=5)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000254 #frameTheme
Steven M. Gava952d0a52001-08-03 04:43:44 +0000255 labelTypeTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
Steven M. Gava41a85322001-10-29 08:05:34 +0000256 self.radioThemeBuiltin.pack(side=TOP,anchor=W,padx=5)
257 self.radioThemeCustom.pack(side=TOP,anchor=W,padx=5,pady=2)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000258 self.optMenuThemeBuiltin.pack(side=TOP,fill=X,padx=5,pady=5)
259 self.optMenuThemeCustom.pack(side=TOP,fill=X,anchor=W,padx=5,pady=5)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000260 self.buttonDeleteCustomTheme.pack(side=TOP,fill=X,padx=5,pady=5)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000261 return frame
262
263 def CreatePageKeys(self):
Steven M. Gava60fc7072001-08-04 13:58:22 +0000264 #tkVars
Steven M. Gava3b55a892001-11-21 05:56:26 +0000265 self.bindingTarget=StringVar(self)
266 self.builtinKeys=StringVar(self)
267 self.customKeys=StringVar(self)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000268 self.keysAreBuiltin=BooleanVar(self)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000269 self.keyBinding=StringVar(self)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000270 ##widget creation
271 #body frame
Kurt B. Kaiser20172f92007-10-30 02:38:54 +0000272 frame=self.tabPages.pages['Keys'].frame
Steven M. Gava60fc7072001-08-04 13:58:22 +0000273 #body section frames
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000274 frameCustom=LabelFrame(frame,borderwidth=2,relief=GROOVE,
275 text=' Custom Key Bindings ')
276 frameKeySets=LabelFrame(frame,borderwidth=2,relief=GROOVE,
277 text=' Key Set ')
Steven M. Gava60fc7072001-08-04 13:58:22 +0000278 #frameCustom
279 frameTarget=Frame(frameCustom)
Steven M. Gavafacfc092002-01-19 00:29:54 +0000280 labelTargetTitle=Label(frameTarget,text='Action - Key(s)')
281 scrollTargetY=Scrollbar(frameTarget)
282 scrollTargetX=Scrollbar(frameTarget,orient=HORIZONTAL)
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000283 self.listBindings=Listbox(frameTarget,takefocus=FALSE,
284 exportselection=FALSE)
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000285 self.listBindings.bind('<ButtonRelease-1>',self.KeyBindingSelected)
Steven M. Gavafacfc092002-01-19 00:29:54 +0000286 scrollTargetY.config(command=self.listBindings.yview)
287 scrollTargetX.config(command=self.listBindings.xview)
288 self.listBindings.config(yscrollcommand=scrollTargetY.set)
289 self.listBindings.config(xscrollcommand=scrollTargetX.set)
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000290 self.buttonNewKeys=Button(frameCustom,text='Get New Keys for Selection',
291 command=self.GetNewKeys,state=DISABLED)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000292 #frameKeySets
Kurt B. Kaiser28c7bcf2007-12-28 04:18:01 +0000293 frames = [Frame(frameKeySets, padx=2, pady=2, borderwidth=0)
294 for i in range(2)]
295 self.radioKeysBuiltin=Radiobutton(frames[0],variable=self.keysAreBuiltin,
296 value=1,command=self.SetKeysType,text='Use a Built-in Key Set')
297 self.radioKeysCustom=Radiobutton(frames[0],variable=self.keysAreBuiltin,
298 value=0,command=self.SetKeysType,text='Use a Custom Key Set')
299 self.optMenuKeysBuiltin=DynOptionMenu(frames[0],
Steven M. Gava41a85322001-10-29 08:05:34 +0000300 self.builtinKeys,None,command=None)
Kurt B. Kaiser28c7bcf2007-12-28 04:18:01 +0000301 self.optMenuKeysCustom=DynOptionMenu(frames[0],
Steven M. Gava41a85322001-10-29 08:05:34 +0000302 self.customKeys,None,command=None)
Kurt B. Kaiser28c7bcf2007-12-28 04:18:01 +0000303 self.buttonDeleteCustomKeys=Button(frames[1],text='Delete Custom Key Set',
Steven M. Gava49745752002-02-18 01:43:11 +0000304 command=self.DeleteCustomKeys)
Kurt B. Kaiser28c7bcf2007-12-28 04:18:01 +0000305 buttonSaveCustomKeys=Button(frames[1],
306 text='Save as New Custom Key Set',command=self.SaveAsNewKeySet)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000307 ##widget packing
308 #body
Kurt B. Kaiser28c7bcf2007-12-28 04:18:01 +0000309 frameCustom.pack(side=BOTTOM,padx=5,pady=5,expand=TRUE,fill=BOTH)
310 frameKeySets.pack(side=BOTTOM,padx=5,pady=5,fill=BOTH)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000311 #frameCustom
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000312 self.buttonNewKeys.pack(side=BOTTOM,fill=X,padx=5,pady=5)
Steven M. Gavafacfc092002-01-19 00:29:54 +0000313 frameTarget.pack(side=LEFT,padx=5,pady=5,expand=TRUE,fill=BOTH)
314 #frame target
315 frameTarget.columnconfigure(0,weight=1)
316 frameTarget.rowconfigure(1,weight=1)
317 labelTargetTitle.grid(row=0,column=0,columnspan=2,sticky=W)
318 self.listBindings.grid(row=1,column=0,sticky=NSEW)
319 scrollTargetY.grid(row=1,column=1,sticky=NS)
320 scrollTargetX.grid(row=2,column=0,sticky=EW)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000321 #frameKeySets
Kurt B. Kaiser28c7bcf2007-12-28 04:18:01 +0000322 self.radioKeysBuiltin.grid(row=0, column=0, sticky=W+NS)
323 self.radioKeysCustom.grid(row=1, column=0, sticky=W+NS)
324 self.optMenuKeysBuiltin.grid(row=0, column=1, sticky=NSEW)
325 self.optMenuKeysCustom.grid(row=1, column=1, sticky=NSEW)
326 self.buttonDeleteCustomKeys.pack(side=LEFT,fill=X,expand=True,padx=2)
327 buttonSaveCustomKeys.pack(side=LEFT,fill=X,expand=True,padx=2)
328 frames[0].pack(side=TOP, fill=BOTH, expand=True)
329 frames[1].pack(side=TOP, fill=X, expand=True, pady=2)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000330 return frame
331
332 def CreatePageGeneral(self):
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000333 #tkVars
334 self.winWidth=StringVar(self)
Steven M. Gava3b55a892001-11-21 05:56:26 +0000335 self.winHeight=StringVar(self)
Raymond Hettinger4e49b832004-06-04 06:31:08 +0000336 self.paraWidth=StringVar(self)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000337 self.startupEdit=IntVar(self)
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000338 self.autoSave=IntVar(self)
Kurt B. Kaisera053f332003-05-10 00:49:56 +0000339 self.encoding=StringVar(self)
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000340 self.userHelpBrowser=BooleanVar(self)
341 self.helpBrowser=StringVar(self)
Steven M. Gava230e5782001-08-07 03:28:25 +0000342 #widget creation
343 #body
Kurt B. Kaiser20172f92007-10-30 02:38:54 +0000344 frame=self.tabPages.pages['General'].frame
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000345 #body section frames
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000346 frameRun=LabelFrame(frame,borderwidth=2,relief=GROOVE,
347 text=' Startup Preferences ')
348 frameSave=LabelFrame(frame,borderwidth=2,relief=GROOVE,
349 text=' Autosave Preferences ')
Steven M. Gava230e5782001-08-07 03:28:25 +0000350 frameWinSize=Frame(frame,borderwidth=2,relief=GROOVE)
Raymond Hettinger4e49b832004-06-04 06:31:08 +0000351 frameParaSize=Frame(frame,borderwidth=2,relief=GROOVE)
Kurt B. Kaisera053f332003-05-10 00:49:56 +0000352 frameEncoding=Frame(frame,borderwidth=2,relief=GROOVE)
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000353 frameHelp=LabelFrame(frame,borderwidth=2,relief=GROOVE,
354 text=' Additional Help Sources ')
Steven M. Gava230e5782001-08-07 03:28:25 +0000355 #frameRun
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000356 labelRunChoiceTitle=Label(frameRun,text='At Startup')
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000357 radioStartupEdit=Radiobutton(frameRun,variable=self.startupEdit,
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +0000358 value=1,command=self.SetKeysType,text="Open Edit Window")
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000359 radioStartupShell=Radiobutton(frameRun,variable=self.startupEdit,
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +0000360 value=0,command=self.SetKeysType,text='Open Shell Window')
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000361 #frameSave
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000362 labelRunSaveTitle=Label(frameSave,text='At Start of Run (F5) ')
363 radioSaveAsk=Radiobutton(frameSave,variable=self.autoSave,
364 value=0,command=self.SetKeysType,text="Prompt to Save")
365 radioSaveAuto=Radiobutton(frameSave,variable=self.autoSave,
366 value=1,command=self.SetKeysType,text='No Prompt')
Steven M. Gava230e5782001-08-07 03:28:25 +0000367 #frameWinSize
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000368 labelWinSizeTitle=Label(frameWinSize,text='Initial Window Size'+
369 ' (in characters)')
Steven M. Gava230e5782001-08-07 03:28:25 +0000370 labelWinWidthTitle=Label(frameWinSize,text='Width')
371 entryWinWidth=Entry(frameWinSize,textvariable=self.winWidth,
372 width=3)
373 labelWinHeightTitle=Label(frameWinSize,text='Height')
374 entryWinHeight=Entry(frameWinSize,textvariable=self.winHeight,
375 width=3)
Raymond Hettinger4e49b832004-06-04 06:31:08 +0000376 #paragraphFormatWidth
377 labelParaWidthTitle=Label(frameParaSize,text='Paragraph reformat'+
378 ' width (in characters)')
379 entryParaWidth=Entry(frameParaSize,textvariable=self.paraWidth,
380 width=3)
Kurt B. Kaisera053f332003-05-10 00:49:56 +0000381 #frameEncoding
382 labelEncodingTitle=Label(frameEncoding,text="Default Source Encoding")
383 radioEncLocale=Radiobutton(frameEncoding,variable=self.encoding,
384 value="locale",text="Locale-defined")
385 radioEncUTF8=Radiobutton(frameEncoding,variable=self.encoding,
386 value="utf-8",text="UTF-8")
387 radioEncNone=Radiobutton(frameEncoding,variable=self.encoding,
388 value="none",text="None")
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000389 #frameHelp
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000390 frameHelpList=Frame(frameHelp)
391 frameHelpListButtons=Frame(frameHelpList)
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000392 scrollHelpList=Scrollbar(frameHelpList)
393 self.listHelp=Listbox(frameHelpList,height=5,takefocus=FALSE,
394 exportselection=FALSE)
395 scrollHelpList.config(command=self.listHelp.yview)
396 self.listHelp.config(yscrollcommand=scrollHelpList.set)
397 self.listHelp.bind('<ButtonRelease-1>',self.HelpSourceSelected)
398 self.buttonHelpListEdit=Button(frameHelpListButtons,text='Edit',
399 state=DISABLED,width=8,command=self.HelpListItemEdit)
400 self.buttonHelpListAdd=Button(frameHelpListButtons,text='Add',
401 width=8,command=self.HelpListItemAdd)
402 self.buttonHelpListRemove=Button(frameHelpListButtons,text='Remove',
403 state=DISABLED,width=8,command=self.HelpListItemRemove)
Steven M. Gava230e5782001-08-07 03:28:25 +0000404 #widget packing
405 #body
406 frameRun.pack(side=TOP,padx=5,pady=5,fill=X)
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000407 frameSave.pack(side=TOP,padx=5,pady=5,fill=X)
Steven M. Gava230e5782001-08-07 03:28:25 +0000408 frameWinSize.pack(side=TOP,padx=5,pady=5,fill=X)
Raymond Hettinger4e49b832004-06-04 06:31:08 +0000409 frameParaSize.pack(side=TOP,padx=5,pady=5,fill=X)
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000410 frameEncoding.pack(side=TOP,padx=5,pady=5,fill=X)
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000411 frameHelp.pack(side=TOP,padx=5,pady=5,expand=TRUE,fill=BOTH)
Steven M. Gava230e5782001-08-07 03:28:25 +0000412 #frameRun
Steven M. Gava230e5782001-08-07 03:28:25 +0000413 labelRunChoiceTitle.pack(side=LEFT,anchor=W,padx=5,pady=5)
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000414 radioStartupShell.pack(side=RIGHT,anchor=W,padx=5,pady=5)
415 radioStartupEdit.pack(side=RIGHT,anchor=W,padx=5,pady=5)
416 #frameSave
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000417 labelRunSaveTitle.pack(side=LEFT,anchor=W,padx=5,pady=5)
418 radioSaveAuto.pack(side=RIGHT,anchor=W,padx=5,pady=5)
419 radioSaveAsk.pack(side=RIGHT,anchor=W,padx=5,pady=5)
Steven M. Gava230e5782001-08-07 03:28:25 +0000420 #frameWinSize
Steven M. Gavafacfc092002-01-19 00:29:54 +0000421 labelWinSizeTitle.pack(side=LEFT,anchor=W,padx=5,pady=5)
422 entryWinHeight.pack(side=RIGHT,anchor=E,padx=10,pady=5)
423 labelWinHeightTitle.pack(side=RIGHT,anchor=E,pady=5)
424 entryWinWidth.pack(side=RIGHT,anchor=E,padx=10,pady=5)
425 labelWinWidthTitle.pack(side=RIGHT,anchor=E,pady=5)
Raymond Hettinger4e49b832004-06-04 06:31:08 +0000426 #paragraphFormatWidth
427 labelParaWidthTitle.pack(side=LEFT,anchor=W,padx=5,pady=5)
428 entryParaWidth.pack(side=RIGHT,anchor=E,padx=10,pady=5)
Kurt B. Kaisera053f332003-05-10 00:49:56 +0000429 #frameEncoding
430 labelEncodingTitle.pack(side=LEFT,anchor=W,padx=5,pady=5)
431 radioEncNone.pack(side=RIGHT,anchor=E,pady=5)
432 radioEncUTF8.pack(side=RIGHT,anchor=E,pady=5)
433 radioEncLocale.pack(side=RIGHT,anchor=E,pady=5)
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000434 #frameHelp
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000435 frameHelpListButtons.pack(side=RIGHT,padx=5,pady=5,fill=Y)
436 frameHelpList.pack(side=TOP,padx=5,pady=5,expand=TRUE,fill=BOTH)
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000437 scrollHelpList.pack(side=RIGHT,anchor=W,fill=Y)
438 self.listHelp.pack(side=LEFT,anchor=E,expand=TRUE,fill=BOTH)
439 self.buttonHelpListEdit.pack(side=TOP,anchor=W,pady=5)
440 self.buttonHelpListAdd.pack(side=TOP,anchor=W)
441 self.buttonHelpListRemove.pack(side=TOP,anchor=W,pady=5)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000442 return frame
443
Steven M. Gavac112cd82002-01-22 05:56:40 +0000444 def AttachVarCallbacks(self):
445 self.fontSize.trace_variable('w',self.VarChanged_fontSize)
446 self.fontName.trace_variable('w',self.VarChanged_fontName)
447 self.fontBold.trace_variable('w',self.VarChanged_fontBold)
448 self.spaceNum.trace_variable('w',self.VarChanged_spaceNum)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000449 self.colour.trace_variable('w',self.VarChanged_colour)
Steven M. Gava052937f2002-02-11 02:20:53 +0000450 self.builtinTheme.trace_variable('w',self.VarChanged_builtinTheme)
451 self.customTheme.trace_variable('w',self.VarChanged_customTheme)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000452 self.themeIsBuiltin.trace_variable('w',self.VarChanged_themeIsBuiltin)
Steven M. Gava052937f2002-02-11 02:20:53 +0000453 self.highlightTarget.trace_variable('w',self.VarChanged_highlightTarget)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000454 self.keyBinding.trace_variable('w',self.VarChanged_keyBinding)
Steven M. Gava052937f2002-02-11 02:20:53 +0000455 self.builtinKeys.trace_variable('w',self.VarChanged_builtinKeys)
456 self.customKeys.trace_variable('w',self.VarChanged_customKeys)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000457 self.keysAreBuiltin.trace_variable('w',self.VarChanged_keysAreBuiltin)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000458 self.winWidth.trace_variable('w',self.VarChanged_winWidth)
459 self.winHeight.trace_variable('w',self.VarChanged_winHeight)
Raymond Hettinger4e49b832004-06-04 06:31:08 +0000460 self.paraWidth.trace_variable('w',self.VarChanged_paraWidth)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000461 self.startupEdit.trace_variable('w',self.VarChanged_startupEdit)
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000462 self.autoSave.trace_variable('w',self.VarChanged_autoSave)
Kurt B. Kaisera053f332003-05-10 00:49:56 +0000463 self.encoding.trace_variable('w',self.VarChanged_encoding)
Steven M. Gava052937f2002-02-11 02:20:53 +0000464
Steven M. Gavac112cd82002-01-22 05:56:40 +0000465 def VarChanged_fontSize(self,*params):
466 value=self.fontSize.get()
467 self.AddChangedItem('main','EditorWindow','font-size',value)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000468
Steven M. Gavac112cd82002-01-22 05:56:40 +0000469 def VarChanged_fontName(self,*params):
470 value=self.fontName.get()
471 self.AddChangedItem('main','EditorWindow','font',value)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000472
473 def VarChanged_fontBold(self,*params):
474 value=self.fontBold.get()
475 self.AddChangedItem('main','EditorWindow','font-bold',value)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000476
Steven M. Gavac112cd82002-01-22 05:56:40 +0000477 def VarChanged_spaceNum(self,*params):
478 value=self.spaceNum.get()
479 self.AddChangedItem('main','Indent','num-spaces',value)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000480
Steven M. Gavac112cd82002-01-22 05:56:40 +0000481 def VarChanged_colour(self,*params):
Steven M. Gava052937f2002-02-11 02:20:53 +0000482 self.OnNewColourSet()
483
484 def VarChanged_builtinTheme(self,*params):
485 value=self.builtinTheme.get()
486 self.AddChangedItem('main','Theme','name',value)
487 self.PaintThemeSample()
488
489 def VarChanged_customTheme(self,*params):
490 value=self.customTheme.get()
Steven M. Gava49745752002-02-18 01:43:11 +0000491 if value != '- no custom themes -':
492 self.AddChangedItem('main','Theme','name',value)
493 self.PaintThemeSample()
Steven M. Gava052937f2002-02-11 02:20:53 +0000494
495 def VarChanged_themeIsBuiltin(self,*params):
496 value=self.themeIsBuiltin.get()
497 self.AddChangedItem('main','Theme','default',value)
Steven M. Gavaf31eec02002-03-05 00:25:58 +0000498 if value:
499 self.VarChanged_builtinTheme()
500 else:
501 self.VarChanged_customTheme()
Steven M. Gava052937f2002-02-11 02:20:53 +0000502
503 def VarChanged_highlightTarget(self,*params):
504 self.SetHighlightTarget()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000505
Steven M. Gavac112cd82002-01-22 05:56:40 +0000506 def VarChanged_keyBinding(self,*params):
Steven M. Gavabbf5ef52002-01-22 11:35:50 +0000507 value=self.keyBinding.get()
508 keySet=self.customKeys.get()
509 event=self.listBindings.get(ANCHOR).split()[0]
Steven M. Gavaa498af22002-02-01 01:33:36 +0000510 if idleConf.IsCoreBinding(event):
511 #this is a core keybinding
512 self.AddChangedItem('keys',keySet,event,value)
513 else: #this is an extension key binding
514 extName=idleConf.GetExtnNameForEvent(event)
515 extKeybindSection=extName+'_cfgBindings'
516 self.AddChangedItem('extensions',extKeybindSection,event,value)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000517
Steven M. Gava052937f2002-02-11 02:20:53 +0000518 def VarChanged_builtinKeys(self,*params):
519 value=self.builtinKeys.get()
520 self.AddChangedItem('main','Keys','name',value)
521 self.LoadKeysList(value)
522
523 def VarChanged_customKeys(self,*params):
524 value=self.customKeys.get()
Steven M. Gava49745752002-02-18 01:43:11 +0000525 if value != '- no custom keys -':
526 self.AddChangedItem('main','Keys','name',value)
527 self.LoadKeysList(value)
Steven M. Gava052937f2002-02-11 02:20:53 +0000528
529 def VarChanged_keysAreBuiltin(self,*params):
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000530 value=self.keysAreBuiltin.get()
Steven M. Gava052937f2002-02-11 02:20:53 +0000531 self.AddChangedItem('main','Keys','default',value)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000532 if value:
Steven M. Gavaf31eec02002-03-05 00:25:58 +0000533 self.VarChanged_builtinKeys()
Steven M. Gava052937f2002-02-11 02:20:53 +0000534 else:
Steven M. Gavaf31eec02002-03-05 00:25:58 +0000535 self.VarChanged_customKeys()
Steven M. Gava052937f2002-02-11 02:20:53 +0000536
Steven M. Gavac112cd82002-01-22 05:56:40 +0000537 def VarChanged_winWidth(self,*params):
Steven M. Gavabbf5ef52002-01-22 11:35:50 +0000538 value=self.winWidth.get()
539 self.AddChangedItem('main','EditorWindow','width',value)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000540
541 def VarChanged_winHeight(self,*params):
Steven M. Gavabbf5ef52002-01-22 11:35:50 +0000542 value=self.winHeight.get()
543 self.AddChangedItem('main','EditorWindow','height',value)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000544
Raymond Hettinger4e49b832004-06-04 06:31:08 +0000545 def VarChanged_paraWidth(self,*params):
546 value=self.paraWidth.get()
547 self.AddChangedItem('main','FormatParagraph','paragraph',value)
548
Steven M. Gavac112cd82002-01-22 05:56:40 +0000549 def VarChanged_startupEdit(self,*params):
Steven M. Gavabbf5ef52002-01-22 11:35:50 +0000550 value=self.startupEdit.get()
551 self.AddChangedItem('main','General','editor-on-startup',value)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000552
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000553 def VarChanged_autoSave(self,*params):
554 value=self.autoSave.get()
555 self.AddChangedItem('main','General','autosave',value)
556
Kurt B. Kaisera053f332003-05-10 00:49:56 +0000557 def VarChanged_encoding(self,*params):
558 value=self.encoding.get()
559 self.AddChangedItem('main','EditorWindow','encoding',value)
560
Steven M. Gavaa498af22002-02-01 01:33:36 +0000561 def ResetChangedItems(self):
Steven M. Gavab77d3432002-03-02 07:16:21 +0000562 #When any config item is changed in this dialog, an entry
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000563 #should be made in the relevant section (config type) of this
564 #dictionary. The key should be the config file section name and the
Steven M. Gavaa498af22002-02-01 01:33:36 +0000565 #value a dictionary, whose key:value pairs are item=value pairs for
566 #that config file section.
567 self.changedItems={'main':{},'highlight':{},'keys':{},'extensions':{}}
568
Steven M. Gavac112cd82002-01-22 05:56:40 +0000569 def AddChangedItem(self,type,section,item,value):
Steven M. Gava2d7bb3f2002-01-29 08:35:29 +0000570 value=str(value) #make sure we use a string
Benjamin Peterson6e3dbbd2009-10-09 22:15:50 +0000571 if section not in self.changedItems[type]:
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000572 self.changedItems[type][section]={}
Steven M. Gavac112cd82002-01-22 05:56:40 +0000573 self.changedItems[type][section][item]=value
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000574
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000575 def GetDefaultItems(self):
576 dItems={'main':{},'highlight':{},'keys':{},'extensions':{}}
577 for configType in dItems.keys():
578 sections=idleConf.GetSectionList('default',configType)
579 for section in sections:
580 dItems[configType][section]={}
581 options=idleConf.defaultCfg[configType].GetOptionList(section)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000582 for option in options:
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000583 dItems[configType][section][option]=(
584 idleConf.defaultCfg[configType].Get(section,option))
585 return dItems
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000586
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000587 def SetThemeType(self):
588 if self.themeIsBuiltin.get():
589 self.optMenuThemeBuiltin.config(state=NORMAL)
590 self.optMenuThemeCustom.config(state=DISABLED)
591 self.buttonDeleteCustomTheme.config(state=DISABLED)
592 else:
593 self.optMenuThemeBuiltin.config(state=DISABLED)
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000594 self.radioThemeCustom.config(state=NORMAL)
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000595 self.optMenuThemeCustom.config(state=NORMAL)
596 self.buttonDeleteCustomTheme.config(state=NORMAL)
597
598 def SetKeysType(self):
Steven M. Gava052937f2002-02-11 02:20:53 +0000599 if self.keysAreBuiltin.get():
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000600 self.optMenuKeysBuiltin.config(state=NORMAL)
601 self.optMenuKeysCustom.config(state=DISABLED)
602 self.buttonDeleteCustomKeys.config(state=DISABLED)
603 else:
604 self.optMenuKeysBuiltin.config(state=DISABLED)
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000605 self.radioKeysCustom.config(state=NORMAL)
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000606 self.optMenuKeysCustom.config(state=NORMAL)
607 self.buttonDeleteCustomKeys.config(state=NORMAL)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000608
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000609 def GetNewKeys(self):
610 listIndex=self.listBindings.index(ANCHOR)
611 binding=self.listBindings.get(listIndex)
612 bindName=binding.split()[0] #first part, up to first space
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000613 if self.keysAreBuiltin.get():
Steven M. Gavae28ee752002-02-11 03:45:22 +0000614 currentKeySetName=self.builtinKeys.get()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000615 else:
Steven M. Gavae28ee752002-02-11 03:45:22 +0000616 currentKeySetName=self.customKeys.get()
617 currentBindings=idleConf.GetCurrentKeySet()
618 if currentKeySetName in self.changedItems['keys'].keys(): #unsaved changes
619 keySetChanges=self.changedItems['keys'][currentKeySetName]
620 for event in keySetChanges.keys():
621 currentBindings[event]=keySetChanges[event].split()
622 currentKeySequences=currentBindings.values()
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000623 newKeys=GetKeysDialog(self,'Get New Keys',bindName,
624 currentKeySequences).result
625 if newKeys: #new keys were specified
Steven M. Gava052937f2002-02-11 02:20:53 +0000626 if self.keysAreBuiltin.get(): #current key set is a built-in
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000627 message=('Your changes will be saved as a new Custom Key Set. '+
628 'Enter a name for your new Custom Key Set below.')
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000629 newKeySet=self.GetNewKeysName(message)
630 if not newKeySet: #user cancelled custom key set creation
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000631 self.listBindings.select_set(listIndex)
632 self.listBindings.select_anchor(listIndex)
633 return
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000634 else: #create new custom key set based on previously active key set
635 self.CreateNewKeySet(newKeySet)
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000636 self.listBindings.delete(listIndex)
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000637 self.listBindings.insert(listIndex,bindName+' - '+newKeys)
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000638 self.listBindings.select_set(listIndex)
639 self.listBindings.select_anchor(listIndex)
Steven M. Gava052937f2002-02-11 02:20:53 +0000640 self.keyBinding.set(newKeys)
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000641 else:
642 self.listBindings.select_set(listIndex)
643 self.listBindings.select_anchor(listIndex)
644
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000645 def GetNewKeysName(self,message):
Steven M. Gava49745752002-02-18 01:43:11 +0000646 usedNames=(idleConf.GetSectionList('user','keys')+
647 idleConf.GetSectionList('default','keys'))
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000648 newKeySet=GetCfgSectionNameDialog(self,'New Custom Key Set',
649 message,usedNames).result
650 return newKeySet
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000651
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000652 def SaveAsNewKeySet(self):
653 newKeysName=self.GetNewKeysName('New Key Set Name:')
654 if newKeysName:
655 self.CreateNewKeySet(newKeysName)
656
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000657 def KeyBindingSelected(self,event):
658 self.buttonNewKeys.config(state=NORMAL)
659
660 def CreateNewKeySet(self,newKeySetName):
661 #creates new custom key set based on the previously active key set,
662 #and makes the new key set active
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000663 if self.keysAreBuiltin.get():
Steven M. Gava052937f2002-02-11 02:20:53 +0000664 prevKeySetName=self.builtinKeys.get()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000665 else:
Steven M. Gava052937f2002-02-11 02:20:53 +0000666 prevKeySetName=self.customKeys.get()
Steven M. Gava052937f2002-02-11 02:20:53 +0000667 prevKeys=idleConf.GetCoreKeys(prevKeySetName)
Steven M. Gava052937f2002-02-11 02:20:53 +0000668 newKeys={}
669 for event in prevKeys.keys(): #add key set to changed items
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000670 eventName=event[2:-2] #trim off the angle brackets
Steven M. Gava052937f2002-02-11 02:20:53 +0000671 binding=string.join(prevKeys[event])
672 newKeys[eventName]=binding
Steven M. Gava052937f2002-02-11 02:20:53 +0000673 #handle any unsaved changes to prev key set
674 if prevKeySetName in self.changedItems['keys'].keys():
675 keySetChanges=self.changedItems['keys'][prevKeySetName]
676 for event in keySetChanges.keys():
677 newKeys[event]=keySetChanges[event]
Steven M. Gava052937f2002-02-11 02:20:53 +0000678 #save the new theme
679 self.SaveNewKeySet(newKeySetName,newKeys)
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000680 #change gui over to the new key set
681 customKeyList=idleConf.GetSectionList('user','keys')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000682 customKeyList.sort()
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000683 self.optMenuKeysCustom.SetMenu(customKeyList,newKeySetName)
Steven M. Gava052937f2002-02-11 02:20:53 +0000684 self.keysAreBuiltin.set(0)
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000685 self.SetKeysType()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000686
Steven M. Gava052937f2002-02-11 02:20:53 +0000687 def LoadKeysList(self,keySetName):
688 reselect=0
689 newKeySet=0
690 if self.listBindings.curselection():
691 reselect=1
692 listIndex=self.listBindings.index(ANCHOR)
Steven M. Gava052937f2002-02-11 02:20:53 +0000693 keySet=idleConf.GetKeySet(keySetName)
Steven M. Gava052937f2002-02-11 02:20:53 +0000694 bindNames=keySet.keys()
695 bindNames.sort()
696 self.listBindings.delete(0,END)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000697 for bindName in bindNames:
Steven M. Gava052937f2002-02-11 02:20:53 +0000698 key=string.join(keySet[bindName]) #make key(s) into a string
699 bindName=bindName[2:-2] #trim off the angle brackets
Steven M. Gava052937f2002-02-11 02:20:53 +0000700 if keySetName in self.changedItems['keys'].keys():
701 #handle any unsaved changes to this key set
702 if bindName in self.changedItems['keys'][keySetName].keys():
703 key=self.changedItems['keys'][keySetName][bindName]
Steven M. Gava052937f2002-02-11 02:20:53 +0000704 self.listBindings.insert(END, bindName+' - '+key)
Steven M. Gava052937f2002-02-11 02:20:53 +0000705 if reselect:
706 self.listBindings.see(listIndex)
707 self.listBindings.select_set(listIndex)
708 self.listBindings.select_anchor(listIndex)
709
Steven M. Gava49745752002-02-18 01:43:11 +0000710 def DeleteCustomKeys(self):
711 keySetName=self.customKeys.get()
712 if not tkMessageBox.askyesno('Delete Key Set','Are you sure you wish '+
Walter Dörwald70a6b492004-02-12 17:35:32 +0000713 'to delete the key set %r ?' % (keySetName),
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +0000714 parent=self):
Steven M. Gava49745752002-02-18 01:43:11 +0000715 return
716 #remove key set from config
717 idleConf.userCfg['keys'].remove_section(keySetName)
Benjamin Peterson6e3dbbd2009-10-09 22:15:50 +0000718 if keySetName in self.changedItems['keys']:
Steven M. Gava49745752002-02-18 01:43:11 +0000719 del(self.changedItems['keys'][keySetName])
720 #write changes
721 idleConf.userCfg['keys'].Save()
722 #reload user key set list
723 itemList=idleConf.GetSectionList('user','keys')
724 itemList.sort()
725 if not itemList:
726 self.radioKeysCustom.config(state=DISABLED)
727 self.optMenuKeysCustom.SetMenu(itemList,'- no custom keys -')
728 else:
729 self.optMenuKeysCustom.SetMenu(itemList,itemList[0])
730 #revert to default key set
731 self.keysAreBuiltin.set(idleConf.defaultCfg['main'].Get('Keys','default'))
732 self.builtinKeys.set(idleConf.defaultCfg['main'].Get('Keys','name'))
733 #user can't back out of these changes, they must be applied now
734 self.Apply()
735 self.SetKeysType()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000736
Steven M. Gava49745752002-02-18 01:43:11 +0000737 def DeleteCustomTheme(self):
738 themeName=self.customTheme.get()
739 if not tkMessageBox.askyesno('Delete Theme','Are you sure you wish '+
Walter Dörwald70a6b492004-02-12 17:35:32 +0000740 'to delete the theme %r ?' % (themeName,),
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +0000741 parent=self):
Steven M. Gava49745752002-02-18 01:43:11 +0000742 return
743 #remove theme from config
744 idleConf.userCfg['highlight'].remove_section(themeName)
Benjamin Peterson6e3dbbd2009-10-09 22:15:50 +0000745 if themeName in self.changedItems['highlight']:
Steven M. Gava49745752002-02-18 01:43:11 +0000746 del(self.changedItems['highlight'][themeName])
747 #write changes
748 idleConf.userCfg['highlight'].Save()
749 #reload user theme list
750 itemList=idleConf.GetSectionList('user','highlight')
751 itemList.sort()
752 if not itemList:
753 self.radioThemeCustom.config(state=DISABLED)
754 self.optMenuThemeCustom.SetMenu(itemList,'- no custom themes -')
755 else:
756 self.optMenuThemeCustom.SetMenu(itemList,itemList[0])
757 #revert to default theme
758 self.themeIsBuiltin.set(idleConf.defaultCfg['main'].Get('Theme','default'))
759 self.builtinTheme.set(idleConf.defaultCfg['main'].Get('Theme','name'))
760 #user can't back out of these changes, they must be applied now
761 self.Apply()
762 self.SetThemeType()
763
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000764 def GetColour(self):
765 target=self.highlightTarget.get()
Steven M. Gava052937f2002-02-11 02:20:53 +0000766 prevColour=self.frameColourSet.cget('bg')
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000767 rgbTuplet, colourString = tkColorChooser.askcolor(parent=self,
Steven M. Gava052937f2002-02-11 02:20:53 +0000768 title='Pick new colour for : '+target,initialcolor=prevColour)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000769 if colourString and (colourString!=prevColour):
Steven M. Gava052937f2002-02-11 02:20:53 +0000770 #user didn't cancel, and they chose a new colour
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000771 if self.themeIsBuiltin.get(): #current theme is a built-in
772 message=('Your changes will be saved as a new Custom Theme. '+
773 'Enter a name for your new Custom Theme below.')
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000774 newTheme=self.GetNewThemeName(message)
775 if not newTheme: #user cancelled custom theme creation
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000776 return
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000777 else: #create new custom theme based on previously active theme
778 self.CreateNewTheme(newTheme)
Steven M. Gava052937f2002-02-11 02:20:53 +0000779 self.colour.set(colourString)
780 else: #current theme is user defined
781 self.colour.set(colourString)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000782
Steven M. Gava052937f2002-02-11 02:20:53 +0000783 def OnNewColourSet(self):
784 newColour=self.colour.get()
785 self.frameColourSet.config(bg=newColour)#set sample
786 if self.fgHilite.get(): plane='foreground'
787 else: plane='background'
788 sampleElement=self.themeElements[self.highlightTarget.get()][0]
Raymond Hettinger931237e2003-07-09 18:48:24 +0000789 self.textHighlightSample.tag_config(sampleElement, **{plane:newColour})
Steven M. Gava052937f2002-02-11 02:20:53 +0000790 theme=self.customTheme.get()
791 themeElement=sampleElement+'-'+plane
792 self.AddChangedItem('highlight',theme,themeElement,newColour)
Steven M. Gava052937f2002-02-11 02:20:53 +0000793
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000794 def GetNewThemeName(self,message):
Steven M. Gava49745752002-02-18 01:43:11 +0000795 usedNames=(idleConf.GetSectionList('user','highlight')+
796 idleConf.GetSectionList('default','highlight'))
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000797 newTheme=GetCfgSectionNameDialog(self,'New Custom Theme',
798 message,usedNames).result
799 return newTheme
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000800
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000801 def SaveAsNewTheme(self):
802 newThemeName=self.GetNewThemeName('New Theme Name:')
803 if newThemeName:
804 self.CreateNewTheme(newThemeName)
805
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000806 def CreateNewTheme(self,newThemeName):
807 #creates new custom theme based on the previously active theme,
808 #and makes the new theme active
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000809 if self.themeIsBuiltin.get():
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000810 themeType='default'
811 themeName=self.builtinTheme.get()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000812 else:
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000813 themeType='user'
814 themeName=self.customTheme.get()
815 newTheme=idleConf.GetThemeDict(themeType,themeName)
Steven M. Gava052937f2002-02-11 02:20:53 +0000816 #apply any of the old theme's unsaved changes to the new theme
817 if themeName in self.changedItems['highlight'].keys():
818 themeChanges=self.changedItems['highlight'][themeName]
819 for element in themeChanges.keys():
820 newTheme[element]=themeChanges[element]
821 #save the new theme
822 self.SaveNewTheme(newThemeName,newTheme)
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000823 #change gui over to the new theme
824 customThemeList=idleConf.GetSectionList('user','highlight')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000825 customThemeList.sort()
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000826 self.optMenuThemeCustom.SetMenu(customThemeList,newThemeName)
827 self.themeIsBuiltin.set(0)
828 self.SetThemeType()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000829
Steven M. Gavac112cd82002-01-22 05:56:40 +0000830 def OnListFontButtonRelease(self,event):
Kurt B. Kaiser05391692003-05-26 20:35:53 +0000831 font = self.listFontName.get(ANCHOR)
832 self.fontName.set(font.lower())
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000833 self.SetFontSample()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000834
Steven M. Gavac112cd82002-01-22 05:56:40 +0000835 def SetFontSample(self,event=None):
836 fontName=self.fontName.get()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000837 if self.fontBold.get():
Steven M. Gavac112cd82002-01-22 05:56:40 +0000838 fontWeight=tkFont.BOLD
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000839 else:
Steven M. Gavac112cd82002-01-22 05:56:40 +0000840 fontWeight=tkFont.NORMAL
Ned Deilye3d47122012-10-22 15:13:01 -0700841 newFont = (fontName, self.fontSize.get(), fontWeight)
842 self.labelFontSample.config(font=newFont)
843 self.textHighlightSample.configure(font=newFont)
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000844
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000845 def SetHighlightTarget(self):
846 if self.highlightTarget.get()=='Cursor': #bg not possible
847 self.radioFg.config(state=DISABLED)
848 self.radioBg.config(state=DISABLED)
849 self.fgHilite.set(1)
850 else: #both fg and bg can be set
851 self.radioFg.config(state=NORMAL)
852 self.radioBg.config(state=NORMAL)
853 self.fgHilite.set(1)
854 self.SetColourSample()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000855
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000856 def SetColourSampleBinding(self,*args):
857 self.SetColourSample()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000858
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000859 def SetColourSample(self):
860 #set the colour smaple area
861 tag=self.themeElements[self.highlightTarget.get()][0]
862 if self.fgHilite.get(): plane='foreground'
863 else: plane='background'
864 colour=self.textHighlightSample.tag_cget(tag,plane)
865 self.frameColourSet.config(bg=colour)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000866
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000867 def PaintThemeSample(self):
Steven M. Gavad0342cd2001-11-04 11:53:10 +0000868 if self.themeIsBuiltin.get(): #a default theme
Steven M. Gava99300612001-11-04 07:03:08 +0000869 theme=self.builtinTheme.get()
870 else: #a user theme
871 theme=self.customTheme.get()
Steven M. Gava052937f2002-02-11 02:20:53 +0000872 for elementTitle in self.themeElements.keys():
873 element=self.themeElements[elementTitle][0]
874 colours=idleConf.GetHighlight(theme,element)
875 if element=='cursor': #cursor sample needs special painting
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000876 colours['background']=idleConf.GetHighlight(theme,
Steven M. Gava0cae01c2002-01-04 07:53:06 +0000877 'normal', fgBg='bg')
Steven M. Gava052937f2002-02-11 02:20:53 +0000878 #handle any unsaved changes to this theme
879 if theme in self.changedItems['highlight'].keys():
880 themeDict=self.changedItems['highlight'][theme]
Benjamin Peterson6e3dbbd2009-10-09 22:15:50 +0000881 if element+'-foreground' in themeDict:
Steven M. Gava052937f2002-02-11 02:20:53 +0000882 colours['foreground']=themeDict[element+'-foreground']
Benjamin Peterson6e3dbbd2009-10-09 22:15:50 +0000883 if element+'-background' in themeDict:
Steven M. Gava052937f2002-02-11 02:20:53 +0000884 colours['background']=themeDict[element+'-background']
Raymond Hettinger931237e2003-07-09 18:48:24 +0000885 self.textHighlightSample.tag_config(element, **colours)
Steven M. Gava052937f2002-02-11 02:20:53 +0000886 self.SetColourSample()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000887
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000888 def HelpSourceSelected(self,event):
889 self.SetHelpListButtonStates()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000890
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000891 def SetHelpListButtonStates(self):
892 if self.listHelp.size()<1: #no entries in list
893 self.buttonHelpListEdit.config(state=DISABLED)
894 self.buttonHelpListRemove.config(state=DISABLED)
895 else: #there are some entries
896 if self.listHelp.curselection(): #there currently is a selection
897 self.buttonHelpListEdit.config(state=NORMAL)
898 self.buttonHelpListRemove.config(state=NORMAL)
899 else: #there currently is not a selection
900 self.buttonHelpListEdit.config(state=DISABLED)
901 self.buttonHelpListRemove.config(state=DISABLED)
902
903 def HelpListItemAdd(self):
904 helpSource=GetHelpSourceDialog(self,'New Help Source').result
905 if helpSource:
906 self.userHelpList.append( (helpSource[0],helpSource[1]) )
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +0000907 self.listHelp.insert(END,helpSource[0])
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000908 self.UpdateUserHelpChangedItems()
909 self.SetHelpListButtonStates()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000910
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000911 def HelpListItemEdit(self):
912 itemIndex=self.listHelp.index(ANCHOR)
913 helpSource=self.userHelpList[itemIndex]
Steven M. Gava0c5bc8c2002-03-27 02:25:44 +0000914 newHelpSource=GetHelpSourceDialog(self,'Edit Help Source',
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000915 menuItem=helpSource[0],filePath=helpSource[1]).result
916 if (not newHelpSource) or (newHelpSource==helpSource):
917 return #no changes
918 self.userHelpList[itemIndex]=newHelpSource
919 self.listHelp.delete(itemIndex)
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +0000920 self.listHelp.insert(itemIndex,newHelpSource[0])
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000921 self.UpdateUserHelpChangedItems()
922 self.SetHelpListButtonStates()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000923
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000924 def HelpListItemRemove(self):
925 itemIndex=self.listHelp.index(ANCHOR)
926 del(self.userHelpList[itemIndex])
927 self.listHelp.delete(itemIndex)
928 self.UpdateUserHelpChangedItems()
929 self.SetHelpListButtonStates()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000930
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000931 def UpdateUserHelpChangedItems(self):
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +0000932 "Clear and rebuild the HelpFiles section in self.changedItems"
933 self.changedItems['main']['HelpFiles'] = {}
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000934 for num in range(1,len(self.userHelpList)+1):
935 self.AddChangedItem('main','HelpFiles',str(num),
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +0000936 string.join(self.userHelpList[num-1][:2],';'))
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000937
Steven M. Gava429a86a2001-10-23 10:42:12 +0000938 def LoadFontCfg(self):
939 ##base editor font selection list
Steven M. Gavac11ccf32001-09-24 09:43:17 +0000940 fonts=list(tkFont.families(self))
941 fonts.sort()
942 for font in fonts:
943 self.listFontName.insert(END,font)
Steven M. Gava485f7b62001-10-26 06:47:09 +0000944 configuredFont=idleConf.GetOption('main','EditorWindow','font',
Steven M. Gava429a86a2001-10-23 10:42:12 +0000945 default='courier')
Kurt B. Kaiser05391692003-05-26 20:35:53 +0000946 lc_configuredFont = configuredFont.lower()
947 self.fontName.set(lc_configuredFont)
948 lc_fonts = [s.lower() for s in fonts]
949 if lc_configuredFont in lc_fonts:
950 currentFontIndex = lc_fonts.index(lc_configuredFont)
Steven M. Gava429a86a2001-10-23 10:42:12 +0000951 self.listFontName.see(currentFontIndex)
952 self.listFontName.select_set(currentFontIndex)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000953 self.listFontName.select_anchor(currentFontIndex)
Steven M. Gava429a86a2001-10-23 10:42:12 +0000954 ##font size dropdown
Steven M. Gavac112cd82002-01-22 05:56:40 +0000955 fontSize=idleConf.GetOption('main','EditorWindow','font-size',
Andrew Svetlovd8590ff2012-12-24 13:17:59 +0200956 type='int', default='10')
Chui Teya178cff2002-11-04 03:17:45 +0000957 self.optMenuFontSize.SetMenu(('7','8','9','10','11','12','13','14',
Steven M. Gava485f7b62001-10-26 06:47:09 +0000958 '16','18','20','22'),fontSize )
Steven M. Gavac112cd82002-01-22 05:56:40 +0000959 ##fontWeight
960 self.fontBold.set(idleConf.GetOption('main','EditorWindow',
961 'font-bold',default=0,type='bool'))
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000962 ##font sample
Steven M. Gava429a86a2001-10-23 10:42:12 +0000963 self.SetFontSample()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000964
Steven M. Gava429a86a2001-10-23 10:42:12 +0000965 def LoadTabCfg(self):
Steven M. Gava429a86a2001-10-23 10:42:12 +0000966 ##indent sizes
Steven M. Gava485f7b62001-10-26 06:47:09 +0000967 spaceNum=idleConf.GetOption('main','Indent','num-spaces',
Steven M. Gava429a86a2001-10-23 10:42:12 +0000968 default=4,type='int')
Steven M. Gava429a86a2001-10-23 10:42:12 +0000969 self.spaceNum.set(spaceNum)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000970
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000971 def LoadThemeCfg(self):
Steven M. Gava41a85322001-10-29 08:05:34 +0000972 ##current theme type radiobutton
Steven M. Gavad0342cd2001-11-04 11:53:10 +0000973 self.themeIsBuiltin.set(idleConf.GetOption('main','Theme','default',
Steven M. Gavac112cd82002-01-22 05:56:40 +0000974 type='bool',default=1))
Steven M. Gava41a85322001-10-29 08:05:34 +0000975 ##currently set theme
Steven M. Gavaad4f5322002-01-03 12:05:17 +0000976 currentOption=idleConf.CurrentTheme()
Steven M. Gava7c017862001-10-29 11:19:46 +0000977 ##load available theme option menus
Steven M. Gavad0342cd2001-11-04 11:53:10 +0000978 if self.themeIsBuiltin.get(): #default theme selected
Steven M. Gava41a85322001-10-29 08:05:34 +0000979 itemList=idleConf.GetSectionList('default','highlight')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000980 itemList.sort()
Steven M. Gava41a85322001-10-29 08:05:34 +0000981 self.optMenuThemeBuiltin.SetMenu(itemList,currentOption)
982 itemList=idleConf.GetSectionList('user','highlight')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000983 itemList.sort()
Steven M. Gava41a85322001-10-29 08:05:34 +0000984 if not itemList:
985 self.radioThemeCustom.config(state=DISABLED)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000986 self.customTheme.set('- no custom themes -')
Steven M. Gava41a85322001-10-29 08:05:34 +0000987 else:
988 self.optMenuThemeCustom.SetMenu(itemList,itemList[0])
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000989 else: #user theme selected
Steven M. Gava41a85322001-10-29 08:05:34 +0000990 itemList=idleConf.GetSectionList('user','highlight')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000991 itemList.sort()
Steven M. Gava41a85322001-10-29 08:05:34 +0000992 self.optMenuThemeCustom.SetMenu(itemList,currentOption)
993 itemList=idleConf.GetSectionList('default','highlight')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000994 itemList.sort()
Steven M. Gava41a85322001-10-29 08:05:34 +0000995 self.optMenuThemeBuiltin.SetMenu(itemList,itemList[0])
Steven M. Gava7c017862001-10-29 11:19:46 +0000996 self.SetThemeType()
997 ##load theme element option menu
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000998 themeNames=self.themeElements.keys()
Florent Xiclunaa7f242f2010-04-02 08:15:26 +0000999 themeNames.sort(key=lambda x: self.themeElements[x][1])
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001000 self.optMenuHighlightTarget.SetMenu(themeNames,themeNames[0])
Steven M. Gava9dd16b32001-11-03 14:54:25 +00001001 self.PaintThemeSample()
Steven M. Gava0cae01c2002-01-04 07:53:06 +00001002 self.SetHighlightTarget()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001003
Steven M. Gava9dd16b32001-11-03 14:54:25 +00001004 def LoadKeyCfg(self):
Steven M. Gava41a85322001-10-29 08:05:34 +00001005 ##current keys type radiobutton
Steven M. Gava052937f2002-02-11 02:20:53 +00001006 self.keysAreBuiltin.set(idleConf.GetOption('main','Keys','default',
Steven M. Gavac112cd82002-01-22 05:56:40 +00001007 type='bool',default=1))
Steven M. Gava41a85322001-10-29 08:05:34 +00001008 ##currently set keys
Steven M. Gavaad4f5322002-01-03 12:05:17 +00001009 currentOption=idleConf.CurrentKeys()
Steven M. Gava7c017862001-10-29 11:19:46 +00001010 ##load available keyset option menus
Steven M. Gava052937f2002-02-11 02:20:53 +00001011 if self.keysAreBuiltin.get(): #default theme selected
Steven M. Gava41a85322001-10-29 08:05:34 +00001012 itemList=idleConf.GetSectionList('default','keys')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +00001013 itemList.sort()
Steven M. Gava41a85322001-10-29 08:05:34 +00001014 self.optMenuKeysBuiltin.SetMenu(itemList,currentOption)
1015 itemList=idleConf.GetSectionList('user','keys')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +00001016 itemList.sort()
Steven M. Gava41a85322001-10-29 08:05:34 +00001017 if not itemList:
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001018 self.radioKeysCustom.config(state=DISABLED)
1019 self.customKeys.set('- no custom keys -')
Steven M. Gava41a85322001-10-29 08:05:34 +00001020 else:
1021 self.optMenuKeysCustom.SetMenu(itemList,itemList[0])
Steven M. Gavaa498af22002-02-01 01:33:36 +00001022 else: #user key set selected
Steven M. Gava41a85322001-10-29 08:05:34 +00001023 itemList=idleConf.GetSectionList('user','keys')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +00001024 itemList.sort()
Steven M. Gava41a85322001-10-29 08:05:34 +00001025 self.optMenuKeysCustom.SetMenu(itemList,currentOption)
1026 itemList=idleConf.GetSectionList('default','keys')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +00001027 itemList.sort()
Steven M. Gava41a85322001-10-29 08:05:34 +00001028 self.optMenuKeysBuiltin.SetMenu(itemList,itemList[0])
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001029 self.SetKeysType()
Steven M. Gavafacfc092002-01-19 00:29:54 +00001030 ##load keyset element list
Steven M. Gava052937f2002-02-11 02:20:53 +00001031 keySetName=idleConf.CurrentKeys()
1032 self.LoadKeysList(keySetName)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001033
Steven M. Gavafacfc092002-01-19 00:29:54 +00001034 def LoadGeneralCfg(self):
Steven M. Gava5f28e8f2002-01-21 06:38:21 +00001035 #startup state
1036 self.startupEdit.set(idleConf.GetOption('main','General',
1037 'editor-on-startup',default=1,type='bool'))
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +00001038 #autosave state
1039 self.autoSave.set(idleConf.GetOption('main', 'General', 'autosave',
1040 default=0, type='bool'))
Steven M. Gavafacfc092002-01-19 00:29:54 +00001041 #initial window size
Andrew Svetlovd8590ff2012-12-24 13:17:59 +02001042 self.winWidth.set(idleConf.GetOption('main','EditorWindow','width',
1043 type='int'))
1044 self.winHeight.set(idleConf.GetOption('main','EditorWindow','height',
1045 type='int'))
Raymond Hettinger4e49b832004-06-04 06:31:08 +00001046 #initial paragraph reformat size
Andrew Svetlovd8590ff2012-12-24 13:17:59 +02001047 self.paraWidth.set(idleConf.GetOption('main','FormatParagraph','paragraph',
1048 type='int'))
Kurt B. Kaisera053f332003-05-10 00:49:56 +00001049 # default source encoding
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +00001050 self.encoding.set(idleConf.GetOption('main', 'EditorWindow',
1051 'encoding', default='none'))
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +00001052 # additional help sources
1053 self.userHelpList = idleConf.GetAllExtraHelpSourcesList()
Steven M. Gava085eb1b2002-02-05 04:52:32 +00001054 for helpItem in self.userHelpList:
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +00001055 self.listHelp.insert(END,helpItem[0])
Steven M. Gava085eb1b2002-02-05 04:52:32 +00001056 self.SetHelpListButtonStates()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001057
Steven M. Gava429a86a2001-10-23 10:42:12 +00001058 def LoadConfigs(self):
1059 """
1060 load configuration from default and user config files and populate
1061 the widgets on the config dialog pages.
1062 """
1063 ### fonts / tabs page
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001064 self.LoadFontCfg()
1065 self.LoadTabCfg()
Steven M. Gava429a86a2001-10-23 10:42:12 +00001066 ### highlighting page
Steven M. Gava9dd16b32001-11-03 14:54:25 +00001067 self.LoadThemeCfg()
Steven M. Gava429a86a2001-10-23 10:42:12 +00001068 ### keys page
Steven M. Gava9dd16b32001-11-03 14:54:25 +00001069 self.LoadKeyCfg()
Steven M. Gava429a86a2001-10-23 10:42:12 +00001070 ### general page
Steven M. Gavafacfc092002-01-19 00:29:54 +00001071 self.LoadGeneralCfg()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001072
Steven M. Gava052937f2002-02-11 02:20:53 +00001073 def SaveNewKeySet(self,keySetName,keySet):
1074 """
1075 save a newly created core key set.
1076 keySetName - string, the name of the new key set
1077 keySet - dictionary containing the new key set
1078 """
1079 if not idleConf.userCfg['keys'].has_section(keySetName):
1080 idleConf.userCfg['keys'].add_section(keySetName)
1081 for event in keySet.keys():
1082 value=keySet[event]
1083 idleConf.userCfg['keys'].SetOption(keySetName,event,value)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001084
Steven M. Gava052937f2002-02-11 02:20:53 +00001085 def SaveNewTheme(self,themeName,theme):
1086 """
1087 save a newly created theme.
1088 themeName - string, the name of the new theme
1089 theme - dictionary containing the new theme
1090 """
1091 if not idleConf.userCfg['highlight'].has_section(themeName):
1092 idleConf.userCfg['highlight'].add_section(themeName)
1093 for element in theme.keys():
1094 value=theme[element]
1095 idleConf.userCfg['highlight'].SetOption(themeName,element,value)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001096
Steven M. Gava2d7bb3f2002-01-29 08:35:29 +00001097 def SetUserValue(self,configType,section,item,value):
Steven M. Gava2d7bb3f2002-01-29 08:35:29 +00001098 if idleConf.defaultCfg[configType].has_option(section,item):
1099 if idleConf.defaultCfg[configType].Get(section,item)==value:
1100 #the setting equals a default setting, remove it from user cfg
1101 return idleConf.userCfg[configType].RemoveOption(section,item)
1102 #if we got here set the option
1103 return idleConf.userCfg[configType].SetOption(section,item,value)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001104
Steven M. Gava052937f2002-02-11 02:20:53 +00001105 def SaveAllChangedConfigs(self):
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +00001106 "Save configuration changes to the user config file."
Steven M. Gava0c5bc8c2002-03-27 02:25:44 +00001107 idleConf.userCfg['main'].Save()
Steven M. Gava5f28e8f2002-01-21 06:38:21 +00001108 for configType in self.changedItems.keys():
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +00001109 cfgTypeHasChanges = False
Steven M. Gava5f28e8f2002-01-21 06:38:21 +00001110 for section in self.changedItems[configType].keys():
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +00001111 if section == 'HelpFiles':
1112 #this section gets completely replaced
1113 idleConf.userCfg['main'].remove_section('HelpFiles')
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +00001114 cfgTypeHasChanges = True
Steven M. Gava5f28e8f2002-01-21 06:38:21 +00001115 for item in self.changedItems[configType][section].keys():
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +00001116 value = self.changedItems[configType][section][item]
Steven M. Gava2d7bb3f2002-01-29 08:35:29 +00001117 if self.SetUserValue(configType,section,item,value):
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +00001118 cfgTypeHasChanges = True
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001119 if cfgTypeHasChanges:
1120 idleConf.userCfg[configType].Save()
Kurt B. Kaiser5acdf932004-11-16 21:28:36 +00001121 for configType in ['keys', 'highlight']:
1122 # save these even if unchanged!
1123 idleConf.userCfg[configType].Save()
Steven M. Gavaa498af22002-02-01 01:33:36 +00001124 self.ResetChangedItems() #clear the changed items dict
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001125
Kurt B. Kaiserb1754452005-11-18 22:05:48 +00001126 def DeactivateCurrentConfig(self):
1127 #Before a config is saved, some cleanup of current
1128 #config must be done - remove the previous keybindings
1129 winInstances=self.parent.instance_dict.keys()
1130 for instance in winInstances:
1131 instance.RemoveKeybindings()
1132
Steven M. Gava49745752002-02-18 01:43:11 +00001133 def ActivateConfigChanges(self):
Kurt B. Kaiseracdef852005-01-31 03:34:26 +00001134 "Dynamically apply configuration changes"
Kurt B. Kaisercf6f1b62004-04-11 03:16:07 +00001135 winInstances=self.parent.instance_dict.keys()
Steven M. Gavab77d3432002-03-02 07:16:21 +00001136 for instance in winInstances:
1137 instance.ResetColorizer()
Steven M. Gavab1585412002-03-12 00:21:56 +00001138 instance.ResetFont()
Kurt B. Kaiseracdef852005-01-31 03:34:26 +00001139 instance.set_notabs_indentwidth()
Kurt B. Kaiserb1754452005-11-18 22:05:48 +00001140 instance.ApplyKeybindings()
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +00001141 instance.reset_help_menu_entries()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001142
Steven M. Gava5f28e8f2002-01-21 06:38:21 +00001143 def Cancel(self):
1144 self.destroy()
1145
1146 def Ok(self):
1147 self.Apply()
1148 self.destroy()
1149
1150 def Apply(self):
Kurt B. Kaiserb1754452005-11-18 22:05:48 +00001151 self.DeactivateCurrentConfig()
Steven M. Gava052937f2002-02-11 02:20:53 +00001152 self.SaveAllChangedConfigs()
Steven M. Gava49745752002-02-18 01:43:11 +00001153 self.ActivateConfigChanges()
Steven M. Gava5f28e8f2002-01-21 06:38:21 +00001154
1155 def Help(self):
Steven M. Gavac11ccf32001-09-24 09:43:17 +00001156 pass
1157
Steven M. Gava44d3d1a2001-07-31 06:59:02 +00001158if __name__ == '__main__':
Terry Jan Reedy76916e82014-05-29 01:46:16 -04001159 from idlelib.idle_test.htest import run
1160 run(ConfigDialog)