void wxToolBarBase::UnToggleRadioGroup(wxToolBarToolBase *tool) { wxCHECK_RET( tool, wxT("NULL tool in wxToolBarTool::UnToggleRadioGroup") ); if ( !tool->IsButton() || tool->GetKind() != wxITEM_RADIO ) return; wxToolBarToolsList::compatibility_iterator node = m_tools.Find(tool); wxCHECK_RET( node, wxT("invalid tool in wxToolBarTool::UnToggleRadioGroup") ); wxToolBarToolsList::compatibility_iterator nodeNext = node->GetNext(); #if defined(__INTEL_COMPILER) && 1 /* VDM auto patch */ # pragma ivdep # pragma swp # pragma unroll # pragma prefetch # if 0 # pragma simd noassert # endif #endif /* VDM auto patch */ while ( nodeNext ) { wxToolBarToolBase *toolNext = nodeNext->GetData(); if ( !toolNext->IsButton() || toolNext->GetKind() != wxITEM_RADIO ) break; if ( toolNext->Toggle(false) ) { DoToggleTool(toolNext, false); } nodeNext = nodeNext->GetNext(); } wxToolBarToolsList::compatibility_iterator nodePrev = node->GetPrevious(); #if defined(__INTEL_COMPILER) && 1 /* VDM auto patch */ # pragma ivdep # pragma swp # pragma unroll # pragma prefetch # if 0 # pragma simd noassert # endif #endif /* VDM auto patch */ while ( nodePrev ) { wxToolBarToolBase *toolNext = nodePrev->GetData(); if ( !toolNext->IsButton() || toolNext->GetKind() != wxITEM_RADIO ) break; if ( toolNext->Toggle(false) ) { DoToggleTool(toolNext, false); } nodePrev = nodePrev->GetPrevious(); } }
bool wxToolBar::Realize() { if ( !wxToolBarBase::Realize() ) return false; // bring the initial state of all the toolbar items in line with the // internal state if the latter was changed by calling wxToolBarTool:: // Enable(): this works under MSW, where the toolbar items are only created // in Realize() which uses the internal state to determine the initial // button state, so make it work under GTK too for ( wxToolBarToolsList::const_iterator i = m_tools.begin(); i != m_tools.end(); ++i ) { // by default the toolbar items are enabled and not toggled, so we only // have to do something if their internal state doesn't correspond to // this if ( !(*i)->IsEnabled() ) DoEnableTool(*i, false); if ( (*i)->IsToggled() ) DoToggleTool(*i, true); } return true; }
void wxToolBarBase::UnToggleRadioGroup(wxToolBarToolBase *tool) { wxCHECK_RET( tool, wxT("NULL tool in wxToolBarTool::UnToggleRadioGroup") ); if ( !tool->IsButton() || tool->GetKind() != wxITEM_RADIO ) return; wxToolBarToolsList::compatibility_iterator node = m_tools.Find(tool); wxCHECK_RET( node, wxT("invalid tool in wxToolBarTool::UnToggleRadioGroup") ); wxToolBarToolsList::compatibility_iterator nodeNext = node->GetNext(); while ( nodeNext ) { wxToolBarToolBase *toolNext = nodeNext->GetData(); if ( !toolNext->IsButton() || toolNext->GetKind() != wxITEM_RADIO ) break; if ( toolNext->Toggle(false) ) { DoToggleTool(toolNext, false); } nodeNext = nodeNext->GetNext(); } wxToolBarToolsList::compatibility_iterator nodePrev = node->GetPrevious(); while ( nodePrev ) { wxToolBarToolBase *toolNext = nodePrev->GetData(); if ( !toolNext->IsButton() || toolNext->GetKind() != wxITEM_RADIO ) break; if ( toolNext->Toggle(false) ) { DoToggleTool(toolNext, false); } nodePrev = nodePrev->GetPrevious(); } }
void wxToolBarBase::ToggleTool(int toolid, bool toggle) { wxToolBarToolBase *tool = FindById(toolid); if ( tool && tool->CanBeToggled() ) { if ( tool->Toggle(toggle) ) { UnToggleRadioGroup(tool); DoToggleTool(tool, toggle); } } }
bool wxToolBar::Realize() { if (m_tools.GetCount() == 0) return FALSE; int x = m_xMargin + kwxMacToolBarLeftMargin ; int y = m_yMargin + kwxMacToolBarTopMargin ; int tw, th; GetSize(& tw, & th); int maxWidth = 0 ; int maxHeight = 0 ; int maxToolWidth = 0; int maxToolHeight = 0; // Find the maximum tool width and height wxToolBarToolsList::compatibility_iterator node = m_tools.GetFirst(); while ( node ) { wxToolBarTool *tool = (wxToolBarTool *)node->GetData(); wxSize sz = tool->GetSize() ; if ( sz.x > maxToolWidth ) maxToolWidth = sz.x ; if (sz.y> maxToolHeight) maxToolHeight = sz.y; node = node->GetNext(); } bool lastWasRadio = FALSE; node = m_tools.GetFirst(); while (node) { wxToolBarTool *tool = (wxToolBarTool *)node->GetData(); wxSize cursize = tool->GetSize() ; bool isRadio = FALSE; if ( tool->IsButton() && tool->GetKind() == wxITEM_RADIO ) { if ( !lastWasRadio ) { if (tool->Toggle(true)) { DoToggleTool(tool, true); } } else if (tool->IsToggled()) { wxToolBarToolsList::compatibility_iterator nodePrev = node->GetPrevious(); while ( nodePrev ) { wxToolBarToolBase *tool = nodePrev->GetData(); if ( !tool->IsButton() || (tool->GetKind() != wxITEM_RADIO) ) break; if ( tool->Toggle(false) ) { DoToggleTool(tool, false); } nodePrev = nodePrev->GetPrevious(); } } isRadio = TRUE; } else { isRadio = FALSE; } lastWasRadio = isRadio; // for the moment we just do a single row/column alignement if ( x + cursize.x > maxWidth ) maxWidth = x + cursize.x ; if ( y + cursize.y > maxHeight ) maxHeight = y + cursize.y ; if ( GetWindowStyleFlag() & wxTB_VERTICAL ) { int x1 = x + (maxToolWidth - cursize.x)/2 ; tool->SetPosition( wxPoint( x1 , y ) ) ; } else { int y1 = y + (maxToolHeight - cursize.y)/2 ; tool->SetPosition( wxPoint( x , y1 ) ) ; } if ( GetWindowStyleFlag() & wxTB_VERTICAL ) { y += cursize.y ; y += kwxMacToolSpacing ; } else { x += cursize.x ; x += kwxMacToolSpacing ; } node = node->GetNext(); } if ( GetWindowStyleFlag() & wxTB_HORIZONTAL ) { if ( m_maxRows == 0 ) { // if not set yet, only one row SetRows(1); } m_minWidth = maxWidth; maxWidth = tw ; maxHeight += m_yMargin + kwxMacToolBarTopMargin; m_minHeight = m_maxHeight = maxHeight ; } else { if ( GetToolsCount() > 0 && m_maxRows == 0 ) { // if not set yet, have one column SetRows(GetToolsCount()); } m_minHeight = maxHeight; maxHeight = th ; maxWidth += m_xMargin + kwxMacToolBarLeftMargin; m_minWidth = m_maxWidth = maxWidth ; } SetSize( maxWidth, maxHeight ); InvalidateBestSize(); return TRUE; }