summaryrefslogtreecommitdiff
path: root/svx/source/form/fmundo.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'svx/source/form/fmundo.cxx')
-rw-r--r--svx/source/form/fmundo.cxx71
1 files changed, 43 insertions, 28 deletions
diff --git a/svx/source/form/fmundo.cxx b/svx/source/form/fmundo.cxx
index 6f1afa5f571a..42bc91c53a15 100644
--- a/svx/source/form/fmundo.cxx
+++ b/svx/source/form/fmundo.cxx
@@ -306,47 +306,59 @@ void FmXUndoEnvironment::Inserted(FmFormObj* pObj)
Reference< XFormComponent > xContent(xModel, UNO_QUERY);
if (xContent.is() && pObj->GetPage())
{
- // Komponente gehoert noch keiner Form an
+ // if the component doesn't belong to a form, yet, find one to insert into
if (!xContent->getParent().is())
{
- // Einfuegen in den Parent falls noetig
- Reference< XIndexContainer > xParent = pObj->GetParent();
- // Suchen des Form in der aktuellen Page
- Reference< XIndexContainer > xForm;
- Reference< XInterface > xIface(xParent, UNO_QUERY);
- Reference< XIndexAccess > xForms(((FmFormPage*)pObj->GetPage())->GetForms(), UNO_QUERY);;
-
- if (searchElement(xForms, xIface))
- xForm = xParent;
- else
+ try
{
- Reference< XForm > xTemp = ((FmFormPage*)pObj->GetPage())->GetImpl()->placeInFormComponentHierarchy(xContent);
- xForm = Reference< XIndexContainer > (xTemp, UNO_QUERY);
- }
+ Reference< XIndexContainer > xObjectParent = pObj->GetOriginalParent();
- // Position des Elements
- sal_Int32 nPos = xForm->getCount();
- if ((XIndexContainer*)xForm.get() == (XIndexContainer*)xParent.get())
- {
- if (nPos > pObj->GetPos())
- nPos = xForm->getCount();
- }
+ FmFormPage& rPage = dynamic_cast< FmFormPage& >( *pObj->GetPage() );
+ Reference< XIndexAccess > xForms( rPage.GetForms(), UNO_QUERY_THROW );
+
+ Reference< XIndexContainer > xNewParent;
+ Reference< XForm > xForm;
+ sal_Int32 nPos = -1;
+ if ( searchElement( xForms, xObjectParent ) )
+ {
+ // the form which was the parent of the object when it was removed is still
+ // part of the form component hierachy of the current page
+ xNewParent = xObjectParent;
+ xForm.set( xNewParent, UNO_QUERY_THROW );
+ nPos = ::std::min( pObj->GetOriginalIndex(), xNewParent->getCount() );
+ }
+ else
+ {
+ xForm.set( rPage.GetImpl()->findPlaceInFormComponentHierarchy( xContent ), UNO_SET_THROW );
+ xNewParent.set( xForm, UNO_QUERY_THROW );
+ nPos = xNewParent->getCount();
+ }
- xForm->insertByIndex(nPos, makeAny(xContent));
+ rPage.GetImpl()->setUniqueName( xContent, xForm );
+ xNewParent->insertByIndex( nPos, makeAny( xContent ) );
- Reference< XEventAttacherManager > xManager(xForm, UNO_QUERY);
- if (xManager.is())
- xManager->registerScriptEvents(nPos, pObj->GetEvents());
+ Reference< XEventAttacherManager > xManager( xNewParent, UNO_QUERY_THROW );
+ xManager->registerScriptEvents( nPos, pObj->GetOriginalEvents() );
+ }
+ catch( const Exception& )
+ {
+ DBG_UNHANDLED_EXCEPTION();
+ }
}
// FormObject zuruecksetzen
- pObj->SetObjEnv(Reference< XIndexContainer > ());
+ pObj->ClearObjEnv();
}
}
//------------------------------------------------------------------
void FmXUndoEnvironment::Removed(SdrObject* pObj)
{
+ if ( pObj->IsVirtualObj() )
+ // for virtual objects, we've already been notified of the removal of the master
+ // object, which is sufficient here
+ return;
+
if (pObj->GetObjInventor() == FmFormInventor)
{
FmFormObj* pFormObj = PTR_CAST(FmFormObj, pObj);
@@ -398,6 +410,7 @@ void FmXUndoEnvironment::Removed(FmFormObj* pObj)
}
catch(Exception&)
{
+ DBG_UNHANDLED_EXCEPTION();
}
}
@@ -492,8 +505,9 @@ void SAL_CALL FmXUndoEnvironment::propertyChange(const PropertyChangeEvent& evt)
Any aCurrentControlSource = xSet->getPropertyValue(FM_PROP_CONTROLSOURCE);
aNewEntry.bHasEmptyControlSource = !aCurrentControlSource.hasValue() || (::comphelper::getString(aCurrentControlSource).getLength() == 0);
}
- catch(Exception&)
+ catch(const Exception&)
{
+ DBG_UNHANDLED_EXCEPTION();
}
}
aSetPos = pCache->insert(PropertySetInfoCache::value_type(xSet,aNewEntry)).first;
@@ -532,8 +546,9 @@ void SAL_CALL FmXUndoEnvironment::propertyChange(const PropertyChangeEvent& evt)
aNewEntry.bIsValueProperty = (sControlSourceProperty.equals(evt.PropertyName));
}
}
- catch(Exception&)
+ catch(const Exception&)
{
+ DBG_UNHANDLED_EXCEPTION();
}
// insert the new entry