Thank you for your guidance.  Alas, I still have some questions...

On Wed, 2008-01-16 at 14:40 +0100, Frank Schönheit - Sun Microsystems
Germany wrote:
> First, you need to merely add the property to the radio button model.

Done.

> To be able to use existing mechanisms in the forms module, you should
> declare a PROPERTY_GROUP_NAME and PROPERTY_ID_GROUP_NAME. As a general
> note, let an arbitrary other PROPERTY_[ID_]FOO (and "grep") guide you
> where to add and use the new property. In short,
> source/inc/frm_strings.hxx and source/inc/property.hrc are for the new
> defines. To actually implement the property, you need to, in
> forms/source/RadioButton.cxx:
> - extend ORadioButtonModel::describeFixedProperties to declare the
>   presence of the property.
> - add a new member to the ORadioButtonModel class, taking the group
>   name
> - overload setFastPropertyValue_NoBroadcast, convertFastPropertyValue,
>   getFastPropertyValue, to handle setting/getting the group name
>   property. See the same methods in e.g. the OBoundControlModel for
>   typical implementations.

One oddity I encountered is that
ORadioButtonModel::setFastPropertyValue_NoBroadcast() must call
OReferenceValueComponent::setFastPropertyValue_NoBroadcast() or things
break (I forget the specifics of how things broke, but it didn't behave
properly), BUT if I call the base class version for
PROPERTY_ID_GROUP_NAME I'd get a debug message
OControlModel::setFastPropertyValue_NoBroadcast() saying "unknown
handle".

I'm not sure what the correct thing to do  for this, so for now I'm only
calling OReferenceValueComponent::setFastPropertyValue_NoBroadcast() if
nHandle isn't PROPERTY_ID_GROUP_NAME.

> Second, you need to respect this property when defining the tab groups
> at runtime. The tabbing order (and thus the definition of radio button
> groups) is managed in the OGroupManager class in
> forms/source/component/GroupManager.cxx. There's one group manager
> instance for every logical form, and it manages the controls which are
> children of this logical forms. It does so by being a listener at the
> form (listening for element insertion and removal), and by being a
> listener at the single elements (aka control models, here it listens for
> the "Name" and "TabIndex" properties).
> 
> You need to tweak the group manager implementations (OGroupManager and
> dependent classes) to respect not only "Name" and "TabIndex" when
> deciding which controls belong into one group, but also the new
> "GroupName" property. The entry point for this change would be
> OGroupManager::InsertElement.
> 
> We need to define how the new property interacts with the old
> implementations. That is, if an old document is loaded, users expect the
> "grouping by name" to continue working, else their documents would be
> simply broken.
> So, I suggest that GroupName should be taken into account to determine
> which group a control model belongs to *only* when it is not empty. When
> it's empty, then the "Name" property should, as before, be taken as
> group indicator.
> 
> If you have all this done right, then the new property should start working.

I have it partially working, which is why I'm replying, because it's
starting to confuse me.

First, an aside: it looks like OGroupManager::removeFromGroupMap() has a
bug where if a _sGroupName group has only one element in it, the group
is NOT removed from m_aActiveGroupMap.  This seems wrong; what's doubly
confusing is that the only time m_aActiveGroupMap.erase() is executed is
if there's at least one element within the group, _after_ we removed the
radio button.  I can't see how groups are ever removed from this map.

Back to my problem: if each radio button has a different name, then the
new GroupName property controls grouping.  If the GroupName property is
empty, then the Name property controls grouping.  So far so good.

Where it goes south is the "migration" scenario: assume you have 4 radio
buttons, each with the same name.  If you try to split them into groups
using GroupName _without_ changing the Name, then the Name property
seems to be the controlling factor, e.g.

        RadioButton 1; Name=OptionButton; GroupName=A
        RadioButton 2; Name=OptionButton; GroupName=A
        RadioButton 3; Name=OptionButton; GroupName=B
        RadioButton 4; Name=OptionButton; GroupName=B

What confuses me is that OGroup::GetControlModels() behaves "properly"
-- it either returns the GroupName=A controls or the GroupName=B
controls (except for the AllComponentGroup group, which returns
everything, but we'll ignore that).

So as far as I can tell, I'm doing the right thing here, with GroupName
overriding Name to control which groups the controls are placed in.

Yet I can't have two buttons selected (one from A, one from B), but only
one.

Doubly odd is that if I change the name of one of the controls, e.g.
change RadioButton 3 to have Name=OptionButton3, then RadioButton 4 is
part of *both* groups -- I can have RadioButtons 1 and 3 active
concurrently, but selecting RadioButton 4 will result in RadioButton 4
being the only button active.

I'm getting the feeling that OGroupManager isn't the only controlling
factor, and that something somewhere isn't following the grouping
information set by OGroupManager.

Or I'm missing something in my OGroupManager updates.

Any suggestions on where to look?

> Third, you need to bring the new property to the UI.
> extensions/source/propctrlr is where the property browser is
> implemented.

This is mercifully easy; I actually did this as step 2 so that I could
make sure the properties in step 1 actually existed.  It also makes
testing the OGroupManager changes possible.

>  If you plan to contribute the code back (I strongly hope you do!), then
> I'm the person who will apply the final nitpick^Wreview to your changes.
> Thus, feel free to, at any time, show me what you have so far :)

Attached is my current patch...which is (sadly) full of debug spew.  It
also fixes the aforementioned OGroupManager::removeFromGroupMap() bug.

The most interesting bits are GetGroupName() and
OGroupManager::propertyChange().

Thanks,
 - Jon

Index: forms/source/component/GroupManager.cxx
===================================================================
RCS file: /cvs/gsl/forms/source/component/GroupManager.cxx,v
retrieving revision 1.17
diff -u -p -r1.17 GroupManager.cxx
--- forms/source/component/GroupManager.cxx	16 Sep 2006 23:51:13 -0000	1.17
+++ forms/source/component/GroupManager.cxx	5 Feb 2008 12:49:27 -0000
@@ -62,6 +62,7 @@
 #include "property.hrc"
 
 #include <algorithm>
+#include <stdio.h>
 
 //.........................................................................
 namespace frm
@@ -91,6 +92,21 @@ namespace
         }
         return bIs;
     }
+
+	#define CHAR_POINTER(THE_OUSTRING) ::rtl::OUStringToOString (THE_OUSTRING, RTL_TEXTENCODING_UTF8).pData->buffer
+    void GetGroupName (const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& xComponent, ::rtl::OUString& sGroupName)
+    {
+		xComponent->getPropertyValue( PROPERTY_GROUP_NAME ) >>= sGroupName;
+		if (sGroupName.getLength() == 0)
+			xComponent->getPropertyValue( PROPERTY_NAME ) >>= sGroupName;
+		rtl::OUString name;
+		xComponent->getPropertyValue( PROPERTY_NAME ) >>= name;
+		// printf ("# GetGroupName: Name=%s; sGroupName=%s\n", CHAR_POINTER(name), CHAR_POINTER(sGroupName));
+    }
+    void GetGroupName_ (const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& xComponent, ::rtl::OUString& sGroupName)
+		{
+			GetGroupName(xComponent, sGroupName);
+		}
 }
 
 //========================================================================
@@ -155,7 +171,7 @@ OGroupComp::OGroupComp(const Reference<X
 			// Indices kleiner 0 werden wie 0 behandelt
 			m_nTabIndex = Max(getINT16(m_xComponent->getPropertyValue( PROPERTY_TABINDEX )) , sal_Int16(0));
 
-		m_xComponent->getPropertyValue( PROPERTY_NAME ) >>= m_aName;
+		GetGroupName (m_xComponent, m_aName);
 	}
 }
 
@@ -217,6 +233,7 @@ OGroup::~OGroup()
 //------------------------------------------------------------------
 void OGroup::InsertComponent( const Reference<XPropertySet>& xSet )
 {
+	printf ("# OGroup::InsertComponent\n");
 	OGroupComp aNewGroupComp( xSet, m_nInsertPos );
 	sal_Int32 nPosInserted = insert_sorted(m_aCompArray, aNewGroupComp, OGroupCompLess());
 
@@ -228,6 +245,7 @@ void OGroup::InsertComponent( const Refe
 //------------------------------------------------------------------
 void OGroup::RemoveComponent( const Reference<XPropertySet>& rxElement )
 {
+	printf ("# OGroup::RemoveComponent\n");
 	sal_Int32 nGroupCompAccPos;
 	OGroupCompAcc aSearchCompAcc( rxElement, OGroupComp() );
 	if ( seek_entry(m_aCompAccArray, aSearchCompAcc, nGroupCompAccPos, OGroupCompAccLess()) )
@@ -250,11 +268,13 @@ void OGroup::RemoveComponent( const Refe
 		}
 		else
 		{
+			printf ("# OGroup::RemoveComponent: Component not in group\n");
 			DBG_ERROR( "OGroup::RemoveComponent: Component nicht in Gruppe" );
 		}
 	}
 	else
 	{
+		printf ("# OGroup::RemoveComponent: Component not in group\n");
 		DBG_ERROR( "OGroup::RemoveComponent: Component nicht in Gruppe" );
 	}
 }
@@ -282,10 +302,22 @@ Sequence< Reference<XControlModel>  > OG
 	Sequence<Reference<XControlModel> > aControlModelSeq( nLen );
 	Reference<XControlModel>* pModels = aControlModelSeq.getArray();
 
+	printf ("# OGroup::GetControlModels; Name=%s; this=%p; nLen=%i\n", CHAR_POINTER(this->GetGroupName()), this, nLen);
 	ConstOGroupCompArrIterator aGroupComps = m_aCompArray.begin();
-	for (sal_Int32 i = 0; i < nLen; ++i, ++pModels, ++aGroupComps)
+	// for (sal_Int32 i = 0; i < nLen; ++i, ++pModels, ++aGroupComps)
+	for (sal_Int32 i = 0; i < nLen; ++i, /* ++pModels, */ ++aGroupComps)
 	{
+		/*
+		if (this->GetGroupName() != aGroupComps->GetName())
+			continue;
+			*/
 		*pModels = aGroupComps->GetControlModel();
+		++pModels;
+		::rtl::OUString n, g;
+		aGroupComps->GetComponent()->getPropertyValue(PROPERTY_NAME) >>= n;
+		aGroupComps->GetComponent()->getPropertyValue(PROPERTY_GROUP_NAME) >>= g;
+		printf ("#\tName=%s; Component.Name=%s; Component.GroupName=%s; Component=%p\n", 
+				CHAR_POINTER(aGroupComps->GetName()), CHAR_POINTER(n), CHAR_POINTER(g), aGroupComps->GetComponent().get());
 	}
 	return aControlModelSeq;
 }
@@ -317,6 +349,7 @@ OGroupManager::~OGroupManager()
 //------------------------------------------------------------------
 void OGroupManager::disposing(const EventObject& evt) throw( RuntimeException )
 {
+	printf ("# OGroupManager::disposing\n");
 	Reference<XContainer>  xContainer(evt.Source, UNO_QUERY);
 	if (xContainer.get() == m_xContainer.get())
 	{
@@ -331,6 +364,9 @@ void OGroupManager::disposing(const Even
 // -----------------------------------------------------------------------------
 void OGroupManager::removeFromGroupMap(const ::rtl::OUString& _sGroupName,const Reference<XPropertySet>& _xSet)
 {
+	rtl::OUString name;
+	_xSet->getPropertyValue (PROPERTY_NAME) >>= name;
+	printf ("# removeFromGroupMap: Name=%s; GroupName=%s; Set=%p\n", CHAR_POINTER(name), CHAR_POINTER(_sGroupName), _xSet.get()); 
 	// Component aus CompGroup entfernen
 	m_pCompGroup->RemoveComponent( _xSet );
 
@@ -342,7 +378,8 @@ void OGroupManager::removeFromGroupMap(c
 		aFind->second.RemoveComponent( _xSet );
 
 		// Wenn Anzahl der Gruppenelemente == 1 ist, Gruppe deaktivieren
-		if ( aFind->second.Count() == 1 )
+		int nCount = aFind->second.Count();
+		if ( nCount == 1 || nCount == 0 )
 		{
 			OActiveGroups::iterator aActiveFind = ::std::find(
                 m_aActiveGroupMap.begin(),
@@ -353,7 +390,7 @@ void OGroupManager::removeFromGroupMap(c
             {
                 // the group is active. Deactivate it if the remaining component
                 // is *no* radio button
-                if ( !isRadioButton( aFind->second.GetObject( 0 ) ) )
+				if (nCount == 0 || !isRadioButton( aFind->second.GetObject( 0 ) ) )
 				    m_aActiveGroupMap.erase( aActiveFind );
             }
 		}
@@ -362,20 +399,37 @@ void OGroupManager::removeFromGroupMap(c
 
 	// Bei Component als PropertyChangeListener abmelden
 	_xSet->removePropertyChangeListener( PROPERTY_NAME, this );
+	_xSet->removePropertyChangeListener( PROPERTY_GROUP_NAME, this );
 	if (hasProperty(PROPERTY_TABINDEX, _xSet))
 		_xSet->removePropertyChangeListener( PROPERTY_TABINDEX, this );
 }
 //------------------------------------------------------------------
 void SAL_CALL OGroupManager::propertyChange(const PropertyChangeEvent& evt) throw ( ::com::sun::star::uno::RuntimeException)
 {
+	printf ("# OGroupManager::propertyChange\n");
 	Reference<XPropertySet>  xSet(evt.Source, UNO_QUERY);
+	rtl::OUString o, n;
+	evt.OldValue >>= o;
+	evt.NewValue >>= n;
+	printf ("# propertyChange: PropertyName=%s; OldValue=%s; NewValue=%s\n",
+			CHAR_POINTER(evt.PropertyName), CHAR_POINTER(o), CHAR_POINTER(n));
 
 	// Component aus Gruppe entfernen
-	::rtl::OUString		sGroupName;
-	if (evt.PropertyName == PROPERTY_NAME)
+	::rtl::OUString sGroupName;
+	xSet->getPropertyValue( PROPERTY_GROUP_NAME ) >>= sGroupName;
+	if (evt.PropertyName == PROPERTY_NAME && sGroupName.getLength() == 0) {
+		// No GroupName; use Name as GroupName
+		evt.OldValue >>= sGroupName;
+	}
+	else if (evt.PropertyName == PROPERTY_GROUP_NAME) {
 		evt.OldValue >>= sGroupName;
+		if (sGroupName.getLength() == 0) {
+			// No prior GroupName; fallback to Name.
+			xSet->getPropertyValue( PROPERTY_NAME ) >>= sGroupName;
+		}
+	}
 	else
-		xSet->getPropertyValue( PROPERTY_NAME ) >>= sGroupName;
+		GetGroupName (xSet, sGroupName);
 
 	removeFromGroupMap(sGroupName,xSet);
 
@@ -387,6 +441,7 @@ void SAL_CALL OGroupManager::propertyCha
 //------------------------------------------------------------------
 void SAL_CALL OGroupManager::elementInserted(const ContainerEvent& Event) throw ( ::com::sun::star::uno::RuntimeException)
 {
+	printf ("# OGroupManager::elementInserted\n");
 	Reference< XPropertySet > xProps;
 	Event.Element >>= xProps;
 	if ( xProps.is() )
@@ -396,6 +451,7 @@ void SAL_CALL OGroupManager::elementInse
 //------------------------------------------------------------------
 void SAL_CALL OGroupManager::elementRemoved(const ContainerEvent& Event) throw ( ::com::sun::star::uno::RuntimeException)
 {
+	printf ("# OGroupManager::elementRemoved\n");
 	Reference<XPropertySet> xProps;
 	Event.Element >>= xProps;
 	if ( xProps.is() )
@@ -405,6 +461,7 @@ void SAL_CALL OGroupManager::elementRemo
 //------------------------------------------------------------------
 void SAL_CALL OGroupManager::elementReplaced(const ContainerEvent& Event) throw ( ::com::sun::star::uno::RuntimeException)
 {
+	printf ("# OGroupManager::elementReplaced\n");
 	Reference<XPropertySet> xProps;
 	Event.ReplacedElement >>= xProps;
 	if ( xProps.is() )
@@ -420,12 +477,14 @@ void SAL_CALL OGroupManager::elementRepl
 //------------------------------------------------------------------
 Sequence<Reference<XControlModel> > OGroupManager::getControlModels()
 {
+	printf ("# OGroupManager::GetControlModels\n");
 	return m_pCompGroup->GetControlModels();
 }
 
 //------------------------------------------------------------------
 sal_Int32 OGroupManager::getGroupCount()
 {
+	printf ("# OGroupManager::getGroupCount=%i\n", (int) m_aActiveGroupMap.size());
 	return m_aActiveGroupMap.size();
 }
 
@@ -436,11 +495,13 @@ void OGroupManager::getGroup(sal_Int32 n
 	OGroupArr::iterator aGroupPos	= m_aActiveGroupMap[nGroup];
 	_rName							= aGroupPos->second.GetGroupName();
 	_rGroup							= aGroupPos->second.GetControlModels();
+	printf ("# OGroupManager::getGroup(%i); Name=%s\n", nGroup, CHAR_POINTER(_rName));
 }
 
 //------------------------------------------------------------------
 void OGroupManager::getGroupByName(const ::rtl::OUString& _rName, Sequence< Reference<XControlModel>  >& _rGroup)
 {
+	printf ("# OGroupManager::getGroupByName(%s)\n", CHAR_POINTER(_rName));
 	OGroupArr::iterator aFind = m_aGroupArr.find(_rName);
 	if ( aFind != m_aGroupArr.end() )
 		_rGroup = aFind->second.GetControlModels();
@@ -449,6 +510,7 @@ void OGroupManager::getGroupByName(const
 //------------------------------------------------------------------
 void OGroupManager::InsertElement( const Reference<XPropertySet>& xSet )
 {
+	printf ("# OGroupManager::InsertElement\n");
 	// Nur ControlModels
 	Reference<XControlModel>  xControl(xSet, UNO_QUERY);
 	if (!xControl.is() )
@@ -459,7 +521,7 @@ void OGroupManager::InsertElement( const
 
 	// Component in Gruppe aufnehmen
 	::rtl::OUString sGroupName;
-	xSet->getPropertyValue( PROPERTY_NAME ) >>= sGroupName;
+	GetGroupName (xSet, sGroupName);
 
 	OGroupArr::iterator aFind = m_aGroupArr.find(sGroupName);
 
@@ -495,8 +557,12 @@ void OGroupManager::InsertElement( const
 	}
 
 
+	rtl::OUString name;
+	xSet->getPropertyValue( PROPERTY_NAME ) >>= name;
+	printf ("# InsertComponent: Name=%s; GroupName=%s; Set=%p\n", CHAR_POINTER(name), CHAR_POINTER(sGroupName), xSet.get());
 	// Bei Component als PropertyChangeListener anmelden
 	xSet->addPropertyChangeListener( PROPERTY_NAME, this );
+	xSet->addPropertyChangeListener( PROPERTY_GROUP_NAME, this );
 
     // Tabindex muss nicht jeder unterstuetzen
 	if (hasProperty(PROPERTY_TABINDEX, xSet))
@@ -507,6 +573,7 @@ void OGroupManager::InsertElement( const
 //------------------------------------------------------------------
 void OGroupManager::RemoveElement( const Reference<XPropertySet>& xSet )
 {
+	printf ("# OGroupManager::RemoveElement\n");
 	// Nur ControlModels
 	Reference<XControlModel>  xControl(xSet, UNO_QUERY);
 	if (!xControl.is() )
@@ -514,7 +581,7 @@ void OGroupManager::RemoveElement( const
 
 	// Component aus Gruppe entfernen
 	::rtl::OUString		sGroupName;
-	xSet->getPropertyValue( PROPERTY_NAME ) >>= sGroupName;
+	GetGroupName (xSet, sGroupName);
 
 	removeFromGroupMap(sGroupName,xSet);
 }
Index: forms/source/component/RadioButton.cxx
===================================================================
RCS file: /cvs/gsl/forms/source/component/RadioButton.cxx,v
retrieving revision 1.21
diff -u -p -r1.21 RadioButton.cxx
--- forms/source/component/RadioButton.cxx	9 Mar 2007 13:31:25 -0000	1.21
+++ forms/source/component/RadioButton.cxx	5 Feb 2008 12:49:27 -0000
@@ -65,6 +65,9 @@
 #include <com/sun/star/awt/XVclWindowPeer.hpp>
 #endif
 
+#include <stdio.h>
+	#define CHAR_POINTER(THE_OUSTRING) ::rtl::OUStringToOString (THE_OUSTRING, RTL_TEXTENCODING_UTF8).pData->buffer
+
 //.........................................................................
 namespace frm
 {
@@ -226,26 +229,59 @@ void ORadioButtonModel::SetSiblingPropsT
 }
 
 //------------------------------------------------------------------------------
-void ORadioButtonModel::setFastPropertyValue_NoBroadcast(sal_Int32 nHandle, const Any& rValue) throw (Exception)
+void ORadioButtonModel::getFastPropertyValue(Any& rValue, sal_Int32 nHandle) const
 {
-	OReferenceValueComponent::setFastPropertyValue_NoBroadcast( nHandle, rValue );
+	switch (nHandle)
+	{
+		case PROPERTY_ID_GROUP_NAME:
+			rValue <<= m_sGroupName;
+			break;
+		default:
+			OReferenceValueComponent::getFastPropertyValue(rValue, nHandle);
+      break;
+	}
+}
 
-	// if the label control changed ...
-	if (nHandle == PROPERTY_ID_CONTROLLABEL)
-	{	// ... forward this to our siblings
-		SetSiblingPropsTo(PROPERTY_CONTROLLABEL, rValue);
+sal_Bool ORadioButtonModel::convertFastPropertyValue(
+                Any& _rConvertedValue, Any& _rOldValue,
+                sal_Int32 _nHandle,
+                const Any& _rValue)
+        throw (com::sun::star::lang::IllegalArgumentException)
+{
+	sal_Bool bModified(sal_False);
+	switch (_nHandle)
+	{
+    case PROPERTY_ID_GROUP_NAME:
+			bModified = tryPropertyValue(_rConvertedValue, _rOldValue, _rValue, m_sGroupName);
+      break;
+		default:
+			bModified = OReferenceValueComponent::convertFastPropertyValue(_rConvertedValue, _rOldValue, _nHandle, _rValue);
+      break;
 	}
+	return bModified;
+}
 
+void ORadioButtonModel::setFastPropertyValue_NoBroadcast(sal_Int32 nHandle, const Any& rValue) throw (Exception)
+{
+	::rtl::OUString s;
+	rValue >>= s;
+	printf ("# setFastPropertyValue_NoBroadcast: nHandle=%i; rValue=%s\n", nHandle, CHAR_POINTER(s));
+	if (nHandle != PROPERTY_ID_GROUP_NAME)
+		OReferenceValueComponent::setFastPropertyValue_NoBroadcast( nHandle, rValue );
+	switch (nHandle) {
+	case PROPERTY_ID_CONTROLLABEL:
+		SetSiblingPropsTo(PROPERTY_CONTROLLABEL, rValue);
+		break;
 	// wenn sich die ControlSource-Eigenschaft geaendert hat ...
-	if (nHandle == PROPERTY_ID_CONTROLSOURCE)
-	{	// ... muss ich allen meinen Siblings, die in der selben RadioButton-Gruppe sind wie ich, auch die
+	case PROPERTY_ID_CONTROLSOURCE:
+		// ... muss ich allen meinen Siblings, die in der selben RadioButton-Gruppe sind wie ich, auch die
 		// neue ControlSource mitgeben
 		SetSiblingPropsTo(PROPERTY_CONTROLSOURCE, rValue);
-	}
-
+		break;
 	// die andere Richtung : wenn sich mein Name aendert ...
-	if (nHandle == PROPERTY_ID_NAME)
-	{
+	case PROPERTY_ID_GROUP_NAME:
+		rValue >>= m_sGroupName;
+	case PROPERTY_ID_NAME: {
 		// ... muss ich testen, ob ich Siblings mit dem selben Namen habe, damit ich deren ControlSource uebernehmen kann
 		Reference<XIndexAccess> xIndexAccess(getParent(), UNO_QUERY);
 		if (xIndexAccess.is())
@@ -271,7 +307,7 @@ void ORadioButtonModel::setFastPropertyV
 					// nur Radio-Buttons
 					continue;
 
-				xSiblingProperties->getPropertyValue(PROPERTY_NAME) >>= sName;
+				xSiblingProperties->getPropertyValue(nHandle == PROPERTY_ID_NAME ? PROPERTY_NAME : PROPERTY_GROUP_NAME) >>= sName;
 				// Control, das zur gleichen Gruppe gehoert ?
 				if (rValue == sName)
 				{
@@ -280,10 +316,9 @@ void ORadioButtonModel::setFastPropertyV
 				}
 			}
 		}
+		break;
 	}
-
-	if (nHandle == PROPERTY_ID_DEFAULTCHECKED)
-	{
+	case PROPERTY_ID_DEFAULTCHECKED: {
 		sal_Int16 nValue;
 		rValue >>= nValue;
 		if (1 == nValue)
@@ -294,14 +329,20 @@ void ORadioButtonModel::setFastPropertyV
 			aZero <<= nValue;
 			SetSiblingPropsTo(PROPERTY_DEFAULTCHECKED, aZero);
 		}
+		break;
+	}
+	default:  
+		// OReferenceValueComponent::setFastPropertyValue_NoBroadcast( nHandle, rValue );
+		break;
 	}
 }
 
 //------------------------------------------------------------------------------
 void ORadioButtonModel::describeFixedProperties( Sequence< Property >& _rProps ) const
 {
-	BEGIN_DESCRIBE_PROPERTIES( 1, OReferenceValueComponent )
+	BEGIN_DESCRIBE_PROPERTIES( 2, OReferenceValueComponent )
 		DECL_PROP1(TABINDEX,			sal_Int16,					BOUND);
+		DECL_PROP1( GROUP_NAME,   ::rtl::OUString,    BOUND);
 	END_DESCRIBE_PROPERTIES();
 }
 
Index: forms/source/component/RadioButton.hxx
===================================================================
RCS file: /cvs/gsl/forms/source/component/RadioButton.hxx,v
retrieving revision 1.11
diff -u -p -r1.11 RadioButton.hxx
--- forms/source/component/RadioButton.hxx	9 Mar 2007 13:31:41 -0000	1.11
+++ forms/source/component/RadioButton.hxx	5 Feb 2008 12:49:28 -0000
@@ -49,6 +49,9 @@ namespace frm
 //==================================================================
 class ORadioButtonModel		:public OReferenceValueComponent
 {
+protected:
+	::rtl::OUString m_sGroupName;
+
 public:
 	DECLARE_DEFAULT_LEAF_XTOR( ORadioButtonModel );
 
@@ -57,6 +60,10 @@ public:
 	virtual StringSequence SAL_CALL	getSupportedServiceNames() throw(::com::sun::star::uno::RuntimeException);
 
 	// OPropertySetHelper
+	virtual void SAL_CALL getFastPropertyValue(::com::sun::star::uno::Any& rValue, sal_Int32 nHandle) const;
+	virtual sal_Bool SAL_CALL convertFastPropertyValue(
+				::com::sun::star::uno::Any& _rConvertedValue, ::com::sun::star::uno::Any& _rOldValue, sal_Int32 _nHandle, const ::com::sun::star::uno::Any& _rValue )
+				throw (::com::sun::star::lang::IllegalArgumentException);
 	virtual void SAL_CALL setFastPropertyValue_NoBroadcast( sal_Int32 nHandle, const ::com::sun::star::uno::Any& rValue )
 				throw (::com::sun::star::uno::Exception);
 
Index: forms/source/inc/frm_strings.hxx
===================================================================
RCS file: /cvs/gsl/forms/source/inc/frm_strings.hxx,v
retrieving revision 1.15
diff -u -p -r1.15 frm_strings.hxx
--- forms/source/inc/frm_strings.hxx	1 Nov 2007 14:57:09 -0000	1.15
+++ forms/source/inc/frm_strings.hxx	5 Feb 2008 12:49:28 -0000
@@ -109,6 +109,7 @@ namespace frm
     FORMS_CONSTASCII_STRING( PROPERTY_TABINDEX,                 "TabIndex" );
     FORMS_CONSTASCII_STRING( PROPERTY_TAG,                      "Tag" );
     FORMS_CONSTASCII_STRING( PROPERTY_NAME,                     "Name" );
+    FORMS_CONSTASCII_STRING( PROPERTY_GROUP_NAME,               "GroupName" );
     FORMS_CONSTASCII_STRING( PROPERTY_CLASSID,                  "ClassId" );
     FORMS_CONSTASCII_STRING( PROPERTY_FETCHSIZE,                "FetchSize" );
     FORMS_CONSTASCII_STRING( PROPERTY_VALUE,                    "Value" );
Index: forms/source/inc/property.hrc
===================================================================
RCS file: /cvs/gsl/forms/source/inc/property.hrc,v
retrieving revision 1.20
diff -u -p -r1.20 property.hrc
--- forms/source/inc/property.hrc	31 Jan 2006 18:36:51 -0000	1.20
+++ forms/source/inc/property.hrc	5 Feb 2008 12:49:28 -0000
@@ -65,7 +65,7 @@ namespace frm
 #define PROPERTY_ID_ALLOWEDITS          (PROPERTY_ID_START + 16)
 #define PROPERTY_ID_ALLOWDELETIONS      (PROPERTY_ID_START + 17)
 #define PROPERTY_ID_NATIVE_LOOK         (PROPERTY_ID_START + 18)
-    // free
+#define PROPERTY_ID_GROUP_NAME          (PROPERTY_ID_START + 19)
     // free
     // free
     // free
Index: extensions/inc/extensio.hrc
===================================================================
RCS file: /cvs/util/extensions/inc/extensio.hrc,v
retrieving revision 1.33
diff -u -p -r1.33 extensio.hrc
--- extensions/inc/extensio.hrc	27 Nov 2007 11:51:34 -0000	1.33
+++ extensions/inc/extensio.hrc	5 Feb 2008 12:49:28 -0000
@@ -162,7 +162,7 @@
 
 //-----------------------------------------------------------------------
     // FREE
-    // FREE
+#define HID_PROP_GROUP_NAME                     (HID_FORMS_START +   1)
 #define HID_PROP_GROUPBOX						(HID_FORMS_START +   2)
 #define HID_PROP_CONTROLSOURCE					(HID_FORMS_START +   3)
 #define HID_PROP_NAME							(HID_FORMS_START +   4)
Index: extensions/source/propctrlr/formmetadata.cxx
===================================================================
RCS file: /cvs/util/extensions/source/propctrlr/formmetadata.cxx,v
retrieving revision 1.47.18.1
diff -u -p -r1.47.18.1 formmetadata.cxx
--- extensions/source/propctrlr/formmetadata.cxx	11 Jan 2008 08:23:04 -0000	1.47.18.1
+++ extensions/source/propctrlr/formmetadata.cxx	5 Feb 2008 12:49:28 -0000
@@ -154,6 +154,7 @@ namespace pcr
         DEF_INFO_?( propname and id,   resoure id,         help id,           flags ),
         */
         DEF_INFO_3( NAME,              NAME,               NAME,              FORM_VISIBLE, DIALOG_VISIBLE, COMPOSEABLE ),
+        DEF_INFO_3( GROUP_NAME,        GROUP_NAME,         GROUP_NAME,        FORM_VISIBLE, DIALOG_VISIBLE, COMPOSEABLE ),
         DEF_INFO_2( TITLE,             TITLE,              TITLE,             FORM_VISIBLE, DIALOG_VISIBLE ),
         DEF_INFO_3( LABEL,             LABEL,              LABEL,             FORM_VISIBLE, DIALOG_VISIBLE, COMPOSEABLE ),
         DEF_INFO_2( CONTROLLABEL,      LABELCONTROL,       CONTROLLABEL,      FORM_VISIBLE, COMPOSEABLE ),
Index: extensions/source/propctrlr/formmetadata.hxx
===================================================================
RCS file: /cvs/util/extensions/source/propctrlr/formmetadata.hxx,v
retrieving revision 1.34
diff -u -p -r1.34 formmetadata.hxx
--- extensions/source/propctrlr/formmetadata.hxx	27 Nov 2007 11:52:15 -0000	1.34
+++ extensions/source/propctrlr/formmetadata.hxx	5 Feb 2008 12:49:28 -0000
@@ -178,6 +178,7 @@ namespace pcr
 	#define PROPERTY_ID_ALLOWADDITIONS		 20
 	#define PROPERTY_ID_ALLOWEDITS			 21
 	#define PROPERTY_ID_ALLOWDELETIONS		 22
+	#define PROPERTY_ID_GROUP_NAME    		 23
 	#define PROPERTY_ID_NAVIGATION			 24
 	#define PROPERTY_ID_CYCLE				 25
 	#define PROPERTY_ID_HIDDEN_VALUE		 26
Index: extensions/source/propctrlr/formres.src
===================================================================
RCS file: /cvs/util/extensions/source/propctrlr/formres.src,v
retrieving revision 1.81
diff -u -p -r1.81 formres.src
--- extensions/source/propctrlr/formres.src	27 Nov 2007 11:52:35 -0000	1.81
+++ extensions/source/propctrlr/formres.src	5 Feb 2008 12:49:29 -0000
@@ -235,6 +235,10 @@ String RID_STR_NAME
 {
 	Text [ en-US ] = "Name" ;
 };
+String RID_STR_GROUP_NAME
+{
+	Text [ en-US ] = "Group Name" ;
+};
 String RID_STR_TABINDEX
 {
 	Text [ en-US ] = "Tab order" ;
Index: extensions/source/propctrlr/formresid.hrc
===================================================================
RCS file: /cvs/util/extensions/source/propctrlr/formresid.hrc,v
retrieving revision 1.36
diff -u -p -r1.36 formresid.hrc
--- extensions/source/propctrlr/formresid.hrc	27 Nov 2007 11:52:56 -0000	1.36
+++ extensions/source/propctrlr/formresid.hrc	5 Feb 2008 12:49:29 -0000
@@ -152,7 +152,7 @@
 #define RID_STR_TAG							( RID_FORMBROWSER_START + 116 )
 #define RID_STR_HELPTEXT					( RID_FORMBROWSER_START + 117 )
 #define RID_STR_HELPURL						( RID_FORMBROWSER_START + 118 )
-    // FREE
+#define RID_STR_GROUP_NAME                  ( RID_FORMBROWSER_START + 119 )
 #define RID_STR_UNCHECKEDREFVALUE           ( RID_FORMBROWSER_START + 120 )
 #define RID_STR_CURSOR_TYPE					( RID_FORMBROWSER_START + 121 )
     // FREE
Index: extensions/source/propctrlr/formstrings.hxx
===================================================================
RCS file: /cvs/util/extensions/source/propctrlr/formstrings.hxx,v
retrieving revision 1.38
diff -u -p -r1.38 formstrings.hxx
--- extensions/source/propctrlr/formstrings.hxx	27 Nov 2007 11:53:16 -0000	1.38
+++ extensions/source/propctrlr/formstrings.hxx	5 Feb 2008 12:49:29 -0000
@@ -57,6 +57,7 @@ namespace pcr
 	PCR_CONSTASCII_STRING( PROPERTY_TABINDEX,				"TabIndex");
 	PCR_CONSTASCII_STRING( PROPERTY_TAG,					"Tag");
 	PCR_CONSTASCII_STRING( PROPERTY_NAME,					"Name");
+	PCR_CONSTASCII_STRING( PROPERTY_GROUP_NAME,   "GroupName");
 	PCR_CONSTASCII_STRING( PROPERTY_VALUE,					"Value");
 	PCR_CONSTASCII_STRING( PROPERTY_TEXT,					"Text");
 	PCR_CONSTASCII_STRING( PROPERTY_NAVIGATION,				"NavigationBarMode");

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to