blob: 1f659e15805b06ae509c4e989f5cd61732018303 [file] [log] [blame]
Steven M. Gava44d3d1a2001-07-31 06:59:02 +00001##---------------------------------------------------------------------------##
2##
3## idle - configuration dialog
4## elguavas
5##
6##---------------------------------------------------------------------------##
7"""
8configuration dialog
9"""
10from Tkinter import *
Steven M. Gavac01e30f2001-08-11 15:48:13 +000011import tkMessageBox, tkColorChooser, tkFont
Steven M. Gava44d3d1a2001-07-31 06:59:02 +000012
Steven M. Gavac11ccf32001-09-24 09:43:17 +000013from configHandler import idleConf
Steven M. Gava485f7b62001-10-26 06:47:09 +000014from dynOptionMenuWidget import DynOptionMenu
Steven M. Gava60fc7072001-08-04 13:58:22 +000015
Steven M. Gava44d3d1a2001-07-31 06:59:02 +000016class ConfigDialog(Toplevel):
Steven M. Gava44d3d1a2001-07-31 06:59:02 +000017 """
Steven M. Gavad721c482001-07-31 10:46:53 +000018 configuration dialog for idle
19 """
20 def __init__(self,parent,title,configDict):
21 """
22 configDict - dictionary of configuration items
23 """
24 Toplevel.__init__(self, parent)
25 self.configure(borderwidth=5)
26 self.geometry("+%d+%d" % (parent.winfo_rootx()+20,
27 parent.winfo_rooty()+30))
Steven M. Gavac11ccf32001-09-24 09:43:17 +000028 #self.LoadConfig()
Steven M. Gava44d3d1a2001-07-31 06:59:02 +000029
Steven M. Gavad721c482001-07-31 10:46:53 +000030 self.CreateWidgets()
31 self.resizable(height=FALSE,width=FALSE)
Steven M. Gava44d3d1a2001-07-31 06:59:02 +000032 self.ChangePage()
Steven M. Gavad721c482001-07-31 10:46:53 +000033 self.transient(parent)
34 self.grab_set()
35 self.protocol("WM_DELETE_WINDOW", self.Cancel)
36 self.parent = parent
37 self.framePages.focus_set()
38 #key bindings for this dialog
Steven M. Gavad721c482001-07-31 10:46:53 +000039 self.bind('<Escape>',self.CancelBinding) #dismiss dialog, no save
Steven M. Gavac01e30f2001-08-11 15:48:13 +000040 self.bind('<Alt-a>',self.ApplyBinding) #apply changes, save
Steven M. Gava952d0a52001-08-03 04:43:44 +000041 self.bind('<F1>',self.HelpBinding) #context help
Steven M. Gavad721c482001-07-31 10:46:53 +000042 self.bind('<Alt-f>',self.ChangePageBinding)
Steven M. Gava952d0a52001-08-03 04:43:44 +000043 self.bind('<Alt-h>',self.ChangePageBinding)
Steven M. Gavad721c482001-07-31 10:46:53 +000044 self.bind('<Alt-k>',self.ChangePageBinding)
45 self.bind('<Alt-g>',self.ChangePageBinding)
Steven M. Gavac11ccf32001-09-24 09:43:17 +000046 #self.LoadOptMenuHighlightTarget()
Steven M. Gava429a86a2001-10-23 10:42:12 +000047
48 self.LoadConfigs()
49
Steven M. Gavad721c482001-07-31 10:46:53 +000050 self.wait_window()
51
52 def Cancel(self):
53 self.destroy()
54
Steven M. Gavac01e30f2001-08-11 15:48:13 +000055 def Ok(self):
56 pass
57
58 def Apply(self):
Steven M. Gavad721c482001-07-31 10:46:53 +000059 pass
60
Steven M. Gava952d0a52001-08-03 04:43:44 +000061 def Help(self):
Steven M. Gavad721c482001-07-31 10:46:53 +000062 pass
63
Steven M. Gavad721c482001-07-31 10:46:53 +000064 def CancelBinding(self,event):
65 self.Cancel()
Steven M. Gava44d3d1a2001-07-31 06:59:02 +000066
Steven M. Gavac01e30f2001-08-11 15:48:13 +000067 def OkBinding(self,event):
68 self.Ok()
69
70 def ApplyBinding(self,event):
71 self.Apply()
Steven M. Gava44d3d1a2001-07-31 06:59:02 +000072
Steven M. Gava952d0a52001-08-03 04:43:44 +000073 def HelpBinding(self,event):
74 self.Help()
Steven M. Gava44d3d1a2001-07-31 06:59:02 +000075
Steven M. Gava952d0a52001-08-03 04:43:44 +000076 def ChangePage(self):
Steven M. Gava33277c72001-08-13 04:36:58 +000077 #pop up the active 'tab' only
78 for button in self.pageButtons: button.master.config(relief=RIDGE)
79 self.pageButtons[self.pageNum.get()].master.config(relief=RAISED)
80 #switch page
Steven M. Gava952d0a52001-08-03 04:43:44 +000081 self.pages[self.pageNum.get()].lift()
Steven M. Gava230e5782001-08-07 03:28:25 +000082 self.title('Settings - '+
83 self.pageButtons[self.pageNum.get()].cget('text'))
Steven M. Gava952d0a52001-08-03 04:43:44 +000084
Steven M. Gavad721c482001-07-31 10:46:53 +000085 def ChangePageBinding(self,event):
Steven M. Gava952d0a52001-08-03 04:43:44 +000086 pageKeys=('f','h','k','g')
Steven M. Gavad721c482001-07-31 10:46:53 +000087 pos=0
88 for key in pageKeys:
89 if event.char == key:
90 self.pageNum.set(pos)
91 self.ChangePage()
92 return
93 pos=pos+1
94
Steven M. Gava952d0a52001-08-03 04:43:44 +000095 def SetThemeType(self):
96 if self.themeType.get()==0:
97 self.optMenuThemeBuiltin.config(state=NORMAL)
98 self.optMenuThemeCustom.config(state=DISABLED)
Steven M. Gava60fc7072001-08-04 13:58:22 +000099 self.buttonDeleteCustomTheme.config(state=DISABLED)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000100 elif self.themeType.get()==1:
101 self.optMenuThemeBuiltin.config(state=DISABLED)
102 self.optMenuThemeCustom.config(state=NORMAL)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000103 self.buttonDeleteCustomTheme.config(state=NORMAL)
104
105 def SetKeysType(self):
106 if self.keysType.get()==0:
107 self.optMenuKeysBuiltin.config(state=NORMAL)
108 self.optMenuKeysCustom.config(state=DISABLED)
109 self.buttonDeleteCustomKeys.config(state=DISABLED)
110 elif self.keysType.get()==1:
111 self.optMenuKeysBuiltin.config(state=DISABLED)
112 self.optMenuKeysCustom.config(state=NORMAL)
113 self.buttonDeleteCustomKeys.config(state=NORMAL)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000114
Steven M. Gava7c017862001-10-29 11:19:46 +0000115 def SetFgBg(self):
116 if self.fgHilite.get()==0:
117 self.labelFontTypeTitle.config(state=DISABLED)
118 self.checkFontBold.config(state=DISABLED)
119 self.checkFontItalic.config(state=DISABLED)
120 elif self.fgHilite.get()==1:
121 self.labelFontTypeTitle.config(state=NORMAL)
122 self.checkFontBold.config(state=NORMAL)
123 self.checkFontItalic.config(state=NORMAL)
124
Steven M. Gava074c9d22001-08-08 01:30:38 +0000125 def GetColour(self):
126 rgbTuplet, colourString = tkColorChooser.askcolor(parent=self,
127 title='Pick new colour for : '+self.highlightTarget.get(),
128 initialcolor=self.workingTestColours['Foo-Bg'])#._root()
129 if colourString: #user didn't cancel
130 self.workingTestColours['Foo-Bg']=colourString
131 self.frameColourSet.config(bg=self.workingTestColours['Foo-Bg'])
132 self.labelTestSample.config(bg=self.workingTestColours['Foo-Bg'])
133 self.frameHighlightSample.config(bg=self.workingTestColours['Foo-Bg'])
134 self.frameColourSet.update() #redraw after dialog
135 self.frameHighlightSample.update() #redraw after dialog
136 self.labelTestSample.update()
137
Steven M. Gava429a86a2001-10-23 10:42:12 +0000138 def SetFontSampleBinding(self,event):
139 self.SetFontSample()
140
141 def SetFontSample(self):
142 self.editFont.config(size=self.fontSize.get(),weight=NORMAL,
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000143 family=self.listFontName.get(self.listFontName.curselection()[0]))
Steven M. Gava41a85322001-10-29 08:05:34 +0000144
Steven M. Gava7c017862001-10-29 11:19:46 +0000145 def SetHighlightTargetBinding(self,event):
146 self.SetHighlightTarget()
Steven M. Gava41a85322001-10-29 08:05:34 +0000147
Steven M. Gava7c017862001-10-29 11:19:46 +0000148 def SetHighlightTarget(self):
149 if self.highlightTarget.get() in ('Cursor','Error Background'):
150 #only bg colour selection is possible
151 self.radioFg.config(state=DISABLED)
152 self.radioBg.config(state=DISABLED)
153 self.fgHilite.set(0)
154 self.SetFgBg()
155 elif self.highlightTarget.get() in ('Shell Foreground',
156 'Shell Stdout Foreground','Shell Stderr Foreground'):
157 #fg and font style selection possible
158 self.radioFg.config(state=DISABLED)
159 self.radioBg.config(state=DISABLED)
160 self.fgHilite.set(1)
161 self.SetFgBg()
162 else: #full fg/bg and font style selection possible
163 self.radioFg.config(state=NORMAL)
164 self.radioBg.config(state=NORMAL)
165 self.fgHilite.set(1) #default to setting foreground properties
166 self.SetFgBg()
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000167
Steven M. Gavad721c482001-07-31 10:46:53 +0000168 def CreateWidgets(self):
Steven M. Gava952d0a52001-08-03 04:43:44 +0000169 self.framePages = Frame(self)
Steven M. Gavad721c482001-07-31 10:46:53 +0000170 frameActionButtons = Frame(self)
Steven M. Gava33277c72001-08-13 04:36:58 +0000171 framePageButtons = Frame(self.framePages)
Steven M. Gavad721c482001-07-31 10:46:53 +0000172 #action buttons
Steven M. Gava952d0a52001-08-03 04:43:44 +0000173 self.buttonHelp = Button(frameActionButtons,text='Help',
174 command=self.Help,takefocus=FALSE)
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000175 self.buttonOk = Button(frameActionButtons,text='Ok',
176 command=self.Ok,takefocus=FALSE)
177 self.buttonApply = Button(frameActionButtons,text='Apply',
178 command=self.Apply,underline=0,takefocus=FALSE)
Steven M. Gavad721c482001-07-31 10:46:53 +0000179 self.buttonCancel = Button(frameActionButtons,text='Cancel',
180 command=self.Cancel,takefocus=FALSE)
181 #page buttons
182 self.pageNum=IntVar()
183 self.pageNum.set(0)
Steven M. Gava33277c72001-08-13 04:36:58 +0000184 pageButtonNames=('Fonts/Tabs','Highlighting','Keys','General')
185 self.pageButtons=[]
186 buttonValue=0
Steven M. Gavac11ccf32001-09-24 09:43:17 +0000187 buttonSelColour=framePageButtons.cget('bg')
Steven M. Gava33277c72001-08-13 04:36:58 +0000188 for name in pageButtonNames:
189 buttonFrame=Frame(framePageButtons,borderwidth=2,relief=RIDGE)
190 buttonFrame.pack(side=LEFT)
191 button = Radiobutton(buttonFrame,command=self.ChangePage,
192 value=buttonValue,padx=5,pady=5,takefocus=FALSE,underline=0,
193 indicatoron=FALSE,highlightthickness=0,variable=self.pageNum,
Steven M. Gavac11ccf32001-09-24 09:43:17 +0000194 selectcolor=buttonSelColour,borderwidth=0,text=name)
Steven M. Gava33277c72001-08-13 04:36:58 +0000195 button.pack()
196 button.lift()
197 self.pageButtons.append(button)
198 buttonValue=buttonValue+1
Steven M. Gavad721c482001-07-31 10:46:53 +0000199 #pages
Steven M. Gava60fc7072001-08-04 13:58:22 +0000200 self.pages=(self.CreatePageFontTab(),
Steven M. Gava952d0a52001-08-03 04:43:44 +0000201 self.CreatePageHighlight(),
202 self.CreatePageKeys(),
203 self.CreatePageGeneral())
204
Steven M. Gavad721c482001-07-31 10:46:53 +0000205 #grid in framePages so we can overlap pages
Steven M. Gava33277c72001-08-13 04:36:58 +0000206 framePageButtons.grid(row=0,column=0,sticky=NSEW)
Steven M. Gavad721c482001-07-31 10:46:53 +0000207 for page in self.pages: page.grid(row=1,column=0,sticky=(N,S,E,W))
208
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000209 self.buttonHelp.pack(side=RIGHT,padx=5,pady=5)
210 self.buttonOk.pack(side=LEFT,padx=5,pady=5)
211 self.buttonApply.pack(side=LEFT,padx=5,pady=5)
Steven M. Gavad721c482001-07-31 10:46:53 +0000212 self.buttonCancel.pack(side=LEFT,padx=5,pady=5)
213 frameActionButtons.pack(side=BOTTOM)
214 self.framePages.pack(side=TOP,expand=TRUE,fill=BOTH)
215
Steven M. Gava60fc7072001-08-04 13:58:22 +0000216 def CreatePageFontTab(self):
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000217 #tkVars
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000218 self.fontSize=StringVar()
219 self.spaceNum=IntVar()
220 self.tabCols=IntVar()
221 self.indentType=IntVar()
Steven M. Gava429a86a2001-10-23 10:42:12 +0000222 self.editFont=tkFont.Font(self,('courier',12,'normal'))
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000223 ##widget creation
224 #body frame
Steven M. Gava33277c72001-08-13 04:36:58 +0000225 frame=Frame(self.framePages,borderwidth=2,relief=RAISED)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000226 #body section frames
227 frameFont=Frame(frame,borderwidth=2,relief=GROOVE)
228 frameIndent=Frame(frame,borderwidth=2,relief=GROOVE)
229 #frameFont
230 labelFontTitle=Label(frameFont,text='Set Base Editor Font')
231 frameFontName=Frame(frameFont)
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000232 frameFontSize=Frame(frameFontName)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000233 labelFontNameTitle=Label(frameFontName,justify=LEFT,
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000234 text='Font :')
235 self.listFontName=Listbox(frameFontName,height=5,takefocus=FALSE,
236 exportselection=FALSE)
Steven M. Gava429a86a2001-10-23 10:42:12 +0000237 self.listFontName.bind('<<ListboxSelect>>',self.SetFontSampleBinding)
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000238 scrollFont=Scrollbar(frameFontName)
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000239 scrollFont.config(command=self.listFontName.yview)
240 self.listFontName.config(yscrollcommand=scrollFont.set)
241 labelFontSizeTitle=Label(frameFontSize,text='Size :')
Steven M. Gava485f7b62001-10-26 06:47:09 +0000242 self.optMenuFontSize=DynOptionMenu(frameFontSize,self.fontSize,None,
243 command=self.SetFontSampleBinding)
Steven M. Gavac11ccf32001-09-24 09:43:17 +0000244 frameFontSample=Frame(frameFont,relief=SOLID,borderwidth=1)
245 self.labelFontSample=Label(frameFontSample,
246 text='AaBbCcDdEe\nFfGgHhIiJjK\n1234567890\n#:+=(){}[]',
Steven M. Gava429a86a2001-10-23 10:42:12 +0000247 justify=LEFT,font=self.editFont)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000248 #frameIndent
249 labelIndentTitle=Label(frameIndent,text='Set Indentation Defaults')
250 frameIndentType=Frame(frameIndent)
251 frameIndentSize=Frame(frameIndent)
252 labelIndentTypeTitle=Label(frameIndentType,
253 text='Choose indentation type :')
254 radioUseSpaces=Radiobutton(frameIndentType,variable=self.indentType,
Steven M. Gava429a86a2001-10-23 10:42:12 +0000255 value=1,text='Tab key inserts spaces')
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000256 radioUseTabs=Radiobutton(frameIndentType,variable=self.indentType,
Steven M. Gava429a86a2001-10-23 10:42:12 +0000257 value=0,text='Tab key inserts tabs')
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000258 labelIndentSizeTitle=Label(frameIndentSize,
259 text='Choose indentation size :')
260 labelSpaceNumTitle=Label(frameIndentSize,justify=LEFT,
261 text='when tab key inserts spaces,\nspaces per tab')
262 self.scaleSpaceNum=Scale(frameIndentSize,variable=self.spaceNum,
263 orient='horizontal',tickinterval=2,from_=2,to=8)
264 labeltabColsTitle=Label(frameIndentSize,justify=LEFT,
265 text='when tab key inserts tabs,\ncolumns per tab')
266 self.scaleTabCols=Scale(frameIndentSize,variable=self.tabCols,
267 orient='horizontal',tickinterval=2,from_=2,to=8)
268
269 #widget packing
270 #body
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000271 frameFont.pack(side=LEFT,padx=5,pady=10,expand=TRUE,fill=BOTH)
272 frameIndent.pack(side=LEFT,padx=5,pady=10,fill=Y)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000273 #frameFont
274 labelFontTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000275 frameFontName.pack(side=TOP,padx=5,pady=5)
276 frameFontSize.pack(side=RIGHT,anchor=N,fill=X)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000277 labelFontNameTitle.pack(side=TOP,anchor=W)
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000278 self.listFontName.pack(side=LEFT,fill=Y)
279 scrollFont.pack(side=LEFT,fill=Y)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000280 labelFontSizeTitle.pack(side=TOP,anchor=W)
Steven M. Gava485f7b62001-10-26 06:47:09 +0000281 self.optMenuFontSize.pack(side=TOP,anchor=W,fill=X)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000282 frameFontSample.pack(side=TOP,padx=5,pady=5,expand=TRUE,fill=BOTH)
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000283 self.labelFontSample.pack(expand=TRUE,fill=BOTH)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000284 #frameIndent
285 labelIndentTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
286 frameIndentType.pack(side=TOP,padx=5,fill=X)
287 frameIndentSize.pack(side=TOP,padx=5,pady=5,fill=BOTH)
288 labelIndentTypeTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
289 radioUseSpaces.pack(side=TOP,anchor=W,padx=5)
290 radioUseTabs.pack(side=TOP,anchor=W,padx=5)
291 labelIndentSizeTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
292 labelSpaceNumTitle.pack(side=TOP,anchor=W,padx=5)
293 self.scaleSpaceNum.pack(side=TOP,padx=5,fill=X)
294 labeltabColsTitle.pack(side=TOP,anchor=W,padx=5)
295 self.scaleTabCols.pack(side=TOP,padx=5,fill=X)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000296 return frame
297
298 def CreatePageHighlight(self):
299 #tkVars
Steven M. Gava60fc7072001-08-04 13:58:22 +0000300 self.highlightTarget=StringVar()
Steven M. Gava952d0a52001-08-03 04:43:44 +0000301 self.builtinTheme=StringVar()
302 self.customTheme=StringVar()
Steven M. Gava7c017862001-10-29 11:19:46 +0000303 self.fgHilite=IntVar()
Steven M. Gava952d0a52001-08-03 04:43:44 +0000304 self.colour=StringVar()
305 self.fontName=StringVar()
306 self.fontBold=StringVar()
307 self.fontItalic=StringVar()
Steven M. Gava952d0a52001-08-03 04:43:44 +0000308 self.themeType=IntVar()
309 ##widget creation
310 #body frame
Steven M. Gava33277c72001-08-13 04:36:58 +0000311 frame=Frame(self.framePages,borderwidth=2,relief=RAISED)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000312 #body section frames
313 frameCustom=Frame(frame,borderwidth=2,relief=GROOVE)
314 frameTheme=Frame(frame,borderwidth=2,relief=GROOVE)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000315 #frameCustom
Steven M. Gavac11ccf32001-09-24 09:43:17 +0000316 self.frameHighlightTarget=Frame(frameCustom)
317 self.frameHighlightSample=Frame(frameCustom,relief=SOLID,
318 borderwidth=1,cursor='hand2')
Steven M. Gava952d0a52001-08-03 04:43:44 +0000319 frameSet=Frame(frameCustom)
Steven M. Gavac11ccf32001-09-24 09:43:17 +0000320 self.frameColourSet=Frame(frameSet,relief=SOLID,borderwidth=1)
Steven M. Gava7c017862001-10-29 11:19:46 +0000321 frameFgBg=Frame(frameCustom)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000322 frameFontSet=Frame(frameSet)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000323 labelCustomTitle=Label(frameCustom,text='Set Custom Highlighting')
Steven M. Gavac11ccf32001-09-24 09:43:17 +0000324 labelTargetTitle=Label(self.frameHighlightTarget,text='for : ')
Steven M. Gava41a85322001-10-29 08:05:34 +0000325 self.optMenuHighlightTarget=DynOptionMenu(self.frameHighlightTarget,
Steven M. Gava7c017862001-10-29 11:19:46 +0000326 self.highlightTarget,None,command=self.SetHighlightTargetBinding)
327 self.radioFg=Radiobutton(frameFgBg,variable=self.fgHilite,
328 value=1,command=self.SetFgBg,text='Foreground')
329 self.radioBg=Radiobutton(frameFgBg,variable=self.fgHilite,
330 value=0,command=self.SetFgBg,text='Background')
331 self.fgHilite.set(1)
332 buttonSetColour=Button(self.frameColourSet,text='Choose Colour',
Steven M. Gava074c9d22001-08-08 01:30:38 +0000333 command=self.GetColour)
Steven M. Gava7c017862001-10-29 11:19:46 +0000334 self.labelFontTypeTitle=Label(frameFontSet,text='Font Style :')
335 self.checkFontBold=Checkbutton(frameFontSet,variable=self.fontBold,
Steven M. Gava952d0a52001-08-03 04:43:44 +0000336 onvalue='Bold',offvalue='',text='Bold')
Steven M. Gava7c017862001-10-29 11:19:46 +0000337 self.checkFontItalic=Checkbutton(frameFontSet,variable=self.fontItalic,
Steven M. Gava952d0a52001-08-03 04:43:44 +0000338 onvalue='Italic',offvalue='',text='Italic')
Steven M. Gava074c9d22001-08-08 01:30:38 +0000339 self.labelTestSample=Label(self.frameHighlightSample,justify=LEFT,font=('courier',12,''),
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000340 text='#when finished, this\n#sample area will\n#be interactive\n'+
341 'def Ahem(foo,bar):\n '+
342 '"""'+'doc hazard'+'"""'+
Steven M. Gavac11ccf32001-09-24 09:43:17 +0000343 '\n test=foo\n text=bar\n return')
Steven M. Gava60fc7072001-08-04 13:58:22 +0000344 buttonSaveCustomTheme=Button(frameCustom,
Steven M. Gava952d0a52001-08-03 04:43:44 +0000345 text='Save as a Custom Theme')
Steven M. Gava952d0a52001-08-03 04:43:44 +0000346 #frameTheme
347 #frameDivider=Frame(frameTheme,relief=SUNKEN,borderwidth=1,
348 # width=2,height=10)
349 labelThemeTitle=Label(frameTheme,text='Select a Highlighting Theme')
350 labelTypeTitle=Label(frameTheme,text='Select : ')
Steven M. Gava41a85322001-10-29 08:05:34 +0000351 self.radioThemeBuiltin=Radiobutton(frameTheme,variable=self.themeType,
Steven M. Gava952d0a52001-08-03 04:43:44 +0000352 value=0,command=self.SetThemeType,text='a Built-in Theme')
Steven M. Gava41a85322001-10-29 08:05:34 +0000353 self.radioThemeCustom=Radiobutton(frameTheme,variable=self.themeType,
Steven M. Gava952d0a52001-08-03 04:43:44 +0000354 value=1,command=self.SetThemeType,text='a Custom Theme')
Steven M. Gava41a85322001-10-29 08:05:34 +0000355 self.optMenuThemeBuiltin=DynOptionMenu(frameTheme,
Steven M. Gava7c017862001-10-29 11:19:46 +0000356 self.builtinTheme,None,command=None)
Steven M. Gava41a85322001-10-29 08:05:34 +0000357 self.optMenuThemeCustom=DynOptionMenu(frameTheme,
Steven M. Gava7c017862001-10-29 11:19:46 +0000358 self.customTheme,None,command=None)
Steven M. Gava41a85322001-10-29 08:05:34 +0000359 # self.themeType.set(0)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000360 self.buttonDeleteCustomTheme=Button(frameTheme,text='Delete Custom Theme')
Steven M. Gava41a85322001-10-29 08:05:34 +0000361 # self.SetThemeType()
Steven M. Gava952d0a52001-08-03 04:43:44 +0000362 ##widget packing
363 #body
Steven M. Gava60fc7072001-08-04 13:58:22 +0000364 frameCustom.pack(side=LEFT,padx=5,pady=10,expand=TRUE,fill=BOTH)
365 frameTheme.pack(side=LEFT,padx=5,pady=10,fill=Y)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000366 #frameCustom
367 labelCustomTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
Steven M. Gavac11ccf32001-09-24 09:43:17 +0000368 self.frameHighlightTarget.pack(side=TOP,padx=5,pady=5,fill=X)
Steven M. Gava7c017862001-10-29 11:19:46 +0000369 frameFgBg.pack(side=TOP,padx=5,pady=0)
Steven M. Gava074c9d22001-08-08 01:30:38 +0000370 self.frameHighlightSample.pack(side=TOP,padx=5,pady=5,expand=TRUE,fill=BOTH)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000371 frameSet.pack(side=TOP,fill=X)
Steven M. Gava074c9d22001-08-08 01:30:38 +0000372 self.frameColourSet.pack(side=LEFT,padx=5,pady=5,fill=BOTH)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000373 frameFontSet.pack(side=RIGHT,padx=5,pady=5,anchor=W)
374 labelTargetTitle.pack(side=LEFT,anchor=E)
Steven M. Gavac11ccf32001-09-24 09:43:17 +0000375 self.optMenuHighlightTarget.pack(side=RIGHT,anchor=W,expand=TRUE,fill=X)
Steven M. Gava7c017862001-10-29 11:19:46 +0000376 self.radioFg.pack(side=LEFT,anchor=E)
377 self.radioBg.pack(side=RIGHT,anchor=W)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000378 buttonSetColour.pack(expand=TRUE,fill=BOTH,padx=10,pady=10)
Steven M. Gava7c017862001-10-29 11:19:46 +0000379 self.labelFontTypeTitle.pack(side=TOP,anchor=W)
380 self.checkFontBold.pack(side=LEFT,anchor=W,pady=2)
381 self.checkFontItalic.pack(side=RIGHT,anchor=W)
Steven M. Gava074c9d22001-08-08 01:30:38 +0000382 self.labelTestSample.pack(anchor=CENTER,expand=TRUE,fill=BOTH)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000383 buttonSaveCustomTheme.pack(side=BOTTOM,fill=X,padx=5,pady=5)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000384 #frameTheme
385 #frameDivider.pack(side=LEFT,fill=Y,padx=5,pady=5)
386 labelThemeTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
387 labelTypeTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
Steven M. Gava41a85322001-10-29 08:05:34 +0000388 self.radioThemeBuiltin.pack(side=TOP,anchor=W,padx=5)
389 self.radioThemeCustom.pack(side=TOP,anchor=W,padx=5,pady=2)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000390 self.optMenuThemeBuiltin.pack(side=TOP,fill=X,padx=5,pady=5)
391 self.optMenuThemeCustom.pack(side=TOP,fill=X,anchor=W,padx=5,pady=5)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000392 self.buttonDeleteCustomTheme.pack(side=TOP,fill=X,padx=5,pady=5)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000393 return frame
394
395 def CreatePageKeys(self):
Steven M. Gava60fc7072001-08-04 13:58:22 +0000396 #tkVars
397 self.bindingTarget=StringVar()
398 self.builtinKeys=StringVar()
399 self.customKeys=StringVar()
400 self.keyChars=StringVar()
401 self.keyCtrl=StringVar()
402 self.keyAlt=StringVar()
403 self.keyShift=StringVar()
404 self.keysType=IntVar()
405 ##widget creation
406 #body frame
Steven M. Gava33277c72001-08-13 04:36:58 +0000407 frame=Frame(self.framePages,borderwidth=2,relief=RAISED)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000408 #body section frames
409 frameCustom=Frame(frame,borderwidth=2,relief=GROOVE)
410 frameKeySets=Frame(frame,borderwidth=2,relief=GROOVE)
411 #frameCustom
412 frameTarget=Frame(frameCustom)
413 frameSet=Frame(frameCustom)
414 labelCustomTitle=Label(frameCustom,text='Set Custom Key Bindings')
415 labelTargetTitle=Label(frameTarget,text='Action')
416 scrollTarget=Scrollbar(frameTarget)
417 listTarget=Listbox(frameTarget)
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000418 scrollTarget.config(command=listTarget.yview)
419 listTarget.config(yscrollcommand=scrollTarget.set)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000420 labelKeyBindTitle=Label(frameSet,text='Binding')
421 labelModifierTitle=Label(frameSet,text='Modifier:')
422 checkCtrl=Checkbutton(frameSet,text='Ctrl')
423 checkAlt=Checkbutton(frameSet,text='Alt')
424 checkShift=Checkbutton(frameSet,text='Shift')
425 labelKeyEntryTitle=Label(frameSet,text='Key:')
426 entryKey=Entry(frameSet,width=4)
427 buttonSaveCustomKeys=Button(frameCustom,text='Save as a Custom Key Set')
428 #frameKeySets
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000429 labelKeysTitle=Label(frameKeySets,text='Select a Key Set')
Steven M. Gava60fc7072001-08-04 13:58:22 +0000430 labelTypeTitle=Label(frameKeySets,text='Select : ')
Steven M. Gava41a85322001-10-29 08:05:34 +0000431 self.radioKeysBuiltin=Radiobutton(frameKeySets,variable=self.keysType,
Steven M. Gava60fc7072001-08-04 13:58:22 +0000432 value=0,command=self.SetKeysType,text='a Built-in Key Set')
Steven M. Gava41a85322001-10-29 08:05:34 +0000433 self.radioKeysCustom=Radiobutton(frameKeySets,variable=self.keysType,
Steven M. Gava60fc7072001-08-04 13:58:22 +0000434 value=1,command=self.SetKeysType,text='a Custom Key Set')
Steven M. Gava41a85322001-10-29 08:05:34 +0000435 self.optMenuKeysBuiltin=DynOptionMenu(frameKeySets,
436 self.builtinKeys,None,command=None)
437 self.optMenuKeysCustom=DynOptionMenu(frameKeySets,
438 self.customKeys,None,command=None)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000439 self.buttonDeleteCustomKeys=Button(frameKeySets,text='Delete Custom Key Set')
Steven M. Gava41a85322001-10-29 08:05:34 +0000440# self.SetKeysType()
Steven M. Gava60fc7072001-08-04 13:58:22 +0000441 ##widget packing
442 #body
443 frameCustom.pack(side=LEFT,padx=5,pady=5,expand=TRUE,fill=BOTH)
444 frameKeySets.pack(side=LEFT,padx=5,pady=5,fill=Y)
445 #frameCustom
446 labelCustomTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
447 buttonSaveCustomKeys.pack(side=BOTTOM,fill=X,padx=5,pady=5)
448 frameTarget.pack(side=LEFT,padx=5,pady=5,fill=Y)
449 frameSet.pack(side=LEFT,padx=5,pady=5,fill=Y)
450 labelTargetTitle.pack(side=TOP,anchor=W)
451 scrollTarget.pack(side=RIGHT,anchor=W,fill=Y)
452 listTarget.pack(side=TOP,anchor=W,expand=TRUE,fill=BOTH)
453 labelKeyBindTitle.pack(side=TOP,anchor=W)
454 labelModifierTitle.pack(side=TOP,anchor=W,pady=5)
455 checkCtrl.pack(side=TOP,anchor=W)
456 checkAlt.pack(side=TOP,anchor=W,pady=2)
457 checkShift.pack(side=TOP,anchor=W)
458 labelKeyEntryTitle.pack(side=TOP,anchor=W,pady=5)
459 entryKey.pack(side=TOP,anchor=W)
460 #frameKeySets
461 labelKeysTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
462 labelTypeTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
Steven M. Gava41a85322001-10-29 08:05:34 +0000463 self.radioKeysBuiltin.pack(side=TOP,anchor=W,padx=5)
464 self.radioKeysCustom.pack(side=TOP,anchor=W,padx=5,pady=2)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000465 self.optMenuKeysBuiltin.pack(side=TOP,fill=X,padx=5,pady=5)
466 self.optMenuKeysCustom.pack(side=TOP,fill=X,anchor=W,padx=5,pady=5)
467 self.buttonDeleteCustomKeys.pack(side=TOP,fill=X,padx=5,pady=5)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000468 return frame
469
470 def CreatePageGeneral(self):
Steven M. Gava230e5782001-08-07 03:28:25 +0000471 #tkVars
472 self.runType=IntVar()
473 self.winWidth=StringVar()
474 self.winHeight=StringVar()
475 self.extState=IntVar()
476 #widget creation
477 #body
Steven M. Gava33277c72001-08-13 04:36:58 +0000478 frame=Frame(self.framePages,borderwidth=2,relief=RAISED)
Steven M. Gava230e5782001-08-07 03:28:25 +0000479 #body section frames
480 frameRun=Frame(frame,borderwidth=2,relief=GROOVE)
481 frameWinSize=Frame(frame,borderwidth=2,relief=GROOVE)
482 frameExt=Frame(frame,borderwidth=2,relief=GROOVE)
483 #frameRun
484 labelRunTitle=Label(frameRun,text='Run Preferences')
485 labelRunChoiceTitle=Label(frameRun,text='Run code : ')
486 radioRunInternal=Radiobutton(frameRun,variable=self.runType,
487 value=0,command=self.SetKeysType,text="in IDLE's Process")
488 radioRunSeparate=Radiobutton(frameRun,variable=self.runType,
489 value=1,command=self.SetKeysType,text='in a Separate Process')
490 #frameWinSize
491 labelWinSizeTitle=Label(frameWinSize,text='Initial Window Size')
492 buttonWinSizeSet=Button(frameWinSize,text='Set to current window size')
493 labelWinWidthTitle=Label(frameWinSize,text='Width')
494 entryWinWidth=Entry(frameWinSize,textvariable=self.winWidth,
495 width=3)
496 labelWinHeightTitle=Label(frameWinSize,text='Height')
497 entryWinHeight=Entry(frameWinSize,textvariable=self.winHeight,
498 width=3)
499 #frameExt
500 frameExtList=Frame(frameExt)
501 frameExtSet=Frame(frameExt)
502 labelExtTitle=Label(frameExt,text='Configure IDLE Extensions')
503 labelExtListTitle=Label(frameExtList,text='Extension')
504 scrollExtList=Scrollbar(frameExtList)
505 listExt=Listbox(frameExtList,height=5)
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000506 scrollExtList.config(command=listExt.yview)
507 listExt.config(yscrollcommand=scrollExtList.set)
Steven M. Gava230e5782001-08-07 03:28:25 +0000508 labelExtSetTitle=Label(frameExtSet,text='Settings')
509 radioEnableExt=Radiobutton(frameExtSet,variable=self.extState,
510 value=1,text="enable")
511 radioDisableExt=Radiobutton(frameExtSet,variable=self.extState,
512 value=0,text="disable")
513 self.extState.set(1)
514 buttonExtConfig=Button(frameExtSet,text='Configure')
515
516 #widget packing
517 #body
518 frameRun.pack(side=TOP,padx=5,pady=5,fill=X)
519 frameWinSize.pack(side=TOP,padx=5,pady=5,fill=X)
520 frameExt.pack(side=TOP,padx=5,pady=5,expand=TRUE,fill=BOTH)
521 #frameRun
522 labelRunTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
523 labelRunChoiceTitle.pack(side=LEFT,anchor=W,padx=5,pady=5)
524 radioRunInternal.pack(side=LEFT,anchor=W,padx=5,pady=5)
525 radioRunSeparate.pack(side=LEFT,anchor=W,padx=5,pady=5)
526 #frameWinSize
527 labelWinSizeTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
528 buttonWinSizeSet.pack(side=LEFT,anchor=W,padx=5,pady=5)
529 labelWinWidthTitle.pack(side=LEFT,anchor=W,padx=5,pady=5)
530 entryWinWidth.pack(side=LEFT,anchor=W,padx=5,pady=5)
531 labelWinHeightTitle.pack(side=LEFT,anchor=W,padx=5,pady=5)
532 entryWinHeight.pack(side=LEFT,anchor=W,padx=5,pady=5)
533 #frameExt
534 labelExtTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
535 frameExtSet.pack(side=RIGHT,padx=5,pady=5,fill=Y)
536 frameExtList.pack(side=RIGHT,padx=5,pady=5,expand=TRUE,fill=BOTH)
537 labelExtListTitle.pack(side=TOP,anchor=W)
538 scrollExtList.pack(side=RIGHT,anchor=W,fill=Y)
539 listExt.pack(side=LEFT,anchor=E,expand=TRUE,fill=BOTH)
540 labelExtSetTitle.pack(side=TOP,anchor=W)
541 radioEnableExt.pack(side=TOP,anchor=W)
542 radioDisableExt.pack(side=TOP,anchor=W)
543 buttonExtConfig.pack(side=TOP,anchor=W,pady=5)
544
Steven M. Gava952d0a52001-08-03 04:43:44 +0000545 return frame
546
Steven M. Gava429a86a2001-10-23 10:42:12 +0000547 def LoadFontCfg(self):
548 ##base editor font selection list
Steven M. Gavac11ccf32001-09-24 09:43:17 +0000549 fonts=list(tkFont.families(self))
550 fonts.sort()
551 for font in fonts:
552 self.listFontName.insert(END,font)
Steven M. Gava485f7b62001-10-26 06:47:09 +0000553 configuredFont=idleConf.GetOption('main','EditorWindow','font',
Steven M. Gava429a86a2001-10-23 10:42:12 +0000554 default='courier')
555 if configuredFont in fonts:
556 currentFontIndex=fonts.index(configuredFont)
557 self.listFontName.see(currentFontIndex)
558 self.listFontName.select_set(currentFontIndex)
559 ##font size dropdown
Steven M. Gava485f7b62001-10-26 06:47:09 +0000560 fontSize=idleConf.GetOption('main','EditorWindow','font-size',default='12')
561 self.optMenuFontSize.SetMenu(('10','11','12','13','14',
562 '16','18','20','22'),fontSize )
Steven M. Gava429a86a2001-10-23 10:42:12 +0000563 ##font sample
564 self.SetFontSample()
565
566 def LoadTabCfg(self):
567 ##indent type radibuttons
Steven M. Gava485f7b62001-10-26 06:47:09 +0000568 spaceIndent=idleConf.GetOption('main','Indent','use-spaces',
Steven M. Gava429a86a2001-10-23 10:42:12 +0000569 default=1,type='bool')
570 self.indentType.set(spaceIndent)
571 ##indent sizes
Steven M. Gava485f7b62001-10-26 06:47:09 +0000572 spaceNum=idleConf.GetOption('main','Indent','num-spaces',
Steven M. Gava429a86a2001-10-23 10:42:12 +0000573 default=4,type='int')
Steven M. Gava485f7b62001-10-26 06:47:09 +0000574 tabCols=idleConf.GetOption('main','Indent','tab-cols',
Steven M. Gava429a86a2001-10-23 10:42:12 +0000575 default=4,type='int')
576 self.spaceNum.set(spaceNum)
577 self.tabCols.set(tabCols)
Steven M. Gavac11ccf32001-09-24 09:43:17 +0000578
Steven M. Gava485f7b62001-10-26 06:47:09 +0000579 def LoadThemeLists(self):
Steven M. Gava41a85322001-10-29 08:05:34 +0000580 ##current theme type radiobutton
581 self.themeType.set(idleConf.GetOption('main','Theme','user',type='int'))
582 ##currently set theme
583 currentOption=idleConf.GetOption('main','Theme','name')
Steven M. Gava7c017862001-10-29 11:19:46 +0000584 ##load available theme option menus
Steven M. Gava41a85322001-10-29 08:05:34 +0000585 if self.themeType.get() == 0: #default theme selected
586 itemList=idleConf.GetSectionList('default','highlight')
587 self.optMenuThemeBuiltin.SetMenu(itemList,currentOption)
588 itemList=idleConf.GetSectionList('user','highlight')
589 if not itemList:
590 self.radioThemeCustom.config(state=DISABLED)
591 self.customTheme.set('- no custom themes -')
592 else:
593 self.optMenuThemeCustom.SetMenu(itemList,itemList[0])
594 elif self.themeType.get() == 1: #user theme selected
595 itemList=idleConf.GetSectionList('user','highlight')
596 self.optMenuThemeCustom.SetMenu(itemList,currentOption)
597 itemList=idleConf.GetSectionList('default','highlight')
598 self.optMenuThemeBuiltin.SetMenu(itemList,itemList[0])
Steven M. Gava7c017862001-10-29 11:19:46 +0000599 self.SetThemeType()
600 ##load theme element option menu
601 elements=('Normal Text','Python Keywords','Python Definitions',
602 'Python Comments','Python Strings','Selected Text',
603 'Search Hits','Cursor','Error Background','Shell Foreground',
604 'Shell Stdout Foreground','Shell Stderr Foreground')
605 self.optMenuHighlightTarget.SetMenu(elements,elements[0])
Steven M. Gava41a85322001-10-29 08:05:34 +0000606
607 def LoadKeyLists(self):
608 ##current keys type radiobutton
609 self.keysType.set(idleConf.GetOption('main','Keys','user',type='int'))
610 ##currently set keys
611 currentOption=idleConf.GetOption('main','Keys','name')
Steven M. Gava7c017862001-10-29 11:19:46 +0000612 ##load available keyset option menus
Steven M. Gava41a85322001-10-29 08:05:34 +0000613 if self.keysType.get() == 0: #default theme selected
614 itemList=idleConf.GetSectionList('default','keys')
615 self.optMenuKeysBuiltin.SetMenu(itemList,currentOption)
616 itemList=idleConf.GetSectionList('user','keys')
617 if not itemList:
618 self.radioKeysCustom.config(state=DISABLED)
619 self.customKeys.set('- no custom keys -')
620 else:
621 self.optMenuKeysCustom.SetMenu(itemList,itemList[0])
622 elif self.keysType.get() == 1: #user theme selected
623 itemList=idleConf.GetSectionList('user','keys')
624 self.optMenuKeysCustom.SetMenu(itemList,currentOption)
625 itemList=idleConf.GetSectionList('default','keys')
626 self.optMenuKeysBuiltin.SetMenu(itemList,itemList[0])
627 self.SetKeysType()
Steven M. Gava7c017862001-10-29 11:19:46 +0000628 ##load keyset element option menu
Steven M. Gava41a85322001-10-29 08:05:34 +0000629
Steven M. Gava429a86a2001-10-23 10:42:12 +0000630 def LoadConfigs(self):
631 """
632 load configuration from default and user config files and populate
633 the widgets on the config dialog pages.
634 """
635 ### fonts / tabs page
636 self.LoadFontCfg()
637 self.LoadTabCfg()
638 ### highlighting page
Steven M. Gava485f7b62001-10-26 06:47:09 +0000639 self.LoadThemeLists()
Steven M. Gava429a86a2001-10-23 10:42:12 +0000640 ### keys page
Steven M. Gava41a85322001-10-29 08:05:34 +0000641 self.LoadKeyLists()
Steven M. Gava429a86a2001-10-23 10:42:12 +0000642 ### help page
643 ### general page
644
Steven M. Gavac11ccf32001-09-24 09:43:17 +0000645 def SaveConfigs(self):
Steven M. Gava429a86a2001-10-23 10:42:12 +0000646 """
647 save configuration changes to user config files.
648 """
Steven M. Gavac11ccf32001-09-24 09:43:17 +0000649 pass
650
Steven M. Gava44d3d1a2001-07-31 06:59:02 +0000651if __name__ == '__main__':
Steven M. Gavad721c482001-07-31 10:46:53 +0000652 #test the dialog
653 root=Tk()
654 Button(root,text='Dialog',
655 command=lambda:ConfigDialog(root,'Settings',None)).pack()
656 root.mainloop()