// 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;
+ LRESULT style = ::SendMessage(GetHwnd(), TB_GETSTYLE, 0, 0L);
- dwToolbarStyle = (DWORD)::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;
}
::SetParent(GetHwndOf(win), GetHwnd());
}
- // only destroy the old toolbar now -- after all the children had been
- // reparented
+ // only destroy the old toolbar now --
+ // after all the children had been reparented
::DestroyWindow(hwndOld);
// it is for the old bitmap control and can't be used with the new one
// is not - otherwise toolbar leaves a hole in the place it used to occupy
wxFrame *frame = wxDynamicCast(GetParent(), wxFrame);
if ( frame && !frame->IsBeingDeleted() )
- {
frame->SendSizeEvent();
- }
if ( m_hBitmap )
- {
::DeleteObject((HBITMAP) m_hBitmap);
- }
delete m_disabledImgList;
}
sizeBest.y = size.cy;
}
+ CacheBestSize(sizeBest);
return sizeBest;
}
// incorrect background colour - and not using it still results in the
// correct (flat) toolbar, so don't use it there
if ( s_verComCtl > 400 && s_verComCtl < 600 )
- {
msStyle |= TBSTYLE_FLAT | TBSTYLE_TRANSPARENT;
- }
if ( s_verComCtl >= 470 && style & wxTB_HORZ_LAYOUT )
- {
msStyle |= TBSTYLE_LIST;
- }
}
if ( style & wxTB_NODIVIDER )
}
if ( tool2->IsControl() )
- {
pos += ((wxToolBarTool *)tool2)->GetSeparatorsCount() - 1;
- }
}
// now determine the number of buttons to delete and the area taken by them
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
+
+#ifndef __WXWINCE__
if (doTransparent)
dcAllButtons.SetBackground(*wxTRANSPARENT_BRUSH);
else
- dcAllButtons.SetBackground(*wxLIGHT_GREY_BRUSH);
+ dcAllButtons.SetBackground(wxBrush(GetBackgroundColour()));
+#else
+ dcAllButtons.SetBackground(wxBrush(wxColour(192,192,192)));
#endif
dcAllButtons.Clear();
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
-#endif // wxUSE_IMAGE
+ 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;
}
wxControl *control = tool->GetControl();
-
wxSize size = control->GetSize();
// the position of the leftmost controls corner
}
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 );
}