1 /////////////////////////////////////////////////////////////////////////////
4 // Author: David Webster
8 // Copyright: (c) David Webster
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 // For compilers that support precompilation, includes "wx.h".
13 #include "wx/wxprec.h"
15 #if wxUSE_TOOLBAR && wxUSE_TOOLBAR_NATIVE
18 #include "wx/settings.h"
19 #include "wx/window.h"
20 #include "wx/dcclient.h"
21 #include "wx/dcmemory.h"
24 #include "wx/toolbar.h"
26 bool wxToolBar::m_bInitialized
= FALSE
;
28 // ---------------------------------------------------------------------------
29 // Helper for taking a regular bitmap and giving it a disabled look
30 // ---------------------------------------------------------------------------
31 wxBitmap
wxDisableBitmap(
36 wxMask
* pMask
= rBmp
.GetMask();
41 DEVOPENSTRUC vDop
= {0L, "DISPLAY", NULL
, 0L, 0L, 0L, 0L, 0L, 0L};
43 HDC hDC
= ::DevOpenDC(vHabmain
, OD_MEMORY
, "*", 5L, (PDEVOPENDATA
)&vDop
, NULLHANDLE
);
44 HPS hPS
= ::GpiCreatePS(vHabmain
, hDC
, &vSize
, PU_PELS
| GPIA_ASSOC
);
45 BITMAPINFOHEADER2 vHeader
;
49 HBITMAP hBitmap
= (HBITMAP
)rBmp
.GetHBITMAP();
50 HBITMAP hOldBitmap
= NULLHANDLE
;
51 HBITMAP hOldMask
= NULLHANDLE
;
52 HBITMAP hMask
= (HBITMAP
)rBmp
.GetMask()->GetMaskBitmap();
53 unsigned char* pucBits
; // buffer that will contain the bitmap data
54 unsigned char* pucData
; // pointer to use to traverse bitmap data
55 unsigned char* pucBitsMask
; // buffer that will contain the mask data
56 unsigned char* pucDataMask
; // pointer to use to traverse mask data
59 bool bpp16
= (wxDisplayDepth() == 16);
61 memset(&vHeader
, '\0', 16);
64 memset(&vInfo
, '\0', 16);
66 vInfo
.cx
= (ULONG
)rBmp
.GetWidth();
67 vInfo
.cy
= (ULONG
)rBmp
.GetHeight();
69 vInfo
.cBitCount
= 24; // Set to desired count going in
72 // Create the buffers for data....all wxBitmaps are 24 bit internally
74 int nBytesPerLine
= rBmp
.GetWidth() * 3;
75 int nSizeDWORD
= sizeof(DWORD
);
76 int nLineBoundary
= nBytesPerLine
% nSizeDWORD
;
82 // Bitmap must be ina double-word alligned address so we may
83 // have some padding to worry about
85 if (nLineBoundary
> 0)
87 nPadding
= nSizeDWORD
- nLineBoundary
;
88 nBytesPerLine
+= nPadding
;
90 pucBits
= (unsigned char *)malloc(nBytesPerLine
* rBmp
.GetHeight());
91 memset(pucBits
, '\0', (nBytesPerLine
* rBmp
.GetHeight()));
92 pucBitsMask
= (unsigned char *)malloc(nBytesPerLine
* rBmp
.GetHeight());
93 memset(pucBitsMask
, '\0', (nBytesPerLine
* rBmp
.GetHeight()));
96 // Extract the bitmap and mask data
98 if ((hOldBitmap
= ::GpiSetBitmap(hPS
, hBitmap
)) == HBM_ERROR
)
100 vError
= ::WinGetLastError(vHabmain
);
101 sError
= wxPMErrorToStr(vError
);
103 ::GpiQueryBitmapInfoHeader(hBitmap
, &vHeader
);
104 vInfo
.cBitCount
= 24;
105 if ((lScans
= ::GpiQueryBitmapBits( hPS
107 ,(LONG
)rBmp
.GetHeight()
112 vError
= ::WinGetLastError(vHabmain
);
113 sError
= wxPMErrorToStr(vError
);
115 if ((hOldMask
= ::GpiSetBitmap(hPS
, hMask
)) == HBM_ERROR
)
117 vError
= ::WinGetLastError(vHabmain
);
118 sError
= wxPMErrorToStr(vError
);
120 ::GpiQueryBitmapInfoHeader(hMask
, &vHeader
);
121 vInfo
.cBitCount
= 24;
122 if ((lScans
= ::GpiQueryBitmapBits( hPS
124 ,(LONG
)rBmp
.GetHeight()
129 vError
= ::WinGetLastError(vHabmain
);
130 sError
= wxPMErrorToStr(vError
);
132 if (( hMask
= ::GpiSetBitmap(hPS
, hOldMask
)) == HBM_ERROR
)
134 vError
= ::WinGetLastError(vHabmain
);
135 sError
= wxPMErrorToStr(vError
);
138 pucDataMask
= pucBitsMask
;
141 // Get the mask value
143 for (i
= 0; i
< rBmp
.GetHeight(); i
++)
145 for (j
= 0; j
< rBmp
.GetWidth(); j
++)
148 if (bpp16
&& *pucDataMask
== 0xF8) // 16 bit display gobblygook
153 else if (*pucDataMask
== 0xFF) // set to grey
160 *pucData
= ((unsigned char)(lColor
>> 16));
165 if (bpp16
&& *(pucDataMask
+ 1) == 0xFC) // 16 bit display gobblygook
170 else if (*(pucDataMask
+ 1) == 0xFF) // set to grey
177 *pucData
= ((unsigned char)(lColor
>> 8));
182 if (bpp16
&& *(pucDataMask
+ 2) == 0xF8) // 16 bit display gobblygook
187 else if (*(pucDataMask
+ 2) == 0xFF) // set to grey
194 *pucData
= ((unsigned char)lColor
);
199 for (j
= 0; j
< nPadding
; j
++)
207 // Create a new bitmap and set the modified bits
209 wxBitmap
vNewBmp( rBmp
.GetWidth()
213 HBITMAP hNewBmp
= (HBITMAP
)vNewBmp
.GetHBITMAP();
215 if ((hOldBitmap
= ::GpiSetBitmap(hPS
, hNewBmp
)) == HBM_ERROR
)
217 vError
= ::WinGetLastError(vHabmain
);
218 sError
= wxPMErrorToStr(vError
);
220 if ((lScansSet
= ::GpiSetBitmapBits( hPS
222 ,(LONG
)rBmp
.GetHeight()
228 vError
= ::WinGetLastError(vHabmain
);
229 sError
= wxPMErrorToStr(vError
);
231 vNewBmp
.SetMask(rBmp
.GetMask());
233 ::GpiSetBitmap(hPS
, NULLHANDLE
);
238 return(wxNullBitmap
);
239 } // end of wxDisableBitmap
241 // ----------------------------------------------------------------------------
243 // ----------------------------------------------------------------------------
245 class wxToolBarTool
: public wxToolBarToolBase
248 inline wxToolBarTool( wxToolBar
* pTbar
250 ,const wxString
& rsLabel
251 ,const wxBitmap
& rBitmap1
252 ,const wxBitmap
& rBitmap2
254 ,wxObject
* pClientData
255 ,const wxString
& rsShortHelpString
256 ,const wxString
& rsLongHelpString
257 ) : wxToolBarToolBase( pTbar
270 inline wxToolBarTool( wxToolBar
* pTbar
272 ) : wxToolBarToolBase( pTbar
278 void SetSize(const wxSize
& rSize
)
284 wxCoord
GetWidth(void) const { return m_vWidth
; }
285 wxCoord
GetHeight(void) const { return m_vHeight
; }
291 }; // end of CLASS wxToolBarTool
293 // ----------------------------------------------------------------------------
295 // ----------------------------------------------------------------------------
297 IMPLEMENT_DYNAMIC_CLASS(wxToolBar
, wxToolBarBase
)
299 BEGIN_EVENT_TABLE(wxToolBar
, wxToolBarBase
)
300 EVT_SIZE(wxToolBar::OnSize
)
301 EVT_PAINT(wxToolBar::OnPaint
)
302 EVT_KILL_FOCUS(wxToolBar::OnKillFocus
)
303 EVT_MOUSE_EVENTS(wxToolBar::OnMouseEvent
)
306 // ============================================================================
308 // ============================================================================
310 // ----------------------------------------------------------------------------
311 // tool bar tools creation
312 // ----------------------------------------------------------------------------
314 wxToolBarToolBase
* wxToolBar::CreateTool(
316 , const wxString
& rsLabel
317 , const wxBitmap
& rBmpNormal
318 , const wxBitmap
& rBmpDisabled
320 , wxObject
* pClientData
321 , const wxString
& rsShortHelp
322 , const wxString
& rsLongHelp
325 return new wxToolBarTool( this
335 } // end of wxToolBarSimple::CreateTool
337 wxToolBarToolBase
*wxToolBar::CreateTool(
341 return new wxToolBarTool( this
344 } // end of wxToolBarSimple::CreateTool
346 // ----------------------------------------------------------------------------
347 // wxToolBarSimple creation
348 // ----------------------------------------------------------------------------
350 void wxToolBar::Init()
352 m_nCurrentRowsOrColumns
= 0;
354 m_vLastX
= m_vLastY
= 0;
355 m_vMaxWidth
= m_vMaxHeight
= 0;
356 m_nPressedTool
= m_nCurrentTool
= -1;
357 m_vXPos
= m_vYPos
= -1;
358 m_vTextX
= m_vTextY
= 0;
361 m_toolSeparation
= 5;
364 m_defaultHeight
= 15;
365 } // end of wxToolBar::Init
367 wxToolBarToolBase
* wxToolBar::DoAddTool(
369 , const wxString
& rsLabel
370 , const wxBitmap
& rBitmap
371 , const wxBitmap
& rBmpDisabled
373 , const wxString
& rsShortHelp
374 , const wxString
& rsLongHelp
375 , wxObject
* pClientData
381 // Rememeber the position for DoInsertTool()
386 return wxToolBarBase::DoAddTool( vId
397 } // end of wxToolBar::DoAddTool
399 bool wxToolBar::DoInsertTool(
400 size_t WXUNUSED(nPos
)
401 , wxToolBarToolBase
* pToolBase
404 wxToolBarTool
* pTool
= (wxToolBarTool
*)pToolBase
;
406 pTool
->m_vX
= m_vXPos
;
407 if (pTool
->m_vX
== -1)
408 pTool
->m_vX
= m_xMargin
;
410 pTool
->m_vY
= m_vYPos
;
411 if (pTool
->m_vY
== -1)
412 pTool
->m_vX
= m_yMargin
;
414 pTool
->SetSize(GetToolSize());
416 if (pTool
->IsButton())
419 // Calculate reasonable max size in case Layout() not called
421 if ((pTool
->m_vX
+ pTool
->GetNormalBitmap().GetWidth() + m_xMargin
) > m_vMaxWidth
)
422 m_vMaxWidth
= (wxCoord
)((pTool
->m_vX
+ pTool
->GetWidth() + m_xMargin
));
424 if ((pTool
->m_vY
+ pTool
->GetNormalBitmap().GetHeight() + m_yMargin
) > m_vMaxHeight
)
425 m_vMaxHeight
= (wxCoord
)((pTool
->m_vY
+ pTool
->GetHeight() + m_yMargin
));
428 } // end of wxToolBar::DoInsertTool
430 bool wxToolBar::DoDeleteTool(
431 size_t WXUNUSED(nPos
)
432 , wxToolBarToolBase
* pTool
438 } // end of wxToolBar::DoDeleteTool
440 bool wxToolBar::Create(
443 , const wxPoint
& rPos
444 , const wxSize
& rSize
446 , const wxString
& rsName
449 if ( !wxWindow::Create( pParent
458 // Set it to grey (or other 3D face colour)
459 SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_MENUBAR
));
460 SetFont(*wxSMALL_FONT
);
462 if (GetWindowStyleFlag() & wxTB_VERTICAL
)
467 m_maxRows
= 32000; // a lot
476 m_maxCols
= 32000; // a lot
478 SetCursor(*wxSTANDARD_CURSOR
);
481 // The toolbar's tools, if they have labels and the winTB_TEXT
482 // style is set, then we need to take into account the size of
483 // the text when drawing tool bitmaps and the text
485 if (HasFlag(wxTB_TEXT
))
487 wxClientDC
vDC(this);
489 vDC
.SetFont(GetFont());
490 vDC
.GetTextExtent( "XXXX"
501 int nWidth
= rSize
.x
;
502 int nHeight
= rSize
.y
;
503 wxFrame
* pFrame
= wxDynamicCast(GetParent(), wxFrame
);
505 if (lStyle
& wxTB_HORIZONTAL
)
509 nWidth
= pParent
->GetClientSize().x
;
513 if (lStyle
& wxTB_TEXT
)
514 nHeight
= m_defaultHeight
+ 18;
516 nHeight
= m_defaultHeight
;
523 nHeight
= pParent
->GetClientSize().y
;
527 if (lStyle
& wxTB_TEXT
)
528 nWidth
= m_vTextX
+ (int)(m_vTextX
/2); // a little margin
530 nWidth
= m_defaultWidth
+ (int)(m_defaultWidth
/2); // a little margin
544 } // end of wxToolBar::Create
546 wxToolBar::~wxToolBar()
548 } // end of wxToolBar::~wxToolBar
550 bool wxToolBar::Realize()
552 int nMaxToolWidth
= 0;
553 int nMaxToolHeight
= 0;
557 m_nCurrentRowsOrColumns
= 0;
558 m_vLastX
= m_xMargin
;
559 m_vLastY
= m_yMargin
;
565 // Find the maximum tool width and height
567 wxToolBarToolsList::Node
* pNode
= m_tools
.GetFirst();
571 wxToolBarTool
* pTool
= (wxToolBarTool
*)pNode
->GetData();
573 if (HasFlag(wxTB_TEXT
) && !pTool
->GetLabel().IsEmpty())
576 // Set the height according to the font and the border size
578 nMaxToolWidth
= m_vTextX
;
579 if (pTool
->GetHeight() + m_vTextY
> nMaxToolHeight
)
580 nMaxToolHeight
= pTool
->GetHeight() + m_vTextY
;
584 if (pTool
->GetWidth() > nMaxToolWidth
)
585 nMaxToolWidth
= pTool
->GetWidth();
586 if (pTool
->GetHeight() > nMaxToolHeight
)
587 nMaxToolHeight
= pTool
->GetHeight();
589 pNode
= pNode
->GetNext();
592 int nSeparatorSize
= m_toolSeparation
;
594 pNode
= m_tools
.GetFirst();
597 wxToolBarTool
* pTool
= (wxToolBarTool
*)pNode
->GetData();
599 if (pTool
->IsSeparator())
601 if (GetWindowStyleFlag() & wxTB_HORIZONTAL
)
603 pTool
->m_vX
= m_vLastX
+ nSeparatorSize
;
604 pTool
->m_vHeight
= m_defaultHeight
+ m_vTextY
;
605 if (m_nCurrentRowsOrColumns
>= m_maxCols
)
606 m_vLastY
+= nSeparatorSize
;
608 m_vLastX
+= nSeparatorSize
;
612 pTool
->m_vY
= m_vLastY
+ nSeparatorSize
;
613 pTool
->m_vHeight
= m_defaultHeight
+ m_vTextY
;
614 if (m_nCurrentRowsOrColumns
>= m_maxRows
)
615 m_vLastX
+= nSeparatorSize
;
617 m_vLastY
+= nSeparatorSize
;
620 else if (pTool
->IsButton())
622 if (GetWindowStyleFlag() & wxTB_HORIZONTAL
)
624 if (m_nCurrentRowsOrColumns
>= m_maxCols
)
626 m_nCurrentRowsOrColumns
= 0;
627 m_vLastX
= m_xMargin
;
628 m_vLastY
+= nMaxToolHeight
+ m_toolPacking
;
630 pTool
->m_vX
= m_vLastX
+ (nMaxToolWidth
- ((int)(nMaxToolWidth
/2) + (int)(pTool
->GetWidth()/2)));
631 if (HasFlag(wxTB_TEXT
))
632 pTool
->m_vY
= m_vLastY
+ nSeparatorSize
- 2; // just bit of adjustment
634 pTool
->m_vY
= m_vLastY
+ (nMaxToolHeight
- (int)(pTool
->GetHeight()/2));
635 m_vLastX
+= nMaxToolWidth
+ m_toolPacking
+ m_toolSeparation
;
639 if (m_nCurrentRowsOrColumns
>= m_maxRows
)
641 m_nCurrentRowsOrColumns
= 0;
642 m_vLastX
+= (nMaxToolWidth
+ m_toolPacking
);
643 m_vLastY
= m_yMargin
;
645 pTool
->m_vX
= m_vLastX
+ pTool
->GetWidth();
646 if (HasFlag(wxTB_TEXT
) && !pTool
->GetLabel().IsNull())
647 pTool
->m_vY
= m_vLastY
+ (nMaxToolHeight
- m_vTextY
) + m_toolPacking
;
649 pTool
->m_vY
= m_vLastY
+ (nMaxToolHeight
- (int)(pTool
->GetHeight()/2));
650 m_vLastY
+= nMaxToolHeight
+ m_toolPacking
+ m_toolSeparation
;
652 m_nCurrentRowsOrColumns
++;
656 // TODO: support the controls
659 if (m_vLastX
> m_maxWidth
)
660 m_maxWidth
= m_vLastX
;
661 if (m_vLastY
> m_maxHeight
)
662 m_maxHeight
= m_vLastY
;
664 pNode
= pNode
->GetNext();
667 if ( GetWindowStyleFlag() & wxTB_HORIZONTAL
)
668 m_maxWidth
+= nMaxToolWidth
;
670 m_maxHeight
+= nMaxToolHeight
;
672 m_maxWidth
+= m_xMargin
;
673 m_maxHeight
+= m_yMargin
;
675 } // end of wxToolBar::Realize
677 // ----------------------------------------------------------------------------
679 // ----------------------------------------------------------------------------
681 void wxToolBar::OnPaint (
682 wxPaintEvent
& WXUNUSED(rEvent
)
689 static int nCount
= 0;
692 // Prevent reentry of OnPaint which would cause wxMemoryDC errors.
698 ::WinFillRect(vDc
.GetHPS(), &vDc
.m_vRclPaint
, GetBackgroundColour().GetPixel());
699 for ( wxToolBarToolsList::Node
* pNode
= m_tools
.GetFirst();
701 pNode
= pNode
->GetNext() )
703 wxToolBarTool
* pTool
= (wxToolBarTool
*)pNode
->GetData();
705 if (pTool
->IsButton() )
706 DrawTool(vDc
, pTool
);
707 if (pTool
->IsSeparator())
709 wxPen
vDarkGreyPen( wxColour(85, 85, 85)
717 vDc
.SetPen(vDarkGreyPen
);
718 if (HasFlag(wxTB_TEXT
) && !pTool
->GetLabel().IsEmpty())
721 nY
= pTool
->m_vY
- (m_vTextY
- 6);
722 nHeight
= (m_vTextY
- 2) + pTool
->GetHeight();
728 nHeight
= pTool
->GetHeight() - 2;
730 vDc
.DrawLine(nX
, nY
, nX
, nY
+ nHeight
);
734 } // end of wxToolBar::OnPaint
736 void wxToolBar::OnSize (
737 wxSizeEvent
& WXUNUSED(rEvent
)
740 #if wxUSE_CONSTRAINTS
744 } // end of wxToolBar::OnSize
746 void wxToolBar::OnKillFocus(
747 wxFocusEvent
& WXUNUSED(rEvent
)
750 OnMouseEnter(m_nPressedTool
= m_nCurrentTool
= -1);
751 } // end of wxToolBar::OnKillFocus
753 void wxToolBar::OnMouseEvent(
759 HPOINTER hPtr
= ::WinQuerySysPointer(HWND_DESKTOP
, SPTR_ARROW
, FALSE
);
761 ::WinSetPointer(HWND_DESKTOP
, hPtr
);
762 rEvent
.GetPosition(&vX
, &vY
);
764 wxToolBarTool
* pTool
= (wxToolBarTool
*)FindToolForPosition( vX
768 if (rEvent
.LeftDown())
779 if (m_nCurrentTool
> -1)
781 if (rEvent
.LeftIsDown())
782 SpringUpButton(m_nCurrentTool
);
783 pTool
= (wxToolBarTool
*)FindById(m_nCurrentTool
);
784 if (pTool
&& pTool
->IsToggled())
795 if (!rEvent
.IsButton())
797 if (pTool
->GetId() != m_nCurrentTool
)
800 // If the left button is kept down and moved over buttons,
801 // press those buttons.
803 if (rEvent
.LeftIsDown() && pTool
->IsEnabled())
805 SpringUpButton(m_nCurrentTool
);
806 if (pTool
->CanBeToggled())
812 m_nCurrentTool
= pTool
->GetId();
813 OnMouseEnter(m_nCurrentTool
);
814 if (!pTool
->IsToggled())
820 // Left button pressed.
821 if (rEvent
.LeftDown() && pTool
->IsEnabled())
823 if (pTool
->CanBeToggled())
829 else if (rEvent
.RightDown())
831 OnRightClick( pTool
->GetId()
838 // Left Button Released. Only this action confirms selection.
839 // If the button is enabled and it is not a toggle tool and it is
840 // in the pressed state, then raise the button and call OnLeftClick.
842 if (rEvent
.LeftUp() && pTool
->IsEnabled() )
845 // Pass the OnLeftClick event to tool
847 if (!OnLeftClick( pTool
->GetId()
848 ,pTool
->IsToggled()) &&
849 pTool
->CanBeToggled())
852 // If it was a toggle, and OnLeftClick says No Toggle allowed,
853 // then change it back
859 } // end of wxToolBar::OnMouseEvent
861 // ----------------------------------------------------------------------------
863 // ----------------------------------------------------------------------------
865 void wxToolBar::DrawTool(
866 wxToolBarToolBase
* pTool
869 wxClientDC
vDc(this);
874 } // end of wxToolBar::DrawTool
876 void wxToolBar::DrawTool(
878 , wxToolBarToolBase
* pToolBase
881 wxToolBarTool
* pTool
= (wxToolBarTool
*)pToolBase
;
882 wxPen
vDarkGreyPen( wxColour( 85,85,85 )
886 wxPen
vWhitePen( wxT("WHITE")
890 wxPen
vBlackPen( wxT("BLACK")
894 wxBitmap vBitmap
= pTool
->GetNormalBitmap();
895 bool bUseMask
= FALSE
;
896 wxMask
* pMask
= NULL
;
903 if ((pMask
= vBitmap
.GetMask()) != NULL
)
904 if (pMask
->GetMaskBitmap() != NULLHANDLE
)
907 if (!pTool
->IsToggled())
909 LowerTool(pTool
, FALSE
);
910 if (!pTool
->IsEnabled())
912 wxColour
vColor("GREY");
914 rDc
.SetTextForeground(vColor
);
915 if (!pTool
->GetDisabledBitmap().Ok())
916 pTool
->SetDisabledBitmap(wxDisableBitmap( vBitmap
917 ,(long)GetBackgroundColour().GetPixel()
919 rDc
.DrawBitmap( pTool
->GetDisabledBitmap()
927 wxColour
vColor("BLACK");
929 rDc
.SetTextForeground(vColor
);
930 rDc
.DrawBitmap( vBitmap
936 if (m_windowStyle
& wxTB_3DBUTTONS
)
940 if (HasFlag(wxTB_TEXT
) && !pTool
->GetLabel().IsNull())
944 wxCoord vLeft
= pTool
->m_vX
- (int)(pTool
->GetWidth()/2);
946 rDc
.SetFont(GetFont());
947 rDc
.GetTextExtent( pTool
->GetLabel()
951 vLeft
+= (wxCoord
)((m_vTextX
- vX
)/2);
952 rDc
.DrawText( pTool
->GetLabel()
954 ,pTool
->m_vY
+ m_vTextY
+ 4 // a bit of margin
960 wxColour
vColor("GREY");
963 rDc
.SetTextForeground(vColor
);
964 if (!pTool
->GetDisabledBitmap().Ok())
965 pTool
->SetDisabledBitmap(wxDisableBitmap( vBitmap
966 ,(long)GetBackgroundColour().GetPixel()
968 rDc
.DrawBitmap( pTool
->GetDisabledBitmap()
973 if (HasFlag(wxTB_TEXT
) && !pTool
->GetLabel().IsNull())
977 wxCoord vLeft
= pTool
->m_vX
- (int)(pTool
->GetWidth()/2);
979 rDc
.SetFont(GetFont());
980 rDc
.GetTextExtent( pTool
->GetLabel()
984 vLeft
+= (wxCoord
)((m_vTextX
- vX
)/2);
985 rDc
.DrawText( pTool
->GetLabel()
987 ,pTool
->m_vY
+ m_vTextY
+ 4 // a bit of margin
991 } // end of wxToolBar::DrawTool
993 // ----------------------------------------------------------------------------
995 // ----------------------------------------------------------------------------
997 void wxToolBar::SetRows(
1001 wxCHECK_RET( nRows
!= 0, _T("max number of rows must be > 0") );
1003 m_maxCols
= (GetToolsCount() + nRows
- 1) / nRows
;
1005 } // end of wxToolBar::SetRows
1007 wxToolBarToolBase
* wxToolBar::FindToolForPosition(
1014 wxCoord vTBarHeight
= 0;
1016 wxToolBarToolsList::Node
* pNode
= m_tools
.GetFirst();
1019 wxToolBarTool
* pTool
= (wxToolBarTool
*)pNode
->GetData();
1021 if (HasFlag(wxTB_TEXT
) && !pTool
->GetLabel().IsNull())
1023 if ((vX
>= (pTool
->m_vX
- ((wxCoord
)(pTool
->GetWidth()/2) - 2))) &&
1024 (vY
>= (pTool
->m_vY
- 2)) &&
1025 (vX
<= (pTool
->m_vX
+ pTool
->GetWidth())) &&
1026 (vY
<= (pTool
->m_vY
+ pTool
->GetHeight() + m_vTextY
+ 2)))
1033 if ((vX
>= pTool
->m_vX
) &&
1034 (vY
>= pTool
->m_vY
) &&
1035 (vX
<= (pTool
->m_vX
+ pTool
->GetWidth())) &&
1036 (vY
<= (pTool
->m_vY
+ pTool
->GetHeight())))
1041 pNode
= pNode
->GetNext();
1043 return (wxToolBarToolBase
*)NULL
;
1044 } // end of wxToolBar::FindToolForPosition
1046 // ----------------------------------------------------------------------------
1047 // tool state change handlers
1048 // ----------------------------------------------------------------------------
1050 void wxToolBar::DoEnableTool(
1051 wxToolBarToolBase
* pTool
1052 , bool WXUNUSED(bEnable
)
1056 } // end of wxToolBar::DoEnableTool
1058 void wxToolBar::DoToggleTool(
1059 wxToolBarToolBase
* pTool
1060 , bool WXUNUSED(bToggle
)
1064 } // end of wxToolBar::DoToggleTool
1066 void wxToolBar::DoSetToggle(
1067 wxToolBarToolBase
* WXUNUSED(pTool
)
1068 , bool WXUNUSED(bToggle
)
1072 } // end of wxToolBar::DoSetToggle
1075 // Okay, so we've left the tool we're in ... we must check if the tool we're
1076 // leaving was a 'sprung push button' and if so, spring it back to the up
1079 void wxToolBar::SpringUpButton(
1083 wxToolBarToolBase
* pTool
= FindById(vId
);
1085 if (pTool
&& pTool
->CanBeToggled())
1087 if (pTool
->IsToggled())
1092 } // end of wxToolBar::SpringUpButton
1094 // ----------------------------------------------------------------------------
1096 // ----------------------------------------------------------------------------
1098 void wxToolBar::LowerTool (
1099 wxToolBarToolBase
* pToolBase
1103 wxToolBarTool
* pTool
= (wxToolBarTool
*)pToolBase
;
1108 wxPen
vDarkGreyPen( wxColour(85, 85, 85)
1112 wxPen
vWhitePen( "WHITE"
1116 wxPen
vClearPen( GetBackgroundColour()
1120 wxClientDC
vDC(this);
1125 if (pTool
->IsSeparator())
1129 // We only do this for flat toolbars
1131 if (!HasFlag(wxTB_FLAT
))
1134 if (HasFlag(wxTB_TEXT
) && !pTool
->GetLabel().IsEmpty())
1136 vX
= pTool
->m_vX
- (wxCoord
)(pTool
->GetWidth()/2);
1137 vY
= pTool
->m_vY
- 2;
1138 vWidth
= m_vTextX
+ 4;
1139 vHeight
= pTool
->GetHeight() + m_vTextY
+ 2;
1144 vY
= pTool
->m_vY
- 2;
1145 vWidth
= pTool
->GetWidth() + 4;
1146 vHeight
= pTool
->GetHeight() + 4;
1150 vDC
.SetPen(vWhitePen
);
1151 vDC
.DrawLine(vX
+ vWidth
, vY
+ vHeight
, vX
, vY
+ vHeight
);
1152 vDC
.DrawLine(vX
+ vWidth
, vY
, vX
+ vWidth
, vY
+ vHeight
);
1153 vDC
.SetPen(vDarkGreyPen
);
1154 vDC
.DrawLine(vX
, vY
, vX
+ vWidth
, vY
);
1155 vDC
.DrawLine(vX
, vY
+ vHeight
, vX
, vY
);
1159 vDC
.SetPen(vClearPen
);
1160 vDC
.DrawLine(vX
+ vWidth
, vY
+ vHeight
, vX
, vY
+ vHeight
);
1161 vDC
.DrawLine(vX
+ vWidth
, vY
, vX
+ vWidth
, vY
+ vHeight
);
1162 vDC
.DrawLine(vX
, vY
, vX
+ vWidth
, vY
);
1163 vDC
.DrawLine(vX
, vY
+ vHeight
, vX
, vY
);
1165 } // end of WinGuiBase_CToolBarTool::LowerTool
1167 void wxToolBar::RaiseTool (
1168 wxToolBarToolBase
* pToolBase
1172 wxToolBarTool
* pTool
= (wxToolBarTool
*)pToolBase
;
1177 wxPen
vDarkGreyPen( wxColour(85, 85, 85)
1181 wxPen
vWhitePen( "WHITE"
1185 wxPen
vClearPen( GetBackgroundColour()
1189 wxClientDC
vDC(this);
1194 if (pTool
->IsSeparator())
1197 if (!pTool
->IsEnabled())
1201 // We only do this for flat toolbars
1203 if (!HasFlag(wxTB_FLAT
))
1206 if (HasFlag(wxTB_TEXT
) && !pTool
->GetLabel().IsEmpty())
1208 vX
= pTool
->m_vX
- (wxCoord
)(pTool
->GetWidth()/2);
1209 vY
= pTool
->m_vY
- 2;
1210 vWidth
= m_vTextX
+ 4;
1211 vHeight
= pTool
->GetHeight() + m_vTextY
+ 2;
1216 vY
= pTool
->m_vY
- 2;
1217 vWidth
= pTool
->GetWidth() + 4;
1218 vHeight
= pTool
->GetHeight() + 4;
1222 vDC
.SetPen(vDarkGreyPen
);
1223 vDC
.DrawLine(vX
+ vWidth
, vY
+ vHeight
, vX
, vY
+ vHeight
);
1224 vDC
.DrawLine(vX
+ vWidth
, vY
, vX
+ vWidth
, vY
+ vHeight
);
1225 vDC
.SetPen(vWhitePen
);
1226 vDC
.DrawLine(vX
, vY
, vX
+ vWidth
, vY
);
1227 vDC
.DrawLine(vX
, vY
+ vHeight
, vX
, vY
);
1231 vDC
.SetPen(vClearPen
);
1232 vDC
.DrawLine(vX
+ vWidth
, vY
+ vHeight
, vX
, vY
+ vHeight
);
1233 vDC
.DrawLine(vX
+ vWidth
, vY
, vX
+ vWidth
, vY
+ vHeight
);
1234 vDC
.DrawLine(vX
, vY
, vX
+ vWidth
, vY
);
1235 vDC
.DrawLine(vX
, vY
+ vHeight
, vX
, vY
);
1237 } // end of wxToolBar::RaiseTool
1239 #endif // ndef for wxUSE_TOOLBAR && wxUSE_TOOLBAR_NATIVE