blob: 449ca0f0a3bc19af0ed13850d3b3ff49d107c8d5 [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 Reedyaf0dce92014-07-14 23:07:21 -040026 def __init__(self, parent, title, _htest=False, _utest=False):
Terry Jan Reedy76916e82014-05-29 01:46:16 -040027 """
28 _htest - bool, change box location when running htest
Terry Jan Reedyaf0dce92014-07-14 23:07:21 -040029 _utest - bool, don't wait_window when running unittest
Terry Jan Reedy76916e82014-05-29 01:46:16 -040030 """
Steven M. Gavad721c482001-07-31 10:46:53 +000031 Toplevel.__init__(self, parent)
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +000032 self.wm_withdraw()
33
Steven M. Gavad721c482001-07-31 10:46:53 +000034 self.configure(borderwidth=5)
Amaury Forgeot d'Arcb9ee8812009-07-15 21:29:27 +000035 self.title('IDLE Preferences')
Terry Jan Reedy76916e82014-05-29 01:46:16 -040036 if _htest:
37 parent.instance_dict = {}
Steven M. Gavad721c482001-07-31 10:46:53 +000038 self.geometry("+%d+%d" % (parent.winfo_rootx()+20,
Terry Jan Reedy76916e82014-05-29 01:46:16 -040039 parent.winfo_rooty()+(30 if not _htest else 150)))
Georg Brandl7eb4b7d2005-07-22 21:49:32 +000040 #Theme Elements. Each theme element key is its display name.
Steven M. Gava9dd16b32001-11-03 14:54:25 +000041 #The first value of the tuple is the sample area tag name.
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +000042 #The second value is the display name list sort index.
Steven M. Gavaad4f5322002-01-03 12:05:17 +000043 self.themeElements={'Normal Text':('normal','00'),
44 'Python Keywords':('keyword','01'),
45 'Python Definitions':('definition','02'),
Kurt B. Kaiser73360a32004-03-08 18:15:31 +000046 'Python Builtins':('builtin', '03'),
47 'Python Comments':('comment','04'),
48 'Python Strings':('string','05'),
49 'Selected Text':('hilite','06'),
50 'Found Text':('hit','07'),
51 'Cursor':('cursor','08'),
52 'Error Text':('error','09'),
53 'Shell Normal Text':('console','10'),
54 'Shell Stdout Text':('stdout','11'),
55 'Shell Stderr Text':('stderr','12'),
56 }
Steven M. Gavaa498af22002-02-01 01:33:36 +000057 self.ResetChangedItems() #load initial values in changed items dict
Steven M. Gavad721c482001-07-31 10:46:53 +000058 self.CreateWidgets()
59 self.resizable(height=FALSE,width=FALSE)
Steven M. Gavad721c482001-07-31 10:46:53 +000060 self.transient(parent)
61 self.grab_set()
62 self.protocol("WM_DELETE_WINDOW", self.Cancel)
63 self.parent = parent
Steven M. Gava2d4e03b2001-12-05 07:54:07 +000064 self.tabPages.focus_set()
Steven M. Gavad721c482001-07-31 10:46:53 +000065 #key bindings for this dialog
Steven M. Gava5f28e8f2002-01-21 06:38:21 +000066 #self.bind('<Escape>',self.Cancel) #dismiss dialog, no save
67 #self.bind('<Alt-a>',self.Apply) #apply changes, save
68 #self.bind('<F1>',self.Help) #context help
Steven M. Gava429a86a2001-10-23 10:42:12 +000069 self.LoadConfigs()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +000070 self.AttachVarCallbacks() #avoid callbacks during LoadConfigs
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +000071
Terry Jan Reedyaf0dce92014-07-14 23:07:21 -040072 if not _utest:
73 self.wm_deiconify()
74 self.wait_window()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +000075
Steven M. Gavad721c482001-07-31 10:46:53 +000076 def CreateWidgets(self):
Kurt B. Kaiser20172f92007-10-30 02:38:54 +000077 self.tabPages = TabbedPageSet(self,
78 page_names=['Fonts/Tabs','Highlighting','Keys','General'])
79 frameActionButtons = Frame(self,pady=2)
Steven M. Gavad721c482001-07-31 10:46:53 +000080 #action buttons
Ned Deily57847df2014-03-27 20:47:04 -070081 if macosxSupport.isAquaTk():
Ronald Oussorena97063a2009-03-04 21:35:05 +000082 # Changing the default padding on OSX results in unreadable
83 # text in the buttons
84 paddingArgs={}
85 else:
86 paddingArgs={'padx':6, 'pady':3}
87
Terry Jan Reedy1d9b9212014-01-26 22:24:17 -050088# Comment out button creation and packing until implement self.Help
89## self.buttonHelp = Button(frameActionButtons,text='Help',
90## command=self.Help,takefocus=FALSE,
91## **paddingArgs)
Steven M. Gavac01e30f2001-08-11 15:48:13 +000092 self.buttonOk = Button(frameActionButtons,text='Ok',
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +000093 command=self.Ok,takefocus=FALSE,
Ronald Oussorena97063a2009-03-04 21:35:05 +000094 **paddingArgs)
Steven M. Gavac01e30f2001-08-11 15:48:13 +000095 self.buttonApply = Button(frameActionButtons,text='Apply',
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +000096 command=self.Apply,takefocus=FALSE,
Ronald Oussorena97063a2009-03-04 21:35:05 +000097 **paddingArgs)
Steven M. Gavad721c482001-07-31 10:46:53 +000098 self.buttonCancel = Button(frameActionButtons,text='Cancel',
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +000099 command=self.Cancel,takefocus=FALSE,
Ronald Oussorena97063a2009-03-04 21:35:05 +0000100 **paddingArgs)
Steven M. Gava2d4e03b2001-12-05 07:54:07 +0000101 self.CreatePageFontTab()
102 self.CreatePageHighlight()
103 self.CreatePageKeys()
104 self.CreatePageGeneral()
Terry Jan Reedy1d9b9212014-01-26 22:24:17 -0500105## self.buttonHelp.pack(side=RIGHT,padx=5)
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000106 self.buttonOk.pack(side=LEFT,padx=5)
107 self.buttonApply.pack(side=LEFT,padx=5)
108 self.buttonCancel.pack(side=LEFT,padx=5)
Steven M. Gavad721c482001-07-31 10:46:53 +0000109 frameActionButtons.pack(side=BOTTOM)
Kurt B. Kaiser28c7bcf2007-12-28 04:18:01 +0000110 Frame(self, height=2, borderwidth=0).pack(side=BOTTOM)
Steven M. Gava2d4e03b2001-12-05 07:54:07 +0000111 self.tabPages.pack(side=TOP,expand=TRUE,fill=BOTH)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000112
Steven M. Gava60fc7072001-08-04 13:58:22 +0000113 def CreatePageFontTab(self):
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000114 #tkVars
Steven M. Gava3b55a892001-11-21 05:56:26 +0000115 self.fontSize=StringVar(self)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000116 self.fontBold=BooleanVar(self)
117 self.fontName=StringVar(self)
Steven M. Gava3b55a892001-11-21 05:56:26 +0000118 self.spaceNum=IntVar(self)
Kurt B. Kaiser05391692003-05-26 20:35:53 +0000119 self.editFont=tkFont.Font(self,('courier',10,'normal'))
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000120 ##widget creation
121 #body frame
Kurt B. Kaiser20172f92007-10-30 02:38:54 +0000122 frame=self.tabPages.pages['Fonts/Tabs'].frame
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000123 #body section frames
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000124 frameFont=LabelFrame(frame,borderwidth=2,relief=GROOVE,
125 text=' Base Editor Font ')
126 frameIndent=LabelFrame(frame,borderwidth=2,relief=GROOVE,
127 text=' Indentation Width ')
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000128 #frameFont
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000129 frameFontName=Frame(frameFont)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000130 frameFontParam=Frame(frameFont)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000131 labelFontNameTitle=Label(frameFontName,justify=LEFT,
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000132 text='Font Face :')
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000133 self.listFontName=Listbox(frameFontName,height=5,takefocus=FALSE,
134 exportselection=FALSE)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000135 self.listFontName.bind('<ButtonRelease-1>',self.OnListFontButtonRelease)
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000136 scrollFont=Scrollbar(frameFontName)
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000137 scrollFont.config(command=self.listFontName.yview)
138 self.listFontName.config(yscrollcommand=scrollFont.set)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000139 labelFontSizeTitle=Label(frameFontParam,text='Size :')
140 self.optMenuFontSize=DynOptionMenu(frameFontParam,self.fontSize,None,
Steven M. Gavac112cd82002-01-22 05:56:40 +0000141 command=self.SetFontSample)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000142 checkFontBold=Checkbutton(frameFontParam,variable=self.fontBold,
Steven M. Gavac112cd82002-01-22 05:56:40 +0000143 onvalue=1,offvalue=0,text='Bold',command=self.SetFontSample)
Steven M. Gavac11ccf32001-09-24 09:43:17 +0000144 frameFontSample=Frame(frameFont,relief=SOLID,borderwidth=1)
145 self.labelFontSample=Label(frameFontSample,
146 text='AaBbCcDdEe\nFfGgHhIiJjK\n1234567890\n#:+=(){}[]',
Steven M. Gava429a86a2001-10-23 10:42:12 +0000147 justify=LEFT,font=self.editFont)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000148 #frameIndent
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000149 frameIndentSize=Frame(frameIndent)
Kurt B. Kaiseracdef852005-01-31 03:34:26 +0000150 labelSpaceNumTitle=Label(frameIndentSize, justify=LEFT,
151 text='Python Standard: 4 Spaces!')
152 self.scaleSpaceNum=Scale(frameIndentSize, variable=self.spaceNum,
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000153 orient='horizontal',
Kurt B. Kaiseracdef852005-01-31 03:34:26 +0000154 tickinterval=2, from_=2, to=16)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000155 #widget packing
156 #body
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000157 frameFont.pack(side=LEFT,padx=5,pady=5,expand=TRUE,fill=BOTH)
158 frameIndent.pack(side=LEFT,padx=5,pady=5,fill=Y)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000159 #frameFont
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000160 frameFontName.pack(side=TOP,padx=5,pady=5,fill=X)
161 frameFontParam.pack(side=TOP,padx=5,pady=5,fill=X)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000162 labelFontNameTitle.pack(side=TOP,anchor=W)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000163 self.listFontName.pack(side=LEFT,expand=TRUE,fill=X)
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000164 scrollFont.pack(side=LEFT,fill=Y)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000165 labelFontSizeTitle.pack(side=LEFT,anchor=W)
166 self.optMenuFontSize.pack(side=LEFT,anchor=W)
167 checkFontBold.pack(side=LEFT,anchor=W,padx=20)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000168 frameFontSample.pack(side=TOP,padx=5,pady=5,expand=TRUE,fill=BOTH)
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000169 self.labelFontSample.pack(expand=TRUE,fill=BOTH)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000170 #frameIndent
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000171 frameIndentSize.pack(side=TOP,fill=X)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000172 labelSpaceNumTitle.pack(side=TOP,anchor=W,padx=5)
173 self.scaleSpaceNum.pack(side=TOP,padx=5,fill=X)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000174 return frame
175
176 def CreatePageHighlight(self):
Steven M. Gava3b55a892001-11-21 05:56:26 +0000177 self.builtinTheme=StringVar(self)
178 self.customTheme=StringVar(self)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000179 self.fgHilite=BooleanVar(self)
Steven M. Gava3b55a892001-11-21 05:56:26 +0000180 self.colour=StringVar(self)
181 self.fontName=StringVar(self)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000182 self.themeIsBuiltin=BooleanVar(self)
Steven M. Gava3b55a892001-11-21 05:56:26 +0000183 self.highlightTarget=StringVar(self)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000184 ##widget creation
185 #body frame
Kurt B. Kaiser20172f92007-10-30 02:38:54 +0000186 frame=self.tabPages.pages['Highlighting'].frame
Steven M. Gava952d0a52001-08-03 04:43:44 +0000187 #body section frames
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000188 frameCustom=LabelFrame(frame,borderwidth=2,relief=GROOVE,
189 text=' Custom Highlighting ')
190 frameTheme=LabelFrame(frame,borderwidth=2,relief=GROOVE,
191 text=' Highlighting Theme ')
Steven M. Gava952d0a52001-08-03 04:43:44 +0000192 #frameCustom
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000193 self.textHighlightSample=Text(frameCustom,relief=SOLID,borderwidth=1,
Terry Jan Reedy42f7b7e2012-05-26 16:55:43 -0400194 font=('courier',12,''),cursor='hand2',width=21,height=11,
Steven M. Gavab77d3432002-03-02 07:16:21 +0000195 takefocus=FALSE,highlightthickness=0,wrap=NONE)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000196 text=self.textHighlightSample
197 text.bind('<Double-Button-1>',lambda e: 'break')
198 text.bind('<B1-Motion>',lambda e: 'break')
Steven M. Gava052937f2002-02-11 02:20:53 +0000199 textAndTags=(('#you can click here','comment'),('\n','normal'),
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000200 ('#to choose items','comment'),('\n','normal'),('def','keyword'),
201 (' ','normal'),('func','definition'),('(param):','normal'),
202 ('\n ','normal'),('"""string"""','string'),('\n var0 = ','normal'),
Steven M. Gavad0342cd2001-11-04 11:53:10 +0000203 ("'string'",'string'),('\n var1 = ','normal'),("'selected'",'hilite'),
Kurt B. Kaiser73360a32004-03-08 18:15:31 +0000204 ('\n var2 = ','normal'),("'found'",'hit'),
205 ('\n var3 = ','normal'),('list', 'builtin'), ('(','normal'),
206 ('None', 'builtin'),(')\n\n','normal'),
Steven M. Gava99300612001-11-04 07:03:08 +0000207 (' error ','error'),(' ','normal'),('cursor |','cursor'),
Steven M. Gavad0342cd2001-11-04 11:53:10 +0000208 ('\n ','normal'),('shell','console'),(' ','normal'),('stdout','stdout'),
209 (' ','normal'),('stderr','stderr'),('\n','normal'))
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000210 for txTa in textAndTags:
211 text.insert(END,txTa[0],txTa[1])
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000212 for element in self.themeElements.keys():
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000213 text.tag_bind(self.themeElements[element][0],'<ButtonPress-1>',
214 lambda event,elem=element: event.widget.winfo_toplevel()
215 .highlightTarget.set(elem))
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000216 text.config(state=DISABLED)
217 self.frameColourSet=Frame(frameCustom,relief=SOLID,borderwidth=1)
Steven M. Gava7c017862001-10-29 11:19:46 +0000218 frameFgBg=Frame(frameCustom)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000219 buttonSetColour=Button(self.frameColourSet,text='Choose Colour for :',
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000220 command=self.GetColour,highlightthickness=0)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000221 self.optMenuHighlightTarget=DynOptionMenu(self.frameColourSet,
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000222 self.highlightTarget,None,highlightthickness=0)#,command=self.SetHighlightTargetBinding
Steven M. Gava7c017862001-10-29 11:19:46 +0000223 self.radioFg=Radiobutton(frameFgBg,variable=self.fgHilite,
Steven M. Gava3b55a892001-11-21 05:56:26 +0000224 value=1,text='Foreground',command=self.SetColourSampleBinding)
Steven M. Gava7c017862001-10-29 11:19:46 +0000225 self.radioBg=Radiobutton(frameFgBg,variable=self.fgHilite,
Steven M. Gava3b55a892001-11-21 05:56:26 +0000226 value=0,text='Background',command=self.SetColourSampleBinding)
Steven M. Gava7c017862001-10-29 11:19:46 +0000227 self.fgHilite.set(1)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000228 buttonSaveCustomTheme=Button(frameCustom,
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000229 text='Save as New Custom Theme',command=self.SaveAsNewTheme)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000230 #frameTheme
Steven M. Gava952d0a52001-08-03 04:43:44 +0000231 labelTypeTitle=Label(frameTheme,text='Select : ')
Steven M. Gavad0342cd2001-11-04 11:53:10 +0000232 self.radioThemeBuiltin=Radiobutton(frameTheme,variable=self.themeIsBuiltin,
233 value=1,command=self.SetThemeType,text='a Built-in Theme')
234 self.radioThemeCustom=Radiobutton(frameTheme,variable=self.themeIsBuiltin,
235 value=0,command=self.SetThemeType,text='a Custom Theme')
Steven M. Gava41a85322001-10-29 08:05:34 +0000236 self.optMenuThemeBuiltin=DynOptionMenu(frameTheme,
Steven M. Gava7c017862001-10-29 11:19:46 +0000237 self.builtinTheme,None,command=None)
Steven M. Gava41a85322001-10-29 08:05:34 +0000238 self.optMenuThemeCustom=DynOptionMenu(frameTheme,
Steven M. Gava7c017862001-10-29 11:19:46 +0000239 self.customTheme,None,command=None)
Steven M. Gava49745752002-02-18 01:43:11 +0000240 self.buttonDeleteCustomTheme=Button(frameTheme,text='Delete Custom Theme',
241 command=self.DeleteCustomTheme)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000242 ##widget packing
243 #body
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000244 frameCustom.pack(side=LEFT,padx=5,pady=5,expand=TRUE,fill=BOTH)
245 frameTheme.pack(side=LEFT,padx=5,pady=5,fill=Y)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000246 #frameCustom
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000247 self.frameColourSet.pack(side=TOP,padx=5,pady=5,expand=TRUE,fill=X)
Steven M. Gava7c017862001-10-29 11:19:46 +0000248 frameFgBg.pack(side=TOP,padx=5,pady=0)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000249 self.textHighlightSample.pack(side=TOP,padx=5,pady=5,expand=TRUE,
250 fill=BOTH)
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000251 buttonSetColour.pack(side=TOP,expand=TRUE,fill=X,padx=8,pady=4)
252 self.optMenuHighlightTarget.pack(side=TOP,expand=TRUE,fill=X,padx=8,pady=3)
Steven M. Gava7c017862001-10-29 11:19:46 +0000253 self.radioFg.pack(side=LEFT,anchor=E)
254 self.radioBg.pack(side=RIGHT,anchor=W)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000255 buttonSaveCustomTheme.pack(side=BOTTOM,fill=X,padx=5,pady=5)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000256 #frameTheme
Steven M. Gava952d0a52001-08-03 04:43:44 +0000257 labelTypeTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
Steven M. Gava41a85322001-10-29 08:05:34 +0000258 self.radioThemeBuiltin.pack(side=TOP,anchor=W,padx=5)
259 self.radioThemeCustom.pack(side=TOP,anchor=W,padx=5,pady=2)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000260 self.optMenuThemeBuiltin.pack(side=TOP,fill=X,padx=5,pady=5)
261 self.optMenuThemeCustom.pack(side=TOP,fill=X,anchor=W,padx=5,pady=5)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000262 self.buttonDeleteCustomTheme.pack(side=TOP,fill=X,padx=5,pady=5)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000263 return frame
264
265 def CreatePageKeys(self):
Steven M. Gava60fc7072001-08-04 13:58:22 +0000266 #tkVars
Steven M. Gava3b55a892001-11-21 05:56:26 +0000267 self.bindingTarget=StringVar(self)
268 self.builtinKeys=StringVar(self)
269 self.customKeys=StringVar(self)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000270 self.keysAreBuiltin=BooleanVar(self)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000271 self.keyBinding=StringVar(self)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000272 ##widget creation
273 #body frame
Kurt B. Kaiser20172f92007-10-30 02:38:54 +0000274 frame=self.tabPages.pages['Keys'].frame
Steven M. Gava60fc7072001-08-04 13:58:22 +0000275 #body section frames
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000276 frameCustom=LabelFrame(frame,borderwidth=2,relief=GROOVE,
277 text=' Custom Key Bindings ')
278 frameKeySets=LabelFrame(frame,borderwidth=2,relief=GROOVE,
279 text=' Key Set ')
Steven M. Gava60fc7072001-08-04 13:58:22 +0000280 #frameCustom
281 frameTarget=Frame(frameCustom)
Steven M. Gavafacfc092002-01-19 00:29:54 +0000282 labelTargetTitle=Label(frameTarget,text='Action - Key(s)')
283 scrollTargetY=Scrollbar(frameTarget)
284 scrollTargetX=Scrollbar(frameTarget,orient=HORIZONTAL)
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000285 self.listBindings=Listbox(frameTarget,takefocus=FALSE,
286 exportselection=FALSE)
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000287 self.listBindings.bind('<ButtonRelease-1>',self.KeyBindingSelected)
Steven M. Gavafacfc092002-01-19 00:29:54 +0000288 scrollTargetY.config(command=self.listBindings.yview)
289 scrollTargetX.config(command=self.listBindings.xview)
290 self.listBindings.config(yscrollcommand=scrollTargetY.set)
291 self.listBindings.config(xscrollcommand=scrollTargetX.set)
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000292 self.buttonNewKeys=Button(frameCustom,text='Get New Keys for Selection',
293 command=self.GetNewKeys,state=DISABLED)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000294 #frameKeySets
Kurt B. Kaiser28c7bcf2007-12-28 04:18:01 +0000295 frames = [Frame(frameKeySets, padx=2, pady=2, borderwidth=0)
296 for i in range(2)]
297 self.radioKeysBuiltin=Radiobutton(frames[0],variable=self.keysAreBuiltin,
298 value=1,command=self.SetKeysType,text='Use a Built-in Key Set')
299 self.radioKeysCustom=Radiobutton(frames[0],variable=self.keysAreBuiltin,
300 value=0,command=self.SetKeysType,text='Use a Custom Key Set')
301 self.optMenuKeysBuiltin=DynOptionMenu(frames[0],
Steven M. Gava41a85322001-10-29 08:05:34 +0000302 self.builtinKeys,None,command=None)
Kurt B. Kaiser28c7bcf2007-12-28 04:18:01 +0000303 self.optMenuKeysCustom=DynOptionMenu(frames[0],
Steven M. Gava41a85322001-10-29 08:05:34 +0000304 self.customKeys,None,command=None)
Kurt B. Kaiser28c7bcf2007-12-28 04:18:01 +0000305 self.buttonDeleteCustomKeys=Button(frames[1],text='Delete Custom Key Set',
Steven M. Gava49745752002-02-18 01:43:11 +0000306 command=self.DeleteCustomKeys)
Kurt B. Kaiser28c7bcf2007-12-28 04:18:01 +0000307 buttonSaveCustomKeys=Button(frames[1],
308 text='Save as New Custom Key Set',command=self.SaveAsNewKeySet)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000309 ##widget packing
310 #body
Kurt B. Kaiser28c7bcf2007-12-28 04:18:01 +0000311 frameCustom.pack(side=BOTTOM,padx=5,pady=5,expand=TRUE,fill=BOTH)
312 frameKeySets.pack(side=BOTTOM,padx=5,pady=5,fill=BOTH)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000313 #frameCustom
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000314 self.buttonNewKeys.pack(side=BOTTOM,fill=X,padx=5,pady=5)
Steven M. Gavafacfc092002-01-19 00:29:54 +0000315 frameTarget.pack(side=LEFT,padx=5,pady=5,expand=TRUE,fill=BOTH)
316 #frame target
317 frameTarget.columnconfigure(0,weight=1)
318 frameTarget.rowconfigure(1,weight=1)
319 labelTargetTitle.grid(row=0,column=0,columnspan=2,sticky=W)
320 self.listBindings.grid(row=1,column=0,sticky=NSEW)
321 scrollTargetY.grid(row=1,column=1,sticky=NS)
322 scrollTargetX.grid(row=2,column=0,sticky=EW)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000323 #frameKeySets
Kurt B. Kaiser28c7bcf2007-12-28 04:18:01 +0000324 self.radioKeysBuiltin.grid(row=0, column=0, sticky=W+NS)
325 self.radioKeysCustom.grid(row=1, column=0, sticky=W+NS)
326 self.optMenuKeysBuiltin.grid(row=0, column=1, sticky=NSEW)
327 self.optMenuKeysCustom.grid(row=1, column=1, sticky=NSEW)
328 self.buttonDeleteCustomKeys.pack(side=LEFT,fill=X,expand=True,padx=2)
329 buttonSaveCustomKeys.pack(side=LEFT,fill=X,expand=True,padx=2)
330 frames[0].pack(side=TOP, fill=BOTH, expand=True)
331 frames[1].pack(side=TOP, fill=X, expand=True, pady=2)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000332 return frame
333
334 def CreatePageGeneral(self):
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000335 #tkVars
336 self.winWidth=StringVar(self)
Steven M. Gava3b55a892001-11-21 05:56:26 +0000337 self.winHeight=StringVar(self)
Raymond Hettinger4e49b832004-06-04 06:31:08 +0000338 self.paraWidth=StringVar(self)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000339 self.startupEdit=IntVar(self)
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000340 self.autoSave=IntVar(self)
Kurt B. Kaisera053f332003-05-10 00:49:56 +0000341 self.encoding=StringVar(self)
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000342 self.userHelpBrowser=BooleanVar(self)
343 self.helpBrowser=StringVar(self)
Steven M. Gava230e5782001-08-07 03:28:25 +0000344 #widget creation
345 #body
Kurt B. Kaiser20172f92007-10-30 02:38:54 +0000346 frame=self.tabPages.pages['General'].frame
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000347 #body section frames
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000348 frameRun=LabelFrame(frame,borderwidth=2,relief=GROOVE,
349 text=' Startup Preferences ')
350 frameSave=LabelFrame(frame,borderwidth=2,relief=GROOVE,
351 text=' Autosave Preferences ')
Steven M. Gava230e5782001-08-07 03:28:25 +0000352 frameWinSize=Frame(frame,borderwidth=2,relief=GROOVE)
Raymond Hettinger4e49b832004-06-04 06:31:08 +0000353 frameParaSize=Frame(frame,borderwidth=2,relief=GROOVE)
Kurt B. Kaisera053f332003-05-10 00:49:56 +0000354 frameEncoding=Frame(frame,borderwidth=2,relief=GROOVE)
Kurt B. Kaisere3fde8f2007-10-04 03:11:12 +0000355 frameHelp=LabelFrame(frame,borderwidth=2,relief=GROOVE,
356 text=' Additional Help Sources ')
Steven M. Gava230e5782001-08-07 03:28:25 +0000357 #frameRun
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000358 labelRunChoiceTitle=Label(frameRun,text='At Startup')
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000359 radioStartupEdit=Radiobutton(frameRun,variable=self.startupEdit,
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +0000360 value=1,command=self.SetKeysType,text="Open Edit Window")
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000361 radioStartupShell=Radiobutton(frameRun,variable=self.startupEdit,
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +0000362 value=0,command=self.SetKeysType,text='Open Shell Window')
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000363 #frameSave
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000364 labelRunSaveTitle=Label(frameSave,text='At Start of Run (F5) ')
365 radioSaveAsk=Radiobutton(frameSave,variable=self.autoSave,
366 value=0,command=self.SetKeysType,text="Prompt to Save")
367 radioSaveAuto=Radiobutton(frameSave,variable=self.autoSave,
368 value=1,command=self.SetKeysType,text='No Prompt')
Steven M. Gava230e5782001-08-07 03:28:25 +0000369 #frameWinSize
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000370 labelWinSizeTitle=Label(frameWinSize,text='Initial Window Size'+
371 ' (in characters)')
Steven M. Gava230e5782001-08-07 03:28:25 +0000372 labelWinWidthTitle=Label(frameWinSize,text='Width')
373 entryWinWidth=Entry(frameWinSize,textvariable=self.winWidth,
374 width=3)
375 labelWinHeightTitle=Label(frameWinSize,text='Height')
376 entryWinHeight=Entry(frameWinSize,textvariable=self.winHeight,
377 width=3)
Raymond Hettinger4e49b832004-06-04 06:31:08 +0000378 #paragraphFormatWidth
379 labelParaWidthTitle=Label(frameParaSize,text='Paragraph reformat'+
380 ' width (in characters)')
381 entryParaWidth=Entry(frameParaSize,textvariable=self.paraWidth,
382 width=3)
Kurt B. Kaisera053f332003-05-10 00:49:56 +0000383 #frameEncoding
384 labelEncodingTitle=Label(frameEncoding,text="Default Source Encoding")
385 radioEncLocale=Radiobutton(frameEncoding,variable=self.encoding,
386 value="locale",text="Locale-defined")
387 radioEncUTF8=Radiobutton(frameEncoding,variable=self.encoding,
388 value="utf-8",text="UTF-8")
389 radioEncNone=Radiobutton(frameEncoding,variable=self.encoding,
390 value="none",text="None")
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000391 #frameHelp
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000392 frameHelpList=Frame(frameHelp)
393 frameHelpListButtons=Frame(frameHelpList)
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000394 scrollHelpList=Scrollbar(frameHelpList)
395 self.listHelp=Listbox(frameHelpList,height=5,takefocus=FALSE,
396 exportselection=FALSE)
397 scrollHelpList.config(command=self.listHelp.yview)
398 self.listHelp.config(yscrollcommand=scrollHelpList.set)
399 self.listHelp.bind('<ButtonRelease-1>',self.HelpSourceSelected)
400 self.buttonHelpListEdit=Button(frameHelpListButtons,text='Edit',
401 state=DISABLED,width=8,command=self.HelpListItemEdit)
402 self.buttonHelpListAdd=Button(frameHelpListButtons,text='Add',
403 width=8,command=self.HelpListItemAdd)
404 self.buttonHelpListRemove=Button(frameHelpListButtons,text='Remove',
405 state=DISABLED,width=8,command=self.HelpListItemRemove)
Steven M. Gava230e5782001-08-07 03:28:25 +0000406 #widget packing
407 #body
408 frameRun.pack(side=TOP,padx=5,pady=5,fill=X)
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000409 frameSave.pack(side=TOP,padx=5,pady=5,fill=X)
Steven M. Gava230e5782001-08-07 03:28:25 +0000410 frameWinSize.pack(side=TOP,padx=5,pady=5,fill=X)
Raymond Hettinger4e49b832004-06-04 06:31:08 +0000411 frameParaSize.pack(side=TOP,padx=5,pady=5,fill=X)
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000412 frameEncoding.pack(side=TOP,padx=5,pady=5,fill=X)
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000413 frameHelp.pack(side=TOP,padx=5,pady=5,expand=TRUE,fill=BOTH)
Steven M. Gava230e5782001-08-07 03:28:25 +0000414 #frameRun
Steven M. Gava230e5782001-08-07 03:28:25 +0000415 labelRunChoiceTitle.pack(side=LEFT,anchor=W,padx=5,pady=5)
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000416 radioStartupShell.pack(side=RIGHT,anchor=W,padx=5,pady=5)
417 radioStartupEdit.pack(side=RIGHT,anchor=W,padx=5,pady=5)
418 #frameSave
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000419 labelRunSaveTitle.pack(side=LEFT,anchor=W,padx=5,pady=5)
420 radioSaveAuto.pack(side=RIGHT,anchor=W,padx=5,pady=5)
421 radioSaveAsk.pack(side=RIGHT,anchor=W,padx=5,pady=5)
Steven M. Gava230e5782001-08-07 03:28:25 +0000422 #frameWinSize
Steven M. Gavafacfc092002-01-19 00:29:54 +0000423 labelWinSizeTitle.pack(side=LEFT,anchor=W,padx=5,pady=5)
424 entryWinHeight.pack(side=RIGHT,anchor=E,padx=10,pady=5)
425 labelWinHeightTitle.pack(side=RIGHT,anchor=E,pady=5)
426 entryWinWidth.pack(side=RIGHT,anchor=E,padx=10,pady=5)
427 labelWinWidthTitle.pack(side=RIGHT,anchor=E,pady=5)
Raymond Hettinger4e49b832004-06-04 06:31:08 +0000428 #paragraphFormatWidth
429 labelParaWidthTitle.pack(side=LEFT,anchor=W,padx=5,pady=5)
430 entryParaWidth.pack(side=RIGHT,anchor=E,padx=10,pady=5)
Kurt B. Kaisera053f332003-05-10 00:49:56 +0000431 #frameEncoding
432 labelEncodingTitle.pack(side=LEFT,anchor=W,padx=5,pady=5)
433 radioEncNone.pack(side=RIGHT,anchor=E,pady=5)
434 radioEncUTF8.pack(side=RIGHT,anchor=E,pady=5)
435 radioEncLocale.pack(side=RIGHT,anchor=E,pady=5)
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000436 #frameHelp
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000437 frameHelpListButtons.pack(side=RIGHT,padx=5,pady=5,fill=Y)
438 frameHelpList.pack(side=TOP,padx=5,pady=5,expand=TRUE,fill=BOTH)
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000439 scrollHelpList.pack(side=RIGHT,anchor=W,fill=Y)
440 self.listHelp.pack(side=LEFT,anchor=E,expand=TRUE,fill=BOTH)
441 self.buttonHelpListEdit.pack(side=TOP,anchor=W,pady=5)
442 self.buttonHelpListAdd.pack(side=TOP,anchor=W)
443 self.buttonHelpListRemove.pack(side=TOP,anchor=W,pady=5)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000444 return frame
445
Steven M. Gavac112cd82002-01-22 05:56:40 +0000446 def AttachVarCallbacks(self):
447 self.fontSize.trace_variable('w',self.VarChanged_fontSize)
448 self.fontName.trace_variable('w',self.VarChanged_fontName)
449 self.fontBold.trace_variable('w',self.VarChanged_fontBold)
450 self.spaceNum.trace_variable('w',self.VarChanged_spaceNum)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000451 self.colour.trace_variable('w',self.VarChanged_colour)
Steven M. Gava052937f2002-02-11 02:20:53 +0000452 self.builtinTheme.trace_variable('w',self.VarChanged_builtinTheme)
453 self.customTheme.trace_variable('w',self.VarChanged_customTheme)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000454 self.themeIsBuiltin.trace_variable('w',self.VarChanged_themeIsBuiltin)
Steven M. Gava052937f2002-02-11 02:20:53 +0000455 self.highlightTarget.trace_variable('w',self.VarChanged_highlightTarget)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000456 self.keyBinding.trace_variable('w',self.VarChanged_keyBinding)
Steven M. Gava052937f2002-02-11 02:20:53 +0000457 self.builtinKeys.trace_variable('w',self.VarChanged_builtinKeys)
458 self.customKeys.trace_variable('w',self.VarChanged_customKeys)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000459 self.keysAreBuiltin.trace_variable('w',self.VarChanged_keysAreBuiltin)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000460 self.winWidth.trace_variable('w',self.VarChanged_winWidth)
461 self.winHeight.trace_variable('w',self.VarChanged_winHeight)
Raymond Hettinger4e49b832004-06-04 06:31:08 +0000462 self.paraWidth.trace_variable('w',self.VarChanged_paraWidth)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000463 self.startupEdit.trace_variable('w',self.VarChanged_startupEdit)
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000464 self.autoSave.trace_variable('w',self.VarChanged_autoSave)
Kurt B. Kaisera053f332003-05-10 00:49:56 +0000465 self.encoding.trace_variable('w',self.VarChanged_encoding)
Steven M. Gava052937f2002-02-11 02:20:53 +0000466
Steven M. Gavac112cd82002-01-22 05:56:40 +0000467 def VarChanged_fontSize(self,*params):
468 value=self.fontSize.get()
469 self.AddChangedItem('main','EditorWindow','font-size',value)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000470
Steven M. Gavac112cd82002-01-22 05:56:40 +0000471 def VarChanged_fontName(self,*params):
472 value=self.fontName.get()
473 self.AddChangedItem('main','EditorWindow','font',value)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000474
475 def VarChanged_fontBold(self,*params):
476 value=self.fontBold.get()
477 self.AddChangedItem('main','EditorWindow','font-bold',value)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000478
Steven M. Gavac112cd82002-01-22 05:56:40 +0000479 def VarChanged_spaceNum(self,*params):
480 value=self.spaceNum.get()
481 self.AddChangedItem('main','Indent','num-spaces',value)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000482
Steven M. Gavac112cd82002-01-22 05:56:40 +0000483 def VarChanged_colour(self,*params):
Steven M. Gava052937f2002-02-11 02:20:53 +0000484 self.OnNewColourSet()
485
486 def VarChanged_builtinTheme(self,*params):
487 value=self.builtinTheme.get()
488 self.AddChangedItem('main','Theme','name',value)
489 self.PaintThemeSample()
490
491 def VarChanged_customTheme(self,*params):
492 value=self.customTheme.get()
Steven M. Gava49745752002-02-18 01:43:11 +0000493 if value != '- no custom themes -':
494 self.AddChangedItem('main','Theme','name',value)
495 self.PaintThemeSample()
Steven M. Gava052937f2002-02-11 02:20:53 +0000496
497 def VarChanged_themeIsBuiltin(self,*params):
498 value=self.themeIsBuiltin.get()
499 self.AddChangedItem('main','Theme','default',value)
Steven M. Gavaf31eec02002-03-05 00:25:58 +0000500 if value:
501 self.VarChanged_builtinTheme()
502 else:
503 self.VarChanged_customTheme()
Steven M. Gava052937f2002-02-11 02:20:53 +0000504
505 def VarChanged_highlightTarget(self,*params):
506 self.SetHighlightTarget()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000507
Steven M. Gavac112cd82002-01-22 05:56:40 +0000508 def VarChanged_keyBinding(self,*params):
Steven M. Gavabbf5ef52002-01-22 11:35:50 +0000509 value=self.keyBinding.get()
510 keySet=self.customKeys.get()
511 event=self.listBindings.get(ANCHOR).split()[0]
Steven M. Gavaa498af22002-02-01 01:33:36 +0000512 if idleConf.IsCoreBinding(event):
513 #this is a core keybinding
514 self.AddChangedItem('keys',keySet,event,value)
515 else: #this is an extension key binding
516 extName=idleConf.GetExtnNameForEvent(event)
517 extKeybindSection=extName+'_cfgBindings'
518 self.AddChangedItem('extensions',extKeybindSection,event,value)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000519
Steven M. Gava052937f2002-02-11 02:20:53 +0000520 def VarChanged_builtinKeys(self,*params):
521 value=self.builtinKeys.get()
522 self.AddChangedItem('main','Keys','name',value)
523 self.LoadKeysList(value)
524
525 def VarChanged_customKeys(self,*params):
526 value=self.customKeys.get()
Steven M. Gava49745752002-02-18 01:43:11 +0000527 if value != '- no custom keys -':
528 self.AddChangedItem('main','Keys','name',value)
529 self.LoadKeysList(value)
Steven M. Gava052937f2002-02-11 02:20:53 +0000530
531 def VarChanged_keysAreBuiltin(self,*params):
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000532 value=self.keysAreBuiltin.get()
Steven M. Gava052937f2002-02-11 02:20:53 +0000533 self.AddChangedItem('main','Keys','default',value)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000534 if value:
Steven M. Gavaf31eec02002-03-05 00:25:58 +0000535 self.VarChanged_builtinKeys()
Steven M. Gava052937f2002-02-11 02:20:53 +0000536 else:
Steven M. Gavaf31eec02002-03-05 00:25:58 +0000537 self.VarChanged_customKeys()
Steven M. Gava052937f2002-02-11 02:20:53 +0000538
Steven M. Gavac112cd82002-01-22 05:56:40 +0000539 def VarChanged_winWidth(self,*params):
Steven M. Gavabbf5ef52002-01-22 11:35:50 +0000540 value=self.winWidth.get()
541 self.AddChangedItem('main','EditorWindow','width',value)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000542
543 def VarChanged_winHeight(self,*params):
Steven M. Gavabbf5ef52002-01-22 11:35:50 +0000544 value=self.winHeight.get()
545 self.AddChangedItem('main','EditorWindow','height',value)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000546
Raymond Hettinger4e49b832004-06-04 06:31:08 +0000547 def VarChanged_paraWidth(self,*params):
548 value=self.paraWidth.get()
549 self.AddChangedItem('main','FormatParagraph','paragraph',value)
550
Steven M. Gavac112cd82002-01-22 05:56:40 +0000551 def VarChanged_startupEdit(self,*params):
Steven M. Gavabbf5ef52002-01-22 11:35:50 +0000552 value=self.startupEdit.get()
553 self.AddChangedItem('main','General','editor-on-startup',value)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000554
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +0000555 def VarChanged_autoSave(self,*params):
556 value=self.autoSave.get()
557 self.AddChangedItem('main','General','autosave',value)
558
Kurt B. Kaisera053f332003-05-10 00:49:56 +0000559 def VarChanged_encoding(self,*params):
560 value=self.encoding.get()
561 self.AddChangedItem('main','EditorWindow','encoding',value)
562
Steven M. Gavaa498af22002-02-01 01:33:36 +0000563 def ResetChangedItems(self):
Steven M. Gavab77d3432002-03-02 07:16:21 +0000564 #When any config item is changed in this dialog, an entry
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000565 #should be made in the relevant section (config type) of this
566 #dictionary. The key should be the config file section name and the
Steven M. Gavaa498af22002-02-01 01:33:36 +0000567 #value a dictionary, whose key:value pairs are item=value pairs for
568 #that config file section.
569 self.changedItems={'main':{},'highlight':{},'keys':{},'extensions':{}}
570
Steven M. Gavac112cd82002-01-22 05:56:40 +0000571 def AddChangedItem(self,type,section,item,value):
Steven M. Gava2d7bb3f2002-01-29 08:35:29 +0000572 value=str(value) #make sure we use a string
Benjamin Peterson6e3dbbd2009-10-09 22:15:50 +0000573 if section not in self.changedItems[type]:
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000574 self.changedItems[type][section]={}
Steven M. Gavac112cd82002-01-22 05:56:40 +0000575 self.changedItems[type][section][item]=value
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000576
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000577 def GetDefaultItems(self):
578 dItems={'main':{},'highlight':{},'keys':{},'extensions':{}}
579 for configType in dItems.keys():
580 sections=idleConf.GetSectionList('default',configType)
581 for section in sections:
582 dItems[configType][section]={}
583 options=idleConf.defaultCfg[configType].GetOptionList(section)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000584 for option in options:
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000585 dItems[configType][section][option]=(
586 idleConf.defaultCfg[configType].Get(section,option))
587 return dItems
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000588
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000589 def SetThemeType(self):
590 if self.themeIsBuiltin.get():
591 self.optMenuThemeBuiltin.config(state=NORMAL)
592 self.optMenuThemeCustom.config(state=DISABLED)
593 self.buttonDeleteCustomTheme.config(state=DISABLED)
594 else:
595 self.optMenuThemeBuiltin.config(state=DISABLED)
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000596 self.radioThemeCustom.config(state=NORMAL)
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000597 self.optMenuThemeCustom.config(state=NORMAL)
598 self.buttonDeleteCustomTheme.config(state=NORMAL)
599
600 def SetKeysType(self):
Steven M. Gava052937f2002-02-11 02:20:53 +0000601 if self.keysAreBuiltin.get():
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000602 self.optMenuKeysBuiltin.config(state=NORMAL)
603 self.optMenuKeysCustom.config(state=DISABLED)
604 self.buttonDeleteCustomKeys.config(state=DISABLED)
605 else:
606 self.optMenuKeysBuiltin.config(state=DISABLED)
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000607 self.radioKeysCustom.config(state=NORMAL)
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000608 self.optMenuKeysCustom.config(state=NORMAL)
609 self.buttonDeleteCustomKeys.config(state=NORMAL)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000610
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000611 def GetNewKeys(self):
612 listIndex=self.listBindings.index(ANCHOR)
613 binding=self.listBindings.get(listIndex)
614 bindName=binding.split()[0] #first part, up to first space
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000615 if self.keysAreBuiltin.get():
Steven M. Gavae28ee752002-02-11 03:45:22 +0000616 currentKeySetName=self.builtinKeys.get()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000617 else:
Steven M. Gavae28ee752002-02-11 03:45:22 +0000618 currentKeySetName=self.customKeys.get()
619 currentBindings=idleConf.GetCurrentKeySet()
620 if currentKeySetName in self.changedItems['keys'].keys(): #unsaved changes
621 keySetChanges=self.changedItems['keys'][currentKeySetName]
622 for event in keySetChanges.keys():
623 currentBindings[event]=keySetChanges[event].split()
624 currentKeySequences=currentBindings.values()
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000625 newKeys=GetKeysDialog(self,'Get New Keys',bindName,
626 currentKeySequences).result
627 if newKeys: #new keys were specified
Steven M. Gava052937f2002-02-11 02:20:53 +0000628 if self.keysAreBuiltin.get(): #current key set is a built-in
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000629 message=('Your changes will be saved as a new Custom Key Set. '+
630 'Enter a name for your new Custom Key Set below.')
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000631 newKeySet=self.GetNewKeysName(message)
632 if not newKeySet: #user cancelled custom key set creation
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000633 self.listBindings.select_set(listIndex)
634 self.listBindings.select_anchor(listIndex)
635 return
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000636 else: #create new custom key set based on previously active key set
637 self.CreateNewKeySet(newKeySet)
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000638 self.listBindings.delete(listIndex)
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000639 self.listBindings.insert(listIndex,bindName+' - '+newKeys)
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000640 self.listBindings.select_set(listIndex)
641 self.listBindings.select_anchor(listIndex)
Steven M. Gava052937f2002-02-11 02:20:53 +0000642 self.keyBinding.set(newKeys)
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000643 else:
644 self.listBindings.select_set(listIndex)
645 self.listBindings.select_anchor(listIndex)
646
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000647 def GetNewKeysName(self,message):
Steven M. Gava49745752002-02-18 01:43:11 +0000648 usedNames=(idleConf.GetSectionList('user','keys')+
649 idleConf.GetSectionList('default','keys'))
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000650 newKeySet=GetCfgSectionNameDialog(self,'New Custom Key Set',
651 message,usedNames).result
652 return newKeySet
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000653
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000654 def SaveAsNewKeySet(self):
655 newKeysName=self.GetNewKeysName('New Key Set Name:')
656 if newKeysName:
657 self.CreateNewKeySet(newKeysName)
658
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000659 def KeyBindingSelected(self,event):
660 self.buttonNewKeys.config(state=NORMAL)
661
662 def CreateNewKeySet(self,newKeySetName):
663 #creates new custom key set based on the previously active key set,
664 #and makes the new key set active
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000665 if self.keysAreBuiltin.get():
Steven M. Gava052937f2002-02-11 02:20:53 +0000666 prevKeySetName=self.builtinKeys.get()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000667 else:
Steven M. Gava052937f2002-02-11 02:20:53 +0000668 prevKeySetName=self.customKeys.get()
Steven M. Gava052937f2002-02-11 02:20:53 +0000669 prevKeys=idleConf.GetCoreKeys(prevKeySetName)
Steven M. Gava052937f2002-02-11 02:20:53 +0000670 newKeys={}
671 for event in prevKeys.keys(): #add key set to changed items
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000672 eventName=event[2:-2] #trim off the angle brackets
Steven M. Gava052937f2002-02-11 02:20:53 +0000673 binding=string.join(prevKeys[event])
674 newKeys[eventName]=binding
Steven M. Gava052937f2002-02-11 02:20:53 +0000675 #handle any unsaved changes to prev key set
676 if prevKeySetName in self.changedItems['keys'].keys():
677 keySetChanges=self.changedItems['keys'][prevKeySetName]
678 for event in keySetChanges.keys():
679 newKeys[event]=keySetChanges[event]
Steven M. Gava052937f2002-02-11 02:20:53 +0000680 #save the new theme
681 self.SaveNewKeySet(newKeySetName,newKeys)
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000682 #change gui over to the new key set
683 customKeyList=idleConf.GetSectionList('user','keys')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000684 customKeyList.sort()
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000685 self.optMenuKeysCustom.SetMenu(customKeyList,newKeySetName)
Steven M. Gava052937f2002-02-11 02:20:53 +0000686 self.keysAreBuiltin.set(0)
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000687 self.SetKeysType()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000688
Steven M. Gava052937f2002-02-11 02:20:53 +0000689 def LoadKeysList(self,keySetName):
690 reselect=0
691 newKeySet=0
692 if self.listBindings.curselection():
693 reselect=1
694 listIndex=self.listBindings.index(ANCHOR)
Steven M. Gava052937f2002-02-11 02:20:53 +0000695 keySet=idleConf.GetKeySet(keySetName)
Steven M. Gava052937f2002-02-11 02:20:53 +0000696 bindNames=keySet.keys()
697 bindNames.sort()
698 self.listBindings.delete(0,END)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000699 for bindName in bindNames:
Steven M. Gava052937f2002-02-11 02:20:53 +0000700 key=string.join(keySet[bindName]) #make key(s) into a string
701 bindName=bindName[2:-2] #trim off the angle brackets
Steven M. Gava052937f2002-02-11 02:20:53 +0000702 if keySetName in self.changedItems['keys'].keys():
703 #handle any unsaved changes to this key set
704 if bindName in self.changedItems['keys'][keySetName].keys():
705 key=self.changedItems['keys'][keySetName][bindName]
Steven M. Gava052937f2002-02-11 02:20:53 +0000706 self.listBindings.insert(END, bindName+' - '+key)
Steven M. Gava052937f2002-02-11 02:20:53 +0000707 if reselect:
708 self.listBindings.see(listIndex)
709 self.listBindings.select_set(listIndex)
710 self.listBindings.select_anchor(listIndex)
711
Steven M. Gava49745752002-02-18 01:43:11 +0000712 def DeleteCustomKeys(self):
713 keySetName=self.customKeys.get()
714 if not tkMessageBox.askyesno('Delete Key Set','Are you sure you wish '+
Walter Dörwald70a6b492004-02-12 17:35:32 +0000715 'to delete the key set %r ?' % (keySetName),
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +0000716 parent=self):
Steven M. Gava49745752002-02-18 01:43:11 +0000717 return
718 #remove key set from config
719 idleConf.userCfg['keys'].remove_section(keySetName)
Benjamin Peterson6e3dbbd2009-10-09 22:15:50 +0000720 if keySetName in self.changedItems['keys']:
Steven M. Gava49745752002-02-18 01:43:11 +0000721 del(self.changedItems['keys'][keySetName])
722 #write changes
723 idleConf.userCfg['keys'].Save()
724 #reload user key set list
725 itemList=idleConf.GetSectionList('user','keys')
726 itemList.sort()
727 if not itemList:
728 self.radioKeysCustom.config(state=DISABLED)
729 self.optMenuKeysCustom.SetMenu(itemList,'- no custom keys -')
730 else:
731 self.optMenuKeysCustom.SetMenu(itemList,itemList[0])
732 #revert to default key set
733 self.keysAreBuiltin.set(idleConf.defaultCfg['main'].Get('Keys','default'))
734 self.builtinKeys.set(idleConf.defaultCfg['main'].Get('Keys','name'))
735 #user can't back out of these changes, they must be applied now
736 self.Apply()
737 self.SetKeysType()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000738
Steven M. Gava49745752002-02-18 01:43:11 +0000739 def DeleteCustomTheme(self):
740 themeName=self.customTheme.get()
741 if not tkMessageBox.askyesno('Delete Theme','Are you sure you wish '+
Walter Dörwald70a6b492004-02-12 17:35:32 +0000742 'to delete the theme %r ?' % (themeName,),
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +0000743 parent=self):
Steven M. Gava49745752002-02-18 01:43:11 +0000744 return
745 #remove theme from config
746 idleConf.userCfg['highlight'].remove_section(themeName)
Benjamin Peterson6e3dbbd2009-10-09 22:15:50 +0000747 if themeName in self.changedItems['highlight']:
Steven M. Gava49745752002-02-18 01:43:11 +0000748 del(self.changedItems['highlight'][themeName])
749 #write changes
750 idleConf.userCfg['highlight'].Save()
751 #reload user theme list
752 itemList=idleConf.GetSectionList('user','highlight')
753 itemList.sort()
754 if not itemList:
755 self.radioThemeCustom.config(state=DISABLED)
756 self.optMenuThemeCustom.SetMenu(itemList,'- no custom themes -')
757 else:
758 self.optMenuThemeCustom.SetMenu(itemList,itemList[0])
759 #revert to default theme
760 self.themeIsBuiltin.set(idleConf.defaultCfg['main'].Get('Theme','default'))
761 self.builtinTheme.set(idleConf.defaultCfg['main'].Get('Theme','name'))
762 #user can't back out of these changes, they must be applied now
763 self.Apply()
764 self.SetThemeType()
765
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000766 def GetColour(self):
767 target=self.highlightTarget.get()
Steven M. Gava052937f2002-02-11 02:20:53 +0000768 prevColour=self.frameColourSet.cget('bg')
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000769 rgbTuplet, colourString = tkColorChooser.askcolor(parent=self,
Steven M. Gava052937f2002-02-11 02:20:53 +0000770 title='Pick new colour for : '+target,initialcolor=prevColour)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000771 if colourString and (colourString!=prevColour):
Steven M. Gava052937f2002-02-11 02:20:53 +0000772 #user didn't cancel, and they chose a new colour
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000773 if self.themeIsBuiltin.get(): #current theme is a built-in
774 message=('Your changes will be saved as a new Custom Theme. '+
775 'Enter a name for your new Custom Theme below.')
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000776 newTheme=self.GetNewThemeName(message)
777 if not newTheme: #user cancelled custom theme creation
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000778 return
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000779 else: #create new custom theme based on previously active theme
780 self.CreateNewTheme(newTheme)
Steven M. Gava052937f2002-02-11 02:20:53 +0000781 self.colour.set(colourString)
782 else: #current theme is user defined
783 self.colour.set(colourString)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000784
Steven M. Gava052937f2002-02-11 02:20:53 +0000785 def OnNewColourSet(self):
786 newColour=self.colour.get()
787 self.frameColourSet.config(bg=newColour)#set sample
788 if self.fgHilite.get(): plane='foreground'
789 else: plane='background'
790 sampleElement=self.themeElements[self.highlightTarget.get()][0]
Raymond Hettinger931237e2003-07-09 18:48:24 +0000791 self.textHighlightSample.tag_config(sampleElement, **{plane:newColour})
Steven M. Gava052937f2002-02-11 02:20:53 +0000792 theme=self.customTheme.get()
793 themeElement=sampleElement+'-'+plane
794 self.AddChangedItem('highlight',theme,themeElement,newColour)
Steven M. Gava052937f2002-02-11 02:20:53 +0000795
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000796 def GetNewThemeName(self,message):
Steven M. Gava49745752002-02-18 01:43:11 +0000797 usedNames=(idleConf.GetSectionList('user','highlight')+
798 idleConf.GetSectionList('default','highlight'))
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000799 newTheme=GetCfgSectionNameDialog(self,'New Custom Theme',
800 message,usedNames).result
801 return newTheme
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000802
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000803 def SaveAsNewTheme(self):
804 newThemeName=self.GetNewThemeName('New Theme Name:')
805 if newThemeName:
806 self.CreateNewTheme(newThemeName)
807
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000808 def CreateNewTheme(self,newThemeName):
809 #creates new custom theme based on the previously active theme,
810 #and makes the new theme active
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000811 if self.themeIsBuiltin.get():
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000812 themeType='default'
813 themeName=self.builtinTheme.get()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000814 else:
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000815 themeType='user'
816 themeName=self.customTheme.get()
817 newTheme=idleConf.GetThemeDict(themeType,themeName)
Steven M. Gava052937f2002-02-11 02:20:53 +0000818 #apply any of the old theme's unsaved changes to the new theme
819 if themeName in self.changedItems['highlight'].keys():
820 themeChanges=self.changedItems['highlight'][themeName]
821 for element in themeChanges.keys():
822 newTheme[element]=themeChanges[element]
823 #save the new theme
824 self.SaveNewTheme(newThemeName,newTheme)
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000825 #change gui over to the new theme
826 customThemeList=idleConf.GetSectionList('user','highlight')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000827 customThemeList.sort()
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000828 self.optMenuThemeCustom.SetMenu(customThemeList,newThemeName)
829 self.themeIsBuiltin.set(0)
830 self.SetThemeType()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000831
Steven M. Gavac112cd82002-01-22 05:56:40 +0000832 def OnListFontButtonRelease(self,event):
Kurt B. Kaiser05391692003-05-26 20:35:53 +0000833 font = self.listFontName.get(ANCHOR)
834 self.fontName.set(font.lower())
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000835 self.SetFontSample()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000836
Steven M. Gavac112cd82002-01-22 05:56:40 +0000837 def SetFontSample(self,event=None):
838 fontName=self.fontName.get()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000839 if self.fontBold.get():
Steven M. Gavac112cd82002-01-22 05:56:40 +0000840 fontWeight=tkFont.BOLD
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000841 else:
Steven M. Gavac112cd82002-01-22 05:56:40 +0000842 fontWeight=tkFont.NORMAL
Ned Deilye3d47122012-10-22 15:13:01 -0700843 newFont = (fontName, self.fontSize.get(), fontWeight)
844 self.labelFontSample.config(font=newFont)
845 self.textHighlightSample.configure(font=newFont)
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000846
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000847 def SetHighlightTarget(self):
848 if self.highlightTarget.get()=='Cursor': #bg not possible
849 self.radioFg.config(state=DISABLED)
850 self.radioBg.config(state=DISABLED)
851 self.fgHilite.set(1)
852 else: #both fg and bg can be set
853 self.radioFg.config(state=NORMAL)
854 self.radioBg.config(state=NORMAL)
855 self.fgHilite.set(1)
856 self.SetColourSample()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000857
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000858 def SetColourSampleBinding(self,*args):
859 self.SetColourSample()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000860
Steven M. Gava5f28e8f2002-01-21 06:38:21 +0000861 def SetColourSample(self):
862 #set the colour smaple area
863 tag=self.themeElements[self.highlightTarget.get()][0]
864 if self.fgHilite.get(): plane='foreground'
865 else: plane='background'
866 colour=self.textHighlightSample.tag_cget(tag,plane)
867 self.frameColourSet.config(bg=colour)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000868
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000869 def PaintThemeSample(self):
Steven M. Gavad0342cd2001-11-04 11:53:10 +0000870 if self.themeIsBuiltin.get(): #a default theme
Steven M. Gava99300612001-11-04 07:03:08 +0000871 theme=self.builtinTheme.get()
872 else: #a user theme
873 theme=self.customTheme.get()
Steven M. Gava052937f2002-02-11 02:20:53 +0000874 for elementTitle in self.themeElements.keys():
875 element=self.themeElements[elementTitle][0]
876 colours=idleConf.GetHighlight(theme,element)
877 if element=='cursor': #cursor sample needs special painting
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000878 colours['background']=idleConf.GetHighlight(theme,
Steven M. Gava0cae01c2002-01-04 07:53:06 +0000879 'normal', fgBg='bg')
Steven M. Gava052937f2002-02-11 02:20:53 +0000880 #handle any unsaved changes to this theme
881 if theme in self.changedItems['highlight'].keys():
882 themeDict=self.changedItems['highlight'][theme]
Benjamin Peterson6e3dbbd2009-10-09 22:15:50 +0000883 if element+'-foreground' in themeDict:
Steven M. Gava052937f2002-02-11 02:20:53 +0000884 colours['foreground']=themeDict[element+'-foreground']
Benjamin Peterson6e3dbbd2009-10-09 22:15:50 +0000885 if element+'-background' in themeDict:
Steven M. Gava052937f2002-02-11 02:20:53 +0000886 colours['background']=themeDict[element+'-background']
Raymond Hettinger931237e2003-07-09 18:48:24 +0000887 self.textHighlightSample.tag_config(element, **colours)
Steven M. Gava052937f2002-02-11 02:20:53 +0000888 self.SetColourSample()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000889
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000890 def HelpSourceSelected(self,event):
891 self.SetHelpListButtonStates()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000892
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000893 def SetHelpListButtonStates(self):
894 if self.listHelp.size()<1: #no entries in list
895 self.buttonHelpListEdit.config(state=DISABLED)
896 self.buttonHelpListRemove.config(state=DISABLED)
897 else: #there are some entries
898 if self.listHelp.curselection(): #there currently is a selection
899 self.buttonHelpListEdit.config(state=NORMAL)
900 self.buttonHelpListRemove.config(state=NORMAL)
901 else: #there currently is not a selection
902 self.buttonHelpListEdit.config(state=DISABLED)
903 self.buttonHelpListRemove.config(state=DISABLED)
904
905 def HelpListItemAdd(self):
906 helpSource=GetHelpSourceDialog(self,'New Help Source').result
907 if helpSource:
908 self.userHelpList.append( (helpSource[0],helpSource[1]) )
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +0000909 self.listHelp.insert(END,helpSource[0])
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000910 self.UpdateUserHelpChangedItems()
911 self.SetHelpListButtonStates()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000912
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000913 def HelpListItemEdit(self):
914 itemIndex=self.listHelp.index(ANCHOR)
915 helpSource=self.userHelpList[itemIndex]
Steven M. Gava0c5bc8c2002-03-27 02:25:44 +0000916 newHelpSource=GetHelpSourceDialog(self,'Edit Help Source',
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000917 menuItem=helpSource[0],filePath=helpSource[1]).result
918 if (not newHelpSource) or (newHelpSource==helpSource):
919 return #no changes
920 self.userHelpList[itemIndex]=newHelpSource
921 self.listHelp.delete(itemIndex)
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +0000922 self.listHelp.insert(itemIndex,newHelpSource[0])
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000923 self.UpdateUserHelpChangedItems()
924 self.SetHelpListButtonStates()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000925
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000926 def HelpListItemRemove(self):
927 itemIndex=self.listHelp.index(ANCHOR)
928 del(self.userHelpList[itemIndex])
929 self.listHelp.delete(itemIndex)
930 self.UpdateUserHelpChangedItems()
931 self.SetHelpListButtonStates()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000932
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000933 def UpdateUserHelpChangedItems(self):
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +0000934 "Clear and rebuild the HelpFiles section in self.changedItems"
935 self.changedItems['main']['HelpFiles'] = {}
Steven M. Gava085eb1b2002-02-05 04:52:32 +0000936 for num in range(1,len(self.userHelpList)+1):
937 self.AddChangedItem('main','HelpFiles',str(num),
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +0000938 string.join(self.userHelpList[num-1][:2],';'))
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000939
Steven M. Gava429a86a2001-10-23 10:42:12 +0000940 def LoadFontCfg(self):
941 ##base editor font selection list
Steven M. Gavac11ccf32001-09-24 09:43:17 +0000942 fonts=list(tkFont.families(self))
943 fonts.sort()
944 for font in fonts:
945 self.listFontName.insert(END,font)
Steven M. Gava485f7b62001-10-26 06:47:09 +0000946 configuredFont=idleConf.GetOption('main','EditorWindow','font',
Steven M. Gava429a86a2001-10-23 10:42:12 +0000947 default='courier')
Kurt B. Kaiser05391692003-05-26 20:35:53 +0000948 lc_configuredFont = configuredFont.lower()
949 self.fontName.set(lc_configuredFont)
950 lc_fonts = [s.lower() for s in fonts]
951 if lc_configuredFont in lc_fonts:
952 currentFontIndex = lc_fonts.index(lc_configuredFont)
Steven M. Gava429a86a2001-10-23 10:42:12 +0000953 self.listFontName.see(currentFontIndex)
954 self.listFontName.select_set(currentFontIndex)
Steven M. Gavac112cd82002-01-22 05:56:40 +0000955 self.listFontName.select_anchor(currentFontIndex)
Steven M. Gava429a86a2001-10-23 10:42:12 +0000956 ##font size dropdown
Steven M. Gavac112cd82002-01-22 05:56:40 +0000957 fontSize=idleConf.GetOption('main','EditorWindow','font-size',
Andrew Svetlovd8590ff2012-12-24 13:17:59 +0200958 type='int', default='10')
Chui Teya178cff2002-11-04 03:17:45 +0000959 self.optMenuFontSize.SetMenu(('7','8','9','10','11','12','13','14',
Steven M. Gava485f7b62001-10-26 06:47:09 +0000960 '16','18','20','22'),fontSize )
Steven M. Gavac112cd82002-01-22 05:56:40 +0000961 ##fontWeight
962 self.fontBold.set(idleConf.GetOption('main','EditorWindow',
963 'font-bold',default=0,type='bool'))
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000964 ##font sample
Steven M. Gava429a86a2001-10-23 10:42:12 +0000965 self.SetFontSample()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000966
Steven M. Gava429a86a2001-10-23 10:42:12 +0000967 def LoadTabCfg(self):
Steven M. Gava429a86a2001-10-23 10:42:12 +0000968 ##indent sizes
Steven M. Gava485f7b62001-10-26 06:47:09 +0000969 spaceNum=idleConf.GetOption('main','Indent','num-spaces',
Steven M. Gava429a86a2001-10-23 10:42:12 +0000970 default=4,type='int')
Steven M. Gava429a86a2001-10-23 10:42:12 +0000971 self.spaceNum.set(spaceNum)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000972
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000973 def LoadThemeCfg(self):
Steven M. Gava41a85322001-10-29 08:05:34 +0000974 ##current theme type radiobutton
Steven M. Gavad0342cd2001-11-04 11:53:10 +0000975 self.themeIsBuiltin.set(idleConf.GetOption('main','Theme','default',
Steven M. Gavac112cd82002-01-22 05:56:40 +0000976 type='bool',default=1))
Steven M. Gava41a85322001-10-29 08:05:34 +0000977 ##currently set theme
Steven M. Gavaad4f5322002-01-03 12:05:17 +0000978 currentOption=idleConf.CurrentTheme()
Steven M. Gava7c017862001-10-29 11:19:46 +0000979 ##load available theme option menus
Steven M. Gavad0342cd2001-11-04 11:53:10 +0000980 if self.themeIsBuiltin.get(): #default theme selected
Steven M. Gava41a85322001-10-29 08:05:34 +0000981 itemList=idleConf.GetSectionList('default','highlight')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000982 itemList.sort()
Steven M. Gava41a85322001-10-29 08:05:34 +0000983 self.optMenuThemeBuiltin.SetMenu(itemList,currentOption)
984 itemList=idleConf.GetSectionList('user','highlight')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000985 itemList.sort()
Steven M. Gava41a85322001-10-29 08:05:34 +0000986 if not itemList:
987 self.radioThemeCustom.config(state=DISABLED)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +0000988 self.customTheme.set('- no custom themes -')
Steven M. Gava41a85322001-10-29 08:05:34 +0000989 else:
990 self.optMenuThemeCustom.SetMenu(itemList,itemList[0])
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000991 else: #user theme selected
Steven M. Gava41a85322001-10-29 08:05:34 +0000992 itemList=idleConf.GetSectionList('user','highlight')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000993 itemList.sort()
Steven M. Gava41a85322001-10-29 08:05:34 +0000994 self.optMenuThemeCustom.SetMenu(itemList,currentOption)
995 itemList=idleConf.GetSectionList('default','highlight')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +0000996 itemList.sort()
Steven M. Gava41a85322001-10-29 08:05:34 +0000997 self.optMenuThemeBuiltin.SetMenu(itemList,itemList[0])
Steven M. Gava7c017862001-10-29 11:19:46 +0000998 self.SetThemeType()
999 ##load theme element option menu
Steven M. Gava9dd16b32001-11-03 14:54:25 +00001000 themeNames=self.themeElements.keys()
Florent Xiclunaa7f242f2010-04-02 08:15:26 +00001001 themeNames.sort(key=lambda x: self.themeElements[x][1])
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001002 self.optMenuHighlightTarget.SetMenu(themeNames,themeNames[0])
Steven M. Gava9dd16b32001-11-03 14:54:25 +00001003 self.PaintThemeSample()
Steven M. Gava0cae01c2002-01-04 07:53:06 +00001004 self.SetHighlightTarget()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001005
Steven M. Gava9dd16b32001-11-03 14:54:25 +00001006 def LoadKeyCfg(self):
Steven M. Gava41a85322001-10-29 08:05:34 +00001007 ##current keys type radiobutton
Steven M. Gava052937f2002-02-11 02:20:53 +00001008 self.keysAreBuiltin.set(idleConf.GetOption('main','Keys','default',
Steven M. Gavac112cd82002-01-22 05:56:40 +00001009 type='bool',default=1))
Steven M. Gava41a85322001-10-29 08:05:34 +00001010 ##currently set keys
Steven M. Gavaad4f5322002-01-03 12:05:17 +00001011 currentOption=idleConf.CurrentKeys()
Steven M. Gava7c017862001-10-29 11:19:46 +00001012 ##load available keyset option menus
Steven M. Gava052937f2002-02-11 02:20:53 +00001013 if self.keysAreBuiltin.get(): #default theme selected
Steven M. Gava41a85322001-10-29 08:05:34 +00001014 itemList=idleConf.GetSectionList('default','keys')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +00001015 itemList.sort()
Steven M. Gava41a85322001-10-29 08:05:34 +00001016 self.optMenuKeysBuiltin.SetMenu(itemList,currentOption)
1017 itemList=idleConf.GetSectionList('user','keys')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +00001018 itemList.sort()
Steven M. Gava41a85322001-10-29 08:05:34 +00001019 if not itemList:
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001020 self.radioKeysCustom.config(state=DISABLED)
1021 self.customKeys.set('- no custom keys -')
Steven M. Gava41a85322001-10-29 08:05:34 +00001022 else:
1023 self.optMenuKeysCustom.SetMenu(itemList,itemList[0])
Steven M. Gavaa498af22002-02-01 01:33:36 +00001024 else: #user key set selected
Steven M. Gava41a85322001-10-29 08:05:34 +00001025 itemList=idleConf.GetSectionList('user','keys')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +00001026 itemList.sort()
Steven M. Gava41a85322001-10-29 08:05:34 +00001027 self.optMenuKeysCustom.SetMenu(itemList,currentOption)
1028 itemList=idleConf.GetSectionList('default','keys')
Steven M. Gavaf9bb90e2002-01-24 06:02:50 +00001029 itemList.sort()
Steven M. Gava41a85322001-10-29 08:05:34 +00001030 self.optMenuKeysBuiltin.SetMenu(itemList,itemList[0])
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001031 self.SetKeysType()
Steven M. Gavafacfc092002-01-19 00:29:54 +00001032 ##load keyset element list
Steven M. Gava052937f2002-02-11 02:20:53 +00001033 keySetName=idleConf.CurrentKeys()
1034 self.LoadKeysList(keySetName)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001035
Steven M. Gavafacfc092002-01-19 00:29:54 +00001036 def LoadGeneralCfg(self):
Steven M. Gava5f28e8f2002-01-21 06:38:21 +00001037 #startup state
1038 self.startupEdit.set(idleConf.GetOption('main','General',
1039 'editor-on-startup',default=1,type='bool'))
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +00001040 #autosave state
1041 self.autoSave.set(idleConf.GetOption('main', 'General', 'autosave',
1042 default=0, type='bool'))
Steven M. Gavafacfc092002-01-19 00:29:54 +00001043 #initial window size
Andrew Svetlovd8590ff2012-12-24 13:17:59 +02001044 self.winWidth.set(idleConf.GetOption('main','EditorWindow','width',
1045 type='int'))
1046 self.winHeight.set(idleConf.GetOption('main','EditorWindow','height',
1047 type='int'))
Raymond Hettinger4e49b832004-06-04 06:31:08 +00001048 #initial paragraph reformat size
Andrew Svetlovd8590ff2012-12-24 13:17:59 +02001049 self.paraWidth.set(idleConf.GetOption('main','FormatParagraph','paragraph',
1050 type='int'))
Kurt B. Kaisera053f332003-05-10 00:49:56 +00001051 # default source encoding
Kurt B. Kaiser6c638b62003-05-26 06:23:10 +00001052 self.encoding.set(idleConf.GetOption('main', 'EditorWindow',
1053 'encoding', default='none'))
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +00001054 # additional help sources
1055 self.userHelpList = idleConf.GetAllExtraHelpSourcesList()
Steven M. Gava085eb1b2002-02-05 04:52:32 +00001056 for helpItem in self.userHelpList:
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +00001057 self.listHelp.insert(END,helpItem[0])
Steven M. Gava085eb1b2002-02-05 04:52:32 +00001058 self.SetHelpListButtonStates()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001059
Steven M. Gava429a86a2001-10-23 10:42:12 +00001060 def LoadConfigs(self):
1061 """
1062 load configuration from default and user config files and populate
1063 the widgets on the config dialog pages.
1064 """
1065 ### fonts / tabs page
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001066 self.LoadFontCfg()
1067 self.LoadTabCfg()
Steven M. Gava429a86a2001-10-23 10:42:12 +00001068 ### highlighting page
Steven M. Gava9dd16b32001-11-03 14:54:25 +00001069 self.LoadThemeCfg()
Steven M. Gava429a86a2001-10-23 10:42:12 +00001070 ### keys page
Steven M. Gava9dd16b32001-11-03 14:54:25 +00001071 self.LoadKeyCfg()
Steven M. Gava429a86a2001-10-23 10:42:12 +00001072 ### general page
Steven M. Gavafacfc092002-01-19 00:29:54 +00001073 self.LoadGeneralCfg()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001074
Steven M. Gava052937f2002-02-11 02:20:53 +00001075 def SaveNewKeySet(self,keySetName,keySet):
1076 """
1077 save a newly created core key set.
1078 keySetName - string, the name of the new key set
1079 keySet - dictionary containing the new key set
1080 """
1081 if not idleConf.userCfg['keys'].has_section(keySetName):
1082 idleConf.userCfg['keys'].add_section(keySetName)
1083 for event in keySet.keys():
1084 value=keySet[event]
1085 idleConf.userCfg['keys'].SetOption(keySetName,event,value)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001086
Steven M. Gava052937f2002-02-11 02:20:53 +00001087 def SaveNewTheme(self,themeName,theme):
1088 """
1089 save a newly created theme.
1090 themeName - string, the name of the new theme
1091 theme - dictionary containing the new theme
1092 """
1093 if not idleConf.userCfg['highlight'].has_section(themeName):
1094 idleConf.userCfg['highlight'].add_section(themeName)
1095 for element in theme.keys():
1096 value=theme[element]
1097 idleConf.userCfg['highlight'].SetOption(themeName,element,value)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001098
Steven M. Gava2d7bb3f2002-01-29 08:35:29 +00001099 def SetUserValue(self,configType,section,item,value):
Steven M. Gava2d7bb3f2002-01-29 08:35:29 +00001100 if idleConf.defaultCfg[configType].has_option(section,item):
1101 if idleConf.defaultCfg[configType].Get(section,item)==value:
1102 #the setting equals a default setting, remove it from user cfg
1103 return idleConf.userCfg[configType].RemoveOption(section,item)
1104 #if we got here set the option
1105 return idleConf.userCfg[configType].SetOption(section,item,value)
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001106
Steven M. Gava052937f2002-02-11 02:20:53 +00001107 def SaveAllChangedConfigs(self):
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +00001108 "Save configuration changes to the user config file."
Steven M. Gava0c5bc8c2002-03-27 02:25:44 +00001109 idleConf.userCfg['main'].Save()
Steven M. Gava5f28e8f2002-01-21 06:38:21 +00001110 for configType in self.changedItems.keys():
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +00001111 cfgTypeHasChanges = False
Steven M. Gava5f28e8f2002-01-21 06:38:21 +00001112 for section in self.changedItems[configType].keys():
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +00001113 if section == 'HelpFiles':
1114 #this section gets completely replaced
1115 idleConf.userCfg['main'].remove_section('HelpFiles')
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +00001116 cfgTypeHasChanges = True
Steven M. Gava5f28e8f2002-01-21 06:38:21 +00001117 for item in self.changedItems[configType][section].keys():
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +00001118 value = self.changedItems[configType][section][item]
Steven M. Gava2d7bb3f2002-01-29 08:35:29 +00001119 if self.SetUserValue(configType,section,item,value):
Kurt B. Kaisere7a161e2003-01-10 20:13:57 +00001120 cfgTypeHasChanges = True
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001121 if cfgTypeHasChanges:
1122 idleConf.userCfg[configType].Save()
Kurt B. Kaiser5acdf932004-11-16 21:28:36 +00001123 for configType in ['keys', 'highlight']:
1124 # save these even if unchanged!
1125 idleConf.userCfg[configType].Save()
Steven M. Gavaa498af22002-02-01 01:33:36 +00001126 self.ResetChangedItems() #clear the changed items dict
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001127
Kurt B. Kaiserb1754452005-11-18 22:05:48 +00001128 def DeactivateCurrentConfig(self):
1129 #Before a config is saved, some cleanup of current
1130 #config must be done - remove the previous keybindings
1131 winInstances=self.parent.instance_dict.keys()
1132 for instance in winInstances:
1133 instance.RemoveKeybindings()
1134
Steven M. Gava49745752002-02-18 01:43:11 +00001135 def ActivateConfigChanges(self):
Kurt B. Kaiseracdef852005-01-31 03:34:26 +00001136 "Dynamically apply configuration changes"
Kurt B. Kaisercf6f1b62004-04-11 03:16:07 +00001137 winInstances=self.parent.instance_dict.keys()
Steven M. Gavab77d3432002-03-02 07:16:21 +00001138 for instance in winInstances:
1139 instance.ResetColorizer()
Steven M. Gavab1585412002-03-12 00:21:56 +00001140 instance.ResetFont()
Kurt B. Kaiseracdef852005-01-31 03:34:26 +00001141 instance.set_notabs_indentwidth()
Kurt B. Kaiserb1754452005-11-18 22:05:48 +00001142 instance.ApplyKeybindings()
Kurt B. Kaiser8e92bf72003-01-14 22:03:31 +00001143 instance.reset_help_menu_entries()
Kurt B. Kaiser6655e4b2002-12-31 16:03:23 +00001144
Steven M. Gava5f28e8f2002-01-21 06:38:21 +00001145 def Cancel(self):
1146 self.destroy()
1147
1148 def Ok(self):
1149 self.Apply()
1150 self.destroy()
1151
1152 def Apply(self):
Kurt B. Kaiserb1754452005-11-18 22:05:48 +00001153 self.DeactivateCurrentConfig()
Steven M. Gava052937f2002-02-11 02:20:53 +00001154 self.SaveAllChangedConfigs()
Steven M. Gava49745752002-02-18 01:43:11 +00001155 self.ActivateConfigChanges()
Steven M. Gava5f28e8f2002-01-21 06:38:21 +00001156
1157 def Help(self):
Steven M. Gavac11ccf32001-09-24 09:43:17 +00001158 pass
1159
Steven M. Gava44d3d1a2001-07-31 06:59:02 +00001160if __name__ == '__main__':
Terry Jan Reedyaf0dce92014-07-14 23:07:21 -04001161 import unittest
1162 unittest.main('idlelib.idle_test.test_configdialog',
1163 verbosity=2, exit=False)
1164
Terry Jan Reedy76916e82014-05-29 01:46:16 -04001165 from idlelib.idle_test.htest import run
1166 run(ConfigDialog)