]> git.saurik.com Git - wxWidgets.git/blame - src/univ/toolbar.cpp
Got dialog sizing to work, downsized fonts a bit (though it always returns
[wxWidgets.git] / src / univ / toolbar.cpp
CommitLineData
c08a4f00
RR
1/////////////////////////////////////////////////////////////////////////////
2// Name: src/univ/toolbar.cpp
3// Author: Robert Roebling
4// Id: $Id$
5// Copyright: (c) 2001 Robert Roebling
6// Licence: wxWindows licence
7/////////////////////////////////////////////////////////////////////////////
8
9// ============================================================================
10// declarations
11// ============================================================================
12
13// ----------------------------------------------------------------------------
14// headers
15// ----------------------------------------------------------------------------
16
17#ifdef __GNUG__
18 #pragma implementation "univtoolbar.h"
19#endif
20
21// For compilers that support precompilation, includes "wx.h".
22#include "wx/wxprec.h"
23
24#ifdef __BORLANDC__
25 #pragma hdrstop
26#endif
27
28#ifndef WX_PRECOMP
29 #include "wx/utils.h"
30 #include "wx/app.h"
31#endif
32
33#include "wx/toolbar.h"
c229e50d 34#include "wx/image.h"
c08a4f00
RR
35
36//-----------------------------------------------------------------------------
37// wxToolBar
38//-----------------------------------------------------------------------------
39
40BEGIN_EVENT_TABLE(wxToolBar,wxToolBarBase)
41 EVT_MOUSE_EVENTS( wxToolBar::OnMouse )
42 EVT_PAINT( wxToolBar::OnPaint )
43 EVT_SIZE( wxToolBar::OnSize )
bb312b54
RR
44 EVT_ENTER_WINDOW( wxToolBar::OnEnter )
45 EVT_LEAVE_WINDOW( wxToolBar::OnLeave )
c08a4f00
RR
46END_EVENT_TABLE()
47
48bool wxToolBar::Create( wxWindow *parent, wxWindowID id,
49 const wxPoint& pos, const wxSize& size,
50 long style, const wxString& name )
16c9a425 51{
c08a4f00
RR
52 bool ret = wxToolBarBase::Create( parent, id, pos, size, style, wxDefaultValidator, name );
53
54 return ret;
55}
56
57void wxToolBar::Init()
58{
16c9a425
JS
59 // TODO: this is from tbarbase.cpp, but should be in
60 // wxToolbarBase::Init
61 // the list owns the pointers
62 m_tools.DeleteContents(TRUE);
63 m_xMargin = m_yMargin = 0;
64 m_maxRows = m_maxCols = 0;
65 // End TODO
66
67 m_maxWidth = 0;
68 m_maxHeight = 0;
69
c08a4f00 70 m_captured = NULL;
bb312b54
RR
71 m_underMouse = NULL;
72
c08a4f00
RR
73 SetToolBitmapSize( wxSize(16,15) );
74}
75
76wxToolBarToolBase *wxToolBar::FindToolForPosition(wxCoord x, wxCoord y) const
77{
78 return NULL;
79}
80
81void wxToolBar::SetToolShortHelp(int id, const wxString& helpString)
82{
83}
84
85bool wxToolBar::DoInsertTool(size_t pos, wxToolBarToolBase *tool)
86{
87 return TRUE;
88}
89
90bool wxToolBar::DoDeleteTool(size_t pos, wxToolBarToolBase *tool)
91{
92 return TRUE;
93}
94
95void wxToolBar::DoEnableTool(wxToolBarToolBase *tool, bool enable)
96{
a14a2227
JS
97 // Comment this out if you don't want the disabled look,
98 // which currently acts weirdly for the scissors icon
99 // in the toolbar sample. See src/common/tbarbase.cpp
100 // for the wxCreateGreyedImage function.
101#if 1
c229e50d 102 // Created disabled-state bitmap on demand
c18ac572 103 if (!enable && !tool->GetBitmap2().Ok())
c229e50d 104 {
bb312b54 105 wxImage image( tool->GetBitmap1() );
c229e50d 106
bb312b54
RR
107 unsigned char bg_red = 180;
108 unsigned char bg_green = 180;
109 unsigned char bg_blue = 180;
110
111 unsigned char mask_red = image.GetMaskRed();
112 unsigned char mask_green = image.GetMaskGreen();
113 unsigned char mask_blue = image.GetMaskBlue();
114
115 bool has_mask = image.HasMask();
116
117 int x,y;
118 for (y = 0; y < image.GetHeight(); y++)
119 {
120 for (x = 0; x < image.GetWidth(); x++)
121 {
122 unsigned char red = image.GetRed(x,y);
123 unsigned char green = image.GetGreen(x,y);
124 unsigned char blue = image.GetBlue(x,y);
125 if (!has_mask || red != mask_red || green != mask_green || blue != mask_blue)
126 {
127 red = (((wxInt32) red - bg_red) >> 1) + bg_red;
128 green = (((wxInt32) green - bg_green) >> 1) + bg_green;
129 blue = (((wxInt32) blue - bg_blue) >> 1) + bg_blue;
130 image.SetRGB( x, y, red, green, blue );
131 }
132 }
133 }
c229e50d 134
bb312b54
RR
135 for (y = 0; y < image.GetHeight(); y++)
136 {
137 for (x = y % 2; x < image.GetWidth(); x += 2)
138 {
139 unsigned char red = image.GetRed(x,y);
140 unsigned char green = image.GetGreen(x,y);
141 unsigned char blue = image.GetBlue(x,y);
142 if (!has_mask || red != mask_red || green != mask_green || blue != mask_blue)
143 {
144 red = (((wxInt32) red - bg_red) >> 1) + bg_red;
145 green = (((wxInt32) green - bg_green) >> 1) + bg_green;
146 blue = (((wxInt32) blue - bg_blue) >> 1) + bg_blue;
147 image.SetRGB( x, y, red, green, blue );
148 }
149 }
150 }
151
152 tool->SetBitmap2( image.ConvertToBitmap() );
c229e50d 153 }
bb312b54
RR
154
155 RefreshTool((wxToolBarTool*) tool);
8262f9ae 156#endif
c08a4f00
RR
157}
158
159void wxToolBar::DoToggleTool(wxToolBarToolBase *tool, bool toggle)
160{
161 wxToolBarTool *my_tool = (wxToolBarTool*) tool;
162
163 bool refresh = (my_tool->IsToggled() != toggle);
164
165 my_tool->m_isDown = toggle;
166
167 if (refresh)
168 RefreshTool( my_tool );
169}
170
171void wxToolBar::DoSetToggle(wxToolBarToolBase *tool, bool toggle)
172{
173}
174
175wxToolBarToolBase *wxToolBar::CreateTool(int id,
176 const wxBitmap& bitmap1,
177 const wxBitmap& bitmap2,
178 bool toggle,
179 wxObject *clientData,
180 const wxString& shortHelpString,
181 const wxString& longHelpString)
182{
183 return new wxToolBarTool( this, id, bitmap1, bitmap2, toggle,
184 clientData, shortHelpString, longHelpString);
185}
186
187wxToolBarToolBase *wxToolBar::CreateTool(wxControl *control)
188{
189 wxFAIL_MSG( wxT("Toolbar doesn't support controls yet.") );
190
191 return NULL;
192}
193
194void wxToolBar::RefreshTool( wxToolBarTool *tool )
195{
196 wxRect rect( tool->m_x, tool->m_y, m_defaultWidth+6, m_defaultHeight+6 );
197 Refresh( TRUE, &rect );
198}
199
200void wxToolBar::DrawToolBarTool( wxToolBarTool *tool, wxDC &dc, bool down )
201{
8262f9ae 202 const wxBitmap& bitmap = (tool->IsEnabled() || !tool->GetBitmap2().Ok()) ? tool->GetBitmap1() : tool->GetBitmap2() ;
bb312b54
RR
203
204 if (HasFlag(wxTB_FLAT) && (tool != m_underMouse))
205 {
206 if (down)
207 dc.DrawBitmap( bitmap, tool->m_x+4, tool->m_y+4, TRUE );
208 else
209 dc.DrawBitmap( bitmap, tool->m_x+3, tool->m_y+3, TRUE );
210
211 return;
212 }
213
c08a4f00
RR
214 if (down)
215 {
c229e50d 216 dc.DrawBitmap( bitmap, tool->m_x+4, tool->m_y+4, TRUE );
c08a4f00
RR
217
218 dc.SetPen( *wxGREY_PEN );
219 dc.DrawLine( tool->m_x, tool->m_y, tool->m_x+m_defaultWidth+5, tool->m_y );
220 dc.DrawLine( tool->m_x, tool->m_y, tool->m_x, tool->m_y+m_defaultHeight+5 );
221
222 dc.SetPen( *wxBLACK_PEN );
223 dc.DrawLine( tool->m_x+1, tool->m_y+1, tool->m_x+m_defaultWidth+4, tool->m_y+1 );
224 dc.DrawLine( tool->m_x+1, tool->m_y+1, tool->m_x+1, tool->m_y+m_defaultHeight+4 );
225
226 dc.SetPen( *wxWHITE_PEN );
227 dc.DrawLine( tool->m_x, tool->m_y+m_defaultHeight+5, tool->m_x+m_defaultWidth+6, tool->m_y+m_defaultHeight+5 );
228 dc.DrawLine( tool->m_x+m_defaultWidth+5, tool->m_y, tool->m_x+m_defaultWidth+5, tool->m_y+m_defaultHeight+6 );
229 }
230 else
231 {
c229e50d 232 dc.DrawBitmap( bitmap, tool->m_x+3, tool->m_y+3, TRUE );
c08a4f00
RR
233
234 dc.SetPen( *wxWHITE_PEN );
235 dc.DrawLine( tool->m_x, tool->m_y, tool->m_x+m_defaultWidth+5, tool->m_y );
236 dc.DrawLine( tool->m_x, tool->m_y, tool->m_x, tool->m_y+m_defaultHeight+5 );
237 dc.DrawLine( tool->m_x+m_defaultWidth+4, tool->m_y, tool->m_x+m_defaultWidth+4, tool->m_y+2 );
238 dc.DrawLine( tool->m_x, tool->m_y+m_defaultHeight+4, tool->m_x+2, tool->m_y+m_defaultHeight+4 );
239
240 dc.SetPen( *wxBLACK_PEN );
241 dc.DrawLine( tool->m_x, tool->m_y+m_defaultHeight+5, tool->m_x+m_defaultWidth+6, tool->m_y+m_defaultHeight+5 );
242 dc.DrawLine( tool->m_x+m_defaultWidth+5, tool->m_y, tool->m_x+m_defaultWidth+5, tool->m_y+m_defaultHeight+6 );
243
244 dc.SetPen( *wxGREY_PEN );
245 dc.DrawLine( tool->m_x+1, tool->m_y+m_defaultHeight+4, tool->m_x+m_defaultWidth+5, tool->m_y+m_defaultHeight+4 );
246 dc.DrawLine( tool->m_x+m_defaultWidth+4, tool->m_y+1, tool->m_x+m_defaultWidth+4, tool->m_y+m_defaultHeight+5 );
247 }
248}
249
250void wxToolBar::OnPaint(wxPaintEvent &event)
251{
252 wxPaintDC dc(this);
253
d1017acf
RR
254 wxSize clientSize = GetClientSize();
255 dc.SetPen( *wxBLACK_PEN );
256 dc.DrawLine( 0,0, clientSize.x,0 );
257
c08a4f00
RR
258 for ( wxToolBarToolsList::Node *node = m_tools.GetFirst();
259 node;
260 node = node->GetNext() )
261 {
262 wxToolBarTool *tool = (wxToolBarTool*) node->Data();
263
264 if (tool->GetId() == -1) continue;
265
266 DrawToolBarTool( tool, dc, tool->m_isDown );
267 }
268}
269
270bool wxToolBar::Realize()
271{
272 if (!wxToolBarBase::Realize())
273 return FALSE;
274
16c9a425
JS
275 int x;
276 int y;
bb312b54 277
16c9a425
JS
278 if (GetWindowStyleFlag() & wxTB_VERTICAL)
279 {
bb312b54
RR
280 m_xMargin += 1; // Cannot help it, but otherwise it look ugly
281
16c9a425
JS
282 x = m_xMargin;
283 y = 5;
284 }
285 else
286 {
bb312b54
RR
287 m_yMargin += 1; // Cannot help it, but otherwise it look ugly
288
16c9a425
JS
289 y = m_yMargin;
290 x = 5;
291 }
c08a4f00
RR
292
293 for ( wxToolBarToolsList::Node *node = m_tools.GetFirst();
294 node;
295 node = node->GetNext() )
296 {
297 wxToolBarTool *tool = (wxToolBarTool*) node->Data();
298
16c9a425 299 if (GetWindowStyleFlag() & wxTB_VERTICAL)
c08a4f00 300 {
16c9a425
JS
301 if (tool->GetId() == -1)
302 {
303 y += 6;
304 continue;
305 }
306 tool->m_x = m_xMargin;
307 tool->m_y = y;
308 y += m_defaultHeight + 6;
309
310 // Calculate the maximum height or width (depending on style)
311 // so we know how to size the toolbar in Realize.
312 // We could get the size of the tool instead of the
313 // default bitmap size
314 if (m_maxWidth < (m_defaultWidth + 2*(m_xMargin + 2)))
315 m_maxWidth = (m_defaultWidth + 2*(m_xMargin + 2)) ;
316 }
317 else
318 {
319 if (tool->GetId() == -1)
320 {
321 x += 6;
322 continue;
323 }
324 tool->m_x = x;
325 tool->m_y = m_yMargin;
326 x += m_defaultWidth + 6;
327
328 // Calculate the maximum height or width (depending on style)
329 // so we know how to size the toolbar in Realize.
330 // We could get the size of the tool instead of the
331 // default bitmap size
332 if (m_maxHeight < (m_defaultHeight + 2*(m_yMargin + 2)))
333 m_maxHeight = (m_defaultHeight + 2*(m_yMargin + 2)) ;
c08a4f00
RR
334 }
335
16c9a425
JS
336 }
337
338 wxSize sz = GetSize();
339 if (GetWindowStyleFlag() & wxTB_VERTICAL)
340 {
341 SetSize(m_maxWidth, sz.y);
342 }
343 else
344 {
345 SetSize(sz.x, m_maxHeight);
c08a4f00 346 }
5e885a58 347
c08a4f00
RR
348 return TRUE;
349}
350
bb312b54
RR
351void wxToolBar::OnLeave(wxMouseEvent &event)
352{
353 if (HasFlag( wxTB_FLAT ))
354 {
355 wxToolBarTool *oldMouseUnder = m_underMouse;
356 if (m_underMouse)
357 {
358 m_underMouse = NULL;
359 RefreshTool( oldMouseUnder );
360 }
361 }
362}
363
364void wxToolBar::OnEnter(wxMouseEvent &event)
365{
366}
367
c08a4f00
RR
368void wxToolBar::OnMouse(wxMouseEvent &event)
369{
370 wxToolBarTool *hit = NULL;
371 int x = event.GetX();
372 int y = event.GetY();
373
374 for ( wxToolBarToolsList::Node *node = m_tools.GetFirst();
375 node;
376 node = node->GetNext() )
377 {
378 wxToolBarTool *tool = (wxToolBarTool*) node->Data();
379
380 if ((x > tool->m_x) && (x < tool->m_x+m_defaultWidth+5) &&
381 (y > tool->m_y) && (y < tool->m_y+m_defaultHeight+5))
382 {
383 hit = tool;
384 break;
385 }
386 }
387
bb312b54
RR
388 wxToolBarTool *oldMouseUnder = m_underMouse;
389 if (HasFlag( wxTB_FLAT))
390 {
391 if (m_underMouse && (m_underMouse != hit))
392 {
393 m_underMouse = NULL;
394 RefreshTool( oldMouseUnder );
395 }
396 m_underMouse = hit;
397 }
398
c18ac572 399 if (event.LeftDown() && (hit) && hit->IsEnabled())
c08a4f00
RR
400 {
401 CaptureMouse();
402 m_captured = hit;
403
404 m_captured->m_isDown = TRUE;
405 RefreshTool( m_captured );
406
407 return;
408 }
409
410 if (event.Dragging() && (m_captured))
411 {
412 bool is_down = (hit == m_captured);
413 if (is_down != m_captured->m_isDown)
414 {
415 m_captured->m_isDown = is_down;
416 RefreshTool( m_captured );
417 }
418
419 return;
420 }
421
422 if (event.LeftUp() && (m_captured))
423 {
424 ReleaseMouse();
425
426 m_captured->m_isDown = FALSE;
bb312b54
RR
427
428 // Bad trick...
429 m_underMouse = NULL;
430
c08a4f00
RR
431 RefreshTool( m_captured );
432
433 if (hit == m_captured)
434 {
435 wxCommandEvent cevent( wxEVT_COMMAND_TOOL_CLICKED, m_captured->GetId() );
436 cevent.SetEventObject( this );
437 // cevent.SetExtraLong((long) toggleDown);
438 GetEventHandler()->ProcessEvent( cevent );
439 }
440
441 m_captured = NULL;
442
443 return;
444 }
bb312b54
RR
445
446 if (HasFlag(wxTB_FLAT))
447 {
448 if (m_underMouse && (m_underMouse != oldMouseUnder))
449 RefreshTool( m_underMouse );
450 }
c08a4f00
RR
451}
452