// headers
// ----------------------------------------------------------------------------
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
- #pragma implementation "tbar95.h"
-#endif
-
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
// these values correspond to those used by comctl32.dll
#define DEFAULTBITMAPX 16
#define DEFAULTBITMAPY 15
-#define DEFAULTBUTTONX 24
-#define DEFAULTBUTTONY 24
-#define DEFAULTBARHEIGHT 27
// ----------------------------------------------------------------------------
// wxWin macros
SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE));
SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT));
- // workaround for flat toolbar on Windows XP classic style
+ // workaround for flat toolbar on Windows XP classic style: we have to set
+ // the style after creating the control, doing it at creation time doesn't
+ // work
#if wxUSE_UXTHEME
if ( style & wxTB_FLAT )
{
- wxUxThemeEngine *p = wxUxThemeEngine::Get();
- if ( !p || !p->IsThemeActive() )
- {
- DWORD dwToolbarStyle;
-
- dwToolbarStyle = (DWORD)::SendMessage(GetHwnd(), TB_GETSTYLE, 0, 0L );
+ LRESULT style = ::SendMessage(GetHwnd(), TB_GETSTYLE, 0, 0L);
- if ((dwToolbarStyle & TBSTYLE_FLAT) == 0)
- {
- dwToolbarStyle |= TBSTYLE_FLAT;
- ::SendMessage(GetHwnd(), TB_SETSTYLE, 0, (LPARAM)dwToolbarStyle );
- }
+ if ( !(style & TBSTYLE_FLAT) )
+ {
+ ::SendMessage(GetHwnd(), TB_SETSTYLE, 0, style | TBSTYLE_FLAT);
}
}
-#endif
+#endif // wxUSE_UXTHEME
return true;
}
sizeBest.y = size.cy;
}
+ CacheBestSize(sizeBest);
return sizeBest;
}
void wxToolBar::CreateDisabledImageList()
{
+ if (m_disabledImgList != NULL)
+ {
+ delete m_disabledImgList;
+ m_disabledImgList = NULL;
+ }
+
// as we can't use disabled image list with older versions of comctl32.dll,
// don't even bother creating it
if ( wxTheApp->GetComCtl32Version() >= 470 )
bmpDisabled.GetMask() != NULL,
GetToolsCount()
);
- return;
+ break;
}
}
// we don't have any disabled bitmaps
}
-
- m_disabledImgList = NULL;
}
bool wxToolBar::Realize()
const bool isVertical = HasFlag(wxTB_VERTICAL);
bool doRemap, doRemapBg, doTransparent;
-#ifdef __WXWINCE__
- doRemapBg = false;
- doRemap = false;
- doTransparent = false;
-#else
- if (wxSystemOptions::GetOptionInt(wxT("msw.remap")) == 2)
+ doRemapBg = doRemap = doTransparent = false;
+
+#ifndef __WXWINCE__
+ int remapValue = (-1);
+ if (wxSystemOptions::HasOption(wxT("msw.remap")))
+ remapValue = wxSystemOptions::GetOptionInt(wxT("msw.remap"));
+
+ doTransparent = (remapValue == 2);
+ if (!doTransparent)
{
- doRemapBg = doRemap = false;
- doTransparent = true;
- }
- else
- { doRemap = !wxSystemOptions::HasOption(wxT("msw.remap"))
- || wxSystemOptions::GetOptionInt(wxT("msw.remap")) == 1;
+ doRemap = (remapValue != 0);
doRemapBg = !doRemap;
- doTransparent = false;
}
#endif
sizeBmp.x = m_defaultWidth;
sizeBmp.y = m_defaultHeight;
- const wxCoord totalBitmapWidth = m_defaultWidth * nTools,
+ const wxCoord totalBitmapWidth = m_defaultWidth *
+ wx_truncate_cast(wxCoord, nTools),
totalBitmapHeight = m_defaultHeight;
// Create a bitmap and copy all the tool bitmaps to it
wxMemoryDC dcAllButtons;
wxBitmap bitmap(totalBitmapWidth, totalBitmapHeight);
dcAllButtons.SelectObject(bitmap);
+
#ifdef __WXWINCE__
dcAllButtons.SetBackground(wxBrush(wxColour(192,192,192)));
#else
totalBitmapWidth, totalBitmapHeight);
dcAllButtons.SelectObject(bitmap);
-
-
}
#endif // !__WXWINCE__
if ( tool->IsButton() )
{
const wxBitmap& bmp = tool->GetNormalBitmap();
+
+ const int w = bmp.GetWidth();
+ const int h = bmp.GetHeight();
+
if ( bmp.Ok() )
{
- int xOffset = wxMax(0, (m_defaultWidth - bmp.GetWidth())/2);
- int yOffset = wxMax(0, (m_defaultHeight - bmp.GetHeight())/2);
+ int xOffset = wxMax(0, (m_defaultWidth - w)/2);
+ int yOffset = wxMax(0, (m_defaultHeight - h)/2);
+
// notice the last parameter: do use mask
- dcAllButtons.DrawBitmap(bmp, x+xOffset, yOffset, true);
+ dcAllButtons.DrawBitmap(bmp, x + xOffset, yOffset, true);
}
else
{
if ( m_disabledImgList )
{
wxBitmap bmpDisabled = tool->GetDisabledBitmap();
+#if wxUSE_IMAGE
if ( !bmpDisabled.Ok() )
{
-#if wxUSE_IMAGE
// no disabled bitmap specified but we still need to
// fill the space in the image list with something, so
// we grey out the normal bitmap
- wxImage img = bmp.ConvertToImage();
-#if 0
- img.SetMaskColour(wxLIGHT_GREY->Red(),
- wxLIGHT_GREY->Green(),
- wxLIGHT_GREY->Blue());
-#endif
wxImage imgGreyed;
- wxCreateGreyedImage(img, imgGreyed);
+ wxCreateGreyedImage(bmp.ConvertToImage(), imgGreyed);
- bmpDisabled = wxBitmap(imgGreyed);
-#if 0
- bmpDisabled.SetMask(new wxMask(bmpDisabled, *wxLIGHT_GREY));
+ if (doRemap)
+ {
+ // we need to have light grey background colour for
+ // MapBitmap() to work correctly
+ for ( int y = 0; y < h; y++ )
+ {
+ for ( int x = 0; x < w; x++ )
+ {
+ if ( imgGreyed.IsTransparent(x, y) )
+ imgGreyed.SetRGB(x, y,
+ wxLIGHT_GREY->Red(),
+ wxLIGHT_GREY->Green(),
+ wxLIGHT_GREY->Blue());
+ }
+ }
+ }
- MapBitmap(bmpDisabled.GetHBITMAP(),
- bmpDisabled.GetWidth(),
- bmpDisabled.GetHeight());
-#endif // 0
+ bmpDisabled = wxBitmap(imgGreyed);
+ }
#endif // wxUSE_IMAGE
+
+ if (doRemap)
+ {
+ MapBitmap(bmpDisabled.GetHBITMAP(), w, h);
}
m_disabledImgList->Add(bmpDisabled);
// Map to system colours
hBitmap = (HBITMAP)MapBitmap((WXHBITMAP) hBitmap,
totalBitmapWidth, totalBitmapHeight);
-
-
}
bool addBitmap = true;
continue;
}
-
TBBUTTON& button = buttons[i];
wxZeroMemory(button);
// radio items
button.fsState |= TBSTATE_CHECKED;
- tool->Toggle(true);
+ if (tool->Toggle(true))
+ {
+ DoToggleTool(tool, true);
+ }
+ }
+ else if (tool->IsToggled())
+ {
+ wxToolBarToolsList::compatibility_iterator nodePrev = node->GetPrevious();
+ int prevIndex = i - 1;
+ while ( nodePrev )
+ {
+ TBBUTTON& prevButton = buttons[prevIndex];
+ wxToolBarToolBase *tool = nodePrev->GetData();
+ if ( !tool->IsButton() || tool->GetKind() != wxITEM_RADIO )
+ break;
+
+ if ( tool->Toggle(false) )
+ {
+ DoToggleTool(tool, false);
+ }
+ prevButton.fsState = TBSTATE_ENABLED;
+ nodePrev = nodePrev->GetPrevious();
+ prevIndex--;
+ }
}
isRadio = true;
}
InvalidateBestSize();
+ SetBestFittingSize();
+
return true;
}
return (wxToolBarToolBase *)NULL;
}
- // if comctl32 version < 4.71 wxToolBar95 adds dummy spacers
-#if defined(_WIN32_IE) && (_WIN32_IE >= 0x400 )
+ // when TB_SETBUTTONINFO is available (both during compile- and run-time),
+ // we don't use the dummy separators hack
+#ifdef TB_SETBUTTONINFO
if ( wxApp::GetComCtl32Version() >= 471 )
{
return m_tools.Item((size_t)index)->GetData();
}
else
-#endif
+#endif // TB_SETBUTTONINFO
{
return GetItemSkippingDummySpacers( m_tools, (size_t) index );
}