accessibility/source/standard/vclxaccessibleradiobutton.cxx | 5 vcl/inc/vcl/builder.hxx | 16 + vcl/inc/vcl/button.hxx | 22 +- vcl/source/control/button.cxx | 118 ++++++------ vcl/source/window/builder.cxx | 46 +++- vcl/source/window/layout.cxx | 2 6 files changed, 129 insertions(+), 80 deletions(-)
New commits: commit a707b39833c1b57a043ef99620dd479bc8a8a523 Author: Caolán McNamara <caol...@redhat.com> Date: Mon Apr 30 10:25:34 2012 +0100 just return a vector rather than pass one in by ref to be cleared diff --git a/accessibility/source/standard/vclxaccessibleradiobutton.cxx b/accessibility/source/standard/vclxaccessibleradiobutton.cxx index 73eefb6..003b9df 100644 --- a/accessibility/source/standard/vclxaccessibleradiobutton.cxx +++ b/accessibility/source/standard/vclxaccessibleradiobutton.cxx @@ -104,9 +104,8 @@ void VCLXAccessibleRadioButton::FillAccessibleRelationSet( utl::AccessibleRelati RadioButton* pRadioButton = dynamic_cast< RadioButton* >( GetWindow() ); if ( pRadioButton ) { - ::std::vector< RadioButton* > aGroup; - pRadioButton->GetRadioButtonGroup( aGroup, true ); - if ( !aGroup.empty() ) + ::std::vector< RadioButton* > aGroup(pRadioButton->GetRadioButtonGroup(true)); + if (!aGroup.empty()) { sal_Int32 i = 0; Sequence< Reference< XInterface > > aSequence( static_cast< sal_Int32 >( aGroup.size() ) ); diff --git a/vcl/inc/vcl/button.hxx b/vcl/inc/vcl/button.hxx index 76b1408..3fc5dc7 100644 --- a/vcl/inc/vcl/button.hxx +++ b/vcl/inc/vcl/button.hxx @@ -388,14 +388,14 @@ public: or giving up the SolarMutex may mean events get executed that lead to the pointers getting invalid. - @param io_rGroup - gets cleared on entering the function. on return contains the <code>RadioButton</code>s - in the same group as this <code>RadioButton</code>. - @param bIncludeThis defines whether <code>this</code> is contained in the returned list + + @return + on return contains the <code>RadioButton</code>s + in the same group as this <code>RadioButton</code>. */ - void GetRadioButtonGroup( std::vector<RadioButton*>& io_rGroup, bool bIncludeThis ) const; + std::vector<RadioButton*> GetRadioButtonGroup(bool bIncludeThis = true) const; virtual bool set_property(const rtl::OString &rKey, const rtl::OString &rValue); void group(RadioButton &rOther); diff --git a/vcl/source/control/button.cxx b/vcl/source/control/button.cxx index fc2248c..b070115 100644 --- a/vcl/source/control/button.cxx +++ b/vcl/source/control/button.cxx @@ -2316,25 +2316,24 @@ void RadioButton::group(RadioButton &rOther) // .----------------------------------------------------------------------- -void RadioButton::GetRadioButtonGroup( std::vector< RadioButton* >& io_rGroup, bool bIncludeThis ) const +std::vector< RadioButton* > RadioButton::GetRadioButtonGroup(bool bIncludeThis) const { - // empty the list - io_rGroup.clear(); + std::vector< RadioButton* > aGroup; if (m_xGroup) { for (std::set<RadioButton*>::iterator aI = m_xGroup->begin(), aEnd = m_xGroup->end(); aI != aEnd; ++aI) { RadioButton *pRadioButton = *aI; - if (pRadioButton == this) + if (!bIncludeThis && pRadioButton == this) continue; - io_rGroup.push_back(pRadioButton); + aGroup.push_back(pRadioButton); } - return; + return aGroup; } //old-school - SAL_WARN("vcl", "No group set on radiobutton"); + SAL_WARN("vcl", "No new-style group set on radiobutton, using old-style digging around"); // go back to first in group; Window* pFirst = const_cast<RadioButton*>(this); @@ -2352,10 +2351,12 @@ void RadioButton::GetRadioButtonGroup( std::vector< RadioButton* >& io_rGroup, b if( pFirst->GetType() == WINDOW_RADIOBUTTON ) { if( pFirst != this || bIncludeThis ) - io_rGroup.push_back( static_cast<RadioButton*>(pFirst) ); + aGroup.push_back( static_cast<RadioButton*>(pFirst) ); } pFirst = pFirst->GetWindow( WINDOW_NEXT ); } while( pFirst && ( ( pFirst->GetStyle() & WB_GROUP ) == 0 ) ); + + return aGroup; } // ----------------------------------------------------------------------- @@ -2364,8 +2365,7 @@ void RadioButton::ImplUncheckAllOther() { mpWindowImpl->mnStyle |= WB_TABSTOP; - std::vector<RadioButton*> aGroup; - GetRadioButtonGroup(aGroup, false); + std::vector<RadioButton*> aGroup(GetRadioButtonGroup(false)); // Gruppe mit RadioButtons durchgehen und die gecheckten Buttons for (std::vector<RadioButton*>::iterator aI = aGroup.begin(), aEnd = aGroup.end(); aI != aEnd; ++aI) { commit 09593c5366945e55d9e8bce982591d76b4eae8ac Author: Caolán McNamara <caol...@redhat.com> Date: Mon Apr 30 10:19:19 2012 +0100 implement RadioButton groups diff --git a/vcl/inc/vcl/builder.hxx b/vcl/inc/vcl/builder.hxx index ffb2e54..730fd34 100644 --- a/vcl/inc/vcl/builder.hxx +++ b/vcl/inc/vcl/builder.hxx @@ -49,6 +49,19 @@ private: } }; std::vector<WinAndId> m_aChildren; + + struct RadioButtonGroupMap + { + rtl::OString m_sID; + rtl::OString m_sGroup; + RadioButtonGroupMap(const rtl::OString &rId, const rtl::OString &rGroup) + : m_sID(rId) + , m_sGroup(rGroup) + { + } + }; + std::vector<RadioButtonGroupMap> m_aGroups; + rtl::OString m_sID; Window *m_pParent; public: @@ -60,7 +73,8 @@ public: typedef std::map<rtl::OString, rtl::OString> stringmap; private: Window *insertObject(Window *pParent, const rtl::OString &rClass, const rtl::OString &rID, stringmap &rVec); - Window *makeObject(Window *pParent, const rtl::OString &rClass, stringmap &rVec); + Window *makeObject(Window *pParent, const rtl::OString &rClass, const rtl::OString &rID, stringmap &rVec); + bool extractGroup(const rtl::OString &id, stringmap &rVec); void handleChild(Window *pParent, xmlreader::XmlReader &reader); Window* handleObject(Window *pParent, xmlreader::XmlReader &reader); diff --git a/vcl/inc/vcl/button.hxx b/vcl/inc/vcl/button.hxx index c5bc274..76b1408 100644 --- a/vcl/inc/vcl/button.hxx +++ b/vcl/inc/vcl/button.hxx @@ -37,6 +37,7 @@ #include <vcl/bitmap.hxx> #include <vcl/salnativewidgets.hxx> +#include <set> #include <vector> class UserDrawEvent; @@ -286,10 +287,10 @@ private: Rectangle maStateRect; Rectangle maMouseRect; Image maImage; - sal_Bool mbChecked; - sal_Bool mbSaveValue; - sal_Bool mbRadioCheck; - sal_Bool mbStateChanged; + sal_Bool mbChecked; + sal_Bool mbSaveValue; + sal_Bool mbRadioCheck; + sal_Bool mbStateChanged; Link maToggleHdl; SAL_DLLPRIVATE void ImplInitRadioButtonData(); @@ -311,6 +312,8 @@ private: SAL_DLLPRIVATE RadioButton& operator= (const RadioButton &); protected: + boost::shared_ptr< std::set<RadioButton*> > m_xGroup; + using Control::ImplInitSettings; using Window::ImplInit; SAL_DLLPRIVATE void ImplInit( Window* pParent, WinBits nStyle ); @@ -395,6 +398,7 @@ public: void GetRadioButtonGroup( std::vector<RadioButton*>& io_rGroup, bool bIncludeThis ) const; virtual bool set_property(const rtl::OString &rKey, const rtl::OString &rValue); + void group(RadioButton &rOther); }; // ------------ diff --git a/vcl/source/control/button.cxx b/vcl/source/control/button.cxx index d6c1e83..fc2248c 100644 --- a/vcl/source/control/button.cxx +++ b/vcl/source/control/button.cxx @@ -2291,13 +2291,51 @@ void RadioButton::ImplDrawRadioButton( bool bLayout ) } } -// ----------------------------------------------------------------------- +void RadioButton::group(RadioButton &rOther) +{ + if (!m_xGroup) + { + m_xGroup.reset(new std::set<RadioButton*>); + m_xGroup->insert(this); + } + + if (rOther.m_xGroup) + { + for (std::set<RadioButton*>::iterator aI = rOther.m_xGroup->begin(), aEnd = rOther.m_xGroup->end(); aI != aEnd; ++aI) + m_xGroup->insert(*aI); + } + + m_xGroup->insert(&rOther); + + rOther.m_xGroup = m_xGroup; + + //if this one is checked, uncheck all the others + if (mbChecked) + ImplUncheckAllOther(); +} + +// .----------------------------------------------------------------------- void RadioButton::GetRadioButtonGroup( std::vector< RadioButton* >& io_rGroup, bool bIncludeThis ) const { // empty the list io_rGroup.clear(); + if (m_xGroup) + { + for (std::set<RadioButton*>::iterator aI = m_xGroup->begin(), aEnd = m_xGroup->end(); aI != aEnd; ++aI) + { + RadioButton *pRadioButton = *aI; + if (pRadioButton == this) + continue; + io_rGroup.push_back(pRadioButton); + } + return; + } + + //old-school + SAL_WARN("vcl", "No group set on radiobutton"); + // go back to first in group; Window* pFirst = const_cast<RadioButton*>(this); while( ( pFirst->GetStyle() & WB_GROUP ) == 0 ) @@ -2416,6 +2454,8 @@ void RadioButton::ImplLoadRes( const ResId& rResId ) RadioButton::~RadioButton() { + if (m_xGroup) + m_xGroup->erase(this); } // ----------------------------------------------------------------------- diff --git a/vcl/source/window/builder.cxx b/vcl/source/window/builder.cxx index 2a1edca..183b718 100644 --- a/vcl/source/window/builder.cxx +++ b/vcl/source/window/builder.cxx @@ -39,11 +39,24 @@ VclBuilder::VclBuilder(Window *pParent, rtl::OUString sUri, rtl::OString sID) : m_sID(sID) , m_pParent(pParent) { - fprintf(stderr, "now trying %s\n", rtl::OUStringToOString(sUri, RTL_TEXTENCODING_UTF8).getStr()); xmlreader::XmlReader reader(sUri); handleChild(pParent, reader); + //Set radiobutton groups when everything has been imported + for (std::vector<RadioButtonGroupMap>::iterator aI = m_aGroups.begin(), + aEnd = m_aGroups.end(); aI != aEnd; ++aI) + { + RadioButton *pOne = static_cast<RadioButton*>(get_by_name(aI->m_sID)); + RadioButton *pOther = static_cast<RadioButton*>(get_by_name(aI->m_sGroup)); + SAL_WARN_IF(!pOne || !pOther, "vcl", "missing member of radiobutton group"); + if (pOne && pOther) + pOne->group(*pOther); + } + //drop maps now + std::vector<RadioButtonGroupMap>().swap(m_aGroups); + + //auto-show (really necessary ?, maybe drop it when complete) for (std::vector<WinAndId>::iterator aI = m_aChildren.begin(), aEnd = m_aChildren.end(); aI != aEnd; ++aI) { @@ -119,7 +132,19 @@ namespace } } -Window *VclBuilder::makeObject(Window *pParent, const rtl::OString &name, stringmap &rMap) +bool VclBuilder::extractGroup(const rtl::OString &id, stringmap &rMap) +{ + VclBuilder::stringmap::iterator aFind = rMap.find(rtl::OString(RTL_CONSTASCII_STRINGPARAM("group"))); + if (aFind != rMap.end()) + { + m_aGroups.push_back(RadioButtonGroupMap(id, aFind->second)); + rMap.erase(aFind); + return true; + } + return false; +} + +Window *VclBuilder::makeObject(Window *pParent, const rtl::OString &name, const rtl::OString &id, stringmap &rMap) { Window *pWindow = NULL; if (name.equalsL(RTL_CONSTASCII_STRINGPARAM("GtkDialog"))) @@ -147,7 +172,10 @@ Window *VclBuilder::makeObject(Window *pParent, const rtl::OString &name, string else if (name.equalsL(RTL_CONSTASCII_STRINGPARAM("GtkButton"))) pWindow = extractStockAndBuildButton(pParent, rMap); else if (name.equalsL(RTL_CONSTASCII_STRINGPARAM("GtkRadioButton"))) + { + extractGroup(id, rMap); pWindow = new RadioButton(pParent, WB_CENTER|WB_VCENTER|WB_3DLOOK); + } else if (name.equalsL(RTL_CONSTASCII_STRINGPARAM("GtkCheckButton"))) pWindow = new CheckBox(pParent, WB_CENTER|WB_VCENTER|WB_3DLOOK); else if (name.equalsL(RTL_CONSTASCII_STRINGPARAM("GtkSpinButton"))) @@ -171,17 +199,13 @@ Window *VclBuilder::insertObject(Window *pParent, const rtl::OString &rClass, co if (!m_sID.isEmpty() && rID.equals(m_sID)) { pCurrentChild = m_pParent; - fprintf(stderr, "inserting into parent dialog\n"); //toplevels default to resizable if (pCurrentChild->IsDialog()) - { - fprintf(stderr, "forcing resizable\n"); pCurrentChild->SetStyle(pCurrentChild->GetStyle() | WB_SIZEMOVE); - } } else { - pCurrentChild = makeObject(pParent, rClass, rMap); + pCurrentChild = makeObject(pParent, rClass, rID, rMap); if (!pCurrentChild) fprintf(stderr, "missing object!\n"); else @@ -429,7 +453,13 @@ void VclBuilder::collectProperty(xmlreader::XmlReader &reader, stringmap &rMap) reader.nextItem( xmlreader::XmlReader::TEXT_NORMALIZED, &name, &nsId); rtl::OString sValue(name.begin, name.length); - rMap[sProperty] = sValue.replace('_', '-'); + //replace '_' with '-' except for property values that + //refer to widget ids themselves. TO-DO, drop conversion + //and just use foo_bar properties throughout + if (sProperty.equalsL(RTL_CONSTASCII_STRINGPARAM("group"))) + rMap[sProperty] = sValue; + else + rMap[sProperty] = sValue.replace('_', '-'); } } } commit fe933b188c3fdb89691abc82dee410905ab0ffb0 Author: Caolán McNamara <caol...@redhat.com> Date: Mon Apr 30 09:53:09 2012 +0100 n-rows doesn't matter, auto sizes depending on children diff --git a/vcl/source/window/layout.cxx b/vcl/source/window/layout.cxx index 5d6b587..b3789a5 100644 --- a/vcl/source/window/layout.cxx +++ b/vcl/source/window/layout.cxx @@ -509,6 +509,8 @@ bool VclGrid::set_property(const rtl::OString &rKey, const rtl::OString &rValue) set_row_homogeneous(toBool(rValue)); else if (rKey.equalsL(RTL_CONSTASCII_STRINGPARAM("column-homogeneous"))) set_column_homogeneous(toBool(rValue)); + else if (rKey.equalsL(RTL_CONSTASCII_STRINGPARAM("n-rows"))) + /*nothing to do*/; else return Window::set_property(rKey, rValue); return true; commit 8a2edf4728e0c1eb34dc0a163e706a56a480729d Author: Caolán McNamara <caol...@redhat.com> Date: Mon Apr 30 08:59:54 2012 +0100 use GetRadioButtonGroup to get other members of the radiobutton group diff --git a/vcl/source/control/button.cxx b/vcl/source/control/button.cxx index 5060bd1..d6c1e83 100644 --- a/vcl/source/control/button.cxx +++ b/vcl/source/control/button.cxx @@ -2326,64 +2326,24 @@ void RadioButton::ImplUncheckAllOther() { mpWindowImpl->mnStyle |= WB_TABSTOP; + std::vector<RadioButton*> aGroup; + GetRadioButtonGroup(aGroup, false); // Gruppe mit RadioButtons durchgehen und die gecheckten Buttons - Window* pWindow; - WinBits nStyle; - if ( !(GetStyle() & WB_GROUP) ) + for (std::vector<RadioButton*>::iterator aI = aGroup.begin(), aEnd = aGroup.end(); aI != aEnd; ++aI) { - pWindow = GetWindow( WINDOW_PREV ); - while ( pWindow ) + RadioButton *pWindow = *aI; + if ( pWindow->IsChecked() ) { - nStyle = pWindow->GetStyle(); - - if ( pWindow->GetType() == WINDOW_RADIOBUTTON ) - { - if ( ((RadioButton*)pWindow)->IsChecked() ) - { - ImplDelData aDelData; - pWindow->ImplAddDel( &aDelData ); - ((RadioButton*)pWindow)->SetState( sal_False ); - if ( aDelData.IsDelete() ) - return; - pWindow->ImplRemoveDel( &aDelData ); - } - // Um falsch gesetzt WB_TABSTOPS immer zu entfernen, nicht - // innerhalb der if-Abfrage - pWindow->mpWindowImpl->mnStyle &= ~WB_TABSTOP; - } - - if ( nStyle & WB_GROUP ) - break; - - pWindow = pWindow->GetWindow( WINDOW_PREV ); - } - } - - pWindow = GetWindow( WINDOW_NEXT ); - while ( pWindow ) - { - nStyle = pWindow->GetStyle(); - - if ( nStyle & WB_GROUP ) - break; - - if ( pWindow->GetType() == WINDOW_RADIOBUTTON ) - { - if ( ((RadioButton*)pWindow)->IsChecked() ) - { - ImplDelData aDelData; - pWindow->ImplAddDel( &aDelData ); - ((RadioButton*)pWindow)->SetState( sal_False ); - if ( aDelData.IsDelete() ) - return; - pWindow->ImplRemoveDel( &aDelData ); - } - // Um falsch gesetzt WB_TABSTOPS immer zu entfernen, nicht - // innerhalb der if-Abfrage - pWindow->mpWindowImpl->mnStyle &= ~WB_TABSTOP; + ImplDelData aDelData; + pWindow->ImplAddDel( &aDelData ); + pWindow->SetState( sal_False ); + if ( aDelData.IsDelete() ) + return; + pWindow->ImplRemoveDel( &aDelData ); } - - pWindow = pWindow->GetWindow( WINDOW_NEXT ); + // Um falsch gesetzt WB_TABSTOPS immer zu entfernen, nicht + // innerhalb der if-Abfrage + pWindow->mpWindowImpl->mnStyle &= ~WB_TABSTOP; } }
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits