e f1@sZdZddlTddljZddljZddlj Z ddl m Z ddl mZddlmZddlmZddlmZdd lmZdd lmZdd lmZGd d d eZdZidd6ZddZGddde Z!e"dkrVddl#Z#e#j$dddddddl%m&Z&e&endS)aIDLE Configuration Dialog: support user customization of IDLE by GUI Customize font faces, sizes, and colorization attributes. Set indentation defaults. Customize keybindings. Colorization and keybindings can be saved as user defined sets. Select startup options including shell/editor and default window size. Define additional help sources. Note that tab width in IDLE is currently fixed at eight due to Tk issues. Refer to comments in EditorWindow autoindent code for details. )*N)idleConf) DynOptionMenu) GetKeysDialog)GetCfgSectionNameDialog)GetHelpSourceDialog) TabbedPageSet) view_text) macosxSupportc@seZdZdddddZddZddZd d Zd d Zd dZddZ ddZ ddZ ddZ ddZ ddZddZddZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd)d*Zd+d,Zd-d.Zd/d0Zd1d2Zd3d4Zd5d6Zd7d8Zd9d:Zd;d<Zd=d>Z d?d@Z!dAdBZ"dCdDZ#dEdFZ$dGdHZ%dIdJZ&dKdLZ'dMdNZ(dOdPZ)dQdRZ*dSdTZ+dUdVZ,dWdXZ-dYdZd[Z.d\d]Z/d^d_Z0d`daZ1dbdcZ2dddeZ3dfdgZ4dhdiZ5djdkZ6dldmZ7dndoZ8dpdqZ9drdsZ:dtduZ;dvdwZ<dxdyZ=dzd{Z>d|d}Z?d~dZ@ddZAddZBddZCddZDddZEddZFddZGddZHddZIddZJddZKddZLddZMddZNdYS) ConfigDialogFcCstj||||_|r+i|_n|j|jdd|j|pTd|jd|jd|j |sdndfid6d 6d7d 6d8d6d9d6d:d6d;d6d<d6d=d6d>d"6d?d%6d@d(6dAd+6dBd.6dCd16|_ |j |j |j d2td3t|j||j|jd4|j|jj|j|j|s|j|jnd5S)Dz _htest - bool, change box location when running htest _utest - bool, don't wait_window when running unittest borderwidthzIDLE Preferencesz+%d+%dnormal00z Normal Textkeyword01zPython Keywords definition02zPython Definitionsbuiltin03zPython Builtinscomment04zPython Commentsstring05zPython Stringshilite06z Selected Texthit07z Found Textcursor08Cursorbreak09zEditor Breakpointconsole10zShell Normal Texterror11zShell Error Textstdout12zShell Stdout Textstderr13zShell Stderr TextheightwidthZWM_DELETE_WINDOWN)rr)zkeywordr)rr)rr)rr)zstringr)rr)r r!)zcursorr#)zbreakr&)r'r()zerrorr*)zstdoutr,)zstderrr.)Toplevel__init__parent instance_dictZ wm_withdraw configuretitleZgeometryZ winfo_rootxZ winfo_rooty themeElementsResetChangedItems CreateWidgetsZ resizableFALSEZ transientZgrab_setZprotocolCanceltabPagesZ focus_set LoadConfigsAttachVarCallbacksZ wm_deiconifyZ wait_window)selfr3r6Z_htestZ_utestr@9/opt/alt/python34/lib64/python3.4/idlelib/configDialog.pyr2sJ   !         zConfigDialog.__init__cCst|ddddddg|_|jjdtdtd t|j|j|j|j |j |j jdt dS) NZ page_namesz Fonts/Tabs HighlightingKeysGeneral Extensionssideexpandfill) rr<packTOPTRUEBOTHCreatePageFontTabCreatePageHighlightCreatePageKeysCreatePageGeneralCreatePageExtensionscreate_action_buttonsBOTTOM)r?r@r@rAr9Qs       zConfigDialog.CreateWidgetsc Cstjri}nidd6dd6}t|dd}t|dd}xud|jfd|jfd|jfd |jffD]=\}}t|d |d |d t|j d t ddqWt|ddddj d t |j d t |S)NpadxpadyOkApplyr;Helptextcommand takefocusrFrr/r r) r ZisAquaTkFramerYrZr;r[Buttonr:rILEFTrJrS)r?Z paddingArgsZouterZbuttonsZtxtcmdr@r@rArR]s     "z"ConfigDialog.create_action_buttonsc Cs|j}t||_t||_t||_t||_tj |d+|_ |j j dj }t|dddtdd }t|dddtdd }t|}t|}t|d tdd }t|d ddtdt|_|jjd|jt|}|jd|jj|jjd|jt|dd} t||jdd|j|_t|d|jddddddd|j} t|dt dd} t| d td|j dd|_!t|} t| d tdd} t"| d|jddd dd!dd"d#|_#|j$d$td%dd&dd't%d(t&|j$d$td%dd&dd(t'|j$d$t(d%dd&dd(t)|j$d$t(d%dd&dd(t)|j$d$t(d)t*|jj$d$td't%d(t)|j$d$td(t'| j$d$td)t*|jj$d$td)t*| j$d$td)t*d%d*| j$d$t(d%dd&dd't%d(t&|j!j$d't%d(t&| j$d$t(d(t)| j$d$t(d)t*d%d|j#j$d$t(d%dd(t)|S),Ncourier rz Fonts/Tabsr rXreliefr\z Base Editor Font z Indentation Width Zjustifyz Font Face :r/rr^exportselectionzr]yscrollcommandzSize :variableonvalueoffvaluerZBoldfontz,AaBbCcDdEe FfGgHhIiJjK 1234567890 #:+=(){}[]zPython Standard: 4 Spaces!orientZ horizontalZ tickintervalZfrom_ZtorFrUrWrGrHanchorr)rcrdznormal)+r3 StringVarfontSize BooleanVarfontBoldfontNameIntVarspaceNumtkFontZFontZeditFontr<pagesframe LabelFrameGROOVEr_LabelraListboxr: listFontNamebindOnListFontButtonRelease Scrollbarconfigyviewsetr SetFontSampleoptMenuFontSize CheckbuttonSOLIDlabelFontSampleZScaleZ scaleSpaceNumrIrKrLYrJXW)r?r3ryZ frameFontZ frameIndentZ frameFontNameZframeFontParamZlabelFontNameTitleZ scrollFontZlabelFontSizeTitleZ checkFontBoldZframeFontSampleZframeIndentSizeZlabelSpaceNumTitler@r@rArMrsn          ("""(zConfigDialog.CreatePageFontTabc!Cs|j}t||_t||_t||_t||_t||_t||_t||_ |j j dj }t |dddtdd}t |dddtdd}t|dtddd d\d ddddddtdddt |_|j}|jddd|jdddd}}x)|D]!}|jt|d|dqHWx>|jD]3}|dBdC} |j|j|ddD| qwW|jdEtt|dtdd|_t|} t|jddFdG|jdd} t|j|j ddd|_ t!| dH|jdIdddJdG|j"|_#t!| dH|jdIdddKdG|j"|_$|jj%dt|ddLdG|j&} t'|ddM} t!|dH|jdIddG|j(ddN|_)t!|dH|jdIddG|j(ddO|_*t||jddGd|_+t||jddGd|_,t|ddPdG|j-|_.t'|dQd|_/|j0dRt1dSdTdUdTdVt2dWt3|j0dRt1dSdTdUdTdWt4|jj0dRt5dSdTdUdTdVt2dWt6| j0dRt5dSdTdUd|jj0dRt5dSdTdUdTdVt2dWt3| j0dRt5dVt2dWt6dSdXdUdY|j j0dRt5dVt2dWt6dSdXdUdZ|j#j0dRt1d[t7|j$j0dRt8d[t9| j0dRt:dWt6dSdTdUdT| j0dRt5d[t9dSdTdUdT|j)j0dRt5d[t9dSdT|j*j0dRt5d[t9dSdTdUd|j+j0dRt5dWt6dSdTdUdT|j,j0dRt5dWt6d[t9dSdTdUdT|j.j0dRt5dWt6dSdTdUdT|j/j0dRt5dWt6dUdT|S)~NrBr rXrer\z Custom Highlighting z Highlighting Theme rjrlrc r r"Zhand2r0r/ r^highlightthicknessrZwrapzcSsdS)Nr%r@)er@r@rAsz2ConfigDialog.CreatePageHighlight..z cSsdS)Nr%r@)rr@r@rArs#you can click herer r#to choose itemsdefr funcr (param): """string"""r var0 = 'string' var1 = 'selected'r var2 = 'found'r var3 = listr(None)  breakpoint("line")r%  error r)cursor | shellr'r+r-cSs|jjjj|dS)N)ZwidgetZwinfo_toplevelhighlightTargetr)eventelemr@r@rAtemsz-ConfigDialog.CreatePageHighlight..temzstatezChoose Colour for :r]rhvalueZ ForegroundZ BackgroundzSave as New Custom Themez Select : za Built-in Themeza Custom ThemezDelete Custom ThemebdrFrUrrWrGrHrVro)zcourierrr rcommentrnormalrrrrzdefkeywordrrzfuncz definitionrrrstringrrrrrrrzhiliterrrzhitrrzlistzbuiltinrrzNonerrrrzbreakrrrzerrorrrrr"rrzshellzconsolerrstdoutrrrstderrrrr) rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr);r3rp builtinTheme customThemerrfgHilitecolourrtthemeIsBuiltinrr<rxryrzr{ZTextrr:ZNONEtextHighlightSamplerinsertENDr7Ztag_bindrDISABLEDr_frameColourSetr` GetColourroptMenuHighlightTarget RadiobuttonSetColourSampleBindingradioFgradioBgrSaveAsNewThemer| SetThemeTypeZradioThemeBuiltinradioThemeCustomoptMenuThemeBuiltinoptMenuThemeCustomDeleteCustomThemebuttonDeleteCustomThemenew_custom_themerIrarKrLrrJrERIGHTrrS)r?r3ry frameCustomZ frameThemer\Z textAndTagsZtxTaelementrZ frameFgBgZbuttonSetColourZbuttonSaveCustomThemeZlabelTypeTitler@r@rArNs          ("+ ( ""%%+%z ConfigDialog.CreatePageHighlightc s|j}t||_t||_t||_t||_t||_|jj dj }t |dddt dd}t |dddt ddt |}t|dd}t|}t|d t}t|d td t|_|jjd |j|jd |jj|jd |jj|jjd|j|jjd|jt|ddd |jdt|_fddtdD}t|dd|jddd |j dd|_!t|dd|jddd |j dd|_"t#|d|jdd d|_$t#|d|jdd d|_%t|dddd |j&|_'t|dddd |j(} |j)dt*ddddd t+d!t,j)dt*ddddd!t,|jj)dt*d!t-dddd|j)dt.ddddd t+d!t,|j/dd"d|j0dd"d|j1d#dd$dd%dd&t2|jj1d#dd$dd&t3|j1d#dd$dd&t4|j1d#dd$dd&t5|j!j1d#dd$dd&t2t4|j"j1d#dd$dd&t2t4|j$j1d#dd$dd&t3|j%j1d#dd$dd&t3|j'j)dt.d!t-d d'dd| j)dt.d!t-d d'dd|dj)dt6d!t,d d'|dj)dt6d!t-d d'dd|S)(NrCr rXrer\z Custom Key Bindings z Key Set zAction - Key(s)rmr^rfzr]rgZxscrollcommandzGet New Keys for Selectionrc s.g|]$}tddddddqS)rUrXrWr r)r_).0i) frameKeySetsr@rA Fs z/ConfigDialog.CreatePageKeys..rrhrrjzUse a Built-in Key SetzUse a Custom Key SetzDelete Custom Key SetzSave as New Custom Key SetrFrUrrWrGrHweightrowcolumnZ columnspanstickyT)7r3rpZ bindingTarget builtinKeys customKeysrrkeysAreBuiltin keyBindingr<rxryrzr{r_r|rZ HORIZONTALr}r: listBindingsrKeyBindingSelectedrrZxviewrr` GetNewKeysr buttonNewKeysranger SetKeysTypeZradioKeysBuiltinradioKeysCustomroptMenuKeysBuiltinoptMenuKeysCustomDeleteCustomKeysbuttonDeleteCustomKeysSaveAsNewKeySetrIrSrKrLrracolumnconfigure rowconfiguregridrNSEWZNSZEWrJ) r?r3ryrZ frameTargetZlabelTargetTitleZ scrollTargetYZ scrollTargetXZframesZbuttonSaveCustomKeysr@)rrArO%s~      ("%("##%" &zConfigDialog.CreatePageKeysc Cs |j}t||_t||_t||_t||_t||_t||_ t||_ |j j dj }t|dddtdd}t|dddtdd}t|dddt}t|dddtdd}t|dd }t|d |jd d d |jdd}t|d |jd dd |jdd} t|dd} t|d |jd dd |jdd} t|d |jd d d |jdd} t|dd} t|dd}t|d|jdd}t|dd}t|d|jdd}t|}t|}t|}t|dddtdt|_|jd |jj|jjd|j|jjd|jt|dd d!tdd"d |j |_!t|dd#dd"d |j"|_#t|dd$d!tdd"d |j$|_%|j&d%t'd&dd'dd(t(|j&d%t'd&dd'dd(t(|j&d%t'd&dd'dd(t(|j&d%t'd&dd'dd)t)d(t*|j&d%t+d*t,d&dd'd| j&d%t-d*t,d&dd'd|j&d%t-d*t,d&dd'd| j&d%t+d*t,d&dd'd| j&d%t-d*t,d&dd'd| j&d%t-d*t,d&dd'd| j&d%t+d*t,d&dd'd|j&d%t-d*t.d&d+d'd|j&d%t-d*t.d'd|j&d%t-d*t.d&d+d'd|j&d%t-d*t.d'd|j&d%t-d&dd'dd(t/|j&d%t'd&dd'dd)t)d(t*|j&d%t-d*t,d(t/|jj&d%t+d*t.d)t)d(t*|j!j&d%t'd*t,d'd|j#j&d%t'd*t,|j%j&d%t'd*t,d'd|S),NrDr rXrer\z Startup Preferences z Autosave Preferences z Additional Help Sources z At Startuprhrrjr]zOpen Edit WindowrzOpen Shell WindowzAt Start of Run (F5) zPrompt to Savez No Promptz$Initial Window Size (in characters)ZWidth textvariabler0rVZHeightr/rr^rfrgzZEditrrZAddZRemoverFrUrWrHrGrord)0r3rpwinWidth winHeightru startupEditautoSaveencodingrrZuserHelpBrowserZ helpBrowserr<rxryrzr{r_r|rrEntryrr}r:listHelprrrrHelpSourceSelectedr`rHelpListItemEditbuttonHelpListEditHelpListItemAddZbuttonHelpListAddHelpListItemRemovebuttonHelpListRemoverIrJrrKrLrarrrr)r?r3ryZframeRunZ frameSaveZ frameWinSizeZ frameHelpZlabelRunChoiceTitleZradioStartupEditZradioStartupShellZlabelRunSaveTitleZ radioSaveAskZ radioSaveAutoZlabelWinSizeTitleZlabelWinWidthTitleZ entryWinWidthZlabelWinHeightTitleZentryWinHeightZ frameHelpListZframeHelpListButtonsZscrollHelpListr@r@rArPrs         """(""""""""""(%zConfigDialog.CreatePageGeneralcCs|jjd|j|jjd|j|jjd|j|jjd|j|jjd|j|j jd|j |j jd|j |j jd|j|jjd|j|jjd|j|jjd|j|jjd|j|jjd|j|jjd|j|jjd|j|jjd|j|jjd|j |j!jd|j"dS)Nw)#rqZtrace_variableVarChanged_fontrtrsrvVarChanged_spaceNumrVarChanged_colourrVarChanged_builtinThemerVarChanged_customThemerVarChanged_themeIsBuiltinrVarChanged_highlightTargetrVarChanged_keyBindingrVarChanged_builtinKeysrVarChanged_customKeysrVarChanged_keysAreBuiltinrVarChanged_winWidthrVarChanged_winHeightrVarChanged_startupEditrVarChanged_autoSaverVarChanged_encoding)r?r@r@rAr>s$zConfigDialog.AttachVarCallbackscGss|jj}|jddd||jj}|jddd||jj}|jddd|dS)zWhen one font attribute changes, save them all, as they are not independent from each other. In particular, when we are overriding the default font, we need to write out everything. main EditorWindowrlz font-sizez font-boldN)rtgetAddChangedItemrqrs)r?paramsrr@r@rAr"s zConfigDialog.VarChanged_fontcGs)|jj}|jddd|dS)Nr2Indentz num-spaces)rvr4r5)r?r6rr@r@rAr#sz ConfigDialog.VarChanged_spaceNumcGs|jdS)N)OnNewColourSet)r?r6r@r@rAr$szConfigDialog.VarChanged_colourcGs|jj}|dkrtjddddkrO|jddddn|jddd||jjdd d d nE|jddd||jdddd |jjdd d d |jdS)Nz IDLE Darkr2ThemenamezIDLE Newz IDLE ClassicZname2r\zNew theme, see HelpZfgz#500000r Zblack)rr4r GetOptionr5rrPaintThemeSample)r?r6rr@r@rAr%s  z$ConfigDialog.VarChanged_builtinThemecGsB|jj}|dkr>|jddd||jndS)Nz- no custom themes -r2r9r:)rr4r5r<)r?r6rr@r@rAr&s z#ConfigDialog.VarChanged_customThemecGsF|jj}|jddd||r8|jn |jdS)Nr2r9default)rr4r5r%r&)r?r6rr@r@rAr' s  z&ConfigDialog.VarChanged_themeIsBuiltincGs|jdS)N)SetHighlightTarget)r?r6r@r@rAr(sz'ConfigDialog.VarChanged_highlightTargetcGs|jj}|jj}|jjtjd}tj|rb|jd|||n/tj |}|d}|jd|||dS)NrkeysZ _cfgBindings extensions) rr4rrANCHORsplitrZ IsCoreBindingr5ZGetExtnNameForEvent)r?r6rkeySetrZextNameZextKeybindSectionr@r@rAr)s z"ConfigDialog.VarChanged_keyBindingcGs6|jj}|jddd||j|dS)Nr2rCr:)rr4r5 LoadKeysList)r?r6rr@r@rAr*$sz#ConfigDialog.VarChanged_builtinKeyscGsE|jj}|dkrA|jddd||j|ndS)Nz- no custom keys -r2rCr:)rr4r5rD)r?r6rr@r@rAr+)s z"ConfigDialog.VarChanged_customKeyscGsF|jj}|jddd||r8|jn |jdS)Nr2rCr=)rr4r5r*r+)r?r6rr@r@rAr,/s  z&ConfigDialog.VarChanged_keysAreBuiltincGs)|jj}|jddd|dS)Nr2r3r0)rr4r5)r?r6rr@r@rAr-7sz ConfigDialog.VarChanged_winWidthcGs)|jj}|jddd|dS)Nr2r3r/)rr4r5)r?r6rr@r@rAr.;sz!ConfigDialog.VarChanged_winHeightcGs)|jj}|jddd|dS)Nr2rDzeditor-on-startup)rr4r5)r?r6rr@r@rAr/?sz#ConfigDialog.VarChanged_startupEditcGs)|jj}|jddd|dS)Nr2rDautosave)rr4r5)r?r6rr@r@rAr0Csz ConfigDialog.VarChanged_autoSavecGs)|jj}|jddd|dS)Nr2r3r)rr4r5)r?r6rr@r@rAr1Gsz ConfigDialog.VarChanged_encodingcCs)iid6id6id6id6|_dS)Nr2 highlightr?r@) changedItems)r?r@r@rAr8KszConfigDialog.ResetChangedItemscCsLt|}||j|kr3i|j||tjddtjdd}t|d||j}|S)Nuserr?r=zNew Custom Key Set)rrLrrV)r?ra usedNamesrbr@r@rArWs zConfigDialog.GetNewKeysNamecCs)|jd}|r%|j|ndS)NzNew Key Set Name:)rWrZ)r?Z newKeysNamer@r@rArszConfigDialog.SaveAsNewKeySetcCs|jjdtdS)Nr)rrrS)r?rr@r@rArszConfigDialog.KeyBindingSelectedc Cs&|jjr!|jj}n|jj}tj|}i}x;|D]3}|dd}dj||}||||jj}d}tjd||d|s5dStjdj|||jdkrm|jd|=ntjdjtj dd}|j |s|j j dt |jj|dn|jj||d|jjtjd jd d |jjtjd jd d |j|jdS) Nz0Are you sure you wish to delete the key set %r ?zDelete Key Setr3r?rcrz- no custom keys -rr2rCr=r:)rr4 tkMessageBoxaskyesnoruserCfgremove_sectionrGSaverLrhr rrr rirrrMrOrrZr)r?rldelmsgitemListr@r@rAr s& ## zConfigDialog.DeleteCustomKeyscCs>|jj}d}tjd||d|s5dStjdj|||jdkrm|jd|=ntjdjtj dd}|j |s|j j dt |jj|dn|jj||d|jjtjd jd d |jjtjd jd d |j|jdS) Nz.Are you sure you wish to delete the theme %r ?z Delete Themer3rFrcrz- no custom themes -rr2r9r=r:)rr4rnrorrprqrGrrrLrhrrrrrirrrMrOrrZr)r? themeNamersrtr@r@rArs& ## zConfigDialog.DeleteCustomThemecCs|jj}|jjd}tjd|dd|d|\}}|r||kr|jjrd}|j|}|sdS|j||j j |q|j j |ndS)Nbgr3r6zPick new colour for : Z initialcolorz_Your changes will be saved as a new Custom Theme. Enter a name for your new Custom Theme below.) rr4rZcgettkColorChooserZaskcolorrGetNewThemeNameCreateNewThemerr)r?targetZ prevColourZ rgbTupletZ colourStringranewThemer@r@rArs  zConfigDialog.GetColourcCs|jj}|jjd||jjr7dnd}|j|jjd}|jj|i||6|j j}|d|}|j d|||dS)Nrv foreground backgroundr-rF) rr4rrrr7rr tag_configrr5)r?Z newColourplaneZ sampleElementthemeZ themeElementr@r@rAr8+szConfigDialog.OnNewColourSetcCs>tjddtjdd}t|d||j}|S)NrcrFr=zNew Custom Theme)rrLrrV)r?rardr{r@r@rArx5s zConfigDialog.GetNewThemeNamecCs)|jd}|r%|j|ndS)NzNew Theme Name:)rxry)r? newThemeNamer@r@rAr<szConfigDialog.SaveAsNewThemecCs|jjr'd}|jj}nd}|jj}tj||}||jdkr|jd|}x|D]}||||eszConfigDialog.SetHighlightTargetcGs|jdS)N)r)r?argsr@r@rArpsz#ConfigDialog.SetColourSampleBindingcCsa|j|jjd}|jjr/dnd}|jj||}|jjd|dS)Nrr|r}rv)r7rr4rrZtag_cgetrr)r?tagrrr@r@rArsszConfigDialog.SetColourSamplecCs$|jjr!|jj}n|jj}x|jD]}|j|d}tj||}|dkrtj|ddd|d|jjdt|jjdtn^|jjrv|jjdt|jjdtn&|jjdt|jjdtdS)Nrjr)rsizerrrr rjrS)r?r@r@rArsz$ConfigDialog.SetHelpListButtonStatescCsht|dj}|rZ|jj|d|df|jjt|d|jn|jdS)NzNew Help Sourcerrj) rrV userHelpListappendrrrUpdateUserHelpChangedItemsr)r? helpSourcer@r@rArs  zConfigDialog.HelpListItemAddcCs|jjt}|j|}t|dd|dd|dj}| sX||kr\dS||j|<|jj||jj||d|j|j dS)NzEdit Help SourceZmenuItemrZfilePathrj) rrTrArrrVr[rrr)r? itemIndexrZ newHelpSourcer@r@rArs   zConfigDialog.HelpListItemEditcCsD|jjt}|j|=|jj||j|jdS)N)rrTrArr[rr)r?rr@r@rArs   zConfigDialog.HelpListItemRemovec Csvi|jdd.789r(r*r,r.1416182022) rrrz10z11z12z13rrrrr)rrwZfamiliesrhr~rrrZGetFontrrtrrTrkrXrY ValueErrorrrirsr) r?ZfontsrlZconfiguredFontrtrqrsZlc_fontsZcurrentFontIndexr@r@rA LoadFontCfgs*      zConfigDialog.LoadFontCfgcCs5tjddddddd}|jj|dS)Nr2r7z num-spacesr=rtypeint)rr;rvr)r?rvr@r@rA LoadTabCfgszConfigDialog.LoadTabCfgc sjjtjdddddddtj}jjrtjdd}|jjj ||tjdd}|j|sj j d t j jd q9jj ||d nbtjdd}|jjj ||tjdd}|jjj ||d jtjj}|jd fd djj ||d jjdS)Nr2r9r=rboolrjrFrcrz- no custom themes -rrmcsj|dS)Nrj)r7)x)r?r@rArsz+ConfigDialog.LoadThemeCfg..)rrrr;Z CurrentThemer4rLrhrrirrrrrrrr7r?rr<r>)r? currentOptionrtZ themeNamesr@)r?rA LoadThemeCfgs2       zConfigDialog.LoadThemeCfgc Cs`|jjtjdddddddtj}|jjrtjdd}|j|jj ||tjdd}|j|s|j j d t |j jd q9|jj ||d nbtjdd}|j|jj ||tjdd}|j|jj ||d |jtj}|j|dS) Nr2rCr=rrrjr?rcrz- no custom keys -r)rrrr;Z CurrentKeysr4rLrhr rir rrrr rrD)r?rrtrlr@r@rA LoadKeyCfgs,       zConfigDialog.LoadKeyCfgc Cs |jjtjddddddd|jjtjddddd dd|jjtjdd d dd |jjtjdd d dd |jjtjdd dddtj|_ x(|j D]}|j j t |d qW|j dS)Nr2rDzeditor-on-startupr=rjrrrErr3r0rr/rZnone)rrrr;rrrrZGetAllExtraHelpSourcesListrrrrr)r?ZhelpItemr@r@rALoadGeneralCfg#szConfigDialog.LoadGeneralCfgcCs6|j|j|j|j|jdS)z load configuration from default and user config files and populate the widgets on the config dialog pages. N)rrrrr)r?r@r@rAr=8s     zConfigDialog.LoadConfigscCsftjdj|s-tjdj|nx2|D]*}||}tjdj|||q4WdS)z save a newly created core key set. keySetName - string, the name of the new key set keySet - dictionary containing the new key set r?N)rrp has_section add_section SetOption)r?rlrCrrr@r@rArgHs   zConfigDialog.SaveNewKeySetcCsftjdj|s-tjdj|nx2|D]*}||}tjdj|||q4WdS)z save a newly created theme. themeName - string, the name of the new theme theme - dictionary containing the new theme rFN)rrprrr)r?rurrrr@r@rArTs   zConfigDialog.SaveNewThemecCsltj|j||rRtj|j|||krRtj|j||Sntj|j|||S)N)rrMZ has_optionrOrp RemoveOptionr)r?rPrJrKrr@r@rA SetUserValue`szConfigDialog.SetUserValuecCstjdjx|jD]}d}x|j|D]}|dkrdtjdjdd}nxO|j||D]<}|j|||}|j||||rvd}qvqvWq5W|rtj|jqqWx%ddgD]}tj|jqW|j|jdS)z3Save configuration changes to the user config file.r2FrTr?rFN)rrprrrGrqrr8save_all_changed_extensions)r?rPZcfgTypeHasChangesrJrKrr@r@rASaveAllChangedConfigshs"   z"ConfigDialog.SaveAllChangedConfigscCs1|jjj}x|D]}|jqWdS)N)r3r4r?ZRemoveKeybindings)r? winInstancesinstancer@r@rADeactivateCurrentConfig~s z$ConfigDialog.DeactivateCurrentConfigcCsY|jjj}x@|D]8}|j|j|j|j|jqWdS)z'Dynamically apply configuration changesN)r3r4r?ZResetColorizerZ ResetFontZset_notabs_indentwidthZApplyKeybindingsZreset_help_menu_entries)r?rrr@r@rAActivateConfigChangess     z"ConfigDialog.ActivateConfigChangescCs|jdS)N)destroy)r?r@r@rAr;szConfigDialog.CancelcCs|j|jdS)N)rZr)r?r@r@rArYs zConfigDialog.OkcCs"|j|j|jdS)N)rrr)r?r@r@rArZs  zConfigDialog.Applyc Cs6|jj}t|dddttj|ddS)Nr6zHelp for IDLE preferencesr\r )r<Z _current_pager help_common help_pagesr4)r?Zpager@r@rAr[s zConfigDialog.Helpc Cs|j}|jjdj}tjd|_tjd|_|j t |_ |j t ||_ |jddd|jdddt|d|j dd |_|jjd |jt|d |jj}|j|j_t|d d dd |_|jjdddddd|jdddddd|jjdddddddddg|jddddi|_d|_||_|j|_d}x6t |j!D]%}|j"||d|d}qW|j j||jj#d|jddS)aPart of the config dialog used for configuring IDLE extensions. This code is generic - it works for any and all IDLE extensions. IDLE extensions save their configuration options using idleConf. This code reads the current configuration using idleConf, supplies a GUI interface to change the configuration values, and saves the changes using idleConf. Not all changes take effect immediately - some may require restarting IDLE. This depends on each extension's implementation. All values are treated as text, and it is up to the user to supply reasonable values. The only exception to this are the 'enable*' options, which are boolean, and can be toggled with an True/False button. rEr@rrrjrXZ listvariableZ selectmodeZbrowsez<>r]r0r/rrrZnwsnsnsewrUrdrWNr {z} )$r3r<rxryrrMext_defaultCfgrp ext_userCfgregisteris_intload_extensionsrpZextension_namesrrr}extension_listrextension_selectedrrrrgrz details_framerr5 config_framecurrent_extensionZ outerframeZtabbed_page_setsortedr@create_extension_frameZ selection_set)r?r3ryZscrollZ ext_namesext_namer@r@rArQs<   +     z!ConfigDialog.CreatePageExtensionsc Csi|_x'tjddD]}g|j|.rawTTrueFalserrNrr=r:rvar)r@rZ GetExtensionsrrrNremoverOKeyErrorrrrrprrHr) r?rZopt_listZenablesrZdef_strZdef_objZopt_typerrr@r@rArsF               zConfigDialog.load_extensionscCs|jj}|r*|jj|}n|dksE||jkr|jr|jjdd|j|jjd|_qn|r|jjd||j|jdddddd||_ndS)Nr\r rrrrr) rrjr4rrrrZ grid_forgetr)r?rZnewselr@r@rArs #zConfigDialog.extension_selectedcCs~t|jdddd}||j|<|j}xFt|j|D]1\}}t|d|d}|jd|ddd t|d }|d d krt |d |d|dddddt ddddjd|ddd t ddqE|d dkrHt |d |ddd|j dfjd|ddd tddqEt |d |jd|ddd tddqEWdS) z=Create a frame holding the widgets to configure one extensionr/rr0r\r:rrrrrrrrrhrirrkrZ indicatoronZ selectcolorr rrjrUrZvalidatermZvalidatecommandz%PN)VerticalScrolledFramerrinterior enumerater@r|rNWrr:rrrr)r?rfZ entry_arearoptZlabelrr@r@rArs&     z#ConfigDialog.create_extension_framecCsv|d}|d}|djjp-|}|dj|||kr`|jj||S|jj|||S)Nr:r=r)r4striprrrr)r?rJrr:r=rr@r@rAset_extension_value*s   z ConfigDialog.set_extension_valuecCsmd}xJ|jD]?}|j|}x)|D]!}|j||r*d}q*q*WqW|ri|jjndS)z3Save configuration changes to the user config file.FTN)r@rrrr)r?Z has_changesrrQrr@r@rAr6s  z(ConfigDialog.save_all_changed_extensions)O__name__ __module__ __qualname__r2r9rRrMrNrOrPr>r"r#r$r%r&r'r(r)r*r+r,r-r.r/r0r1r8r5rRrrrrWrrrZrDr rrr8rxrryrrr>rrr<rrrrrrrrrrrr=rgrrrrrr;rYrZr[rQrrrrrr@r@r@rAr s 5  D o M `                 $                       !           5 -   r ahWhen you click either the Apply or Ok buttons, settings in this dialog that are different from IDLE's default are saved in a .idlerc directory in your home directory. Except as noted, these changes apply to all versions of IDLE installed on this machine. Some do not take affect until IDLE is restarted. [Cancel] only cancels changes made since the last save. z Highlighting: The IDLE Dark color theme is new in October 2015. It can only be used with older IDLE releases if it is saved as a custom theme, with a different name. rBc Cs9|s dSyt|dSWntk r4dSYnXdS)z(Return 's is blank or represents an int'TFN)rr)rr@r@rArTs  rc@s"eZdZdZddZdS)rzA pure Tkinter vertically scrollable frame. * Use the 'interior' attribute to place widgets inside the scrollable frame * Construct and pack/place/grid normally * This frame only allows vertical scrolling c s6tj||||t|dt}|jdtdtdtt|ddddd|j d d jdt dt dt |j d jjdjdt|_jddd d tfdd}jd|fdd}jd|dS)NrmrHrFrGrrrrgr0r]Zwindowrocs0jjf}jdd|dS)NZ scrollregionz 0 0 %s %s)winfo_reqwidthZwinfo_reqheightr)rr)canvasrr@rA_configure_interior{sz;VerticalScrolledFrame.__init__.._configure_interiorz cs8jjkr4jdjndS)Nr0)rZ winfo_widthZ itemconfigure)r)rr interior_idr@rA_configure_canvassz9VerticalScrolledFrame.__init__.._configure_canvas)r_r2rZVERTICALrIrrr:ZCanvasrrarLrKrrZ xview_movetoZ yview_movetorZ create_windowrr)r?r3rkwZ vscrollbarrrr@)rrrrAr2fs   zVerticalScrolledFrame.__init__N)rrr__doc__r2r@r@r@rAr_s r__main__z#idlelib.idle_test.test_configdialog verbosityrXexitF)run)'rZtkinterZtkinter.messageboxZ messageboxrnZtkinter.colorchooserZ colorchooserrwZ tkinter.fontrlrwZidlelib.configHandlerrZidlelib.dynOptionMenuWidgetrZidlelib.keybindingDialogrZidlelib.configSectionNameDialogrZidlelib.configHelpSourceEditrZidlelib.tabbedpagesrZidlelib.textViewr Zidlelibr r1r rrrr_rrZunittestr2Zidlelib.idle_test.htestrr@r@r@rA s: 4  +