removed obsolete issues (many of them fixed with AE)
[docutils.git] / sandbox / gschwant / docfactory / factory / controls.py
blobda3b3817b30472194ee395cc4ffbdfdb5cf03a4e
1 """
2 :author: Dr. Gunnar Schwant
3 :contact: g.schwant@gmx.de
4 :version: 0.3
5 """
7 import os, throbimages, time
8 from wxPython.wx import *
9 from wxPython.stc import *
10 from docutilsadapter import get_rest_bibl_fields
11 from docutilsadapter import get_rest_directives
12 from dialogs import customMsgBox
13 from shutil import copyfile
15 if wxPlatform == '__WXMSW__':
16 faces = { 'times': 'Times New Roman',
17 'mono' : 'Courier New',
18 'helv' : 'Arial',
19 'other': 'Comic Sans MS',
20 'size' : 10,
21 'size2': 8,
23 else:
24 faces = { 'times': 'Times',
25 'mono' : 'Courier',
26 'helv' : 'Helvetica',
27 'other': 'new century schoolbook',
28 'size' : 12,
29 'size2': 10,
32 #---------------------------------------------------------------------------
34 class CustomStyledTextCtrl(wxStyledTextCtrl):
35 def __init__(self, parent, ID, log):
36 wxStyledTextCtrl.__init__(self, parent, ID)
37 self.log = log
39 self.CmdKeyAssign(ord('L'), wxSTC_SCMOD_CTRL, wxSTC_CMD_ZOOMIN)
40 self.CmdKeyAssign(ord('K'), wxSTC_SCMOD_CTRL, wxSTC_CMD_ZOOMOUT)
41 self.SetEdgeMode(wxSTC_EDGE_LINE)
42 self.SetEdgeColour(wxColour(175,255,255))
43 self.SetEdgeColumn(75)
44 self.SetUseTabs(0)
45 self.SetIndent(2)
46 self.SetEOLMode(wxSTC_EOL_LF)
48 self.set_styles()
50 EVT_STC_MODIFIED(self, ID, self.OnModified)
51 EVT_CHAR(self, self.OnChar)
53 # lists for autocompletion:
54 self.bibliographic_fields = get_rest_bibl_fields()
55 self.directives = get_rest_directives()
57 self.IsModified = 0
59 def set_styles(self):
61 # general
62 self.StyleSetSpec(wxSTC_STYLE_DEFAULT, 'face:%(mono)s,size:%(size)d' % faces)
63 self.StyleSetSpec(1, 'face:%(mono)s,bold,fore:#0000FF,size:%(size)d' % faces)
64 self.StyleSetSpec(2, 'face:%(mono)s,italic,fore:#FF0000,size:%(size)d' % faces)
65 self.StyleSetSpec(3, 'face:%(mono)s,bold,size:%(size)d' % faces)
66 self.StyleSetSpec(4, 'face:%(mono)s,size:%(size)d' % faces)
67 self.StyleSetSpec(wxSTC_STYLE_CONTROLCHAR, 'face:%(other)s' % faces)
69 # line numbers in the margin
70 self.StyleSetSpec(wxSTC_STYLE_LINENUMBER,
71 'back:#C0C0C0,face:%(helv)s,size:%(size2)d' % faces)
72 self.SetMarginType(0, wxSTC_MARGIN_NUMBER)
73 self.SetMarginWidth(0, 3*faces['size']-2)
75 # markers
76 self.SetMarginType(1, wxSTC_MARGIN_SYMBOL)
77 self.MarkerDefine(0, wxSTC_MARK_CIRCLE, 'RED', '#FFFF00')
78 self.MarkerDefine(1, wxSTC_MARK_CIRCLE, '#FFFF00', 'RED')
80 def OnChar(self, event):
81 key = event.KeyCode()
82 currpos = self.GetCurrentPos()
83 currcol = self.GetColumn(currpos)
84 if currcol == 0 and key == ord(':'):
85 self.AddText(':')
86 self.AutoCompShow(0, self.bibliographic_fields)
87 elif currcol == 2 and key == ord(' '):
88 if self.GetCharAt(currpos - 1) == self.GetCharAt(currpos - 2) == ord('.'):
89 self.AddText(' ')
90 self.AutoCompShow(0, self.directives)
91 else:
92 event.Skip()
93 else:
94 event.Skip()
96 def OnModified(self, evt):
97 self.IsModified = 1
99 def set_lexer(self, ext):
100 lexer = self.GetLexer()
101 if ext == '.html' or ext == '.htm':
102 if lexer != wxSTC_LEX_HTML:
103 self.SetLexer(wxSTC_LEX_HTML)
104 else:
105 if lexer != wxSTC_LEX_NULL:
106 self.SetLexer(wxSTC_LEX_NULL)
108 def LoadFile(self, filename):
109 try:
110 wxBeginBusyCursor()
111 try:
112 f = open(filename, 'rt')
113 text = f.read()
114 f.close()
115 ext = os.path.splitext(filename)[1]
116 self.set_lexer(ext)
117 self.SetText(text)
118 self.EmptyUndoBuffer()
119 self.IsModified = 0
120 except:
121 self.Clear()
122 customMsgBox(self, '%s:\n%s\n%s' % sys.exc_info(), 'error')
123 finally:
124 wxEndBusyCursor()
126 def SaveFile(self, filename, backup=0):
127 return_value = 1
128 try:
129 wxBeginBusyCursor()
130 try:
131 if backup:
132 copyfile(filename, '%s.bak' % filename)
133 f = open(filename, 'w')
134 f.write(self.GetText())
135 f.close()
136 self.IsModified = 0
137 except:
138 return_value = 0
139 customMsgBox(self, 'Error when saving "%s".\n\n%s:\n%s\n%s' \
140 % (filename, sys.exc_info()[0], sys.exc_info()[1],
141 sys.exc_info()[2]),
142 'error')
143 finally:
144 wxEndBusyCursor()
145 return return_value
147 def Clear(self):
148 self.SetText('')
149 self.IsModified = 0
151 #---------------------------------------------------------------------------
153 class CustomStatusBar(wxStatusBar):
154 def __init__(self, parent):
155 wxStatusBar.__init__(self, parent, -1)
156 self.SetFieldsCount(2)
157 self.SetStatusWidths([-1,150])
159 self.SetStatusText('Ready', 0)
161 # start timer
162 self.timer = wxPyTimer(self.Notify)
163 self.timer.Start(1000)
164 self.Notify()
166 # Time-out handler
167 def Notify(self):
168 t = time.localtime(time.time())
169 st = time.strftime(" %d-%b-%Y %H:%M:%S", t)
170 self.SetStatusText(st, 1)
172 #---------------------------------------------------------------------------
174 class CustomTreeCtrl(wxTreeCtrl):
176 def OnCompareItems(self, item1, item2):
177 t1 = self.GetItemText(item1)
178 t2 = self.GetItemText(item2)
179 #self.log.WriteText('compare: ' + t1 + ' <> ' + t2 + '\n')
180 if t1 < t2: return -1
181 if t1 == t2: return 0
182 return 1