]> git.saurik.com Git - wxWidgets.git/blame - wxPython/samples/ide/activegrid/tool/HtmlEditor.py
Docview and IDE patch from Morag Hua with fix for bug #1217890
[wxWidgets.git] / wxPython / samples / ide / activegrid / tool / HtmlEditor.py
CommitLineData
1f780e48
RD
1#----------------------------------------------------------------------------
2# Name: HtmlEditor.py
3# Purpose: Abstract Code Editor for pydocview tbat uses the Styled Text Control
4#
5# Author: Peter Yared
6#
7# Created: 8/15/04
8# CVS-ID: $Id$
9# Copyright: (c) 2004-2005 ActiveGrid, Inc.
10# License: wxWindows License
11#----------------------------------------------------------------------------
12
13
14import wx
15import os.path
16import string
17import STCTextEditor
18import CodeEditor
19_ = wx.GetTranslation
20
21
22class HtmlDocument(CodeEditor.CodeDocument):
23
24 pass
25
26
27class HtmlView(CodeEditor.CodeView):
28
29
30 def GetCtrlClass(self):
31 """ Used in split window to instantiate new instances """
32 return HtmlCtrl
33
34
35 def GetAutoCompleteHint(self):
36 pos = self.GetCtrl().GetCurrentPos()
37 if pos == 0:
38 return None, None
39
40 validLetters = string.letters + string.digits + '_!-'
41 word = ''
42 while (True):
43 pos = pos - 1
44 if pos < 0:
45 break
46 char = chr(self.GetCtrl().GetCharAt(pos))
47 if char not in validLetters:
48 break
49 word = char + word
50
51 return None, word
52
53
54 def GetAutoCompleteDefaultKeywords(self):
55 return HTMLKEYWORDS
56
57
58## def _CreateControl(self, parent, id):
59## import wx # wxBug: When inlining the import of the appropriate html control below, have to specifically import wx for some reason
60## self._notebook = wx.Notebook(parent, wx.NewId(), style = wx.NB_BOTTOM)
61## self._textEditor = HtmlCtrl(self._notebook, id)
62## if wx.Platform =='__WXMSW__':
63## import wxPython.iewin
64## self._browserCtrl = wxPython.iewin.wxIEHtmlWin(self._notebook, -1, style = wx.NO_FULL_REPAINT_ON_RESIZE)
65## else:
66## import wx.html
67## self._browserCtrl = wx.html.HtmlWindow(self._notebook, -1, style = wx.NO_FULL_REPAINT_ON_RESIZE)
68## self._notebook.AddPage(self._textEditor, _("Edit"))
69## self._notebook.AddPage(self._browserCtrl, _("View"))
70## self._insertMode = True
71## wx.EVT_NOTEBOOK_PAGE_CHANGED(self._notebook, self._notebook.GetId(), self.OnNotebookChanging)
72## return self._textEditor
73##
74##
75## def _CreateSizer(self, frame):
76## sizer = wx.BoxSizer(wx.HORIZONTAL)
77## sizer.Add(self._notebook, 1, wx.EXPAND)
78## frame.SetSizer(sizer)
79## frame.SetAutoLayout(True)
80##
81##
82## def OnNotebookChanging(self, event):
83## if event.GetSelection() == 0: # Going to the edit page
84## pass # self._textEditor.Refresh()
85## elif event.GetSelection() == 1: # Going to the browser page
86## text = self._textEditor.GetText()
87## if wx.Platform == '__WXMSW__':
88## path = os.path.join(tempfile.gettempdir(), "temp.html")
89## file = open(path, 'w')
90## file.write(text)
91## file.close()
92## self._browserCtrl.Navigate("file://" + path)
93## else:
94## self._browserCtrl.SetPage(text)
95## event.Skip()
96
97
98class HtmlService(CodeEditor.CodeService):
99
100
101 def __init__(self):
102 CodeEditor.CodeService.__init__(self)
103
104
105class HtmlCtrl(CodeEditor.CodeCtrl):
106
107
26ee3a06
RD
108 def __init__(self, parent, id=-1, style=wx.NO_FULL_REPAINT_ON_RESIZE):
109 CodeEditor.CodeCtrl.__init__(self, parent, id, style)
1f780e48
RD
110 self.SetLexer(wx.stc.STC_LEX_HTML)
111 self.SetProperty("fold.html", "1")
112
26ee3a06 113
1f780e48
RD
114 def GetMatchingBraces(self):
115 return "<>[]{}()"
116
26ee3a06 117
1f780e48
RD
118 def CanWordWrap(self):
119 return True
120
121
122 def SetViewDefaults(self):
123 CodeEditor.CodeCtrl.SetViewDefaults(self, configPrefix = "Html", hasWordWrap = False, hasTabs = True)
124
125
126 def GetFontAndColorFromConfig(self):
127 return CodeEditor.CodeCtrl.GetFontAndColorFromConfig(self, configPrefix = "Html")
128
129
130 def UpdateStyles(self):
131 CodeEditor.CodeCtrl.UpdateStyles(self)
132
133 if not self.GetFont():
134 return
135
136 faces = { 'font' : self.GetFont().GetFaceName(),
137 'size' : self.GetFont().GetPointSize(),
138 'size2': self.GetFont().GetPointSize() - 2,
139 'color' : "%02x%02x%02x" % (self.GetFontColor().Red(), self.GetFontColor().Green(), self.GetFontColor().Blue())
140 }
141
142 # White space
143 self.StyleSetSpec(wx.stc.STC_H_DEFAULT, "face:%(font)s,fore:#000000,face:%(font)s,size:%(size)d" % faces)
144 # Comment
145 self.StyleSetSpec(wx.stc.STC_H_COMMENT, "face:%(font)s,fore:#007F00,italic,face:%(font)s,size:%(size)d" % faces)
146 # Number
147 self.StyleSetSpec(wx.stc.STC_H_NUMBER, "face:%(font)s,fore:#007F7F,size:%(size)d" % faces)
148 # String
149 self.StyleSetSpec(wx.stc.STC_H_SINGLESTRING, "face:%(font)s,fore:#7F007F,face:%(font)s,size:%(size)d" % faces)
150 self.StyleSetSpec(wx.stc.STC_H_DOUBLESTRING, "face:%(font)s,fore:#7F007F,face:%(font)s,size:%(size)d" % faces)
151 # Tag
152 self.StyleSetSpec(wx.stc.STC_H_TAG, "face:%(font)s,fore:#00007F,bold,size:%(size)d" % faces)
153 # Attributes
154 self.StyleSetSpec(wx.stc.STC_H_ATTRIBUTE, "face:%(font)s,fore:#00007F,bold,size:%(size)d" % faces)
155
156
157class HtmlOptionsPanel(STCTextEditor.TextOptionsPanel):
158
159 def __init__(self, parent, id):
160 STCTextEditor.TextOptionsPanel.__init__(self, parent, id, configPrefix = "Html", label = "HTML", hasWordWrap = True, hasTabs = True)
161
162
163HTMLKEYWORDS = [
164 "A", "ABBR", "ACRONYM", "ADDRESS", "APPLET", "AREA", "B", "BASE", "BASEFONT", "BDO", "BIG", "BLOCKQUOTE",
165 "BODY", "BR", "BUTTON", "CAPTION", "CENTER", "CITE", "CODE", "COL", "COLGROUP", "DD", "DEL", "DFN", "DIR",
166 "DIV", "DL", "DT", "EM", "FIELDSET", "FONT", "FORM", "FRAME", "FRAMESET", "H1", "H2", "H3", "H4", "H5", "H6",
167 "HEAD", "HR", "HTML", "I", "IFRAME", "IMG", "INPUT", "INS", "ISINDEX", "KBD", "LABEL", "LEGEND", "LI", "LINK",
168 "MAP", "MENU", "META", "NOFRAMES", "NOSCRIPT", "OBJECT", "OL", "OPTGROUP", "OPTION", "P", "PARAM",
169 "PRE", "Q", "S", "SAMP", "SCRIPT", "SELECT", "SMALL", "SPAN", "STRIKE", "STRONG", "STYLE", "SUB", "SUP",
170 "TABLE", "TBODY", "TD", "TEXTAREA", "TFOOT", "TH", "THEAD", "TITLE", "TR", "TT", "U", "UL", "VAR", "XML",
171 "XMLNS", "ACCEPT-CHARSET", "ACCEPT", "ACCESSKEY", "ACTION", "ALIGN", "ALINK", "ALT",
172 "ARCHIVE", "AXIS", "BACKGROUND", "BGCOLOR", "BORDER", "CELLPADDING", "CELLSPACING", "CHAR",
173 "CHAROFF", "CHARSET", "CHECKED", "CLASS", "CLASSID", "CLEAR", "CODEBASE", "CODETYPE",
174 "COLOR", "COLS", "COLSPAN", "COMPACT", "CONTENT", "COORDS", "DATA", "DATAFLD", "DATAFORMATAS",
175 "DATAPAGESIZE", "DATASRC", "DATETIME", "DECLARE", "DEFER", "DISABLED", "ENCTYPE",
176 "EVENT", "FACE", "FOR", "FRAMEBORDER", "HEADERS", "HEIGHT", "HREF", "HREFLANG", "HSPACE",
177 "HTTP-EQUIV", "ID", "ISMAP", "LANG", "LANGUAGE", "LEFTMARGIN", "LONGDESC",
178 "MARGINWIDTH", "MARGINHEIGHT", "MAXLENGTH", "MEDIA", "METHOD", "MULTIPLE", "NAME", "NOHREF",
179 "NORESIZE", "NOSHADE", "NOWRAP", "ONBLUR", "ONCHANGE", "ONCLICK", "ONDBLCLICK",
180 "ONFOCUS", "ONKEYDOWN", "ONKEYPRESS", "ONKEYUP", "ONLOAD", "ONMOUSEDOWN", "ONMOUSEMOVE",
181 "ONMOUSEOVER", "ONMOUSEOUT", "ONMOUSEUP", "ONRESET", "ONSELECT", "ONSUBMIT", "ONUNLOAD",
182 "PROFILE", "PROMPT", "READONLY", "REL", "REV", "ROWS", "ROWSPAN", "RULES", "SCHEME", "SCOPE",
183 "SELECTED", "SHAPE", "SIZE", "SRC", "STANDBY", "START", "SUMMARY", "TABINDEX",
184 "TARGET", "TOPMARGIN", "TYPE", "USEMAP", "VALIGN", "VALUE", "VALUETYPE",
185 "VERSION", "VLINK", "VSPACE", "WIDTH", "TEXT", "PASSWORD", "CHECKBOX", "RADIO", "SUBMIT", "RESET",
186 "FILE", "HIDDEN", "IMAGE", "PUBLIC", "!DOCTYPE",
187 "ADD_DATE", "LAST_MODIFIED", "LAST_VISIT"
188 ]
189
190
191#----------------------------------------------------------------------------
192# Icon Bitmaps - generated by encode_bitmaps.py
193#----------------------------------------------------------------------------
194from wx import ImageFromStream, BitmapFromImage
1f780e48
RD
195import cStringIO
196
197
198def getHTMLData():
199 return \
200'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\
201\x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\
bbf7159c
RD
202\x00\x00\xd3IDAT8\x8dcddbf\xa0\x040\xfe\xbf\xd1\xf3\x9f\x12\x03X\xfe}\xbeI\
203\x91\x0b\x98(\xd2=(\x0c`\x90W\xd2\xfc\x0f\x030\xb6\xbc\x92\xe6\x7f\x1d\x03\
204\xf3\xffN\xae\xde\xff\xff\xff\xff\xff\xdf\xc0\xd8\xfa\xff\xb5;O\xfe_\xbb\xf3\
205\xe4\xbf\x8e\x819\\\xcd\xd7_\xff\xff\xb3<|x\x9dAAY\x0b\xc5\xd0\x07w\xaf1\xd8\
206\xdbZ0\xec\xdd\xb5\x85\x81\x81\x81\x81\xe1\xdd\xf3\x1b\x0c\xab\x97\xcef\xe0`\
207ca\xf8\xfa\xf1\x19\\\x1d\x17+\x03\x03\x0b\x03\x03\x03Cqq>\xc3\xd3\x17o\x18V,\
208]\n\x97de\xe7\x81\xb3\x199\xc4\x18\x0e\x1d:\xc2 "*\xce\xf0\x8f\x11!\x8e\xd3\
209\x0b\xd8\xd8\xa7\x8e\xed\xf9\x7f\xf1\xcca\x14o\xca+i\xfeg\xfc{:\x95\xa2\x844\
210\xf0\xd1H\xb1\x01\x8c\x94\xe6F\x8a]\x00\x00YXz\xf0\x97\x87\'\x1a\x00\x00\x00\
211\x00IEND\xaeB`\x82'
1f780e48
RD
212
213
214def getHTMLBitmap():
215 return BitmapFromImage(getHTMLImage())
216
217def getHTMLImage():
218 stream = cStringIO.StringIO(getHTMLData())
219 return ImageFromStream(stream)
220
221def getHTMLIcon():
bbf7159c 222 return wx.IconFromBitmap(getHTMLBitmap())