60
59
#-----------------------------------------------------------------------------#
62
61
ID_CLOSE_BUTTON = wx.NewId()
63
ID_SEARCH_CTRL = wx.NewId()
64
62
ID_SEARCH_NEXT = wx.NewId()
65
63
ID_SEARCH_PRE = wx.NewId()
66
64
ID_MATCH_CASE = wx.NewId()
67
ID_LINE_CTRL = wx.NewId()
68
ID_CMD_CTRL = wx.NewId()
70
67
#-----------------------------------------------------------------------------#
72
class CommandBar(wx.Panel):
73
"""The command bar is a slim panel that is used to hold various small
74
controls for searching jumping to line, ect...
75
@todo: make a plugin interface and a management system for showing and
76
hiding the various conrols
79
def __init__(self, parent, id_, size=(-1, 24), style=wx.TAB_TRAVERSAL):
80
"""Initializes the bar and its default widgets
81
@postcondition: commandbar is created
84
wx.Panel.__init__(self, parent, id_, size=size, style=style)
69
class CommandBarBase(eclib.ControlBar):
70
"""Base class for control bars"""
71
def __init__(self, parent):
72
eclib.ControlBar.__init__(self, parent,
73
style=eclib.CTRLBAR_STYLE_GRADIENT)
75
if wx.Platform == '__WXGTK__':
76
self.SetWindowStyle(eclib.CTRLBAR_STYLE_DEFAULT)
87
81
self._parent = parent
88
self._installed = False
89
self._sizers = dict(psizer=parent.GetSizer(),
90
h_sizer=wx.BoxSizer(wx.HORIZONTAL),
96
v_sizer = wx.BoxSizer(wx.VERTICAL)
97
self._sizers['h_sizer'].Add((8, 8))
98
bstyle = wx.BU_EXACTFIT
99
if wx.Platform == '__WXGTK__':
100
bstyle = wx.NO_BORDER
102
self.close_b = wx.BitmapButton(self, ID_CLOSE_BUTTON, \
103
XButton.GetBitmap(), style=bstyle)
104
self._sizers['h_sizer'].Add(self.close_b, 0, wx.ALIGN_CENTER_VERTICAL)
105
self._sizers['h_sizer'].Add((12, 12))
107
self._sizers['h_sizer'].Add(v_sizer)
108
self.SetSizer(self._sizers['h_sizer'])
109
self.SetAutoLayout(True)
112
ed_msg.Subscribe(self.OnThemeChange, ed_msg.EDMSG_THEME_CHANGED)
114
# Don't paint the gradient on gtk due to transparency
115
# issues with some controls
116
if wx.Platform != '__WXGTK__':
117
self.Bind(wx.EVT_PAINT, self.OnPaint)
118
self.Bind(wx.EVT_BUTTON, self.OnButton)
119
self.Bind(wx.EVT_CHECKBOX, self.OnCheck)
83
self.close_b = eclib.PlateButton(self, ID_CLOSE_BUTTON,
84
bmp=XButton.GetBitmap(),
85
style=eclib.PB_STYLE_NOBG)
88
self.AddControl(self.close_b, wx.ALIGN_LEFT)
91
self.Bind(wx.EVT_BUTTON, self.OnClose, self.close_b)
93
def OnClose(self, evt):
94
"""Handles events from the buttons on the bar
95
@param evt: Event that called this handler
99
if e_id == ID_CLOSE_BUTTON:
122
105
"""Hides the control and notifies the parent
123
106
@postcondition: commandbar is hidden
107
@todo: dont reference nb directly here
127
if self._sizers['psizer'] != None:
128
self._sizers['psizer'].Layout()
110
super(CommandBarBase, self).Hide()
129
111
self._parent.SendSizeEvent()
130
112
self._parent.nb.GetCurrentCtrl().SetFocus()
133
def InstallCtrl(self, id_):
134
"""Installs a control into the bar by ID
135
@postcondition: control is installed
136
@return: requested control or None
139
if id_ == ID_SEARCH_CTRL:
140
ctrl = self.InstallSearchCtrl()
141
elif id_ == ID_LINE_CTRL:
142
ctrl = self.InstallLineCtrl()
143
elif id_ == ID_CMD_CTRL:
144
ctrl = self.InstallCommandCtrl()
149
def InstallLineCtrl(self):
150
"""Installs the go to line control into the panel.
151
@postcondition: GotoLine control is installed in bar.
154
h_sizer = wx.BoxSizer(wx.HORIZONTAL)
155
v_sizer = wx.BoxSizer(wx.VERTICAL)
157
linectrl = LineCtrl(self, ID_LINE_CTRL, self._parent.nb.GetCurrentCtrl,
159
v_sizer.Add(linectrl, 0, wx.ALIGN_CENTER_VERTICAL)
161
go_lbl = wx.StaticText(self, label=_("Goto Line") + ": ")
162
if wx.Platform == '__WXMAC__':
163
go_lbl.SetFont(wx.SMALL_FONT)
164
h_sizer.AddMany([(go_lbl, 0, wx.ALIGN_CENTER_VERTICAL),
165
((5, 5)), (v_sizer)])
167
self._sizers['goto'] = h_sizer
168
self._sizers['h_sizer'].Add(h_sizer, 0, wx.ALIGN_CENTER_HORIZONTAL)
169
self._sizers['h_sizer'].Layout()
172
def InstallCommandCtrl(self):
173
"""Install the sizer containing the command executer control
175
@return: the command control instance
178
h_sizer = wx.BoxSizer(wx.HORIZONTAL)
179
v_sizer = wx.BoxSizer(wx.VERTICAL)
181
cmdctrl = CommandExecuter(self, ID_CMD_CTRL, size=(150, 20))
182
v_sizer.Add(cmdctrl, 0, wx.ALIGN_CENTER_VERTICAL)
184
cmd_lbl = wx.StaticText(self, label=_("Command") + ": ")
185
if wx.Platform == '__WXMAC__':
186
cmd_lbl.SetFont(wx.SMALL_FONT)
187
h_sizer.AddMany([(cmd_lbl, 0, wx.ALIGN_CENTER_VERTICAL),
188
((5, 5)), (v_sizer)])
190
self._sizers['cmd'] = h_sizer
191
self._sizers['h_sizer'].Add(h_sizer, 0, wx.ALIGN_CENTER_HORIZONTAL)
192
self._sizers['h_sizer'].Layout()
195
def InstallSearchCtrl(self):
196
"""Installs the search context controls into the panel.
197
Other controls should be removed from the panel before calling
199
@postcondition: search control is installed in bar
202
h_sizer = wx.BoxSizer(wx.HORIZONTAL)
203
v_sizer = wx.BoxSizer(wx.VERTICAL)
204
t_sizer = wx.BoxSizer(wx.VERTICAL)
207
if wx.Platform == '__WXGTK__':
210
search = ed_search.EdSearchCtrl(self, ID_SEARCH_CTRL,
211
menulen=5, size=(180, 20))
212
v_sizer.Add(search, 0, wx.ALIGN_CENTER_VERTICAL)
115
def SetControl(self, ctrl):
116
"""Set the main control of this command bar
123
"""Set the focus to the bar and its main control"""
124
super(CommandBarBase, self).SetFocus()
125
if self.ctrl is not None:
128
#-----------------------------------------------------------------------------#
130
class SearchBar(CommandBarBase):
131
"""Commandbar for searching text in the current buffer."""
132
def __init__(self, parent):
133
CommandBarBase.__init__(self, parent)
136
self.SetControl(ed_search.EdSearchCtrl(self, wx.ID_ANY,
137
menulen=5, size=(180, -1)))
138
self._sctrl = self.ctrl.GetSearchController()
214
141
f_lbl = wx.StaticText(self, label=_("Find") + u": ")
215
ctrl_sizer = wx.BoxSizer(wx.HORIZONTAL)
216
142
t_bmp = wx.ArtProvider.GetBitmap(str(ed_glob.ID_DOWN), wx.ART_MENU)
217
next_btn = platebtn.PlateButton(self, ID_SEARCH_NEXT, _("Next"),
218
t_bmp, style=platebtn.PB_STYLE_NOBG)
143
next_btn = eclib.PlateButton(self, ID_SEARCH_NEXT, _("Next"),
144
t_bmp, style=eclib.PB_STYLE_NOBG)
145
self.AddControl(f_lbl, wx.ALIGN_LEFT)
146
self.AddControl(self.ctrl, wx.ALIGN_LEFT)
147
self.AddControl(next_btn, wx.ALIGN_LEFT)
220
149
t_bmp = wx.ArtProvider.GetBitmap(str(ed_glob.ID_UP), wx.ART_MENU)
221
pre_btn = platebtn.PlateButton(self, ID_SEARCH_PRE, _("Previous"),
222
t_bmp, style=platebtn.PB_STYLE_NOBG)
150
pre_btn = eclib.PlateButton(self, ID_SEARCH_PRE, _("Previous"),
151
t_bmp, style=eclib.PB_STYLE_NOBG)
152
self.AddControl(pre_btn, wx.ALIGN_LEFT)
224
154
match_case = wx.CheckBox(self, ID_MATCH_CASE, _("Match Case"))
225
match_case.SetValue(search.IsMatchCase())
155
match_case.SetValue(self.ctrl.IsMatchCase())
156
self.AddControl(match_case, wx.ALIGN_LEFT)
158
regex_cb = wx.CheckBox(self, ID_REGEX, _("Regular Expression"))
159
regex_cb.SetValue(self.ctrl.IsRegEx())
160
self.AddControl(regex_cb, wx.ALIGN_LEFT)
162
# HACK: workaround bug in mac control that resets size to
163
# that of the default variant after any text has been
164
# typed in it. Note it reports the best size as the default
165
# variant and causes layout issues. wxBUG
226
166
if wx.Platform == '__WXMAC__':
228
for win in [f_lbl, match_case, next_btn, pre_btn]:
229
win.SetFont(wx.SMALL_FONT)
231
ctrl_sizer.AddMany([(10, 0), (next_btn, 0, wx.ALIGN_CENTER_VERTICAL),
232
((5, 0)), (pre_btn, 0, wx.ALIGN_CENTER_VERTICAL),
234
(match_case, 0, wx.ALIGN_CENTER_VERTICAL)])
236
t_sizer.Add(ctrl_sizer, 0, wx.ALIGN_CENTER_VERTICAL)
238
h_sizer.AddMany([(f_lbl, 0, wx.ALIGN_CENTER_VERTICAL),
239
((5, 5)), (v_sizer, 0, wx.ALIGN_CENTER_VERTICAL),
240
(t_sizer, 0, wx.ALIGN_CENTER_VERTICAL)])
241
self._sizers['search'] = h_sizer
242
self._sizers['h_sizer'].Add(h_sizer, 0, wx.ALIGN_CENTER_HORIZONTAL)
243
self._sizers['h_sizer'].Layout()
167
self.ctrl.SetSizeHints(180, 16, 180, 16)
170
self.Bind(wx.EVT_BUTTON, self.OnButton)
171
self.Bind(wx.EVT_CHECKBOX, self.OnCheck)
172
ed_msg.Subscribe(self.OnThemeChange, ed_msg.EDMSG_THEME_CHANGED)
173
self._sctrl.RegisterClient(self)
176
ed_msg.Unsubscribe(self.OnThemeChange)
177
self._sctrl.RemoveClient(self)
179
def OnButton(self, evt):
180
"""Handle button clicks for the next/previous buttons
181
@param evt: wx.CommandEvent
185
if e_id in [ID_SEARCH_NEXT, ID_SEARCH_PRE]:
186
self.ctrl.DoSearch(e_id == ID_SEARCH_NEXT)
246
190
def OnCheck(self, evt):
247
"""Check box event handler
248
@param evt: Event that called this handler
249
@type evt: wx.EVT_CHECKBOX
191
"""Set search options for match case, regex, ect...
192
@param evt: wx.CommandEvent
252
195
e_id = evt.GetId()
253
if e_id == ID_MATCH_CASE:
196
if e_id in (ID_MATCH_CASE, ID_REGEX):
254
197
ctrl = self.FindWindowById(e_id)
256
search = self.FindWindowById(ID_SEARCH_CTRL)
199
if e_id == ID_MATCH_CASE:
200
flag = eclib.AFR_MATCHCASE
202
flag = eclib.AFR_REGEX
204
if self.ctrl != None:
258
205
if ctrl.GetValue():
259
search.SetSearchFlag(finddlg.AFR_MATCHCASE)
206
self.ctrl.SetSearchFlag(flag)
261
search.ClearSearchFlag(finddlg.AFR_MATCHCASE)
265
def OnButton(self, evt):
266
"""Handles events from the buttons on the bar
267
@param evt: Event that called this handler
271
if e_id == ID_CLOSE_BUTTON:
273
elif e_id in [ID_SEARCH_NEXT, ID_SEARCH_PRE]:
274
search = self.FindWindowById(ID_SEARCH_CTRL)
276
search.DoSearch(e_id == ID_SEARCH_NEXT)
280
def OnPaint(self, evt):
281
"""Paints the background of the bar with a nice gradient.
282
@param evt: Event that called this handler
283
@type evt: wx.PaintEvent
286
dc = wx.PaintDC(self)
287
gc = wx.GraphicsContext.Create(dc)
288
col1 = wx.SystemSettings_GetColour(wx.SYS_COLOUR_3DFACE)
289
col2 = util.AdjustColour(col1, 40)
290
col1 = util.AdjustColour(col1, -15)
291
grad = gc.CreateLinearGradientBrush(0, 1, 0, 29, col2, col1)
292
rect = self.GetClientRect()
294
pen_col = tuple([min(190, x) for x in util.AdjustColour(col1, 20)])
295
gc.SetPen(gc.CreatePen(wx.Pen(pen_col, 1)))
297
gc.DrawRectangle(0, 1, rect.width - 0.5, rect.height - 0.5)
208
self.ctrl.ClearSearchFlag(flag)
212
def NotifyOptionChanged(self, evt):
213
"""Callback for L{ed_search.SearchController} to notify of update
215
@param evt: eclib.finddlg.FindEvent
218
self.FindWindowById(ID_MATCH_CASE).SetValue(evt.IsMatchCase())
219
self.FindWindowById(ID_REGEX).SetValue(evt.IsRegEx())
301
221
def OnThemeChange(self, msg):
302
222
"""Update icons when the theme has changed
303
223
@param msg: Message Object
308
def Show(self, id_=0):
309
"""Shows the control and installs it in the parents
310
sizer if not installed already.
311
@param id_: Id of control to show in bar
314
# Install self in parent
315
if not self._installed and self._sizers['psizer'] != None:
316
self._installed = True
317
self._sizers['psizer'].Add(self, 0, wx.EXPAND)
318
self._sizers['psizer'].Layout()
319
self._parent.SendSizeEvent()
322
# HACK YUCK, come back and try again when my brain is working
323
# Show specified control
325
ctrl = self.FindWindowById(id_)
327
ctrl = self.InstallCtrl(id_)
329
# First Hide everything
330
for kid in (list(self._sizers['search'].GetChildren()) +
331
list(self._sizers['goto'].GetChildren()) +
332
list(self._sizers['cmd'].GetChildren())):
335
if id_ == ID_SEARCH_CTRL:
336
for kid in self._sizers['search'].GetChildren():
338
self.FindWindowById(ID_SEARCH_CTRL).AutoSetQuery()
339
self._sizers['search'].Layout()
340
elif id_ == ID_LINE_CTRL:
341
for kid in self._sizers['goto'].GetChildren():
343
elif id_ == ID_CMD_CTRL:
344
for kid in self._sizers['cmd'].GetChildren():
347
self.GetSizer().Layout()
352
def UpdateIcons(self):
353
"""Refresh icons to current theme settings
354
@postcondition: all icons are updated
357
226
next = self.FindWindowById(ID_SEARCH_NEXT)
359
228
t_bmp = wx.ArtProvider.GetBitmap(str(ed_glob.ID_DOWN), wx.ART_MENU)