# The property page to define generic IDE options for Pythonwin import win32con import win32ui from pywin.framework import interact from pywin.mfc import dialog buttonControlMap = { win32ui.IDC_BUTTON1: win32ui.IDC_EDIT1, win32ui.IDC_BUTTON2: win32ui.IDC_EDIT2, win32ui.IDC_BUTTON3: win32ui.IDC_EDIT3, } class OptionsPropPage(dialog.PropertyPage): def __init__(self): dialog.PropertyPage.__init__(self, win32ui.IDD_PP_IDE) self.AddDDX(win32ui.IDC_CHECK1, "bShowAtStartup") self.AddDDX(win32ui.IDC_CHECK2, "bDocking") self.AddDDX(win32ui.IDC_EDIT4, "MRUSize", "i") def OnInitDialog(self): edit = self.GetDlgItem(win32ui.IDC_EDIT1) format = eval( win32ui.GetProfileVal( interact.sectionProfile, interact.STYLE_INTERACTIVE_PROMPT, str(interact.formatInput), ) ) edit.SetDefaultCharFormat(format) edit.SetWindowText("Input Text") edit = self.GetDlgItem(win32ui.IDC_EDIT2) format = eval( win32ui.GetProfileVal( interact.sectionProfile, interact.STYLE_INTERACTIVE_OUTPUT, str(interact.formatOutput), ) ) edit.SetDefaultCharFormat(format) edit.SetWindowText("Output Text") edit = self.GetDlgItem(win32ui.IDC_EDIT3) format = eval( win32ui.GetProfileVal( interact.sectionProfile, interact.STYLE_INTERACTIVE_ERROR, str(interact.formatOutputError), ) ) edit.SetDefaultCharFormat(format) edit.SetWindowText("Error Text") self["bShowAtStartup"] = interact.LoadPreference("Show at startup", 1) self["bDocking"] = interact.LoadPreference("Docking", 0) self["MRUSize"] = win32ui.GetProfileVal("Settings", "Recent File List Size", 10) # Hook the button clicks. self.HookCommand(self.HandleCharFormatChange, win32ui.IDC_BUTTON1) self.HookCommand(self.HandleCharFormatChange, win32ui.IDC_BUTTON2) self.HookCommand(self.HandleCharFormatChange, win32ui.IDC_BUTTON3) # Ensure the spin control remains in range. spinner = self.GetDlgItem(win32ui.IDC_SPIN1) spinner.SetRange(1, 16) return dialog.PropertyPage.OnInitDialog(self) # Called to save away the new format tuple for the specified item. def HandleCharFormatChange(self, id, code): if code == win32con.BN_CLICKED: editId = buttonControlMap.get(id) assert editId is not None, "Format button has no associated edit control" editControl = self.GetDlgItem(editId) existingFormat = editControl.GetDefaultCharFormat() flags = win32con.CF_SCREENFONTS d = win32ui.CreateFontDialog(existingFormat, flags, None, self) if d.DoModal() == win32con.IDOK: cf = d.GetCharFormat() editControl.SetDefaultCharFormat(cf) self.SetModified(1) return 0 # We handled this fully! def OnOK(self): # Handle the edit controls - get all the fonts, put them back into interact, then # get interact to save its stuff! controlAttrs = [ (win32ui.IDC_EDIT1, interact.STYLE_INTERACTIVE_PROMPT), (win32ui.IDC_EDIT2, interact.STYLE_INTERACTIVE_OUTPUT), (win32ui.IDC_EDIT3, interact.STYLE_INTERACTIVE_ERROR), ] for id, key in controlAttrs: control = self.GetDlgItem(id) fmt = control.GetDefaultCharFormat() win32ui.WriteProfileVal(interact.sectionProfile, key, str(fmt)) # Save the other interactive window options. interact.SavePreference("Show at startup", self["bShowAtStartup"]) interact.SavePreference("Docking", self["bDocking"]) # And the other options. win32ui.WriteProfileVal("Settings", "Recent File List Size", self["MRUSize"]) return 1 def ChangeFormat(self, fmtAttribute, fmt): dlg = win32ui.CreateFontDialog(fmt) if dlg.DoModal() != win32con.IDOK: return None return dlg.GetCharFormat() def OnFormatTitle(self, command, code): fmt = self.GetFormat(interact.formatTitle) if fmt: formatTitle = fmt SaveFontPreferences() def OnFormatInput(self, command, code): global formatInput fmt = self.GetFormat(formatInput) if fmt: formatInput = fmt SaveFontPreferences() def OnFormatOutput(self, command, code): global formatOutput fmt = self.GetFormat(formatOutput) if fmt: formatOutput = fmt SaveFontPreferences() def OnFormatError(self, command, code): global formatOutputError fmt = self.GetFormat(formatOutputError) if fmt: formatOutputError = fmt SaveFontPreferences()