cpython/Lib/idlelib/configDialog.py

1125 lines
51 KiB
Python
Raw Normal View History

"""
configuration dialog
"""
from Tkinter import *
2001-08-11 12:48:13 -03:00
import tkMessageBox, tkColorChooser, tkFont
2002-02-10 22:20:53 -04:00
import string, copy
2001-09-24 06:43:17 -03:00
from configHandler import idleConf
from dynOptionMenuWidget import DynOptionMenu
2001-12-05 03:54:07 -04:00
from tabpage import TabPageSet
2002-01-18 20:29:54 -04:00
from keybindingDialog import GetKeysDialog
2002-01-24 02:02:50 -04:00
from configSectionNameDialog import GetCfgSectionNameDialog
from configHelpSourceEdit import GetHelpSourceDialog
class ConfigDialog(Toplevel):
"""
configuration dialog for idle
"""
2001-11-21 01:56:26 -04:00
def __init__(self,parent,title):
Toplevel.__init__(self, parent)
self.configure(borderwidth=5)
self.geometry("+%d+%d" % (parent.winfo_rootx()+20,
parent.winfo_rooty()+30))
2001-11-03 10:54:25 -04:00
#Theme Elements. Each theme element key is it's display name.
#The first value of the tuple is the sample area tag name.
#The second value is the display name list sort index.
self.themeElements={'Normal Text':('normal','00'),
'Python Keywords':('keyword','01'),
'Python Definitions':('definition','02'),
'Python Comments':('comment','03'),
'Python Strings':('string','04'),
'Selected Text':('hilite','05'),
'Found Text':('hit','06'),
'Cursor':('cursor','07'),
'Error Text':('error','08'),
'Shell Normal Text':('console','09'),
'Shell Stdout Text':('stdout','10'),
'Shell Stderr Text':('stderr','11')}
2002-01-31 21:33:36 -04:00
self.ResetChangedItems() #load initial values in changed items dict
self.CreateWidgets()
self.resizable(height=FALSE,width=FALSE)
self.transient(parent)
self.grab_set()
self.protocol("WM_DELETE_WINDOW", self.Cancel)
self.parent = parent
2001-12-05 03:54:07 -04:00
self.tabPages.focus_set()
#key bindings for this dialog
#self.bind('<Escape>',self.Cancel) #dismiss dialog, no save
#self.bind('<Alt-a>',self.Apply) #apply changes, save
#self.bind('<F1>',self.Help) #context help
self.LoadConfigs()
2002-01-22 01:56:40 -04:00
self.AttachVarCallbacks() #avoid callbacks during LoadConfigs
self.wait_window()
def CreateWidgets(self):
2001-12-05 03:54:07 -04:00
self.tabPages = TabPageSet(self,
pageNames=['Fonts/Tabs','Highlighting','Keys','General'])
self.tabPages.ChangePage()#activates default (first) page
frameActionButtons = Frame(self)
#action buttons
self.buttonHelp = Button(frameActionButtons,text='Help',
command=self.Help,takefocus=FALSE)
2001-08-11 12:48:13 -03:00
self.buttonOk = Button(frameActionButtons,text='Ok',
command=self.Ok,takefocus=FALSE)
self.buttonApply = Button(frameActionButtons,text='Apply',
command=self.Apply,takefocus=FALSE)
self.buttonCancel = Button(frameActionButtons,text='Cancel',
command=self.Cancel,takefocus=FALSE)
2001-12-05 03:54:07 -04:00
self.CreatePageFontTab()
self.CreatePageHighlight()
self.CreatePageKeys()
self.CreatePageGeneral()
2001-08-11 12:48:13 -03:00
self.buttonHelp.pack(side=RIGHT,padx=5,pady=5)
self.buttonOk.pack(side=LEFT,padx=5,pady=5)
self.buttonApply.pack(side=LEFT,padx=5,pady=5)
self.buttonCancel.pack(side=LEFT,padx=5,pady=5)
frameActionButtons.pack(side=BOTTOM)
2001-12-05 03:54:07 -04:00
self.tabPages.pack(side=TOP,expand=TRUE,fill=BOTH)
2001-08-04 10:58:22 -03:00
def CreatePageFontTab(self):
2001-08-05 05:00:28 -03:00
#tkVars
2001-11-21 01:56:26 -04:00
self.fontSize=StringVar(self)
2002-01-22 01:56:40 -04:00
self.fontBold=BooleanVar(self)
self.fontName=StringVar(self)
2001-11-21 01:56:26 -04:00
self.spaceNum=IntVar(self)
2002-03-11 22:33:52 -04:00
#self.tabCols=IntVar(self)
2002-01-22 01:56:40 -04:00
self.indentBySpaces=BooleanVar(self)
self.editFont=tkFont.Font(self,('courier',12,'normal'))
2001-08-05 05:00:28 -03:00
##widget creation
#body frame
2001-12-05 03:54:07 -04:00
frame=self.tabPages.pages['Fonts/Tabs']['page']
2001-08-05 05:00:28 -03:00
#body section frames
frameFont=Frame(frame,borderwidth=2,relief=GROOVE)
frameIndent=Frame(frame,borderwidth=2,relief=GROOVE)
#frameFont
labelFontTitle=Label(frameFont,text='Set Base Editor Font')
frameFontName=Frame(frameFont)
2001-11-03 01:07:28 -04:00
frameFontParam=Frame(frameFont)
2001-08-05 05:00:28 -03:00
labelFontNameTitle=Label(frameFontName,justify=LEFT,
2001-08-11 12:48:13 -03:00
text='Font :')
self.listFontName=Listbox(frameFontName,height=5,takefocus=FALSE,
exportselection=FALSE)
2002-01-22 01:56:40 -04:00
self.listFontName.bind('<ButtonRelease-1>',self.OnListFontButtonRelease)
2001-08-11 12:48:13 -03:00
scrollFont=Scrollbar(frameFontName)
scrollFont.config(command=self.listFontName.yview)
self.listFontName.config(yscrollcommand=scrollFont.set)
2001-11-03 01:07:28 -04:00
labelFontSizeTitle=Label(frameFontParam,text='Size :')
self.optMenuFontSize=DynOptionMenu(frameFontParam,self.fontSize,None,
2002-01-22 01:56:40 -04:00
command=self.SetFontSample)
2001-11-03 01:07:28 -04:00
checkFontBold=Checkbutton(frameFontParam,variable=self.fontBold,
2002-01-22 01:56:40 -04:00
onvalue=1,offvalue=0,text='Bold',command=self.SetFontSample)
2001-09-24 06:43:17 -03:00
frameFontSample=Frame(frameFont,relief=SOLID,borderwidth=1)
self.labelFontSample=Label(frameFontSample,
text='AaBbCcDdEe\nFfGgHhIiJjK\n1234567890\n#:+=(){}[]',
justify=LEFT,font=self.editFont)
2001-08-05 05:00:28 -03:00
#frameIndent
labelIndentTitle=Label(frameIndent,text='Set Indentation Defaults')
frameIndentType=Frame(frameIndent)
frameIndentSize=Frame(frameIndent)
labelIndentTypeTitle=Label(frameIndentType,
text='Choose indentation type :')
2002-01-22 01:56:40 -04:00
radioUseSpaces=Radiobutton(frameIndentType,variable=self.indentBySpaces,
value=1,text='Tab key inserts spaces')
2002-01-22 01:56:40 -04:00
radioUseTabs=Radiobutton(frameIndentType,variable=self.indentBySpaces,
value=0,text='Tab key inserts tabs')
2001-08-05 05:00:28 -03:00
labelIndentSizeTitle=Label(frameIndentSize,
text='Choose indentation size :')
labelSpaceNumTitle=Label(frameIndentSize,justify=LEFT,
text='when tab key inserts spaces,\nspaces per indent')
2001-08-05 05:00:28 -03:00
self.scaleSpaceNum=Scale(frameIndentSize,variable=self.spaceNum,
2002-03-11 22:33:52 -04:00
orient='horizontal',tickinterval=2,from_=2,to=10)
#labeltabColsTitle=Label(frameIndentSize,justify=LEFT,
# text='when tab key inserts tabs,\ncolumns per tab')
#self.scaleTabCols=Scale(frameIndentSize,variable=self.tabCols,
# orient='horizontal',tickinterval=2,from_=2,to=8)
2001-08-05 05:00:28 -03:00
#widget packing
#body
2001-08-11 12:48:13 -03:00
frameFont.pack(side=LEFT,padx=5,pady=10,expand=TRUE,fill=BOTH)
frameIndent.pack(side=LEFT,padx=5,pady=10,fill=Y)
2001-08-05 05:00:28 -03:00
#frameFont
labelFontTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
2001-11-03 01:07:28 -04:00
frameFontName.pack(side=TOP,padx=5,pady=5,fill=X)
frameFontParam.pack(side=TOP,padx=5,pady=5,fill=X)
2001-08-05 05:00:28 -03:00
labelFontNameTitle.pack(side=TOP,anchor=W)
2001-11-03 01:07:28 -04:00
self.listFontName.pack(side=LEFT,expand=TRUE,fill=X)
2001-08-11 12:48:13 -03:00
scrollFont.pack(side=LEFT,fill=Y)
2001-11-03 01:07:28 -04:00
labelFontSizeTitle.pack(side=LEFT,anchor=W)
self.optMenuFontSize.pack(side=LEFT,anchor=W)
checkFontBold.pack(side=LEFT,anchor=W,padx=20)
2001-08-05 05:00:28 -03:00
frameFontSample.pack(side=TOP,padx=5,pady=5,expand=TRUE,fill=BOTH)
2001-08-11 12:48:13 -03:00
self.labelFontSample.pack(expand=TRUE,fill=BOTH)
2001-08-05 05:00:28 -03:00
#frameIndent
labelIndentTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
frameIndentType.pack(side=TOP,padx=5,fill=X)
frameIndentSize.pack(side=TOP,padx=5,pady=5,fill=BOTH)
labelIndentTypeTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
radioUseSpaces.pack(side=TOP,anchor=W,padx=5)
radioUseTabs.pack(side=TOP,anchor=W,padx=5)
labelIndentSizeTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
labelSpaceNumTitle.pack(side=TOP,anchor=W,padx=5)
self.scaleSpaceNum.pack(side=TOP,padx=5,fill=X)
#labeltabColsTitle.pack(side=TOP,anchor=W,padx=5)
#self.scaleTabCols.pack(side=TOP,padx=5,fill=X)
return frame
def CreatePageHighlight(self):
2001-11-21 01:56:26 -04:00
self.builtinTheme=StringVar(self)
self.customTheme=StringVar(self)
2002-01-22 01:56:40 -04:00
self.fgHilite=BooleanVar(self)
2001-11-21 01:56:26 -04:00
self.colour=StringVar(self)
self.fontName=StringVar(self)
2002-01-22 01:56:40 -04:00
self.themeIsBuiltin=BooleanVar(self)
2001-11-21 01:56:26 -04:00
self.highlightTarget=StringVar(self)
##widget creation
#body frame
2001-12-05 03:54:07 -04:00
frame=self.tabPages.pages['Highlighting']['page']
#body section frames
frameCustom=Frame(frame,borderwidth=2,relief=GROOVE)
frameTheme=Frame(frame,borderwidth=2,relief=GROOVE)
#frameCustom
2001-11-03 01:07:28 -04:00
self.textHighlightSample=Text(frameCustom,relief=SOLID,borderwidth=1,
font=('courier',12,''),cursor='hand2',width=21,height=10,
takefocus=FALSE,highlightthickness=0,wrap=NONE)
2001-11-03 01:07:28 -04:00
text=self.textHighlightSample
text.bind('<Double-Button-1>',lambda e: 'break')
text.bind('<B1-Motion>',lambda e: 'break')
2002-02-10 22:20:53 -04:00
textAndTags=(('#you can click here','comment'),('\n','normal'),
2001-11-03 10:54:25 -04:00
('#to choose items','comment'),('\n','normal'),('def','keyword'),
(' ','normal'),('func','definition'),('(param):','normal'),
('\n ','normal'),('"""string"""','string'),('\n var0 = ','normal'),
2001-11-04 07:53:10 -04:00
("'string'",'string'),('\n var1 = ','normal'),("'selected'",'hilite'),
('\n var2 = ','normal'),("'found'",'hit'),('\n\n','normal'),
2001-11-04 03:03:08 -04:00
(' error ','error'),(' ','normal'),('cursor |','cursor'),
2001-11-04 07:53:10 -04:00
('\n ','normal'),('shell','console'),(' ','normal'),('stdout','stdout'),
(' ','normal'),('stderr','stderr'),('\n','normal'))
2001-11-03 10:54:25 -04:00
for txTa in textAndTags:
text.insert(END,txTa[0],txTa[1])
for element in self.themeElements.keys():
text.tag_bind(self.themeElements[element][0],'<ButtonPress-1>',
lambda event,elem=element: event.widget.winfo_toplevel()
.highlightTarget.set(elem))
2001-11-03 01:07:28 -04:00
text.config(state=DISABLED)
self.frameColourSet=Frame(frameCustom,relief=SOLID,borderwidth=1)
2001-10-29 07:19:46 -04:00
frameFgBg=Frame(frameCustom)
labelCustomTitle=Label(frameCustom,text='Set Custom Highlighting')
2001-11-03 01:07:28 -04:00
buttonSetColour=Button(self.frameColourSet,text='Choose Colour for :',
2001-11-03 10:54:25 -04:00
command=self.GetColour,highlightthickness=0)
2001-11-03 01:07:28 -04:00
self.optMenuHighlightTarget=DynOptionMenu(self.frameColourSet,
2001-11-03 10:54:25 -04:00
self.highlightTarget,None,highlightthickness=0)#,command=self.SetHighlightTargetBinding
2001-10-29 07:19:46 -04:00
self.radioFg=Radiobutton(frameFgBg,variable=self.fgHilite,
2001-11-21 01:56:26 -04:00
value=1,text='Foreground',command=self.SetColourSampleBinding)
2001-10-29 07:19:46 -04:00
self.radioBg=Radiobutton(frameFgBg,variable=self.fgHilite,
2001-11-21 01:56:26 -04:00
value=0,text='Background',command=self.SetColourSampleBinding)
2001-10-29 07:19:46 -04:00
self.fgHilite.set(1)
2001-08-04 10:58:22 -03:00
buttonSaveCustomTheme=Button(frameCustom,
text='Save as New Custom Theme',command=self.SaveAsNewTheme)
#frameTheme
labelThemeTitle=Label(frameTheme,text='Select a Highlighting Theme')
labelTypeTitle=Label(frameTheme,text='Select : ')
2001-11-04 07:53:10 -04:00
self.radioThemeBuiltin=Radiobutton(frameTheme,variable=self.themeIsBuiltin,
value=1,command=self.SetThemeType,text='a Built-in Theme')
self.radioThemeCustom=Radiobutton(frameTheme,variable=self.themeIsBuiltin,
value=0,command=self.SetThemeType,text='a Custom Theme')
self.optMenuThemeBuiltin=DynOptionMenu(frameTheme,
2001-10-29 07:19:46 -04:00
self.builtinTheme,None,command=None)
self.optMenuThemeCustom=DynOptionMenu(frameTheme,
2001-10-29 07:19:46 -04:00
self.customTheme,None,command=None)
2002-02-17 21:43:11 -04:00
self.buttonDeleteCustomTheme=Button(frameTheme,text='Delete Custom Theme',
command=self.DeleteCustomTheme)
##widget packing
#body
2001-08-04 10:58:22 -03:00
frameCustom.pack(side=LEFT,padx=5,pady=10,expand=TRUE,fill=BOTH)
frameTheme.pack(side=LEFT,padx=5,pady=10,fill=Y)
#frameCustom
labelCustomTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
2001-11-03 01:07:28 -04:00
self.frameColourSet.pack(side=TOP,padx=5,pady=5,expand=TRUE,fill=X)
2001-10-29 07:19:46 -04:00
frameFgBg.pack(side=TOP,padx=5,pady=0)
2001-11-03 01:07:28 -04:00
self.textHighlightSample.pack(side=TOP,padx=5,pady=5,expand=TRUE,
fill=BOTH)
2001-11-03 10:54:25 -04:00
buttonSetColour.pack(side=TOP,expand=TRUE,fill=X,padx=8,pady=4)
self.optMenuHighlightTarget.pack(side=TOP,expand=TRUE,fill=X,padx=8,pady=3)
2001-10-29 07:19:46 -04:00
self.radioFg.pack(side=LEFT,anchor=E)
self.radioBg.pack(side=RIGHT,anchor=W)
2001-08-04 10:58:22 -03:00
buttonSaveCustomTheme.pack(side=BOTTOM,fill=X,padx=5,pady=5)
#frameTheme
labelThemeTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
labelTypeTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
self.radioThemeBuiltin.pack(side=TOP,anchor=W,padx=5)
self.radioThemeCustom.pack(side=TOP,anchor=W,padx=5,pady=2)
self.optMenuThemeBuiltin.pack(side=TOP,fill=X,padx=5,pady=5)
self.optMenuThemeCustom.pack(side=TOP,fill=X,anchor=W,padx=5,pady=5)
2001-08-04 10:58:22 -03:00
self.buttonDeleteCustomTheme.pack(side=TOP,fill=X,padx=5,pady=5)
return frame
def CreatePageKeys(self):
2001-08-04 10:58:22 -03:00
#tkVars
2001-11-21 01:56:26 -04:00
self.bindingTarget=StringVar(self)
self.builtinKeys=StringVar(self)
self.customKeys=StringVar(self)
2002-02-10 22:20:53 -04:00
self.keysAreBuiltin=BooleanVar(self)
2002-01-22 01:56:40 -04:00
self.keyBinding=StringVar(self)
2001-08-04 10:58:22 -03:00
##widget creation
#body frame
2001-12-05 03:54:07 -04:00
frame=self.tabPages.pages['Keys']['page']
2001-08-04 10:58:22 -03:00
#body section frames
frameCustom=Frame(frame,borderwidth=2,relief=GROOVE)
frameKeySets=Frame(frame,borderwidth=2,relief=GROOVE)
#frameCustom
frameTarget=Frame(frameCustom)
labelCustomTitle=Label(frameCustom,text='Set Custom Key Bindings')
2002-01-18 20:29:54 -04:00
labelTargetTitle=Label(frameTarget,text='Action - Key(s)')
scrollTargetY=Scrollbar(frameTarget)
scrollTargetX=Scrollbar(frameTarget,orient=HORIZONTAL)
self.listBindings=Listbox(frameTarget,takefocus=FALSE,
exportselection=FALSE)
self.listBindings.bind('<ButtonRelease-1>',self.KeyBindingSelected)
2002-01-18 20:29:54 -04:00
scrollTargetY.config(command=self.listBindings.yview)
scrollTargetX.config(command=self.listBindings.xview)
self.listBindings.config(yscrollcommand=scrollTargetY.set)
self.listBindings.config(xscrollcommand=scrollTargetX.set)
self.buttonNewKeys=Button(frameCustom,text='Get New Keys for Selection',
command=self.GetNewKeys,state=DISABLED)
buttonSaveCustomKeys=Button(frameCustom,
text='Save as New Custom Key Set',command=self.SaveAsNewKeySet)
2001-08-04 10:58:22 -03:00
#frameKeySets
2001-08-05 05:00:28 -03:00
labelKeysTitle=Label(frameKeySets,text='Select a Key Set')
2001-08-04 10:58:22 -03:00
labelTypeTitle=Label(frameKeySets,text='Select : ')
2002-02-10 22:20:53 -04:00
self.radioKeysBuiltin=Radiobutton(frameKeySets,variable=self.keysAreBuiltin,
2001-11-04 07:53:10 -04:00
value=1,command=self.SetKeysType,text='a Built-in Key Set')
2002-02-10 22:20:53 -04:00
self.radioKeysCustom=Radiobutton(frameKeySets,variable=self.keysAreBuiltin,
2001-11-04 07:53:10 -04:00
value=0,command=self.SetKeysType,text='a Custom Key Set')
self.optMenuKeysBuiltin=DynOptionMenu(frameKeySets,
self.builtinKeys,None,command=None)
self.optMenuKeysCustom=DynOptionMenu(frameKeySets,
self.customKeys,None,command=None)
2002-02-17 21:43:11 -04:00
self.buttonDeleteCustomKeys=Button(frameKeySets,text='Delete Custom Key Set',
command=self.DeleteCustomKeys)
2001-08-04 10:58:22 -03:00
##widget packing
#body
frameCustom.pack(side=LEFT,padx=5,pady=5,expand=TRUE,fill=BOTH)
frameKeySets.pack(side=LEFT,padx=5,pady=5,fill=Y)
#frameCustom
labelCustomTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
buttonSaveCustomKeys.pack(side=BOTTOM,fill=X,padx=5,pady=5)
self.buttonNewKeys.pack(side=BOTTOM,fill=X,padx=5,pady=5)
2002-01-18 20:29:54 -04:00
frameTarget.pack(side=LEFT,padx=5,pady=5,expand=TRUE,fill=BOTH)
#frame target
frameTarget.columnconfigure(0,weight=1)
frameTarget.rowconfigure(1,weight=1)
labelTargetTitle.grid(row=0,column=0,columnspan=2,sticky=W)
self.listBindings.grid(row=1,column=0,sticky=NSEW)
scrollTargetY.grid(row=1,column=1,sticky=NS)
scrollTargetX.grid(row=2,column=0,sticky=EW)
2001-08-04 10:58:22 -03:00
#frameKeySets
labelKeysTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
labelTypeTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
self.radioKeysBuiltin.pack(side=TOP,anchor=W,padx=5)
self.radioKeysCustom.pack(side=TOP,anchor=W,padx=5,pady=2)
2001-08-04 10:58:22 -03:00
self.optMenuKeysBuiltin.pack(side=TOP,fill=X,padx=5,pady=5)
self.optMenuKeysCustom.pack(side=TOP,fill=X,anchor=W,padx=5,pady=5)
self.buttonDeleteCustomKeys.pack(side=TOP,fill=X,padx=5,pady=5)
return frame
def CreatePageGeneral(self):
#tkVars
2001-11-21 01:56:26 -04:00
self.winWidth=StringVar(self)
self.winHeight=StringVar(self)
self.startupEdit=IntVar(self)
self.userHelpBrowser=BooleanVar(self)
self.helpBrowser=StringVar(self)
#widget creation
#body
2001-12-05 03:54:07 -04:00
frame=self.tabPages.pages['General']['page']
#body section frames
frameRun=Frame(frame,borderwidth=2,relief=GROOVE)
frameWinSize=Frame(frame,borderwidth=2,relief=GROOVE)
frameHelp=Frame(frame,borderwidth=2,relief=GROOVE)
#frameRun
labelRunTitle=Label(frameRun,text='Startup Preferences')
labelRunChoiceTitle=Label(frameRun,text='On startup : ')
radioStartupEdit=Radiobutton(frameRun,variable=self.startupEdit,
value=1,command=self.SetKeysType,text="open Edit Window")
radioStartupShell=Radiobutton(frameRun,variable=self.startupEdit,
value=0,command=self.SetKeysType,text='open Shell Window')
#frameWinSize
labelWinSizeTitle=Label(frameWinSize,text='Initial Window Size'+
' (in characters)')
labelWinWidthTitle=Label(frameWinSize,text='Width')
entryWinWidth=Entry(frameWinSize,textvariable=self.winWidth,
width=3)
labelWinHeightTitle=Label(frameWinSize,text='Height')
entryWinHeight=Entry(frameWinSize,textvariable=self.winHeight,
width=3)
#frameHelp
labelHelpTitle=Label(frameHelp,text='Help Options')
frameHelpList=Frame(frameHelp)
frameHelpListButtons=Frame(frameHelpList)
labelHelpListTitle=Label(frameHelpList,text='Additional (html) Help Sources:')
scrollHelpList=Scrollbar(frameHelpList)
self.listHelp=Listbox(frameHelpList,height=5,takefocus=FALSE,
exportselection=FALSE)
scrollHelpList.config(command=self.listHelp.yview)
self.listHelp.config(yscrollcommand=scrollHelpList.set)
self.listHelp.bind('<ButtonRelease-1>',self.HelpSourceSelected)
self.buttonHelpListEdit=Button(frameHelpListButtons,text='Edit',
state=DISABLED,width=8,command=self.HelpListItemEdit)
self.buttonHelpListAdd=Button(frameHelpListButtons,text='Add',
width=8,command=self.HelpListItemAdd)
self.buttonHelpListRemove=Button(frameHelpListButtons,text='Remove',
state=DISABLED,width=8,command=self.HelpListItemRemove)
# the following is better handled by the BROWSER environment
# variable under unix/linux
#checkHelpBrowser=Checkbutton(frameHelp,variable=self.userHelpBrowser,
# onvalue=1,offvalue=0,text='user specified (html) help browser:',
# command=self.OnCheckUserHelpBrowser)
#self.entryHelpBrowser=Entry(frameHelp,textvariable=self.helpBrowser,
# width=40)
#widget packing
#body
frameRun.pack(side=TOP,padx=5,pady=5,fill=X)
frameWinSize.pack(side=TOP,padx=5,pady=5,fill=X)
frameHelp.pack(side=TOP,padx=5,pady=5,expand=TRUE,fill=BOTH)
#frameRun
labelRunTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
labelRunChoiceTitle.pack(side=LEFT,anchor=W,padx=5,pady=5)
radioStartupEdit.pack(side=LEFT,anchor=W,padx=5,pady=5)
radioStartupShell.pack(side=LEFT,anchor=W,padx=5,pady=5)
#frameWinSize
2002-01-18 20:29:54 -04:00
labelWinSizeTitle.pack(side=LEFT,anchor=W,padx=5,pady=5)
entryWinHeight.pack(side=RIGHT,anchor=E,padx=10,pady=5)
labelWinHeightTitle.pack(side=RIGHT,anchor=E,pady=5)
entryWinWidth.pack(side=RIGHT,anchor=E,padx=10,pady=5)
labelWinWidthTitle.pack(side=RIGHT,anchor=E,pady=5)
#frameHelp
labelHelpTitle.pack(side=TOP,anchor=W,padx=5,pady=5)
frameHelpListButtons.pack(side=RIGHT,padx=5,pady=5,fill=Y)
frameHelpList.pack(side=TOP,padx=5,pady=5,expand=TRUE,fill=BOTH)
labelHelpListTitle.pack(side=TOP,anchor=W)
scrollHelpList.pack(side=RIGHT,anchor=W,fill=Y)
self.listHelp.pack(side=LEFT,anchor=E,expand=TRUE,fill=BOTH)
self.buttonHelpListEdit.pack(side=TOP,anchor=W,pady=5)
self.buttonHelpListAdd.pack(side=TOP,anchor=W)
self.buttonHelpListRemove.pack(side=TOP,anchor=W,pady=5)
#checkHelpBrowser.pack(side=TOP,anchor=W,padx=5)
#self.entryHelpBrowser.pack(side=TOP,anchor=W,padx=5,pady=5)
return frame
2002-01-22 01:56:40 -04:00
def AttachVarCallbacks(self):
self.fontSize.trace_variable('w',self.VarChanged_fontSize)
self.fontName.trace_variable('w',self.VarChanged_fontName)
self.fontBold.trace_variable('w',self.VarChanged_fontBold)
self.spaceNum.trace_variable('w',self.VarChanged_spaceNum)
2002-03-11 22:33:52 -04:00
#self.tabCols.trace_variable('w',self.VarChanged_tabCols)
2002-01-22 01:56:40 -04:00
self.indentBySpaces.trace_variable('w',self.VarChanged_indentBySpaces)
self.colour.trace_variable('w',self.VarChanged_colour)
2002-02-10 22:20:53 -04:00
self.builtinTheme.trace_variable('w',self.VarChanged_builtinTheme)
self.customTheme.trace_variable('w',self.VarChanged_customTheme)
self.themeIsBuiltin.trace_variable('w',self.VarChanged_themeIsBuiltin)
self.highlightTarget.trace_variable('w',self.VarChanged_highlightTarget)
2002-01-22 01:56:40 -04:00
self.keyBinding.trace_variable('w',self.VarChanged_keyBinding)
2002-02-10 22:20:53 -04:00
self.builtinKeys.trace_variable('w',self.VarChanged_builtinKeys)
self.customKeys.trace_variable('w',self.VarChanged_customKeys)
self.keysAreBuiltin.trace_variable('w',self.VarChanged_keysAreBuiltin)
2002-01-22 01:56:40 -04:00
self.winWidth.trace_variable('w',self.VarChanged_winWidth)
self.winHeight.trace_variable('w',self.VarChanged_winHeight)
self.startupEdit.trace_variable('w',self.VarChanged_startupEdit)
2002-02-10 22:20:53 -04:00
2002-01-22 01:56:40 -04:00
def VarChanged_fontSize(self,*params):
value=self.fontSize.get()
self.AddChangedItem('main','EditorWindow','font-size',value)
def VarChanged_fontName(self,*params):
value=self.fontName.get()
self.AddChangedItem('main','EditorWindow','font',value)
def VarChanged_fontBold(self,*params):
value=self.fontBold.get()
self.AddChangedItem('main','EditorWindow','font-bold',value)
def VarChanged_indentBySpaces(self,*params):
value=self.indentBySpaces.get()
self.AddChangedItem('main','Indent','use-spaces',value)
def VarChanged_spaceNum(self,*params):
value=self.spaceNum.get()
self.AddChangedItem('main','Indent','num-spaces',value)
2002-03-11 22:33:52 -04:00
#def VarChanged_tabCols(self,*params):
# value=self.tabCols.get()
# self.AddChangedItem('main','Indent','tab-cols',value)
2002-01-22 01:56:40 -04:00
def VarChanged_colour(self,*params):
2002-02-10 22:20:53 -04:00
self.OnNewColourSet()
def VarChanged_builtinTheme(self,*params):
value=self.builtinTheme.get()
self.AddChangedItem('main','Theme','name',value)
self.PaintThemeSample()
def VarChanged_customTheme(self,*params):
value=self.customTheme.get()
2002-02-17 21:43:11 -04:00
if value != '- no custom themes -':
self.AddChangedItem('main','Theme','name',value)
self.PaintThemeSample()
2002-02-10 22:20:53 -04:00
def VarChanged_themeIsBuiltin(self,*params):
value=self.themeIsBuiltin.get()
self.AddChangedItem('main','Theme','default',value)
2002-03-04 20:25:58 -04:00
if value:
self.VarChanged_builtinTheme()
else:
self.VarChanged_customTheme()
2002-02-10 22:20:53 -04:00
def VarChanged_highlightTarget(self,*params):
self.SetHighlightTarget()
2002-01-22 07:35:50 -04:00
2002-01-22 01:56:40 -04:00
def VarChanged_keyBinding(self,*params):
2002-01-22 07:35:50 -04:00
value=self.keyBinding.get()
keySet=self.customKeys.get()
event=self.listBindings.get(ANCHOR).split()[0]
2002-01-31 21:33:36 -04:00
if idleConf.IsCoreBinding(event):
#this is a core keybinding
self.AddChangedItem('keys',keySet,event,value)
else: #this is an extension key binding
extName=idleConf.GetExtnNameForEvent(event)
extKeybindSection=extName+'_cfgBindings'
self.AddChangedItem('extensions',extKeybindSection,event,value)
2002-02-10 22:20:53 -04:00
def VarChanged_builtinKeys(self,*params):
value=self.builtinKeys.get()
self.AddChangedItem('main','Keys','name',value)
self.LoadKeysList(value)
def VarChanged_customKeys(self,*params):
value=self.customKeys.get()
2002-02-17 21:43:11 -04:00
if value != '- no custom keys -':
self.AddChangedItem('main','Keys','name',value)
self.LoadKeysList(value)
2002-02-10 22:20:53 -04:00
def VarChanged_keysAreBuiltin(self,*params):
value=self.keysAreBuiltin.get()
self.AddChangedItem('main','Keys','default',value)
if value:
2002-03-04 20:25:58 -04:00
self.VarChanged_builtinKeys()
2002-02-10 22:20:53 -04:00
else:
2002-03-04 20:25:58 -04:00
self.VarChanged_customKeys()
2002-02-10 22:20:53 -04:00
2002-01-22 01:56:40 -04:00
def VarChanged_winWidth(self,*params):
2002-01-22 07:35:50 -04:00
value=self.winWidth.get()
self.AddChangedItem('main','EditorWindow','width',value)
2002-01-22 01:56:40 -04:00
def VarChanged_winHeight(self,*params):
2002-01-22 07:35:50 -04:00
value=self.winHeight.get()
self.AddChangedItem('main','EditorWindow','height',value)
2002-01-22 01:56:40 -04:00
def VarChanged_startupEdit(self,*params):
2002-01-22 07:35:50 -04:00
value=self.startupEdit.get()
self.AddChangedItem('main','General','editor-on-startup',value)
2002-01-22 01:56:40 -04:00
2002-01-31 21:33:36 -04:00
def ResetChangedItems(self):
#When any config item is changed in this dialog, an entry
2002-01-31 21:33:36 -04:00
#should be made in the relevant section (config type) of this
#dictionary. The key should be the config file section name and the
#value a dictionary, whose key:value pairs are item=value pairs for
#that config file section.
self.changedItems={'main':{},'highlight':{},'keys':{},'extensions':{}}
2002-01-22 01:56:40 -04:00
def AddChangedItem(self,type,section,item,value):
2002-01-29 04:35:29 -04:00
value=str(value) #make sure we use a string
2002-01-22 01:56:40 -04:00
if not self.changedItems[type].has_key(section):
self.changedItems[type][section]={}
self.changedItems[type][section][item]=value
def GetDefaultItems(self):
dItems={'main':{},'highlight':{},'keys':{},'extensions':{}}
for configType in dItems.keys():
sections=idleConf.GetSectionList('default',configType)
for section in sections:
dItems[configType][section]={}
options=idleConf.defaultCfg[configType].GetOptionList(section)
for option in options:
dItems[configType][section][option]=(
idleConf.defaultCfg[configType].Get(section,option))
return dItems
def SetThemeType(self):
if self.themeIsBuiltin.get():
self.optMenuThemeBuiltin.config(state=NORMAL)
self.optMenuThemeCustom.config(state=DISABLED)
self.buttonDeleteCustomTheme.config(state=DISABLED)
else:
self.optMenuThemeBuiltin.config(state=DISABLED)
2002-01-24 02:02:50 -04:00
self.radioThemeCustom.config(state=NORMAL)
self.optMenuThemeCustom.config(state=NORMAL)
self.buttonDeleteCustomTheme.config(state=NORMAL)
def SetKeysType(self):
2002-02-10 22:20:53 -04:00
if self.keysAreBuiltin.get():
self.optMenuKeysBuiltin.config(state=NORMAL)
self.optMenuKeysCustom.config(state=DISABLED)
self.buttonDeleteCustomKeys.config(state=DISABLED)
else:
self.optMenuKeysBuiltin.config(state=DISABLED)
2002-01-24 02:02:50 -04:00
self.radioKeysCustom.config(state=NORMAL)
self.optMenuKeysCustom.config(state=NORMAL)
self.buttonDeleteCustomKeys.config(state=NORMAL)
2002-01-24 02:02:50 -04:00
def GetNewKeys(self):
listIndex=self.listBindings.index(ANCHOR)
binding=self.listBindings.get(listIndex)
bindName=binding.split()[0] #first part, up to first space
2002-02-10 23:45:22 -04:00
if self.keysAreBuiltin.get():
currentKeySetName=self.builtinKeys.get()
else:
currentKeySetName=self.customKeys.get()
currentBindings=idleConf.GetCurrentKeySet()
if currentKeySetName in self.changedItems['keys'].keys(): #unsaved changes
keySetChanges=self.changedItems['keys'][currentKeySetName]
for event in keySetChanges.keys():
currentBindings[event]=keySetChanges[event].split()
currentKeySequences=currentBindings.values()
newKeys=GetKeysDialog(self,'Get New Keys',bindName,
currentKeySequences).result
if newKeys: #new keys were specified
2002-02-10 22:20:53 -04:00
if self.keysAreBuiltin.get(): #current key set is a built-in
2002-01-24 02:02:50 -04:00
message=('Your changes will be saved as a new Custom Key Set. '+
'Enter a name for your new Custom Key Set below.')
newKeySet=self.GetNewKeysName(message)
if not newKeySet: #user cancelled custom key set creation
2002-01-24 02:02:50 -04:00
self.listBindings.select_set(listIndex)
self.listBindings.select_anchor(listIndex)
return
else: #create new custom key set based on previously active key set
self.CreateNewKeySet(newKeySet)
2002-01-24 02:02:50 -04:00
self.listBindings.delete(listIndex)
self.listBindings.insert(listIndex,bindName+' - '+newKeys)
2002-01-24 02:02:50 -04:00
self.listBindings.select_set(listIndex)
self.listBindings.select_anchor(listIndex)
2002-02-10 22:20:53 -04:00
self.keyBinding.set(newKeys)
2002-01-24 02:02:50 -04:00
else:
self.listBindings.select_set(listIndex)
self.listBindings.select_anchor(listIndex)
def GetNewKeysName(self,message):
2002-02-17 21:43:11 -04:00
usedNames=(idleConf.GetSectionList('user','keys')+
idleConf.GetSectionList('default','keys'))
newKeySet=GetCfgSectionNameDialog(self,'New Custom Key Set',
message,usedNames).result
return newKeySet
def SaveAsNewKeySet(self):
newKeysName=self.GetNewKeysName('New Key Set Name:')
if newKeysName:
self.CreateNewKeySet(newKeysName)
2002-01-24 02:02:50 -04:00
def KeyBindingSelected(self,event):
self.buttonNewKeys.config(state=NORMAL)
def CreateNewKeySet(self,newKeySetName):
#creates new custom key set based on the previously active key set,
#and makes the new key set active
2002-02-10 22:20:53 -04:00
if self.keysAreBuiltin.get():
prevKeySetName=self.builtinKeys.get()
2002-01-24 02:02:50 -04:00
else:
2002-02-10 22:20:53 -04:00
prevKeySetName=self.customKeys.get()
prevKeys=idleConf.GetCoreKeys(prevKeySetName)
newKeys={}
for event in prevKeys.keys(): #add key set to changed items
2002-01-24 02:02:50 -04:00
eventName=event[2:-2] #trim off the angle brackets
2002-02-10 22:20:53 -04:00
binding=string.join(prevKeys[event])
newKeys[eventName]=binding
#handle any unsaved changes to prev key set
if prevKeySetName in self.changedItems['keys'].keys():
keySetChanges=self.changedItems['keys'][prevKeySetName]
for event in keySetChanges.keys():
newKeys[event]=keySetChanges[event]
#save the new theme
self.SaveNewKeySet(newKeySetName,newKeys)
2002-01-24 02:02:50 -04:00
#change gui over to the new key set
customKeyList=idleConf.GetSectionList('user','keys')
customKeyList.sort()
self.optMenuKeysCustom.SetMenu(customKeyList,newKeySetName)
2002-02-10 22:20:53 -04:00
self.keysAreBuiltin.set(0)
2002-01-24 02:02:50 -04:00
self.SetKeysType()
2002-02-10 22:20:53 -04:00
def LoadKeysList(self,keySetName):
reselect=0
newKeySet=0
if self.listBindings.curselection():
reselect=1
listIndex=self.listBindings.index(ANCHOR)
keySet=idleConf.GetKeySet(keySetName)
bindNames=keySet.keys()
bindNames.sort()
self.listBindings.delete(0,END)
for bindName in bindNames:
key=string.join(keySet[bindName]) #make key(s) into a string
bindName=bindName[2:-2] #trim off the angle brackets
if keySetName in self.changedItems['keys'].keys():
#handle any unsaved changes to this key set
if bindName in self.changedItems['keys'][keySetName].keys():
key=self.changedItems['keys'][keySetName][bindName]
self.listBindings.insert(END, bindName+' - '+key)
if reselect:
self.listBindings.see(listIndex)
self.listBindings.select_set(listIndex)
self.listBindings.select_anchor(listIndex)
2002-02-17 21:43:11 -04:00
def DeleteCustomKeys(self):
keySetName=self.customKeys.get()
if not tkMessageBox.askyesno('Delete Key Set','Are you sure you wish '+
'to delete the key set '+`keySetName`+' ?'):
return
#remove key set from config
idleConf.userCfg['keys'].remove_section(keySetName)
if self.changedItems['keys'].has_key(keySetName):
del(self.changedItems['keys'][keySetName])
#write changes
idleConf.userCfg['keys'].Save()
#reload user key set list
itemList=idleConf.GetSectionList('user','keys')
itemList.sort()
if not itemList:
self.radioKeysCustom.config(state=DISABLED)
self.optMenuKeysCustom.SetMenu(itemList,'- no custom keys -')
else:
self.optMenuKeysCustom.SetMenu(itemList,itemList[0])
#revert to default key set
self.keysAreBuiltin.set(idleConf.defaultCfg['main'].Get('Keys','default'))
self.builtinKeys.set(idleConf.defaultCfg['main'].Get('Keys','name'))
#user can't back out of these changes, they must be applied now
self.Apply()
self.SetKeysType()
def DeleteCustomTheme(self):
themeName=self.customTheme.get()
if not tkMessageBox.askyesno('Delete Theme','Are you sure you wish '+
'to delete the theme '+`themeName`+' ?'):
return
#remove theme from config
idleConf.userCfg['highlight'].remove_section(themeName)
if self.changedItems['highlight'].has_key(themeName):
del(self.changedItems['highlight'][themeName])
#write changes
idleConf.userCfg['highlight'].Save()
#reload user theme list
itemList=idleConf.GetSectionList('user','highlight')
itemList.sort()
if not itemList:
self.radioThemeCustom.config(state=DISABLED)
self.optMenuThemeCustom.SetMenu(itemList,'- no custom themes -')
else:
self.optMenuThemeCustom.SetMenu(itemList,itemList[0])
#revert to default theme
self.themeIsBuiltin.set(idleConf.defaultCfg['main'].Get('Theme','default'))
self.builtinTheme.set(idleConf.defaultCfg['main'].Get('Theme','name'))
#user can't back out of these changes, they must be applied now
self.Apply()
self.SetThemeType()
def GetColour(self):
target=self.highlightTarget.get()
2002-02-10 22:20:53 -04:00
prevColour=self.frameColourSet.cget('bg')
rgbTuplet, colourString = tkColorChooser.askcolor(parent=self,
2002-02-10 22:20:53 -04:00
title='Pick new colour for : '+target,initialcolor=prevColour)
if colourString and (colourString!=prevColour):
#user didn't cancel, and they chose a new colour
2002-01-24 02:02:50 -04:00
if self.themeIsBuiltin.get(): #current theme is a built-in
message=('Your changes will be saved as a new Custom Theme. '+
'Enter a name for your new Custom Theme below.')
newTheme=self.GetNewThemeName(message)
if not newTheme: #user cancelled custom theme creation
2002-01-24 02:02:50 -04:00
return
else: #create new custom theme based on previously active theme
self.CreateNewTheme(newTheme)
2002-02-10 22:20:53 -04:00
self.colour.set(colourString)
else: #current theme is user defined
self.colour.set(colourString)
2002-02-10 22:20:53 -04:00
def OnNewColourSet(self):
newColour=self.colour.get()
self.frameColourSet.config(bg=newColour)#set sample
if self.fgHilite.get(): plane='foreground'
else: plane='background'
sampleElement=self.themeElements[self.highlightTarget.get()][0]
apply(self.textHighlightSample.tag_config,
(sampleElement,),{plane:newColour})
theme=self.customTheme.get()
themeElement=sampleElement+'-'+plane
self.AddChangedItem('highlight',theme,themeElement,newColour)
def GetNewThemeName(self,message):
2002-02-17 21:43:11 -04:00
usedNames=(idleConf.GetSectionList('user','highlight')+
idleConf.GetSectionList('default','highlight'))
newTheme=GetCfgSectionNameDialog(self,'New Custom Theme',
message,usedNames).result
return newTheme
def SaveAsNewTheme(self):
newThemeName=self.GetNewThemeName('New Theme Name:')
if newThemeName:
self.CreateNewTheme(newThemeName)
2002-01-24 02:02:50 -04:00
def CreateNewTheme(self,newThemeName):
#creates new custom theme based on the previously active theme,
#and makes the new theme active
if self.themeIsBuiltin.get():
themeType='default'
themeName=self.builtinTheme.get()
else:
themeType='user'
themeName=self.customTheme.get()
newTheme=idleConf.GetThemeDict(themeType,themeName)
2002-02-10 22:20:53 -04:00
#apply any of the old theme's unsaved changes to the new theme
if themeName in self.changedItems['highlight'].keys():
themeChanges=self.changedItems['highlight'][themeName]
for element in themeChanges.keys():
newTheme[element]=themeChanges[element]
#save the new theme
self.SaveNewTheme(newThemeName,newTheme)
2002-01-24 02:02:50 -04:00
#change gui over to the new theme
customThemeList=idleConf.GetSectionList('user','highlight')
customThemeList.sort()
self.optMenuThemeCustom.SetMenu(customThemeList,newThemeName)
self.themeIsBuiltin.set(0)
self.SetThemeType()
2002-01-22 01:56:40 -04:00
def OnListFontButtonRelease(self,event):
self.fontName.set(self.listFontName.get(ANCHOR))
self.SetFontSample()
2002-01-22 01:56:40 -04:00
def SetFontSample(self,event=None):
fontName=self.fontName.get()
if self.fontBold.get():
fontWeight=tkFont.BOLD
else:
fontWeight=tkFont.NORMAL
self.editFont.config(size=self.fontSize.get(),
weight=fontWeight,family=fontName)
def SetHighlightTarget(self):
if self.highlightTarget.get()=='Cursor': #bg not possible
self.radioFg.config(state=DISABLED)
self.radioBg.config(state=DISABLED)
self.fgHilite.set(1)
else: #both fg and bg can be set
self.radioFg.config(state=NORMAL)
self.radioBg.config(state=NORMAL)
self.fgHilite.set(1)
self.SetColourSample()
def SetColourSampleBinding(self,*args):
self.SetColourSample()
def SetColourSample(self):
#set the colour smaple area
tag=self.themeElements[self.highlightTarget.get()][0]
if self.fgHilite.get(): plane='foreground'
else: plane='background'
colour=self.textHighlightSample.tag_cget(tag,plane)
self.frameColourSet.config(bg=colour)
2001-11-03 10:54:25 -04:00
def PaintThemeSample(self):
2001-11-04 07:53:10 -04:00
if self.themeIsBuiltin.get(): #a default theme
2001-11-04 03:03:08 -04:00
theme=self.builtinTheme.get()
else: #a user theme
theme=self.customTheme.get()
2002-02-10 22:20:53 -04:00
for elementTitle in self.themeElements.keys():
element=self.themeElements[elementTitle][0]
colours=idleConf.GetHighlight(theme,element)
if element=='cursor': #cursor sample needs special painting
colours['background']=idleConf.GetHighlight(theme,
'normal', fgBg='bg')
2002-02-10 22:20:53 -04:00
#handle any unsaved changes to this theme
if theme in self.changedItems['highlight'].keys():
themeDict=self.changedItems['highlight'][theme]
if themeDict.has_key(element+'-foreground'):
colours['foreground']=themeDict[element+'-foreground']
if themeDict.has_key(element+'-background'):
colours['background']=themeDict[element+'-background']
apply(self.textHighlightSample.tag_config,(element,),colours)
self.SetColourSample()
def OnCheckUserHelpBrowser(self):
if self.userHelpBrowser.get():
self.entryHelpBrowser.config(state=NORMAL)
else:
self.entryHelpBrowser.config(state=DISABLED)
def HelpSourceSelected(self,event):
self.SetHelpListButtonStates()
def SetHelpListButtonStates(self):
if self.listHelp.size()<1: #no entries in list
self.buttonHelpListEdit.config(state=DISABLED)
self.buttonHelpListRemove.config(state=DISABLED)
else: #there are some entries
if self.listHelp.curselection(): #there currently is a selection
self.buttonHelpListEdit.config(state=NORMAL)
self.buttonHelpListRemove.config(state=NORMAL)
else: #there currently is not a selection
self.buttonHelpListEdit.config(state=DISABLED)
self.buttonHelpListRemove.config(state=DISABLED)
def HelpListItemAdd(self):
helpSource=GetHelpSourceDialog(self,'New Help Source').result
if helpSource:
self.userHelpList.append( (helpSource[0],helpSource[1]) )
self.listHelp.insert(END,helpSource[0]+' '+helpSource[1])
self.UpdateUserHelpChangedItems()
self.SetHelpListButtonStates()
def HelpListItemEdit(self):
itemIndex=self.listHelp.index(ANCHOR)
helpSource=self.userHelpList[itemIndex]
newHelpSource=GetHelpSourceDialog(self,'Edit Help Source',
menuItem=helpSource[0],filePath=helpSource[1]).result
if (not newHelpSource) or (newHelpSource==helpSource):
return #no changes
self.userHelpList[itemIndex]=newHelpSource
self.listHelp.delete(itemIndex)
self.listHelp.insert(itemIndex,newHelpSource[0]+' '+newHelpSource[1])
self.UpdateUserHelpChangedItems()
self.SetHelpListButtonStates()
def HelpListItemRemove(self):
itemIndex=self.listHelp.index(ANCHOR)
del(self.userHelpList[itemIndex])
self.listHelp.delete(itemIndex)
self.UpdateUserHelpChangedItems()
self.SetHelpListButtonStates()
def UpdateUserHelpChangedItems(self):
#clear and rebuild the HelpFiles secion in self.changedItems
if self.changedItems['main'].has_key('HelpFiles'):
del(self.changedItems['main']['HelpFiles'])
for num in range(1,len(self.userHelpList)+1):
self.AddChangedItem('main','HelpFiles',str(num),
string.join(self.userHelpList[num-1],';'))
def LoadFontCfg(self):
##base editor font selection list
2001-09-24 06:43:17 -03:00
fonts=list(tkFont.families(self))
fonts.sort()
for font in fonts:
self.listFontName.insert(END,font)
configuredFont=idleConf.GetOption('main','EditorWindow','font',
default='courier')
2002-01-22 01:56:40 -04:00
self.fontName.set(configuredFont)
if configuredFont in fonts:
currentFontIndex=fonts.index(configuredFont)
self.listFontName.see(currentFontIndex)
self.listFontName.select_set(currentFontIndex)
2002-01-22 01:56:40 -04:00
self.listFontName.select_anchor(currentFontIndex)
##font size dropdown
2002-01-22 01:56:40 -04:00
fontSize=idleConf.GetOption('main','EditorWindow','font-size',
default='12')
self.optMenuFontSize.SetMenu(('10','11','12','13','14',
'16','18','20','22'),fontSize )
2002-01-22 01:56:40 -04:00
##fontWeight
self.fontBold.set(idleConf.GetOption('main','EditorWindow',
'font-bold',default=0,type='bool'))
##font sample
self.SetFontSample()
def LoadTabCfg(self):
##indent type radiobuttons
spaceIndent=idleConf.GetOption('main','Indent','use-spaces',
default=1,type='bool')
2002-01-22 01:56:40 -04:00
self.indentBySpaces.set(spaceIndent)
##indent sizes
spaceNum=idleConf.GetOption('main','Indent','num-spaces',
default=4,type='int')
#tabCols=idleConf.GetOption('main','Indent','tab-cols',
# default=4,type='int')
self.spaceNum.set(spaceNum)
#self.tabCols.set(tabCols)
2001-09-24 06:43:17 -03:00
2001-11-03 10:54:25 -04:00
def LoadThemeCfg(self):
##current theme type radiobutton
2001-11-04 07:53:10 -04:00
self.themeIsBuiltin.set(idleConf.GetOption('main','Theme','default',
2002-01-22 01:56:40 -04:00
type='bool',default=1))
##currently set theme
currentOption=idleConf.CurrentTheme()
2001-10-29 07:19:46 -04:00
##load available theme option menus
2001-11-04 07:53:10 -04:00
if self.themeIsBuiltin.get(): #default theme selected
itemList=idleConf.GetSectionList('default','highlight')
2002-01-24 02:02:50 -04:00
itemList.sort()
self.optMenuThemeBuiltin.SetMenu(itemList,currentOption)
itemList=idleConf.GetSectionList('user','highlight')
2002-01-24 02:02:50 -04:00
itemList.sort()
if not itemList:
self.radioThemeCustom.config(state=DISABLED)
self.customTheme.set('- no custom themes -')
else:
self.optMenuThemeCustom.SetMenu(itemList,itemList[0])
2001-11-03 10:54:25 -04:00
else: #user theme selected
itemList=idleConf.GetSectionList('user','highlight')
2002-01-24 02:02:50 -04:00
itemList.sort()
self.optMenuThemeCustom.SetMenu(itemList,currentOption)
itemList=idleConf.GetSectionList('default','highlight')
2002-01-24 02:02:50 -04:00
itemList.sort()
self.optMenuThemeBuiltin.SetMenu(itemList,itemList[0])
2001-10-29 07:19:46 -04:00
self.SetThemeType()
##load theme element option menu
2001-11-03 10:54:25 -04:00
themeNames=self.themeElements.keys()
themeNames.sort(self.__ThemeNameIndexCompare)
self.optMenuHighlightTarget.SetMenu(themeNames,themeNames[0])
self.PaintThemeSample()
self.SetHighlightTarget()
2001-11-03 10:54:25 -04:00
def __ThemeNameIndexCompare(self,a,b):
if self.themeElements[a][1]<self.themeElements[b][1]: return -1
elif self.themeElements[a][1]==self.themeElements[b][1]: return 0
else: return 1
2001-11-03 10:54:25 -04:00
def LoadKeyCfg(self):
##current keys type radiobutton
2002-02-10 22:20:53 -04:00
self.keysAreBuiltin.set(idleConf.GetOption('main','Keys','default',
2002-01-22 01:56:40 -04:00
type='bool',default=1))
##currently set keys
currentOption=idleConf.CurrentKeys()
2001-10-29 07:19:46 -04:00
##load available keyset option menus
2002-02-10 22:20:53 -04:00
if self.keysAreBuiltin.get(): #default theme selected
itemList=idleConf.GetSectionList('default','keys')
2002-01-24 02:02:50 -04:00
itemList.sort()
self.optMenuKeysBuiltin.SetMenu(itemList,currentOption)
itemList=idleConf.GetSectionList('user','keys')
2002-01-24 02:02:50 -04:00
itemList.sort()
if not itemList:
self.radioKeysCustom.config(state=DISABLED)
self.customKeys.set('- no custom keys -')
else:
self.optMenuKeysCustom.SetMenu(itemList,itemList[0])
2002-01-31 21:33:36 -04:00
else: #user key set selected
itemList=idleConf.GetSectionList('user','keys')
2002-01-24 02:02:50 -04:00
itemList.sort()
self.optMenuKeysCustom.SetMenu(itemList,currentOption)
itemList=idleConf.GetSectionList('default','keys')
2002-01-24 02:02:50 -04:00
itemList.sort()
self.optMenuKeysBuiltin.SetMenu(itemList,itemList[0])
self.SetKeysType()
2002-01-18 20:29:54 -04:00
##load keyset element list
2002-02-10 22:20:53 -04:00
keySetName=idleConf.CurrentKeys()
self.LoadKeysList(keySetName)
2002-01-18 20:29:54 -04:00
def LoadGeneralCfg(self):
#startup state
self.startupEdit.set(idleConf.GetOption('main','General',
'editor-on-startup',default=1,type='bool'))
2002-01-18 20:29:54 -04:00
#initial window size
self.winWidth.set(idleConf.GetOption('main','EditorWindow','width'))
self.winHeight.set(idleConf.GetOption('main','EditorWindow','height'))
#help browsing
self.userHelpList=idleConf.GetExtraHelpSourceList('user')
for helpItem in self.userHelpList:
self.listHelp.insert(END,helpItem[0]+' '+helpItem[1])
self.SetHelpListButtonStates()
#self.userHelpBrowser.set(idleConf.GetOption('main','General',
# 'user-help-browser',default=0,type='bool'))
#self.helpBrowser.set(idleConf.GetOption('main','General',
# 'user-help-browser-command',default=''))
#self.OnCheckUserHelpBrowser()
def LoadConfigs(self):
"""
load configuration from default and user config files and populate
the widgets on the config dialog pages.
"""
### fonts / tabs page
self.LoadFontCfg()
self.LoadTabCfg()
### highlighting page
2001-11-03 10:54:25 -04:00
self.LoadThemeCfg()
### keys page
2001-11-03 10:54:25 -04:00
self.LoadKeyCfg()
### general page
2002-01-18 20:29:54 -04:00
self.LoadGeneralCfg()
2002-02-10 22:20:53 -04:00
def SaveNewKeySet(self,keySetName,keySet):
"""
save a newly created core key set.
keySetName - string, the name of the new key set
keySet - dictionary containing the new key set
"""
if not idleConf.userCfg['keys'].has_section(keySetName):
idleConf.userCfg['keys'].add_section(keySetName)
for event in keySet.keys():
value=keySet[event]
idleConf.userCfg['keys'].SetOption(keySetName,event,value)
def SaveNewTheme(self,themeName,theme):
"""
save a newly created theme.
themeName - string, the name of the new theme
theme - dictionary containing the new theme
"""
if not idleConf.userCfg['highlight'].has_section(themeName):
idleConf.userCfg['highlight'].add_section(themeName)
for element in theme.keys():
value=theme[element]
idleConf.userCfg['highlight'].SetOption(themeName,element,value)
2002-01-29 04:35:29 -04:00
def SetUserValue(self,configType,section,item,value):
if idleConf.defaultCfg[configType].has_option(section,item):
if idleConf.defaultCfg[configType].Get(section,item)==value:
#the setting equals a default setting, remove it from user cfg
return idleConf.userCfg[configType].RemoveOption(section,item)
#if we got here set the option
return idleConf.userCfg[configType].SetOption(section,item,value)
2002-02-10 22:20:53 -04:00
def SaveAllChangedConfigs(self):
"""
2002-02-10 22:20:53 -04:00
save all configuration changes to user config files.
"""
#this section gets completely replaced
idleConf.userCfg['main'].remove_section('HelpFiles')
idleConf.userCfg['main'].Save()
for configType in self.changedItems.keys():
2002-01-29 04:35:29 -04:00
cfgTypeHasChanges=0
for section in self.changedItems[configType].keys():
for item in self.changedItems[configType][section].keys():
value=self.changedItems[configType][section][item]
2002-01-29 04:35:29 -04:00
if self.SetUserValue(configType,section,item,value):
cfgTypeHasChanges=1
if cfgTypeHasChanges:
idleConf.userCfg[configType].Save()
2002-01-31 21:33:36 -04:00
self.ResetChangedItems() #clear the changed items dict
2002-02-17 21:43:11 -04:00
def ActivateConfigChanges(self):
#things that need to be done to make
#applied config changes dynamic:
#update editor/shell font and repaint
#dynamically update indentation setttings
#update theme and repaint
#update keybindings and re-bind
#update user help sources menu
winInstances=self.parent.instanceDict.keys()
for instance in winInstances:
instance.ResetColorizer()
instance.ResetFont()
instance.ResetKeybindings()
instance.ResetExtraHelpMenu()
def Cancel(self):
self.destroy()
def Ok(self):
self.Apply()
self.destroy()
def Apply(self):
2002-02-10 22:20:53 -04:00
self.SaveAllChangedConfigs()
2002-02-17 21:43:11 -04:00
self.ActivateConfigChanges()
def Help(self):
2001-09-24 06:43:17 -03:00
pass
if __name__ == '__main__':
#test the dialog
root=Tk()
Button(root,text='Dialog',
2001-11-21 01:56:26 -04:00
command=lambda:ConfigDialog(root,'Settings')).pack()
2002-03-04 20:25:58 -04:00
root.instanceDict={}
root.mainloop()