blob: bfff813e3aafa67418916c43eebd39d3319ac6ef [file] [log] [blame]
Steven M. Gava44d3d1a2001-07-31 06:59:02 +00001"""
2configuration dialog
3"""
4from Tkinter import *
Steven M. Gavac01e30f2001-08-11 15:48:13 +00005import tkMessageBox, tkColorChooser, tkFont
Steven M. Gava44d3d1a2001-07-31 06:59:02 +00006
Steven M. Gavac11ccf32001-09-24 09:43:17 +00007from configHandler import idleConf
Steven M. Gava485f7b62001-10-26 06:47:09 +00008from dynOptionMenuWidget import DynOptionMenu
Steven M. Gava2d4e03b2001-12-05 07:54:07 +00009from tabpage import TabPageSet
Steven M. Gava60fc7072001-08-04 13:58:22 +000010
Steven M. Gava44d3d1a2001-07-31 06:59:02 +000011class ConfigDialog(Toplevel):
Steven M. Gava44d3d1a2001-07-31 06:59:02 +000012 """
Steven M. Gavad721c482001-07-31 10:46:53 +000013 configuration dialog for idle
14 """
Steven M. Gava3b55a892001-11-21 05:56:26 +000015 def __init__(self,parent,title):
Steven M. Gavad721c482001-07-31 10:46:53 +000016 Toplevel.__init__(self, parent)
17 self.configure(borderwidth=5)
18 self.geometry("+%d+%d" % (parent.winfo_rootx()+20,
19 parent.winfo_rooty()+30))
Steven M. Gava9dd16b32001-11-03 14:54:25 +000020 #Theme Elements. Each theme element key is it's display name.
21 #The first value of the tuple is the sample area tag name.
22 #The second value is the display name list sort index.
23 #The third value indicates whether the element can have a foreground
24 #or background colour or both.
Steven M. Gavaad4f5322002-01-03 12:05:17 +000025 self.themeElements={'Normal Text':('normal','00'),
26 'Python Keywords':('keyword','01'),
27 'Python Definitions':('definition','02'),
28 'Python Comments':('comment','03'),
29 'Python Strings':('string','04'),
30 'Selected Text':('hilite','05'),
31 'Found Text':('hit','06'),
32 'Cursor':('cursor','07'),
33 'Error Text':('error','08'),
34 'Shell Normal Text':('console','09'),
35 'Shell Stdout Text':('stdout','10'),
36 'Shell Stderr Text':('stderr','11')}
Steven M. Gavad721c482001-07-31 10:46:53 +000037 self.CreateWidgets()
38 self.resizable(height=FALSE,width=FALSE)
Steven M. Gavad721c482001-07-31 10:46:53 +000039 self.transient(parent)
40 self.grab_set()
41 self.protocol("WM_DELETE_WINDOW", self.Cancel)
42 self.parent = parent
Steven M. Gava2d4e03b2001-12-05 07:54:07 +000043 self.tabPages.focus_set()
Steven M. Gavad721c482001-07-31 10:46:53 +000044 #key bindings for this dialog
Steven M. Gavad721c482001-07-31 10:46:53 +000045 self.bind('<Escape>',self.CancelBinding) #dismiss dialog, no save
Steven M. Gavac01e30f2001-08-11 15:48:13 +000046 self.bind('<Alt-a>',self.ApplyBinding) #apply changes, save
Steven M. Gava952d0a52001-08-03 04:43:44 +000047 self.bind('<F1>',self.HelpBinding) #context help
Steven M. Gava429a86a2001-10-23 10:42:12 +000048 self.LoadConfigs()
Steven M. Gavad721c482001-07-31 10:46:53 +000049 self.wait_window()
50
51 def Cancel(self):
52 self.destroy()
53
Steven M. Gavac01e30f2001-08-11 15:48:13 +000054 def Ok(self):
55 pass
56
57 def Apply(self):
Steven M. Gavad721c482001-07-31 10:46:53 +000058 pass
59
Steven M. Gava952d0a52001-08-03 04:43:44 +000060 def Help(self):
Steven M. Gavad721c482001-07-31 10:46:53 +000061 pass
62
Steven M. Gavad721c482001-07-31 10:46:53 +000063 def CancelBinding(self,event):
64 self.Cancel()
Steven M. Gava44d3d1a2001-07-31 06:59:02 +000065
Steven M. Gavac01e30f2001-08-11 15:48:13 +000066 def OkBinding(self,event):
67 self.Ok()
68
69 def ApplyBinding(self,event):
70 self.Apply()
Steven M. Gava44d3d1a2001-07-31 06:59:02 +000071
Steven M. Gava952d0a52001-08-03 04:43:44 +000072 def HelpBinding(self,event):
73 self.Help()
Steven M. Gava44d3d1a2001-07-31 06:59:02 +000074
Steven M. Gava952d0a52001-08-03 04:43:44 +000075 def SetThemeType(self):
Steven M. Gavad0342cd2001-11-04 11:53:10 +000076 if self.themeIsBuiltin.get():
Steven M. Gava952d0a52001-08-03 04:43:44 +000077 self.optMenuThemeBuiltin.config(state=NORMAL)
78 self.optMenuThemeCustom.config(state=DISABLED)
Steven M. Gava60fc7072001-08-04 13:58:22 +000079 self.buttonDeleteCustomTheme.config(state=DISABLED)
Steven M. Gava9dd16b32001-11-03 14:54:25 +000080 else:
Steven M. Gava952d0a52001-08-03 04:43:44 +000081 self.optMenuThemeBuiltin.config(state=DISABLED)
82 self.optMenuThemeCustom.config(state=NORMAL)
Steven M. Gava60fc7072001-08-04 13:58:22 +000083 self.buttonDeleteCustomTheme.config(state=NORMAL)
84
85 def SetKeysType(self):
Steven M. Gavad0342cd2001-11-04 11:53:10 +000086 if self.keysAreDefault.get():
Steven M. Gava60fc7072001-08-04 13:58:22 +000087 self.optMenuKeysBuiltin.config(state=NORMAL)
88 self.optMenuKeysCustom.config(state=DISABLED)
89 self.buttonDeleteCustomKeys.config(state=DISABLED)
Steven M. Gavad0342cd2001-11-04 11:53:10 +000090 else:
Steven M. Gava60fc7072001-08-04 13:58:22 +000091 self.optMenuKeysBuiltin.config(state=DISABLED)
92 self.optMenuKeysCustom.config(state=NORMAL)
93 self.buttonDeleteCustomKeys.config(state=NORMAL)
Steven M. Gava952d0a52001-08-03 04:43:44 +000094
Steven M. Gava074c9d22001-08-08 01:30:38 +000095 def GetColour(self):
Steven M. Gava9dd16b32001-11-03 14:54:25 +000096 target=self.highlightTarget.get()
Steven M. Gava074c9d22001-08-08 01:30:38 +000097 rgbTuplet, colourString = tkColorChooser.askcolor(parent=self,
Steven M. Gava9dd16b32001-11-03 14:54:25 +000098 title='Pick new colour for : '+target,
99 initialcolor=self.frameColourSet.cget('bg'))
Steven M. Gava074c9d22001-08-08 01:30:38 +0000100 if colourString: #user didn't cancel
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000101 self.frameColourSet.config(bg=colourString)#set sample
102 if self.fgHilite.get(): plane='foreground'
103 else: plane='background'
104 apply(self.textHighlightSample.tag_config,
105 (self.themeElements[target][0],),{plane:colourString})
106
Steven M. Gava429a86a2001-10-23 10:42:12 +0000107 def SetFontSampleBinding(self,event):
108 self.SetFontSample()
109
110 def SetFontSample(self):
111 self.editFont.config(size=self.fontSize.get(),weight=NORMAL,
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000112 family=self.listFontName.get(self.listFontName.curselection()[0]))
Steven M. Gava41a85322001-10-29 08:05:34 +0000113
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000114 def SetHighlightTargetBinding(self,*args):
Steven M. Gava7c017862001-10-29 11:19:46 +0000115 self.SetHighlightTarget()
Steven M. Gava41a85322001-10-29 08:05:34 +0000116
Steven M. Gava7c017862001-10-29 11:19:46 +0000117 def SetHighlightTarget(self):
Steven M. Gavaad4f5322002-01-03 12:05:17 +0000118 if self.highlightTarget.get()=='Cursor': #bg not possible
Steven M. Gava7c017862001-10-29 11:19:46 +0000119 self.radioFg.config(state=DISABLED)
120 self.radioBg.config(state=DISABLED)
121 self.fgHilite.set(1)
Steven M. Gavaad4f5322002-01-03 12:05:17 +0000122 else: #both fg and bg can be set
Steven M. Gava0cae01c2002-01-04 07:53:06 +0000123 self.radioFg.config(state=NORMAL)
124 self.radioBg.config(state=NORMAL)
Steven M. Gavaad4f5322002-01-03 12:05:17 +0000125 self.fgHilite.set(1)
Steven M. Gava3b55a892001-11-21 05:56:26 +0000126 self.SetColourSample()
127
128 def SetColourSampleBinding(self,*args):
129 self.SetColourSample()
130
131 def SetColourSample(self):
132 #set the colour smaple area
133 tag=self.themeElements[self.highlightTarget.get()][0]
134 if self.fgHilite.get(): plane='foreground'
135 else: plane='background'
136 colour=self.textHighlightSample.tag_cget(tag,plane)
137 self.frameColourSet.config(bg=colour)
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000138
Steven M. Gavad721c482001-07-31 10:46:53 +0000139 def CreateWidgets(self):
Steven M. Gava2d4e03b2001-12-05 07:54:07 +0000140 self.tabPages = TabPageSet(self,
141 pageNames=['Fonts/Tabs','Highlighting','Keys','General'])
Steven M. Gavaad4f5322002-01-03 12:05:17 +0000142 self.tabPages.ChangePage()#activates default (first) page
Steven M. Gavad721c482001-07-31 10:46:53 +0000143 frameActionButtons = Frame(self)
Steven M. Gavad721c482001-07-31 10:46:53 +0000144 #action buttons
Steven M. Gava952d0a52001-08-03 04:43:44 +0000145 self.buttonHelp = Button(frameActionButtons,text='Help',
146 command=self.Help,takefocus=FALSE)
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000147 self.buttonOk = Button(frameActionButtons,text='Ok',
148 command=self.Ok,takefocus=FALSE)
149 self.buttonApply = Button(frameActionButtons,text='Apply',
150 command=self.Apply,underline=0,takefocus=FALSE)
Steven M. Gavad721c482001-07-31 10:46:53 +0000151 self.buttonCancel = Button(frameActionButtons,text='Cancel',
152 command=self.Cancel,takefocus=FALSE)
Steven M. Gava2d4e03b2001-12-05 07:54:07 +0000153 self.CreatePageFontTab()
154 self.CreatePageHighlight()
155 self.CreatePageKeys()
156 self.CreatePageGeneral()
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000157 self.buttonHelp.pack(side=RIGHT,padx=5,pady=5)
158 self.buttonOk.pack(side=LEFT,padx=5,pady=5)
159 self.buttonApply.pack(side=LEFT,padx=5,pady=5)
Steven M. Gavad721c482001-07-31 10:46:53 +0000160 self.buttonCancel.pack(side=LEFT,padx=5,pady=5)
161 frameActionButtons.pack(side=BOTTOM)
Steven M. Gava2d4e03b2001-12-05 07:54:07 +0000162 self.tabPages.pack(side=TOP,expand=TRUE,fill=BOTH)
163
Steven M. Gavad721c482001-07-31 10:46:53 +0000164
Steven M. Gava60fc7072001-08-04 13:58:22 +0000165 def CreatePageFontTab(self):
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000166 #tkVars
Steven M. Gava3b55a892001-11-21 05:56:26 +0000167 self.fontSize=StringVar(self)
168 self.fontBold=StringVar(self)
169 self.spaceNum=IntVar(self)
170 self.tabCols=IntVar(self)
171 self.indentType=IntVar(self)
Steven M. Gava429a86a2001-10-23 10:42:12 +0000172 self.editFont=tkFont.Font(self,('courier',12,'normal'))
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000173 ##widget creation
174 #body frame
Steven M. Gava2d4e03b2001-12-05 07:54:07 +0000175 frame=self.tabPages.pages['Fonts/Tabs']['page']
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000176 #body section frames
177 frameFont=Frame(frame,borderwidth=2,relief=GROOVE)
178 frameIndent=Frame(frame,borderwidth=2,relief=GROOVE)
179 #frameFont
180 labelFontTitle=Label(frameFont,text='Set Base Editor Font')
181 frameFontName=Frame(frameFont)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000182 frameFontParam=Frame(frameFont)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000183 labelFontNameTitle=Label(frameFontName,justify=LEFT,
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000184 text='Font :')
185 self.listFontName=Listbox(frameFontName,height=5,takefocus=FALSE,
186 exportselection=FALSE)
Steven M. Gava429a86a2001-10-23 10:42:12 +0000187 self.listFontName.bind('<<ListboxSelect>>',self.SetFontSampleBinding)
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000188 scrollFont=Scrollbar(frameFontName)
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000189 scrollFont.config(command=self.listFontName.yview)
190 self.listFontName.config(yscrollcommand=scrollFont.set)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000191 labelFontSizeTitle=Label(frameFontParam,text='Size :')
192 self.optMenuFontSize=DynOptionMenu(frameFontParam,self.fontSize,None,
Steven M. Gava485f7b62001-10-26 06:47:09 +0000193 command=self.SetFontSampleBinding)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000194 checkFontBold=Checkbutton(frameFontParam,variable=self.fontBold,
195 onvalue='Bold',offvalue='',text='Bold')
Steven M. Gavac11ccf32001-09-24 09:43:17 +0000196 frameFontSample=Frame(frameFont,relief=SOLID,borderwidth=1)
197 self.labelFontSample=Label(frameFontSample,
198 text='AaBbCcDdEe\nFfGgHhIiJjK\n1234567890\n#:+=(){}[]',
Steven M. Gava429a86a2001-10-23 10:42:12 +0000199 justify=LEFT,font=self.editFont)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000200 #frameIndent
201 labelIndentTitle=Label(frameIndent,text='Set Indentation Defaults')
202 frameIndentType=Frame(frameIndent)
203 frameIndentSize=Frame(frameIndent)
204 labelIndentTypeTitle=Label(frameIndentType,
205 text='Choose indentation type :')
206 radioUseSpaces=Radiobutton(frameIndentType,variable=self.indentType,
Steven M. Gava429a86a2001-10-23 10:42:12 +0000207 value=1,text='Tab key inserts spaces')
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000208 radioUseTabs=Radiobutton(frameIndentType,variable=self.indentType,
Steven M. Gava429a86a2001-10-23 10:42:12 +0000209 value=0,text='Tab key inserts tabs')
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000210 labelIndentSizeTitle=Label(frameIndentSize,
211 text='Choose indentation size :')
212 labelSpaceNumTitle=Label(frameIndentSize,justify=LEFT,
213 text='when tab key inserts spaces,\nspaces per tab')
214 self.scaleSpaceNum=Scale(frameIndentSize,variable=self.spaceNum,
215 orient='horizontal',tickinterval=2,from_=2,to=8)
216 labeltabColsTitle=Label(frameIndentSize,justify=LEFT,
217 text='when tab key inserts tabs,\ncolumns per tab')
218 self.scaleTabCols=Scale(frameIndentSize,variable=self.tabCols,
219 orient='horizontal',tickinterval=2,from_=2,to=8)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000220 #widget packing
221 #body
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000222 frameFont.pack(side=LEFT,padx=5,pady=10,expand=TRUE,fill=BOTH)
223 frameIndent.pack(side=LEFT,padx=5,pady=10,fill=Y)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000224 #frameFont
225 labelFontTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000226 frameFontName.pack(side=TOP,padx=5,pady=5,fill=X)
227 frameFontParam.pack(side=TOP,padx=5,pady=5,fill=X)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000228 labelFontNameTitle.pack(side=TOP,anchor=W)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000229 self.listFontName.pack(side=LEFT,expand=TRUE,fill=X)
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000230 scrollFont.pack(side=LEFT,fill=Y)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000231 labelFontSizeTitle.pack(side=LEFT,anchor=W)
232 self.optMenuFontSize.pack(side=LEFT,anchor=W)
233 checkFontBold.pack(side=LEFT,anchor=W,padx=20)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000234 frameFontSample.pack(side=TOP,padx=5,pady=5,expand=TRUE,fill=BOTH)
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000235 self.labelFontSample.pack(expand=TRUE,fill=BOTH)
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000236 #frameIndent
237 labelIndentTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
238 frameIndentType.pack(side=TOP,padx=5,fill=X)
239 frameIndentSize.pack(side=TOP,padx=5,pady=5,fill=BOTH)
240 labelIndentTypeTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
241 radioUseSpaces.pack(side=TOP,anchor=W,padx=5)
242 radioUseTabs.pack(side=TOP,anchor=W,padx=5)
243 labelIndentSizeTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
244 labelSpaceNumTitle.pack(side=TOP,anchor=W,padx=5)
245 self.scaleSpaceNum.pack(side=TOP,padx=5,fill=X)
246 labeltabColsTitle.pack(side=TOP,anchor=W,padx=5)
247 self.scaleTabCols.pack(side=TOP,padx=5,fill=X)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000248 return frame
249
250 def CreatePageHighlight(self):
Steven M. Gava3b55a892001-11-21 05:56:26 +0000251 self.builtinTheme=StringVar(self)
252 self.customTheme=StringVar(self)
253 self.fgHilite=IntVar(self)
254 self.colour=StringVar(self)
255 self.fontName=StringVar(self)
256 self.themeIsBuiltin=IntVar(self)
257 self.highlightTarget=StringVar(self)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000258 self.highlightTarget.trace_variable('w',self.SetHighlightTargetBinding)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000259 ##widget creation
260 #body frame
Steven M. Gava2d4e03b2001-12-05 07:54:07 +0000261 frame=self.tabPages.pages['Highlighting']['page']
Steven M. Gava952d0a52001-08-03 04:43:44 +0000262 #body section frames
263 frameCustom=Frame(frame,borderwidth=2,relief=GROOVE)
264 frameTheme=Frame(frame,borderwidth=2,relief=GROOVE)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000265 #frameCustom
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000266 self.textHighlightSample=Text(frameCustom,relief=SOLID,borderwidth=1,
267 font=('courier',12,''),cursor='hand2',width=10,height=10,
268 takefocus=FALSE,highlightthickness=0)
269 text=self.textHighlightSample
270 text.bind('<Double-Button-1>',lambda e: 'break')
271 text.bind('<B1-Motion>',lambda e: 'break')
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000272 textAndTags=(('#you can click in here','comment'),('\n','normal'),
273 ('#to choose items','comment'),('\n','normal'),('def','keyword'),
274 (' ','normal'),('func','definition'),('(param):','normal'),
275 ('\n ','normal'),('"""string"""','string'),('\n var0 = ','normal'),
Steven M. Gavad0342cd2001-11-04 11:53:10 +0000276 ("'string'",'string'),('\n var1 = ','normal'),("'selected'",'hilite'),
277 ('\n var2 = ','normal'),("'found'",'hit'),('\n\n','normal'),
Steven M. Gava99300612001-11-04 07:03:08 +0000278 (' error ','error'),(' ','normal'),('cursor |','cursor'),
Steven M. Gavad0342cd2001-11-04 11:53:10 +0000279 ('\n ','normal'),('shell','console'),(' ','normal'),('stdout','stdout'),
280 (' ','normal'),('stderr','stderr'),('\n','normal'))
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000281 for txTa in textAndTags:
282 text.insert(END,txTa[0],txTa[1])
283 for element in self.themeElements.keys():
284 text.tag_bind(self.themeElements[element][0],'<ButtonPress-1>',
285 lambda event,elem=element: event.widget.winfo_toplevel()
286 .highlightTarget.set(elem))
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000287 text.config(state=DISABLED)
288 self.frameColourSet=Frame(frameCustom,relief=SOLID,borderwidth=1)
Steven M. Gava7c017862001-10-29 11:19:46 +0000289 frameFgBg=Frame(frameCustom)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000290 labelCustomTitle=Label(frameCustom,text='Set Custom Highlighting')
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000291 buttonSetColour=Button(self.frameColourSet,text='Choose Colour for :',
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000292 command=self.GetColour,highlightthickness=0)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000293 self.optMenuHighlightTarget=DynOptionMenu(self.frameColourSet,
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000294 self.highlightTarget,None,highlightthickness=0)#,command=self.SetHighlightTargetBinding
Steven M. Gava7c017862001-10-29 11:19:46 +0000295 self.radioFg=Radiobutton(frameFgBg,variable=self.fgHilite,
Steven M. Gava3b55a892001-11-21 05:56:26 +0000296 value=1,text='Foreground',command=self.SetColourSampleBinding)
Steven M. Gava7c017862001-10-29 11:19:46 +0000297 self.radioBg=Radiobutton(frameFgBg,variable=self.fgHilite,
Steven M. Gava3b55a892001-11-21 05:56:26 +0000298 value=0,text='Background',command=self.SetColourSampleBinding)
Steven M. Gava7c017862001-10-29 11:19:46 +0000299 self.fgHilite.set(1)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000300 buttonSaveCustomTheme=Button(frameCustom,
Steven M. Gava952d0a52001-08-03 04:43:44 +0000301 text='Save as a Custom Theme')
Steven M. Gava952d0a52001-08-03 04:43:44 +0000302 #frameTheme
Steven M. Gava952d0a52001-08-03 04:43:44 +0000303 labelThemeTitle=Label(frameTheme,text='Select a Highlighting Theme')
304 labelTypeTitle=Label(frameTheme,text='Select : ')
Steven M. Gavad0342cd2001-11-04 11:53:10 +0000305 self.radioThemeBuiltin=Radiobutton(frameTheme,variable=self.themeIsBuiltin,
306 value=1,command=self.SetThemeType,text='a Built-in Theme')
307 self.radioThemeCustom=Radiobutton(frameTheme,variable=self.themeIsBuiltin,
308 value=0,command=self.SetThemeType,text='a Custom Theme')
Steven M. Gava41a85322001-10-29 08:05:34 +0000309 self.optMenuThemeBuiltin=DynOptionMenu(frameTheme,
Steven M. Gava7c017862001-10-29 11:19:46 +0000310 self.builtinTheme,None,command=None)
Steven M. Gava41a85322001-10-29 08:05:34 +0000311 self.optMenuThemeCustom=DynOptionMenu(frameTheme,
Steven M. Gava7c017862001-10-29 11:19:46 +0000312 self.customTheme,None,command=None)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000313 self.buttonDeleteCustomTheme=Button(frameTheme,text='Delete Custom Theme')
Steven M. Gava952d0a52001-08-03 04:43:44 +0000314 ##widget packing
315 #body
Steven M. Gava60fc7072001-08-04 13:58:22 +0000316 frameCustom.pack(side=LEFT,padx=5,pady=10,expand=TRUE,fill=BOTH)
317 frameTheme.pack(side=LEFT,padx=5,pady=10,fill=Y)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000318 #frameCustom
319 labelCustomTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000320 self.frameColourSet.pack(side=TOP,padx=5,pady=5,expand=TRUE,fill=X)
Steven M. Gava7c017862001-10-29 11:19:46 +0000321 frameFgBg.pack(side=TOP,padx=5,pady=0)
Steven M. Gavae16d94b2001-11-03 05:07:28 +0000322 self.textHighlightSample.pack(side=TOP,padx=5,pady=5,expand=TRUE,
323 fill=BOTH)
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000324 buttonSetColour.pack(side=TOP,expand=TRUE,fill=X,padx=8,pady=4)
325 self.optMenuHighlightTarget.pack(side=TOP,expand=TRUE,fill=X,padx=8,pady=3)
Steven M. Gava7c017862001-10-29 11:19:46 +0000326 self.radioFg.pack(side=LEFT,anchor=E)
327 self.radioBg.pack(side=RIGHT,anchor=W)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000328 buttonSaveCustomTheme.pack(side=BOTTOM,fill=X,padx=5,pady=5)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000329 #frameTheme
Steven M. Gava952d0a52001-08-03 04:43:44 +0000330 labelThemeTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
331 labelTypeTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
Steven M. Gava41a85322001-10-29 08:05:34 +0000332 self.radioThemeBuiltin.pack(side=TOP,anchor=W,padx=5)
333 self.radioThemeCustom.pack(side=TOP,anchor=W,padx=5,pady=2)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000334 self.optMenuThemeBuiltin.pack(side=TOP,fill=X,padx=5,pady=5)
335 self.optMenuThemeCustom.pack(side=TOP,fill=X,anchor=W,padx=5,pady=5)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000336 self.buttonDeleteCustomTheme.pack(side=TOP,fill=X,padx=5,pady=5)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000337 return frame
338
339 def CreatePageKeys(self):
Steven M. Gava60fc7072001-08-04 13:58:22 +0000340 #tkVars
Steven M. Gava3b55a892001-11-21 05:56:26 +0000341 self.bindingTarget=StringVar(self)
342 self.builtinKeys=StringVar(self)
343 self.customKeys=StringVar(self)
344 self.keyChars=StringVar(self)
345 self.keyCtrl=StringVar(self)
346 self.keyAlt=StringVar(self)
347 self.keyShift=StringVar(self)
348 self.keysAreDefault=IntVar(self)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000349 ##widget creation
350 #body frame
Steven M. Gava2d4e03b2001-12-05 07:54:07 +0000351 frame=self.tabPages.pages['Keys']['page']
Steven M. Gava60fc7072001-08-04 13:58:22 +0000352 #body section frames
353 frameCustom=Frame(frame,borderwidth=2,relief=GROOVE)
354 frameKeySets=Frame(frame,borderwidth=2,relief=GROOVE)
355 #frameCustom
356 frameTarget=Frame(frameCustom)
357 frameSet=Frame(frameCustom)
358 labelCustomTitle=Label(frameCustom,text='Set Custom Key Bindings')
359 labelTargetTitle=Label(frameTarget,text='Action')
360 scrollTarget=Scrollbar(frameTarget)
361 listTarget=Listbox(frameTarget)
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000362 scrollTarget.config(command=listTarget.yview)
363 listTarget.config(yscrollcommand=scrollTarget.set)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000364 labelKeyBindTitle=Label(frameSet,text='Binding')
365 labelModifierTitle=Label(frameSet,text='Modifier:')
366 checkCtrl=Checkbutton(frameSet,text='Ctrl')
367 checkAlt=Checkbutton(frameSet,text='Alt')
368 checkShift=Checkbutton(frameSet,text='Shift')
369 labelKeyEntryTitle=Label(frameSet,text='Key:')
370 entryKey=Entry(frameSet,width=4)
371 buttonSaveCustomKeys=Button(frameCustom,text='Save as a Custom Key Set')
372 #frameKeySets
Steven M. Gavaf213ccb2001-08-05 08:00:28 +0000373 labelKeysTitle=Label(frameKeySets,text='Select a Key Set')
Steven M. Gava60fc7072001-08-04 13:58:22 +0000374 labelTypeTitle=Label(frameKeySets,text='Select : ')
Steven M. Gavad0342cd2001-11-04 11:53:10 +0000375 self.radioKeysBuiltin=Radiobutton(frameKeySets,variable=self.keysAreDefault,
376 value=1,command=self.SetKeysType,text='a Built-in Key Set')
377 self.radioKeysCustom=Radiobutton(frameKeySets,variable=self.keysAreDefault,
378 value=0,command=self.SetKeysType,text='a Custom Key Set')
Steven M. Gava41a85322001-10-29 08:05:34 +0000379 self.optMenuKeysBuiltin=DynOptionMenu(frameKeySets,
380 self.builtinKeys,None,command=None)
381 self.optMenuKeysCustom=DynOptionMenu(frameKeySets,
382 self.customKeys,None,command=None)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000383 self.buttonDeleteCustomKeys=Button(frameKeySets,text='Delete Custom Key Set')
Steven M. Gava60fc7072001-08-04 13:58:22 +0000384 ##widget packing
385 #body
386 frameCustom.pack(side=LEFT,padx=5,pady=5,expand=TRUE,fill=BOTH)
387 frameKeySets.pack(side=LEFT,padx=5,pady=5,fill=Y)
388 #frameCustom
389 labelCustomTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
390 buttonSaveCustomKeys.pack(side=BOTTOM,fill=X,padx=5,pady=5)
391 frameTarget.pack(side=LEFT,padx=5,pady=5,fill=Y)
392 frameSet.pack(side=LEFT,padx=5,pady=5,fill=Y)
393 labelTargetTitle.pack(side=TOP,anchor=W)
394 scrollTarget.pack(side=RIGHT,anchor=W,fill=Y)
395 listTarget.pack(side=TOP,anchor=W,expand=TRUE,fill=BOTH)
396 labelKeyBindTitle.pack(side=TOP,anchor=W)
397 labelModifierTitle.pack(side=TOP,anchor=W,pady=5)
398 checkCtrl.pack(side=TOP,anchor=W)
399 checkAlt.pack(side=TOP,anchor=W,pady=2)
400 checkShift.pack(side=TOP,anchor=W)
401 labelKeyEntryTitle.pack(side=TOP,anchor=W,pady=5)
402 entryKey.pack(side=TOP,anchor=W)
403 #frameKeySets
404 labelKeysTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
405 labelTypeTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
Steven M. Gava41a85322001-10-29 08:05:34 +0000406 self.radioKeysBuiltin.pack(side=TOP,anchor=W,padx=5)
407 self.radioKeysCustom.pack(side=TOP,anchor=W,padx=5,pady=2)
Steven M. Gava60fc7072001-08-04 13:58:22 +0000408 self.optMenuKeysBuiltin.pack(side=TOP,fill=X,padx=5,pady=5)
409 self.optMenuKeysCustom.pack(side=TOP,fill=X,anchor=W,padx=5,pady=5)
410 self.buttonDeleteCustomKeys.pack(side=TOP,fill=X,padx=5,pady=5)
Steven M. Gava952d0a52001-08-03 04:43:44 +0000411 return frame
412
413 def CreatePageGeneral(self):
Steven M. Gava230e5782001-08-07 03:28:25 +0000414 #tkVars
Steven M. Gava3b55a892001-11-21 05:56:26 +0000415 self.runType=IntVar(self)
416 self.winWidth=StringVar(self)
417 self.winHeight=StringVar(self)
418 self.extState=IntVar(self)
Steven M. Gava230e5782001-08-07 03:28:25 +0000419 #widget creation
420 #body
Steven M. Gava2d4e03b2001-12-05 07:54:07 +0000421 frame=self.tabPages.pages['General']['page']
Steven M. Gava230e5782001-08-07 03:28:25 +0000422 #body section frames
423 frameRun=Frame(frame,borderwidth=2,relief=GROOVE)
424 frameWinSize=Frame(frame,borderwidth=2,relief=GROOVE)
425 frameExt=Frame(frame,borderwidth=2,relief=GROOVE)
426 #frameRun
427 labelRunTitle=Label(frameRun,text='Run Preferences')
428 labelRunChoiceTitle=Label(frameRun,text='Run code : ')
429 radioRunInternal=Radiobutton(frameRun,variable=self.runType,
430 value=0,command=self.SetKeysType,text="in IDLE's Process")
431 radioRunSeparate=Radiobutton(frameRun,variable=self.runType,
432 value=1,command=self.SetKeysType,text='in a Separate Process')
433 #frameWinSize
434 labelWinSizeTitle=Label(frameWinSize,text='Initial Window Size')
435 buttonWinSizeSet=Button(frameWinSize,text='Set to current window size')
436 labelWinWidthTitle=Label(frameWinSize,text='Width')
437 entryWinWidth=Entry(frameWinSize,textvariable=self.winWidth,
438 width=3)
439 labelWinHeightTitle=Label(frameWinSize,text='Height')
440 entryWinHeight=Entry(frameWinSize,textvariable=self.winHeight,
441 width=3)
442 #frameExt
443 frameExtList=Frame(frameExt)
444 frameExtSet=Frame(frameExt)
445 labelExtTitle=Label(frameExt,text='Configure IDLE Extensions')
446 labelExtListTitle=Label(frameExtList,text='Extension')
447 scrollExtList=Scrollbar(frameExtList)
448 listExt=Listbox(frameExtList,height=5)
Steven M. Gavac01e30f2001-08-11 15:48:13 +0000449 scrollExtList.config(command=listExt.yview)
450 listExt.config(yscrollcommand=scrollExtList.set)
Steven M. Gava230e5782001-08-07 03:28:25 +0000451 labelExtSetTitle=Label(frameExtSet,text='Settings')
452 radioEnableExt=Radiobutton(frameExtSet,variable=self.extState,
453 value=1,text="enable")
454 radioDisableExt=Radiobutton(frameExtSet,variable=self.extState,
455 value=0,text="disable")
456 self.extState.set(1)
457 buttonExtConfig=Button(frameExtSet,text='Configure')
458
459 #widget packing
460 #body
461 frameRun.pack(side=TOP,padx=5,pady=5,fill=X)
462 frameWinSize.pack(side=TOP,padx=5,pady=5,fill=X)
463 frameExt.pack(side=TOP,padx=5,pady=5,expand=TRUE,fill=BOTH)
464 #frameRun
465 labelRunTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
466 labelRunChoiceTitle.pack(side=LEFT,anchor=W,padx=5,pady=5)
467 radioRunInternal.pack(side=LEFT,anchor=W,padx=5,pady=5)
468 radioRunSeparate.pack(side=LEFT,anchor=W,padx=5,pady=5)
469 #frameWinSize
470 labelWinSizeTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
471 buttonWinSizeSet.pack(side=LEFT,anchor=W,padx=5,pady=5)
472 labelWinWidthTitle.pack(side=LEFT,anchor=W,padx=5,pady=5)
473 entryWinWidth.pack(side=LEFT,anchor=W,padx=5,pady=5)
474 labelWinHeightTitle.pack(side=LEFT,anchor=W,padx=5,pady=5)
475 entryWinHeight.pack(side=LEFT,anchor=W,padx=5,pady=5)
476 #frameExt
477 labelExtTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
478 frameExtSet.pack(side=RIGHT,padx=5,pady=5,fill=Y)
479 frameExtList.pack(side=RIGHT,padx=5,pady=5,expand=TRUE,fill=BOTH)
480 labelExtListTitle.pack(side=TOP,anchor=W)
481 scrollExtList.pack(side=RIGHT,anchor=W,fill=Y)
482 listExt.pack(side=LEFT,anchor=E,expand=TRUE,fill=BOTH)
483 labelExtSetTitle.pack(side=TOP,anchor=W)
484 radioEnableExt.pack(side=TOP,anchor=W)
485 radioDisableExt.pack(side=TOP,anchor=W)
486 buttonExtConfig.pack(side=TOP,anchor=W,pady=5)
487
Steven M. Gava952d0a52001-08-03 04:43:44 +0000488 return frame
489
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000490 def PaintThemeSample(self):
Steven M. Gavad0342cd2001-11-04 11:53:10 +0000491 if self.themeIsBuiltin.get(): #a default theme
Steven M. Gava99300612001-11-04 07:03:08 +0000492 theme=self.builtinTheme.get()
493 else: #a user theme
494 theme=self.customTheme.get()
Steven M. Gavad0342cd2001-11-04 11:53:10 +0000495 for element in self.themeElements.keys():
496 colours=idleConf.GetHighlight(theme, self.themeElements[element][0])
Steven M. Gavaad4f5322002-01-03 12:05:17 +0000497 if element=='Cursor': #cursor sample needs special painting
498 colours['background']=idleConf.GetHighlight(theme,
Steven M. Gava0cae01c2002-01-04 07:53:06 +0000499 'normal', fgBg='bg')
Steven M. Gavad0342cd2001-11-04 11:53:10 +0000500 apply(self.textHighlightSample.tag_config,
501 (self.themeElements[element][0],),colours)
Steven M. Gavaad4f5322002-01-03 12:05:17 +0000502
Steven M. Gava429a86a2001-10-23 10:42:12 +0000503 def LoadFontCfg(self):
504 ##base editor font selection list
Steven M. Gavac11ccf32001-09-24 09:43:17 +0000505 fonts=list(tkFont.families(self))
506 fonts.sort()
507 for font in fonts:
508 self.listFontName.insert(END,font)
Steven M. Gava485f7b62001-10-26 06:47:09 +0000509 configuredFont=idleConf.GetOption('main','EditorWindow','font',
Steven M. Gava429a86a2001-10-23 10:42:12 +0000510 default='courier')
511 if configuredFont in fonts:
512 currentFontIndex=fonts.index(configuredFont)
513 self.listFontName.see(currentFontIndex)
514 self.listFontName.select_set(currentFontIndex)
515 ##font size dropdown
Steven M. Gava485f7b62001-10-26 06:47:09 +0000516 fontSize=idleConf.GetOption('main','EditorWindow','font-size',default='12')
517 self.optMenuFontSize.SetMenu(('10','11','12','13','14',
518 '16','18','20','22'),fontSize )
Steven M. Gava429a86a2001-10-23 10:42:12 +0000519 ##font sample
520 self.SetFontSample()
521
522 def LoadTabCfg(self):
523 ##indent type radibuttons
Steven M. Gava485f7b62001-10-26 06:47:09 +0000524 spaceIndent=idleConf.GetOption('main','Indent','use-spaces',
Steven M. Gava429a86a2001-10-23 10:42:12 +0000525 default=1,type='bool')
526 self.indentType.set(spaceIndent)
527 ##indent sizes
Steven M. Gava485f7b62001-10-26 06:47:09 +0000528 spaceNum=idleConf.GetOption('main','Indent','num-spaces',
Steven M. Gava429a86a2001-10-23 10:42:12 +0000529 default=4,type='int')
Steven M. Gava485f7b62001-10-26 06:47:09 +0000530 tabCols=idleConf.GetOption('main','Indent','tab-cols',
Steven M. Gava429a86a2001-10-23 10:42:12 +0000531 default=4,type='int')
532 self.spaceNum.set(spaceNum)
533 self.tabCols.set(tabCols)
Steven M. Gavac11ccf32001-09-24 09:43:17 +0000534
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000535 def LoadThemeCfg(self):
Steven M. Gava41a85322001-10-29 08:05:34 +0000536 ##current theme type radiobutton
Steven M. Gavad0342cd2001-11-04 11:53:10 +0000537 self.themeIsBuiltin.set(idleConf.GetOption('main','Theme','default',
538 type='int',default=1))
Steven M. Gava41a85322001-10-29 08:05:34 +0000539 ##currently set theme
Steven M. Gavaad4f5322002-01-03 12:05:17 +0000540 currentOption=idleConf.CurrentTheme()
Steven M. Gava7c017862001-10-29 11:19:46 +0000541 ##load available theme option menus
Steven M. Gavad0342cd2001-11-04 11:53:10 +0000542 if self.themeIsBuiltin.get(): #default theme selected
Steven M. Gava41a85322001-10-29 08:05:34 +0000543 itemList=idleConf.GetSectionList('default','highlight')
544 self.optMenuThemeBuiltin.SetMenu(itemList,currentOption)
545 itemList=idleConf.GetSectionList('user','highlight')
546 if not itemList:
547 self.radioThemeCustom.config(state=DISABLED)
548 self.customTheme.set('- no custom themes -')
549 else:
550 self.optMenuThemeCustom.SetMenu(itemList,itemList[0])
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000551 else: #user theme selected
Steven M. Gava41a85322001-10-29 08:05:34 +0000552 itemList=idleConf.GetSectionList('user','highlight')
553 self.optMenuThemeCustom.SetMenu(itemList,currentOption)
554 itemList=idleConf.GetSectionList('default','highlight')
555 self.optMenuThemeBuiltin.SetMenu(itemList,itemList[0])
Steven M. Gava7c017862001-10-29 11:19:46 +0000556 self.SetThemeType()
557 ##load theme element option menu
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000558 themeNames=self.themeElements.keys()
559 themeNames.sort(self.__ThemeNameIndexCompare)
560 self.optMenuHighlightTarget.SetMenu(themeNames,themeNames[0])
561 self.PaintThemeSample()
Steven M. Gava0cae01c2002-01-04 07:53:06 +0000562 self.SetHighlightTarget()
Steven M. Gava41a85322001-10-29 08:05:34 +0000563
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000564 def __ThemeNameIndexCompare(self,a,b):
565 if self.themeElements[a][1]<self.themeElements[b][1]: return -1
566 elif self.themeElements[a][1]==self.themeElements[b][1]: return 0
567 else: return 1
568
569 def LoadKeyCfg(self):
Steven M. Gava41a85322001-10-29 08:05:34 +0000570 ##current keys type radiobutton
Steven M. Gavad0342cd2001-11-04 11:53:10 +0000571 self.keysAreDefault.set(idleConf.GetOption('main','Keys','default',
572 type='int',default=1))
Steven M. Gava41a85322001-10-29 08:05:34 +0000573 ##currently set keys
Steven M. Gavaad4f5322002-01-03 12:05:17 +0000574 currentOption=idleConf.CurrentKeys()
Steven M. Gava7c017862001-10-29 11:19:46 +0000575 ##load available keyset option menus
Steven M. Gavad0342cd2001-11-04 11:53:10 +0000576 if self.keysAreDefault.get(): #default theme selected
Steven M. Gava41a85322001-10-29 08:05:34 +0000577 itemList=idleConf.GetSectionList('default','keys')
578 self.optMenuKeysBuiltin.SetMenu(itemList,currentOption)
579 itemList=idleConf.GetSectionList('user','keys')
580 if not itemList:
581 self.radioKeysCustom.config(state=DISABLED)
582 self.customKeys.set('- no custom keys -')
583 else:
584 self.optMenuKeysCustom.SetMenu(itemList,itemList[0])
Steven M. Gavad0342cd2001-11-04 11:53:10 +0000585 else: #user theme selected
Steven M. Gava41a85322001-10-29 08:05:34 +0000586 itemList=idleConf.GetSectionList('user','keys')
587 self.optMenuKeysCustom.SetMenu(itemList,currentOption)
588 itemList=idleConf.GetSectionList('default','keys')
589 self.optMenuKeysBuiltin.SetMenu(itemList,itemList[0])
590 self.SetKeysType()
Steven M. Gava7c017862001-10-29 11:19:46 +0000591 ##load keyset element option menu
Steven M. Gava41a85322001-10-29 08:05:34 +0000592
Steven M. Gava429a86a2001-10-23 10:42:12 +0000593 def LoadConfigs(self):
594 """
595 load configuration from default and user config files and populate
596 the widgets on the config dialog pages.
597 """
598 ### fonts / tabs page
599 self.LoadFontCfg()
600 self.LoadTabCfg()
601 ### highlighting page
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000602 self.LoadThemeCfg()
Steven M. Gava429a86a2001-10-23 10:42:12 +0000603 ### keys page
Steven M. Gava9dd16b32001-11-03 14:54:25 +0000604 self.LoadKeyCfg()
Steven M. Gava429a86a2001-10-23 10:42:12 +0000605 ### help page
606 ### general page
607
Steven M. Gavac11ccf32001-09-24 09:43:17 +0000608 def SaveConfigs(self):
Steven M. Gava429a86a2001-10-23 10:42:12 +0000609 """
610 save configuration changes to user config files.
611 """
Steven M. Gavac11ccf32001-09-24 09:43:17 +0000612 pass
613
Steven M. Gava44d3d1a2001-07-31 06:59:02 +0000614if __name__ == '__main__':
Steven M. Gavad721c482001-07-31 10:46:53 +0000615 #test the dialog
616 root=Tk()
617 Button(root,text='Dialog',
Steven M. Gava3b55a892001-11-21 05:56:26 +0000618 command=lambda:ConfigDialog(root,'Settings')).pack()
Steven M. Gavad721c482001-07-31 10:46:53 +0000619 root.mainloop()