]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/toolbar.cpp
capture mouse to be notified when it exists the popup rect (bug 1372228)
[wxWidgets.git] / src / os2 / toolbar.cpp
index bc1e7b972305d051396307e953e99d0254e5d0be..55a5e314e364988d14d0857fca8ff84aa0428d8e 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        toolbar.cpp
+// Name:        src/os2/toolbar.cpp
 // Purpose:     wxToolBar
 // Author:      David Webster
 // Modified by:
 
 #if wxUSE_TOOLBAR && wxUSE_TOOLBAR_NATIVE
 
+#include "wx/toolbar.h"
+
 #ifndef WX_PRECOMP
     #include "wx/settings.h"
     #include "wx/window.h"
+    #include "wx/frame.h"
+    #include "wx/app.h"
     #include "wx/dcclient.h"
     #include "wx/dcmemory.h"
 #endif
 
-#include "wx/toolbar.h"
-
-bool                                wxToolBar::m_bInitialized = FALSE;
-
-// ---------------------------------------------------------------------------
-// Helper for taking a regular bitmap and giving it a disabled look
-// ---------------------------------------------------------------------------
-wxBitmap wxDisableBitmap(
-  const wxBitmap&                   rBmp
-, long                              lColor
-)
-{
-    wxMask*                         pMask = rBmp.GetMask();
-
-    if (!pMask)
-        return(wxNullBitmap);
-
-    DEVOPENSTRUC                    vDop  = {0L, "DISPLAY", NULL, 0L, 0L, 0L, 0L, 0L, 0L};
-    SIZEL                           vSize = {0, 0};
-    HDC                             hDC   = ::DevOpenDC(vHabmain, OD_MEMORY, "*", 5L, (PDEVOPENDATA)&vDop, NULLHANDLE);
-    HPS                             hPS   = ::GpiCreatePS(vHabmain, hDC, &vSize, PU_PELS | GPIA_ASSOC);
-    BITMAPINFOHEADER2               vHeader;
-    BITMAPINFO2                     vInfo;
-    ERRORID                         vError;
-    wxString                        sError;
-    HBITMAP                         hBitmap =  (HBITMAP)rBmp.GetHBITMAP();
-    HBITMAP                         hOldBitmap = NULLHANDLE;
-    HBITMAP                         hOldMask   = NULLHANDLE;
-    HBITMAP                         hMask = (HBITMAP)rBmp.GetMask()->GetMaskBitmap();
-    unsigned char*                  pucBits;     // buffer that will contain the bitmap data
-    unsigned char*                  pucData;     // pointer to use to traverse bitmap data
-    unsigned char*                  pucBitsMask; // buffer that will contain the mask data
-    unsigned char*                  pucDataMask; // pointer to use to traverse mask data
-    LONG                            lScans = 0L;
-    LONG                            lScansSet = 0L;
-    bool                            bpp16 = (wxDisplayDepth() == 16);
-
-    memset(&vHeader, '\0', 16);
-    vHeader.cbFix           = 16;
-
-    memset(&vInfo, '\0', 16);
-    vInfo.cbFix           = 16;
-    vInfo.cx              = (ULONG)rBmp.GetWidth();
-    vInfo.cy              = (ULONG)rBmp.GetHeight();
-    vInfo.cPlanes         = 1;
-    vInfo.cBitCount       = 24; // Set to desired count going in
-
-    //
-    // Create the buffers for data....all wxBitmaps are 24 bit internally
-    //
-    int                             nBytesPerLine = rBmp.GetWidth() * 3;
-    int                             nSizeDWORD    = sizeof(DWORD);
-    int                             nLineBoundary = nBytesPerLine % nSizeDWORD;
-    int                             nPadding = 0;
-    int                             i;
-    int                             j;
-
-    //
-    // Bitmap must be ina double-word alligned address so we may
-    // have some padding to worry about
-    //
-    if (nLineBoundary > 0)
-    {
-        nPadding     = nSizeDWORD - nLineBoundary;
-        nBytesPerLine += nPadding;
-    }
-    pucBits = (unsigned char *)malloc(nBytesPerLine * rBmp.GetHeight());
-    memset(pucBits, '\0', (nBytesPerLine * rBmp.GetHeight()));
-    pucBitsMask = (unsigned char *)malloc(nBytesPerLine * rBmp.GetHeight());
-    memset(pucBitsMask, '\0', (nBytesPerLine * rBmp.GetHeight()));
-
-    //
-    // Extract the bitmap and mask data
-    //
-    if ((hOldBitmap = ::GpiSetBitmap(hPS, hBitmap)) == HBM_ERROR)
-    {
-        vError = ::WinGetLastError(vHabmain);
-        sError = wxPMErrorToStr(vError);
-    }
-    ::GpiQueryBitmapInfoHeader(hBitmap, &vHeader);
-    vInfo.cBitCount = 24;
-    if ((lScans = ::GpiQueryBitmapBits( hPS
-                                       ,0L
-                                       ,(LONG)rBmp.GetHeight()
-                                       ,(PBYTE)pucBits
-                                       ,&vInfo
-                                      )) == GPI_ALTERROR)
-    {
-        vError = ::WinGetLastError(vHabmain);
-        sError = wxPMErrorToStr(vError);
-    }
-    if ((hOldMask = ::GpiSetBitmap(hPS, hMask)) == HBM_ERROR)
-    {
-        vError = ::WinGetLastError(vHabmain);
-        sError = wxPMErrorToStr(vError);
-    }
-    ::GpiQueryBitmapInfoHeader(hMask, &vHeader);
-    vInfo.cBitCount = 24;
-    if ((lScans = ::GpiQueryBitmapBits( hPS
-                                       ,0L
-                                       ,(LONG)rBmp.GetHeight()
-                                       ,(PBYTE)pucBitsMask
-                                       ,&vInfo
-                                      )) == GPI_ALTERROR)
-    {
-        vError = ::WinGetLastError(vHabmain);
-        sError = wxPMErrorToStr(vError);
-    }
-    if (( hMask = ::GpiSetBitmap(hPS, hOldMask)) == HBM_ERROR)
-    {
-        vError = ::WinGetLastError(vHabmain);
-        sError = wxPMErrorToStr(vError);
-    }
-    pucData     = pucBits;
-    pucDataMask = pucBitsMask;
-
-    //
-    // Get the mask value
-    //
-    for (i = 0; i < rBmp.GetHeight(); i++)
-    {
-        for (j = 0; j < rBmp.GetWidth(); j++)
-        {
-            // Byte 1
-            if (bpp16 && *pucDataMask == 0xF8) // 16 bit display gobblygook
-            {
-                *pucData = 0x7F;
-                pucData++;
-            }
-            else if (*pucDataMask == 0xFF) // set to grey
-            {
-                *pucData = 0x7F;
-                pucData++;
-            }
-            else
-            {
-                *pucData = ((unsigned char)(lColor >> 16));
-                pucData++;
-            }
-
-            // Byte 2
-            if (bpp16 && *(pucDataMask + 1) == 0xFC) // 16 bit display gobblygook
-            {
-                *pucData = 0x7F;
-                pucData++;
-            }
-            else if (*(pucDataMask + 1) == 0xFF) // set to grey
-            {
-                *pucData = 0x7F;
-                pucData++;
-            }
-            else
-            {
-                *pucData = ((unsigned char)(lColor >> 8));
-                pucData++;
-            }
-
-            // Byte 3
-            if (bpp16 && *(pucDataMask + 2) == 0xF8) // 16 bit display gobblygook
-            {
-                *pucData = 0x7F;
-                pucData++;
-            }
-            else if (*(pucDataMask + 2) == 0xFF) // set to grey
-            {
-                *pucData = 0x7F;
-                pucData++;
-            }
-            else
-            {
-                *pucData = ((unsigned char)lColor);
-                pucData++;
-            }
-            pucDataMask += 3;
-        }
-        for (j = 0; j < nPadding; j++)
-        {
-            pucData++;
-            pucDataMask++;
-        }
-    }
-
-    //
-    // Create a new bitmap and set the modified bits
-    //
-    wxBitmap                        vNewBmp( rBmp.GetWidth()
-                                            ,rBmp.GetHeight()
-                                            ,24
-                                           );
-    HBITMAP                         hNewBmp = (HBITMAP)vNewBmp.GetHBITMAP();
-
-    if ((hOldBitmap = ::GpiSetBitmap(hPS, hNewBmp)) == HBM_ERROR)
-    {
-        vError = ::WinGetLastError(vHabmain);
-        sError = wxPMErrorToStr(vError);
-    }
-    if ((lScansSet = ::GpiSetBitmapBits( hPS
-                                        ,0L
-                                        ,(LONG)rBmp.GetHeight()
-                                        ,(PBYTE)pucBits
-                                        ,&vInfo
-                                       )) == GPI_ALTERROR)
+#include "wx/tooltip.h"
 
-    {
-        vError = ::WinGetLastError(vHabmain);
-        sError = wxPMErrorToStr(vError);
-    }
-    wxMask*                         pNewMask;
-
-    pNewMask = new wxMask(pMask->GetMaskBitmap());
-    vNewBmp.SetMask(pNewMask);
-    free(pucBits);
-    ::GpiSetBitmap(hPS, NULLHANDLE);
-    ::GpiDestroyPS(hPS);
-    ::DevCloseDC(hDC);
-    if (vNewBmp.Ok())
-        return(vNewBmp);
-    return(wxNullBitmap);
-} // end of wxDisableBitmap
+bool wxToolBar::m_bInitialized = false;
 
 // ----------------------------------------------------------------------------
 // private classes
@@ -297,7 +85,7 @@ public:
 // wxWin macros
 // ----------------------------------------------------------------------------
 
-IMPLEMENT_DYNAMIC_CLASS(wxToolBar, wxToolBarBase)
+IMPLEMENT_DYNAMIC_CLASS(wxToolBar, wxControl)
 
 BEGIN_EVENT_TABLE(wxToolBar, wxToolBarBase)
     EVT_SIZE(wxToolBar::OnSize)
@@ -366,6 +154,8 @@ void wxToolBar::Init()
 
     m_defaultWidth = 16;
     m_defaultHeight = 15;
+
+    m_pToolTip = NULL;
 } // end of wxToolBar::Init
 
 wxToolBarToolBase* wxToolBar::DoAddTool(
@@ -486,12 +276,10 @@ wxToolBarToolBase* wxToolBar::InsertTool(
     return pTool;
 } // end of wxToolBar::InsertTool
 
-bool wxToolBar::DoInsertTool(
-  size_t                            WXUNUSED(nPos)
-, wxToolBarToolBase*                pToolBase
-)
+bool wxToolBar::DoInsertTool( size_t WXUNUSED(nPos),
+                              wxToolBarToolBase* pToolBase )
 {
-    wxToolBarTool*                  pTool = (wxToolBarTool *)pToolBase;
+    wxToolBarTool* pTool = (wxToolBarTool *)pToolBase;
 
     pTool->m_vX = m_vXPos;
     if (pTool->m_vX == -1)
@@ -514,27 +302,23 @@ bool wxToolBar::DoInsertTool(
         if ((pTool->m_vY + pTool->GetNormalBitmap().GetHeight() + m_yMargin) > m_vMaxHeight)
             m_vMaxHeight = (wxCoord)((pTool->m_vY + pTool->GetHeight() + m_yMargin));
     }
-    return TRUE;
+    return true;
 } // end of wxToolBar::DoInsertTool
 
-bool wxToolBar::DoDeleteTool(
-  size_t                            WXUNUSED(nPos)
-, wxToolBarToolBase*                pTool
-)
+bool wxToolBar::DoDeleteTool( size_t WXUNUSED(nPos),
+                              wxToolBarToolBase* pTool )
 {
     pTool->Detach();
     Refresh();
-    return TRUE;
+    return true;
 } // end of wxToolBar::DoDeleteTool
 
-bool wxToolBar::Create(
-  wxWindow*                         pParent
-, wxWindowID                        vId
-, const wxPoint&                    rPos
-, const wxSize&                     rSize
-, long                              lStyle
-, const wxString&                   rsName
-)
+bool wxToolBar::Create( wxWindow* pParent,
+                        wxWindowID vId,
+                        const wxPoint& rPos,
+                        const wxSize& rSize,
+                        long lStyle,
+                        const wxString& rsName )
 {
     if ( !wxWindow::Create( pParent
                            ,vId
@@ -543,7 +327,7 @@ bool wxToolBar::Create(
                            ,lStyle
                            ,rsName
                           ))
-        return FALSE;
+        return false;
 
     // Set it to grey (or other 3D face colour)
     SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_MENUBAR));
@@ -577,7 +361,7 @@ bool wxToolBar::Create(
         wxClientDC                  vDC(this);
 
         vDC.SetFont(GetFont());
-        vDC.GetTextExtent( "XXXX"
+        vDC.GetTextExtent( wxT("XXXX")
                           ,&m_vTextX
                           ,&m_vTextY
                          );
@@ -590,9 +374,8 @@ bool wxToolBar::Create(
     int                             nY      = rPos.y;
     int                             nWidth  = rSize.x;
     int                             nHeight = rSize.y;
-    wxFrame*                        pFrame = wxDynamicCast(GetParent(), wxFrame);
 
-    if (lStyle & wxTB_HORIZONTAL)
+    if (lStyle & (wxTB_HORIZONTAL | wxTB_BOTTOM))
     {
         if (nWidth <= 0)
         {
@@ -630,19 +413,22 @@ bool wxToolBar::Create(
             ,nWidth
             ,nHeight
            );
-    return TRUE;
+    return true;
 } // end of wxToolBar::Create
 
 wxToolBar::~wxToolBar()
 {
+    if (m_pToolTip)
+    {
+        delete m_pToolTip;
+        m_pToolTip = NULL;
+    }
 } // end of wxToolBar::~wxToolBar
 
 bool wxToolBar::Realize()
 {
     int                             nMaxToolWidth  = 0;
     int                             nMaxToolHeight = 0;
-    int                             nX;
-    int                             nY;
 
     m_nCurrentRowsOrColumns = 0;
     m_vLastX               = m_xMargin;
@@ -654,13 +440,13 @@ bool wxToolBar::Realize()
     //
     // Find the maximum tool width and height
     //
-    wxToolBarToolsList::Node*       pNode = m_tools.GetFirst();
+    wxToolBarToolsList::compatibility_iterator     node = m_tools.GetFirst();
 
-    while (pNode )
+    while (node )
     {
-        wxToolBarTool*              pTool = (wxToolBarTool *)pNode->GetData();
+        wxToolBarTool*              pTool = (wxToolBarTool *)node->GetData();
 
-        if (HasFlag(wxTB_TEXT) && !pTool->GetLabel().IsEmpty())
+        if (HasFlag(wxTB_TEXT) && !pTool->GetLabel().empty())
         {
             //
             // Set the height according to the font and the border size
@@ -679,7 +465,7 @@ bool wxToolBar::Realize()
             if (pTool->GetHeight() > nMaxToolHeight)
                 nMaxToolHeight = pTool->GetHeight();
         }
-        pNode = pNode->GetNext();
+        node = node->GetNext();
     }
 
     wxCoord                         vTbWidth = 0L;
@@ -706,14 +492,14 @@ bool wxToolBar::Realize()
 
     int                             nSeparatorSize = m_toolSeparation;
 
-    pNode = m_tools.GetFirst();
-    while (pNode)
+    node = m_tools.GetFirst();
+    while (node)
     {
-        wxToolBarTool*              pTool = (wxToolBarTool *)pNode->GetData();
+        wxToolBarTool*              pTool = (wxToolBarTool *)node->GetData();
 
         if (pTool->IsSeparator())
         {
-            if (GetWindowStyleFlag() & wxTB_HORIZONTAL)
+            if (GetWindowStyleFlag() & (wxTB_HORIZONTAL | wxTB_BOTTOM))
             {
                 pTool->m_vX = m_vLastX + nSeparatorSize;
                 pTool->m_vHeight = m_defaultHeight + m_vTextY;
@@ -734,7 +520,7 @@ bool wxToolBar::Realize()
         }
         else if (pTool->IsButton())
         {
-            if (GetWindowStyleFlag() & wxTB_HORIZONTAL)
+            if (GetWindowStyleFlag() & (wxTB_HORIZONTAL | wxTB_BOTTOM))
             {
                 if (m_nCurrentRowsOrColumns >= m_maxCols)
                 {
@@ -776,18 +562,18 @@ bool wxToolBar::Realize()
         if (m_vLastY > m_maxHeight)
             m_maxHeight = m_vLastY;
 
-        pNode = pNode->GetNext();
+        node = node->GetNext();
     }
 
-    if ( GetWindowStyleFlag() & wxTB_HORIZONTAL )
+    if (GetWindowStyleFlag() & (wxTB_HORIZONTAL | wxTB_BOTTOM))
         m_maxWidth += nMaxToolWidth;
     else
         m_maxHeight += nMaxToolHeight;
 
     m_maxWidth += m_xMargin;
     m_maxHeight += m_yMargin;
-    m_bInitialized = TRUE;
-    return TRUE;
+    m_bInitialized = true;
+    return true;
 } // end of wxToolBar::Realize
 
 // ----------------------------------------------------------------------------
@@ -812,29 +598,27 @@ void wxToolBar::OnPaint (
     nCount++;
 
     ::WinFillRect(vDc.GetHPS(), &vDc.m_vRclPaint, GetBackgroundColour().GetPixel());
-    for ( wxToolBarToolsList::Node* pNode = m_tools.GetFirst();
-          pNode;
-          pNode = pNode->GetNext() )
+    for ( wxToolBarToolsList::compatibility_iterator node = m_tools.GetFirst();
+          node;
+          node = node->GetNext() )
     {
-        wxToolBarTool*              pTool = (wxToolBarTool*)pNode->GetData();
+        wxToolBarTool*              pTool = (wxToolBarTool*)node->GetData();
 
         if (pTool->IsButton() )
             DrawTool(vDc, pTool);
         if (pTool->IsSeparator())
         {
-            wxPen                   vDarkGreyPen( wxColour(85, 85, 85)
-                                                 ,1
-                                                 ,wxSOLID
-                                                );
-            int                     nX;
-            int                     nY;
-            int                     nHeight = 0;
-            int                     nWidth = 0;
+            wxColour gray85(85, 85, 85);
+            wxPen vDarkGreyPen( gray85, 1, wxSOLID );
+            int nX;
+            int nY;
+            int nHeight = 0;
+            int nWidth = 0;
 
             vDc.SetPen(vDarkGreyPen);
             if (HasFlag(wxTB_TEXT))
             {
-                if (HasFlag(wxTB_HORIZONTAL))
+                if (HasFlag(wxTB_HORIZONTAL) || HasFlag(wxTB_BOTTOM))
                 {
                     nX = pTool->m_vX;
                     nY = pTool->m_vY - (m_vTextY - 6);
@@ -851,7 +635,7 @@ void wxToolBar::OnPaint (
             {
                 nX = pTool->m_vX;
                 nY = pTool->m_vY;
-                if (HasFlag(wxTB_HORIZONTAL))
+                if (HasFlag(wxTB_HORIZONTAL) || HasFlag(wxTB_BOTTOM))
                     nHeight = pTool->GetHeight() - 2;
                 else
                 {
@@ -887,11 +671,21 @@ void wxToolBar::OnMouseEvent(
   wxMouseEvent&                     rEvent
 )
 {
+    POINTL                          vPoint;
+    HWND                            hWnd;
     wxCoord                         vX;
     wxCoord                         vY;
     HPOINTER                        hPtr = ::WinQuerySysPointer(HWND_DESKTOP, SPTR_ARROW, FALSE);
 
     ::WinSetPointer(HWND_DESKTOP, hPtr);
+    ::WinQueryPointerPos(HWND_DESKTOP, &vPoint);
+    hWnd = ::WinWindowFromPoint(HWND_DESKTOP, &vPoint, TRUE);
+    if (hWnd != (HWND)GetHwnd())
+    {
+        m_vToolTimer.Stop();
+        return;
+    }
+
     rEvent.GetPosition(&vX, &vY);
 
     wxToolBarTool*            pTool = (wxToolBarTool *)FindToolForPosition( vX
@@ -907,10 +701,9 @@ void wxToolBar::OnMouseEvent(
         ReleaseMouse();
     }
 
-    m_vToolTimer.Stop();
-    m_vToolTimer.Start(3000L, FALSE);
     if (!pTool)
     {
+        m_vToolTimer.Stop();
         if (m_nCurrentTool > -1)
         {
             if (rEvent.LeftIsDown())
@@ -918,9 +711,7 @@ void wxToolBar::OnMouseEvent(
             pTool = (wxToolBarTool *)FindById(m_nCurrentTool);
             if (pTool && !pTool->IsToggled())
             {
-                RaiseTool( pTool
-                          ,FALSE
-                         );
+                RaiseTool( pTool, FALSE );
             }
             m_nCurrentTool = -1;
             OnMouseEnter(-1);
@@ -947,11 +738,18 @@ void wxToolBar::OnMouseEvent(
             wxToolBarTool*          pOldTool = (wxToolBarTool*)FindById(m_nCurrentTool);
 
             if (pOldTool && !pTool->IsToggled())
-                RaiseTool( pOldTool
-                          ,FALSE
-                         );
+                RaiseTool( pOldTool, FALSE );
             m_nCurrentTool = pTool->GetId();
             OnMouseEnter(m_nCurrentTool);
+            if (!pTool->GetShortHelp().empty())
+            {
+                if (m_pToolTip)
+                    delete m_pToolTip;
+                m_pToolTip = new wxToolTip(pTool->GetShortHelp());
+                m_vXMouse = (wxCoord)vPoint.x;
+                m_vYMouse = (wxCoord)vPoint.y;
+                m_vToolTimer.Start(1000L, TRUE);
+            }
             if (!pTool->IsToggled())
                 RaiseTool(pTool);
         }
@@ -1003,39 +801,21 @@ void wxToolBar::OnMouseEvent(
 // drawing
 // ----------------------------------------------------------------------------
 
-void wxToolBar::DrawTool(
-  wxToolBarToolBase*                pTool
-)
+void wxToolBar::DrawTool( wxToolBarToolBase* pTool )
 {
-    wxClientDC                      vDc(this);
+    wxClientDC vDc(this);
 
-    DrawTool( vDc
-             ,pTool
-            );
+    DrawTool( vDc, pTool );
 } // end of wxToolBar::DrawTool
 
-void wxToolBar::DrawTool(
-  wxDC&                             rDc
-, wxToolBarToolBase*                pToolBase
-)
+void wxToolBar::DrawTool( wxDC& rDc, wxToolBarToolBase* pToolBase )
 {
-    wxToolBarTool*                  pTool = (wxToolBarTool *)pToolBase;
-    wxPen                           vDarkGreyPen( wxColour( 85,85,85 )
-                                                 ,1
-                                                 ,wxSOLID
-                                                );
-    wxPen                           vWhitePen( wxT("WHITE")
-                                              ,1
-                                              ,wxSOLID
-                                             );
-    wxPen                           vBlackPen( wxT("BLACK")
-                                              ,1
-                                              ,wxSOLID
-                                             );
-    wxBitmap                        vBitmap = pTool->GetNormalBitmap();
-    bool                            bUseMask = FALSE;
-    wxMask*                         pMask = NULL;
-    RECTL                           vRect;
+    wxToolBarTool* pTool = (wxToolBarTool *)pToolBase;
+    wxColour gray85( 85,85,85 );
+    wxPen vDarkGreyPen( gray85, 1, wxSOLID );
+    wxBitmap vBitmap = pTool->GetNormalBitmap();
+    bool bUseMask = false;
+    wxMask* pMask = NULL;
 
     PrepareDC(rDc);
 
@@ -1043,14 +823,14 @@ void wxToolBar::DrawTool(
         return;
     if ((pMask = vBitmap.GetMask()) != NULL)
         if (pMask->GetMaskBitmap() != NULLHANDLE)
-            bUseMask = TRUE;
+            bUseMask = true;
 
     if (!pTool->IsToggled())
     {
         LowerTool(pTool, FALSE);
         if (!pTool->IsEnabled())
         {
-            wxColour                vColor("GREY");
+            wxColour vColor(wxT("GREY"));
 
             rDc.SetTextForeground(vColor);
             if (!pTool->GetDisabledBitmap().Ok())
@@ -1065,9 +845,7 @@ void wxToolBar::DrawTool(
         }
         else
         {
-            wxColour                vColor("BLACK");
-
-            rDc.SetTextForeground(vColor);
+            rDc.SetTextForeground(*wxBLACK);
             rDc.DrawBitmap( vBitmap
                            ,pTool->m_vX
                            ,pTool->m_vY
@@ -1095,7 +873,7 @@ void wxToolBar::DrawTool(
                 GetSize(&vX, &vY);
                 rDc.DrawText( pTool->GetLabel()
                              ,vLeft
-                             ,vY - (m_vTextY - 2)
+                             ,vY - m_vTextY - 1
                             );
             }
             else  // normal tools
@@ -1103,14 +881,14 @@ void wxToolBar::DrawTool(
                 vLeft += (wxCoord)((m_vTextX - vX)/2);
                 rDc.DrawText( pTool->GetLabel()
                              ,vLeft
-                             ,pTool->m_vY + m_vTextY + 4 // a bit of margin
+                             ,pTool->m_vY + m_vTextY - 1 // a bit of margin
                             );
             }
         }
     }
     else
     {
-        wxColour                    vColor("GREY");
+        wxColour vColor(wxT("GREY"));
 
         LowerTool(pTool);
         rDc.SetTextForeground(vColor);
@@ -1137,7 +915,7 @@ void wxToolBar::DrawTool(
             vLeft += (wxCoord)((m_vTextX - vX)/2);
             rDc.DrawText( pTool->GetLabel()
                          ,vLeft
-                         ,pTool->m_vY + m_vTextY + 4 // a bit of margin
+                         ,pTool->m_vY + m_vTextY - 1 // a bit of margin
                         );
         }
     }
@@ -1162,18 +940,16 @@ wxToolBarToolBase* wxToolBar::FindToolForPosition(
 , wxCoord                           vY
 ) const
 {
-    wxCoord                         vTextX = 0;
-    wxCoord                         vTextY = 0;
     wxCoord                         vTBarHeight = 0;
 
     GetSize( NULL
             ,&vTBarHeight
            );
     vY = vTBarHeight - vY;
-    wxToolBarToolsList::Node* pNode = m_tools.GetFirst();
-    while (pNode)
+    wxToolBarToolsList::compatibility_iterator node = m_tools.GetFirst();
+    while (node)
     {
-        wxToolBarTool*              pTool = (wxToolBarTool *)pNode->GetData();
+        wxToolBarTool*              pTool = (wxToolBarTool *)node->GetData();
 
         if (HasFlag(wxTB_TEXT) && !pTool->GetLabel().IsNull())
         {
@@ -1195,7 +971,7 @@ wxToolBarToolBase* wxToolBar::FindToolForPosition(
                 return pTool;
             }
         }
-        pNode = pNode->GetNext();
+        node = node->GetNext();
     }
     return (wxToolBarToolBase *)NULL;
 } // end of wxToolBar::FindToolForPosition
@@ -1252,29 +1028,18 @@ void wxToolBar::SpringUpButton(
 // private helpers
 // ----------------------------------------------------------------------------
 
-void wxToolBar::LowerTool (
-  wxToolBarToolBase*                pToolBase
-, bool                              bLower
-)
+void wxToolBar::LowerTool ( wxToolBarToolBase* pToolBase,
+                            bool               bLower )
 {
     wxToolBarTool*                  pTool = (wxToolBarTool*)pToolBase;
-    wxCoord                         vX;
-    wxCoord                         vY;
-    wxCoord                         vWidth;
-    wxCoord                         vHeight;
-    wxPen                           vDarkGreyPen( wxColour(85, 85, 85)
-                                                 ,1
-                                                 ,wxSOLID
-                                                );
-    wxPen                           vWhitePen( "WHITE"
-                                              ,1
-                                              ,wxSOLID
-                                             );
-    wxPen                           vClearPen( GetBackgroundColour()
-                                              ,1
-                                              ,wxSOLID
-                                             );
-    wxClientDC                      vDC(this);
+    wxCoord vX;
+    wxCoord vY;
+    wxCoord vWidth;
+    wxCoord vHeight;
+    wxColour gray85( 85,85,85 );
+    wxPen vDarkGreyPen( gray85, 1, wxSOLID );
+    wxPen vClearPen( GetBackgroundColour(), 1, wxSOLID );
+    wxClientDC vDC(this);
 
     if (!pTool)
         return;
@@ -1288,7 +1053,7 @@ void wxToolBar::LowerTool (
     if (!HasFlag(wxTB_FLAT))
         return;
 
-    if (HasFlag(wxTB_TEXT) && !pTool->GetLabel().IsEmpty())
+    if (HasFlag(wxTB_TEXT) && !pTool->GetLabel().empty())
     {
         if (pTool->GetWidth() > m_vTextX)
         {
@@ -1312,7 +1077,7 @@ void wxToolBar::LowerTool (
     }
     if (bLower)
     {
-        vDC.SetPen(vWhitePen);
+        vDC.SetPen(*wxWHITE_PEN);
         vDC.DrawLine(vX + vWidth, vY + vHeight, vX, vY + vHeight);
         vDC.DrawLine(vX + vWidth, vY, vX + vWidth, vY + vHeight);
         vDC.SetPen(vDarkGreyPen);
@@ -1329,29 +1094,18 @@ void wxToolBar::LowerTool (
     }
 } // end of WinGuiBase_CToolBarTool::LowerTool
 
-void wxToolBar::RaiseTool (
-  wxToolBarToolBase*                pToolBase
-, bool                              bRaise
-)
+void wxToolBar::RaiseTool ( wxToolBarToolBase* pToolBase,
+                            bool bRaise )
 {
-    wxToolBarTool*                  pTool = (wxToolBarTool*)pToolBase;
-    wxCoord                         vX;
-    wxCoord                         vY;
-    wxCoord                         vWidth;
-    wxCoord                         vHeight;
-    wxPen                           vDarkGreyPen( wxColour(85, 85, 85)
-                                                 ,1
-                                                 ,wxSOLID
-                                                );
-    wxPen                           vWhitePen( "WHITE"
-                                              ,1
-                                              ,wxSOLID
-                                             );
-    wxPen                           vClearPen( GetBackgroundColour()
-                                              ,1
-                                              ,wxSOLID
-                                             );
-    wxClientDC                      vDC(this);
+    wxToolBarTool* pTool = (wxToolBarTool*)pToolBase;
+    wxCoord vX;
+    wxCoord vY;
+    wxCoord vWidth;
+    wxCoord vHeight;
+    wxColour gray85( 85,85,85 );
+    wxPen vDarkGreyPen( gray85, 1, wxSOLID );
+    wxPen vClearPen( GetBackgroundColour(), 1, wxSOLID );
+    wxClientDC vDC(this);
 
     if (!pTool)
         return;
@@ -1368,7 +1122,7 @@ void wxToolBar::RaiseTool (
     if (!HasFlag(wxTB_FLAT))
         return;
 
-    if (HasFlag(wxTB_TEXT) && !pTool->GetLabel().IsEmpty())
+    if (HasFlag(wxTB_TEXT) && !pTool->GetLabel().empty())
     {
         if (pTool->GetWidth() > m_vTextX)
         {
@@ -1395,7 +1149,7 @@ void wxToolBar::RaiseTool (
         vDC.SetPen(vDarkGreyPen);
         vDC.DrawLine(vX + vWidth, vY + vHeight, vX, vY + vHeight);
         vDC.DrawLine(vX + vWidth, vY, vX + vWidth, vY + vHeight);
-        vDC.SetPen(vWhitePen);
+        vDC.SetPen(*wxWHITE_PEN);
         vDC.DrawLine(vX, vY, vX + vWidth, vY);
         vDC.DrawLine(vX, vY + vHeight, vX, vY);
     }
@@ -1409,17 +1163,21 @@ void wxToolBar::RaiseTool (
     }
 } // end of wxToolBar::RaiseTool
 
-void wxToolBar::OnTimer (
-  wxTimerEvent&                     rEvent
-)
+void wxToolBar::OnTimer ( wxTimerEvent& rEvent )
 {
-    if (rEvent.GetId() == (int)m_ulToolTimer)
+    if (rEvent.GetId() == m_vToolTimer.GetTimerId())
     {
-        (void)wxMessageBox("wxWindows toolbar timer", "ToolTimer");
+        wxPoint vPos( m_vXMouse, m_vYMouse );
+
+        m_pToolTip->DisplayToolTipWindow(vPos);
+        m_vToolTimer.Stop();
+        m_vToolExpTimer.Start(4000L, TRUE);
     }
-    else if (rEvent.GetId() == (int)m_ulToolExpTimer)
+    else if (rEvent.GetId() == m_vToolExpTimer.GetTimerId())
     {
-        (void)wxMessageBox("wxWindows toolbar timer", "ToolExpTimer");
+        m_pToolTip->HideToolTipWindow();
+        GetParent()->Refresh();
+        m_vToolExpTimer.Stop();
     }
 } // end of wxToolBar::OnTimer