123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292 |
- import win32api
- import win32con
- import win32ui
- from pywin.mfc import dialog
-
- # Used to indicate that style should use default color
- from win32con import CLR_INVALID
-
- from . import scintillacon
-
- ######################################################
- # Property Page for syntax formatting options
-
- # The standard 16 color VGA palette should always be possible
- paletteVGA = (
- ("Black", win32api.RGB(0, 0, 0)),
- ("Navy", win32api.RGB(0, 0, 128)),
- ("Green", win32api.RGB(0, 128, 0)),
- ("Cyan", win32api.RGB(0, 128, 128)),
- ("Maroon", win32api.RGB(128, 0, 0)),
- ("Purple", win32api.RGB(128, 0, 128)),
- ("Olive", win32api.RGB(128, 128, 0)),
- ("Gray", win32api.RGB(128, 128, 128)),
- ("Silver", win32api.RGB(192, 192, 192)),
- ("Blue", win32api.RGB(0, 0, 255)),
- ("Lime", win32api.RGB(0, 255, 0)),
- ("Aqua", win32api.RGB(0, 255, 255)),
- ("Red", win32api.RGB(255, 0, 0)),
- ("Fuchsia", win32api.RGB(255, 0, 255)),
- ("Yellow", win32api.RGB(255, 255, 0)),
- ("White", win32api.RGB(255, 255, 255)),
- # and a few others will generally be possible.
- ("DarkGrey", win32api.RGB(64, 64, 64)),
- ("PurpleBlue", win32api.RGB(64, 64, 192)),
- ("DarkGreen", win32api.RGB(0, 96, 0)),
- ("DarkOlive", win32api.RGB(128, 128, 64)),
- ("MediumBlue", win32api.RGB(0, 0, 192)),
- ("DarkNavy", win32api.RGB(0, 0, 96)),
- ("Magenta", win32api.RGB(96, 0, 96)),
- ("OffWhite", win32api.RGB(255, 255, 220)),
- ("LightPurple", win32api.RGB(220, 220, 255)),
- ("<Default>", win32con.CLR_INVALID),
- )
-
-
- class ScintillaFormatPropertyPage(dialog.PropertyPage):
- def __init__(self, scintillaClass=None, caption=0):
- self.scintillaClass = scintillaClass
- dialog.PropertyPage.__init__(self, win32ui.IDD_PP_FORMAT, caption=caption)
-
- def OnInitDialog(self):
- try:
- if self.scintillaClass is None:
- from . import control
-
- sc = control.CScintillaEdit
- else:
- sc = self.scintillaClass
-
- self.scintilla = sc()
- style = win32con.WS_CHILD | win32con.WS_VISIBLE | win32con.ES_MULTILINE
- # Convert the rect size
- rect = self.MapDialogRect((5, 5, 120, 75))
- self.scintilla.CreateWindow(style, rect, self, 111)
- self.HookNotify(self.OnBraceMatch, scintillacon.SCN_CHECKBRACE)
- self.scintilla.HookKeyStroke(self.OnEsc, 27)
- self.scintilla.SCISetViewWS(1)
- self.pos_bstart = self.pos_bend = self.pos_bbad = 0
-
- colorizer = self.scintilla._GetColorizer()
- text = colorizer.GetSampleText()
- items = text.split("|", 2)
- pos = len(items[0])
- self.scintilla.SCIAddText("".join(items))
- self.scintilla.SetSel(pos, pos)
- self.scintilla.ApplyFormattingStyles()
- self.styles = self.scintilla._GetColorizer().styles
-
- self.cbo = self.GetDlgItem(win32ui.IDC_COMBO1)
- for c in paletteVGA:
- self.cbo.AddString(c[0])
-
- self.cboBoldItalic = self.GetDlgItem(win32ui.IDC_COMBO2)
- for item in ("Bold Italic", "Bold", "Italic", "Regular"):
- self.cboBoldItalic.InsertString(0, item)
-
- self.butIsDefault = self.GetDlgItem(win32ui.IDC_CHECK1)
- self.butIsDefaultBackground = self.GetDlgItem(win32ui.IDC_CHECK2)
- self.listbox = self.GetDlgItem(win32ui.IDC_LIST1)
- self.HookCommand(self.OnListCommand, win32ui.IDC_LIST1)
- names = list(self.styles.keys())
- names.sort()
- for name in names:
- if self.styles[name].aliased is None:
- self.listbox.AddString(name)
- self.listbox.SetCurSel(0)
-
- idc = win32ui.IDC_RADIO1
- if not self.scintilla._GetColorizer().bUseFixed:
- idc = win32ui.IDC_RADIO2
- self.GetDlgItem(idc).SetCheck(1)
- self.UpdateUIForStyle(self.styles[names[0]])
-
- self.scintilla.HookFormatter(self)
- self.HookCommand(self.OnButDefaultFixedFont, win32ui.IDC_BUTTON1)
- self.HookCommand(self.OnButDefaultPropFont, win32ui.IDC_BUTTON2)
- self.HookCommand(self.OnButThisFont, win32ui.IDC_BUTTON3)
- self.HookCommand(self.OnButUseDefaultFont, win32ui.IDC_CHECK1)
- self.HookCommand(self.OnButThisBackground, win32ui.IDC_BUTTON4)
- self.HookCommand(self.OnButUseDefaultBackground, win32ui.IDC_CHECK2)
- self.HookCommand(self.OnStyleUIChanged, win32ui.IDC_COMBO1)
- self.HookCommand(self.OnStyleUIChanged, win32ui.IDC_COMBO2)
- self.HookCommand(self.OnButFixedOrDefault, win32ui.IDC_RADIO1)
- self.HookCommand(self.OnButFixedOrDefault, win32ui.IDC_RADIO2)
- except:
- import traceback
-
- traceback.print_exc()
-
- def OnEsc(self, ch):
- self.GetParent().EndDialog(win32con.IDCANCEL)
-
- def OnBraceMatch(self, std, extra):
- import pywin.scintilla.view
-
- pywin.scintilla.view.DoBraceMatch(self.scintilla)
-
- def GetSelectedStyle(self):
- return self.styles[self.listbox.GetText(self.listbox.GetCurSel())]
-
- def _DoButDefaultFont(self, extra_flags, attr):
- baseFormat = getattr(self.scintilla._GetColorizer(), attr)
- flags = (
- extra_flags
- | win32con.CF_SCREENFONTS
- | win32con.CF_EFFECTS
- | win32con.CF_FORCEFONTEXIST
- )
- d = win32ui.CreateFontDialog(baseFormat, flags, None, self)
- if d.DoModal() == win32con.IDOK:
- setattr(self.scintilla._GetColorizer(), attr, d.GetCharFormat())
- self.OnStyleUIChanged(0, win32con.BN_CLICKED)
-
- def OnButDefaultFixedFont(self, id, code):
- if code == win32con.BN_CLICKED:
- self._DoButDefaultFont(win32con.CF_FIXEDPITCHONLY, "baseFormatFixed")
- return 1
-
- def OnButDefaultPropFont(self, id, code):
- if code == win32con.BN_CLICKED:
- self._DoButDefaultFont(win32con.CF_SCALABLEONLY, "baseFormatProp")
- return 1
-
- def OnButFixedOrDefault(self, id, code):
- if code == win32con.BN_CLICKED:
- bUseFixed = id == win32ui.IDC_RADIO1
- self.GetDlgItem(win32ui.IDC_RADIO1).GetCheck() != 0
- self.scintilla._GetColorizer().bUseFixed = bUseFixed
- self.scintilla.ApplyFormattingStyles(0)
- return 1
-
- def OnButThisFont(self, id, code):
- if code == win32con.BN_CLICKED:
- flags = (
- win32con.CF_SCREENFONTS
- | win32con.CF_EFFECTS
- | win32con.CF_FORCEFONTEXIST
- )
- style = self.GetSelectedStyle()
- # If the selected style is based on the default, we need to apply
- # the default to it.
- def_format = self.scintilla._GetColorizer().GetDefaultFormat()
- format = style.GetCompleteFormat(def_format)
- d = win32ui.CreateFontDialog(format, flags, None, self)
- if d.DoModal() == win32con.IDOK:
- style.format = d.GetCharFormat()
- self.scintilla.ApplyFormattingStyles(0)
- return 1
-
- def OnButUseDefaultFont(self, id, code):
- if code == win32con.BN_CLICKED:
- isDef = self.butIsDefault.GetCheck()
- self.GetDlgItem(win32ui.IDC_BUTTON3).EnableWindow(not isDef)
- if isDef: # Being reset to the default font.
- style = self.GetSelectedStyle()
- style.ForceAgainstDefault()
- self.UpdateUIForStyle(style)
- self.scintilla.ApplyFormattingStyles(0)
- else:
- # User wants to override default -
- # do nothing!
- pass
-
- def OnButThisBackground(self, id, code):
- if code == win32con.BN_CLICKED:
- style = self.GetSelectedStyle()
- bg = win32api.RGB(0xFF, 0xFF, 0xFF)
- if style.background != CLR_INVALID:
- bg = style.background
- d = win32ui.CreateColorDialog(bg, 0, self)
- if d.DoModal() == win32con.IDOK:
- style.background = d.GetColor()
- self.scintilla.ApplyFormattingStyles(0)
- return 1
-
- def OnButUseDefaultBackground(self, id, code):
- if code == win32con.BN_CLICKED:
- isDef = self.butIsDefaultBackground.GetCheck()
- self.GetDlgItem(win32ui.IDC_BUTTON4).EnableWindow(not isDef)
- if isDef: # Being reset to the default color
- style = self.GetSelectedStyle()
- style.background = style.default_background
- self.UpdateUIForStyle(style)
- self.scintilla.ApplyFormattingStyles(0)
- else:
- # User wants to override default -
- # do nothing!
- pass
-
- def OnListCommand(self, id, code):
- if code == win32con.LBN_SELCHANGE:
- style = self.GetSelectedStyle()
- self.UpdateUIForStyle(style)
- return 1
-
- def UpdateUIForStyle(self, style):
- format = style.format
- sel = 0
- for c in paletteVGA:
- if format[4] == c[1]:
- # print "Style", style.name, "is", c[0]
- break
- sel = sel + 1
- else:
- sel = -1
- self.cbo.SetCurSel(sel)
- self.butIsDefault.SetCheck(style.IsBasedOnDefault())
- self.GetDlgItem(win32ui.IDC_BUTTON3).EnableWindow(not style.IsBasedOnDefault())
-
- self.butIsDefaultBackground.SetCheck(
- style.background == style.default_background
- )
- self.GetDlgItem(win32ui.IDC_BUTTON4).EnableWindow(
- style.background != style.default_background
- )
-
- bold = format[1] & win32con.CFE_BOLD != 0
- italic = format[1] & win32con.CFE_ITALIC != 0
- self.cboBoldItalic.SetCurSel(bold * 2 + italic)
-
- def OnStyleUIChanged(self, id, code):
- if code in [win32con.BN_CLICKED, win32con.CBN_SELCHANGE]:
- style = self.GetSelectedStyle()
- self.ApplyUIFormatToStyle(style)
- self.scintilla.ApplyFormattingStyles(0)
- return 0
- return 1
-
- def ApplyUIFormatToStyle(self, style):
- format = style.format
- color = paletteVGA[self.cbo.GetCurSel()]
- effect = 0
- sel = self.cboBoldItalic.GetCurSel()
- if sel == 0:
- effect = 0
- elif sel == 1:
- effect = win32con.CFE_ITALIC
- elif sel == 2:
- effect = win32con.CFE_BOLD
- else:
- effect = win32con.CFE_BOLD | win32con.CFE_ITALIC
- maskFlags = (
- format[0] | win32con.CFM_COLOR | win32con.CFM_BOLD | win32con.CFM_ITALIC
- )
- style.format = (
- maskFlags,
- effect,
- style.format[2],
- style.format[3],
- color[1],
- ) + style.format[5:]
-
- def OnOK(self):
- self.scintilla._GetColorizer().SavePreferences()
- return 1
-
-
- def test():
- page = ColorEditorPropertyPage()
- sheet = pywin.mfc.dialog.PropertySheet("Test")
- sheet.AddPage(page)
- sheet.CreateWindow()
|