diff options
Diffstat (limited to 'chart2/source/controller')
-rw-r--r-- | chart2/source/controller/main/SelectionHelper.cxx | 259 | ||||
-rw-r--r-- | chart2/source/controller/main/SelectionHelper.hxx | 13 |
2 files changed, 92 insertions, 180 deletions
diff --git a/chart2/source/controller/main/SelectionHelper.cxx b/chart2/source/controller/main/SelectionHelper.cxx index 50494871cc7f..3cd5ec816ba2 100644 --- a/chart2/source/controller/main/SelectionHelper.cxx +++ b/chart2/source/controller/main/SelectionHelper.cxx @@ -83,39 +83,29 @@ void impl_selectObject( SdrObject* pObjectToSelect, DrawViewWrapper& rDrawViewWr bool Selection::hasSelection() { - return m_aSelectedObjectCID.getLength() || m_xSelectAdditionalShape.is(); + return m_aSelectedOID.isValid(); } rtl::OUString Selection::getSelectedCID() { - return m_aSelectedObjectCID; + return m_aSelectedOID.getObjectCID(); } uno::Reference< drawing::XShape > Selection::getSelectedAdditionalShape() { - return m_xSelectAdditionalShape; + return m_aSelectedOID.getAdditionalShape(); } ObjectIdentifier Selection::getSelectedOID() const { - ObjectIdentifier aReturn; - if ( m_aSelectedObjectCID.getLength() > 0 ) - { - aReturn = ObjectIdentifier( m_aSelectedObjectCID ); - } - else if ( m_xSelectAdditionalShape.is() ) - { - aReturn = ObjectIdentifier( m_xSelectAdditionalShape ); - } - return aReturn; + return m_aSelectedOID; } bool Selection::setSelection( const ::rtl::OUString& rCID ) { - if( !rCID.equals( m_aSelectedObjectCID ) ) + if ( !rCID.equals( m_aSelectedOID.getObjectCID() ) ) { - m_aSelectedObjectCID = rCID; - m_xSelectAdditionalShape.set(0); + m_aSelectedOID = ObjectIdentifier( rCID ); return true; } return false; @@ -123,10 +113,10 @@ bool Selection::setSelection( const ::rtl::OUString& rCID ) bool Selection::setSelection( const uno::Reference< drawing::XShape >& xShape ) { - if( !(m_xSelectAdditionalShape==xShape) ) + if ( !( xShape == m_aSelectedOID.getAdditionalShape() ) ) { clearSelection(); - m_xSelectAdditionalShape = xShape; + m_aSelectedOID = ObjectIdentifier( xShape ); return true; } return false; @@ -134,18 +124,18 @@ bool Selection::setSelection( const uno::Reference< drawing::XShape >& xShape ) void Selection::clearSelection() { - m_aSelectedObjectCID = m_aSelectedObjectCID_beforeMouseDown - = m_aSelectedObjectCID_selectOnlyIfNoDoubleClickIsFollowing = rtl::OUString(); - m_xSelectAdditionalShape.set(0); + m_aSelectedOID = ObjectIdentifier(); + m_aSelectedOID_beforeMouseDown = ObjectIdentifier(); + m_aSelectedOID_selectOnlyIfNoDoubleClickIsFollowing = ObjectIdentifier(); } bool Selection::maybeSwitchSelectionAfterSingleClickWasEnsured() { - if( m_aSelectedObjectCID_selectOnlyIfNoDoubleClickIsFollowing.getLength() - && !m_aSelectedObjectCID_selectOnlyIfNoDoubleClickIsFollowing.equals(m_aSelectedObjectCID) ) + if ( m_aSelectedOID_selectOnlyIfNoDoubleClickIsFollowing.isValid() + && m_aSelectedOID_selectOnlyIfNoDoubleClickIsFollowing != m_aSelectedOID ) { - m_aSelectedObjectCID = m_aSelectedObjectCID_selectOnlyIfNoDoubleClickIsFollowing; - m_aSelectedObjectCID_selectOnlyIfNoDoubleClickIsFollowing = C2U(""); + m_aSelectedOID = m_aSelectedOID_selectOnlyIfNoDoubleClickIsFollowing; + m_aSelectedOID_selectOnlyIfNoDoubleClickIsFollowing = ObjectIdentifier(); return true; } return false; @@ -153,18 +143,20 @@ bool Selection::maybeSwitchSelectionAfterSingleClickWasEnsured() void Selection::resetPossibleSelectionAfterSingleClickWasEnsured() { - if( m_aSelectedObjectCID_selectOnlyIfNoDoubleClickIsFollowing.getLength() ) - m_aSelectedObjectCID_selectOnlyIfNoDoubleClickIsFollowing = C2U(""); + if ( m_aSelectedOID_selectOnlyIfNoDoubleClickIsFollowing.isValid() ) + { + m_aSelectedOID_selectOnlyIfNoDoubleClickIsFollowing = ObjectIdentifier(); + } } void Selection::remindSelectionBeforeMouseDown() { - m_aSelectedObjectCID_beforeMouseDown = m_aSelectedObjectCID; + m_aSelectedOID_beforeMouseDown = m_aSelectedOID; } bool Selection::isSelectionDifferentFromBeforeMouseDown() { - return !ObjectIdentifier::areIdenticalObjects( m_aSelectedObjectCID, m_aSelectedObjectCID_beforeMouseDown ); + return ( m_aSelectedOID != m_aSelectedOID_beforeMouseDown ); } void Selection::applySelection( DrawViewWrapper* pDrawViewWrapper ) @@ -176,10 +168,14 @@ void Selection::applySelection( DrawViewWrapper* pDrawViewWrapper ) pDrawViewWrapper->UnmarkAll(); } SdrObject* pObjectToSelect = 0; - if( m_aSelectedObjectCID.getLength() ) - pObjectToSelect = pDrawViewWrapper->getNamedSdrObject( m_aSelectedObjectCID ); - else if( m_xSelectAdditionalShape.is() ) - pObjectToSelect = DrawViewWrapper::getSdrObject( m_xSelectAdditionalShape ); + if ( m_aSelectedOID.isAutoGeneratedObject() ) + { + pObjectToSelect = pDrawViewWrapper->getNamedSdrObject( m_aSelectedOID.getObjectCID() ); + } + else if( m_aSelectedOID.isAdditionalShape() ) + { + pObjectToSelect = DrawViewWrapper::getSdrObject( m_aSelectedOID.getAdditionalShape() ); + } impl_selectObject( pObjectToSelect, *pDrawViewWrapper ); } @@ -193,7 +189,7 @@ void Selection::adaptSelectionToNewPos( const Point& rMousePos, DrawViewWrapper* //do not toggel multiclick selection if right clicked on the selected object or waiting for double click bool bAllowMultiClickSelectionChange = !bIsRightMouse && !bWaitingForDoubleClick; - const rtl::OUString aNameOfLastSelectedObject( m_aSelectedObjectCID ); + ObjectIdentifier aLastSelectedObject( m_aSelectedOID ); ::vos::OGuard aSolarGuard( Application::GetSolarMutex()); @@ -202,86 +198,89 @@ void Selection::adaptSelectionToNewPos( const Point& rMousePos, DrawViewWrapper* //get object to select: SdrObject* pNewObj = 0; { - m_aSelectedObjectCID_selectOnlyIfNoDoubleClickIsFollowing = C2U(""); - m_xSelectAdditionalShape.set(0); + m_aSelectedOID_selectOnlyIfNoDoubleClickIsFollowing = ObjectIdentifier(); //the search for the object to select starts with the hit object deepest in the grouping hierarchy (a leaf in the tree) //further we travel along the grouping hierarchy from child to parent pNewObj = pDrawViewWrapper->getHitObject(rMousePos); - m_aSelectedObjectCID = lcl_getObjectName( pNewObj );//name of pNewObj - rtl::OUString aTestFirstHit = m_aSelectedObjectCID; + m_aSelectedOID = ObjectIdentifier( lcl_getObjectName( pNewObj ) );//name of pNewObj //ignore handle only objects for hit test - while( pNewObj && m_aSelectedObjectCID.match(C2U("HandlesOnly")) ) + while( pNewObj && m_aSelectedOID.getObjectCID().match( C2U( "HandlesOnly" ) ) ) { pNewObj->SetMarkProtect(true); pNewObj = pDrawViewWrapper->getHitObject(rMousePos); - m_aSelectedObjectCID = lcl_getObjectName( pNewObj ); + m_aSelectedOID = ObjectIdentifier( lcl_getObjectName( pNewObj ) ); } //accept only named objects while searching for the object to select - //this call may change m_aSelectedObjectCID - if( SelectionHelper::findNamedParent( pNewObj, m_aSelectedObjectCID, true ) ) + //this call may change m_aSelectedOID + if ( SelectionHelper::findNamedParent( pNewObj, m_aSelectedOID, true ) ) { //if the so far found object is a multi click object further steps are necessary - while( ObjectIdentifier::isMultiClickObject( m_aSelectedObjectCID ) ) + while( ObjectIdentifier::isMultiClickObject( m_aSelectedOID.getObjectCID() ) ) { - bool bSameObjectAsLastSelected = ObjectIdentifier::areIdenticalObjects( aNameOfLastSelectedObject, m_aSelectedObjectCID ); + bool bSameObjectAsLastSelected = ( aLastSelectedObject == m_aSelectedOID ); if( bSameObjectAsLastSelected ) { //if the same child is clicked again don't go up further break; } - if( ObjectIdentifier::areSiblings(aNameOfLastSelectedObject,m_aSelectedObjectCID) ) + if ( ObjectIdentifier::areSiblings( aLastSelectedObject.getObjectCID(), m_aSelectedOID.getObjectCID() ) ) { //if a sibling of the last selected object is clicked don't go up further break; } SdrObject* pLastChild = pNewObj; - rtl::OUString aLastChildName = m_aSelectedObjectCID; - if(!SelectionHelper::findNamedParent( pNewObj, m_aSelectedObjectCID, false )) + ObjectIdentifier aLastChild = m_aSelectedOID; + if ( !SelectionHelper::findNamedParent( pNewObj, m_aSelectedOID, false ) ) { //take the one found so far break; } //if the last selected object is found don't go up further //but take the last child if selection change is allowed - if( ObjectIdentifier::areIdenticalObjects( aNameOfLastSelectedObject, m_aSelectedObjectCID ) ) + if ( aLastSelectedObject == m_aSelectedOID ) { if( bAllowMultiClickSelectionChange ) { pNewObj = pLastChild; - m_aSelectedObjectCID = aLastChildName; + m_aSelectedOID = aLastChild; } else - m_aSelectedObjectCID_selectOnlyIfNoDoubleClickIsFollowing = aLastChildName; + m_aSelectedOID_selectOnlyIfNoDoubleClickIsFollowing = aLastChild; break; } } - DBG_ASSERT(pNewObj && m_aSelectedObjectCID.getLength(),"somehow lost selected object"); + DBG_ASSERT( pNewObj && m_aSelectedOID.isValid(), "somehow lost selected object" ); } else { //maybe an additional shape was hit - m_aSelectedObjectCID = rtl::OUString(); - if( pNewObj ) + if ( pNewObj ) { - m_xSelectAdditionalShape = uno::Reference< drawing::XShape >( pNewObj->getUnoShape(), uno::UNO_QUERY); + m_aSelectedOID = ObjectIdentifier( uno::Reference< drawing::XShape >( pNewObj->getUnoShape(), uno::UNO_QUERY ) ); + } + else + { + m_aSelectedOID = ObjectIdentifier(); } } - if(!m_xSelectAdditionalShape.is()) + if ( !m_aSelectedOID.isAdditionalShape() ) { rtl::OUString aPageCID( ObjectIdentifier::createClassifiedIdentifier( OBJECTTYPE_PAGE, rtl::OUString() ) );//@todo read CID from model - if( !m_aSelectedObjectCID.getLength() ) - m_aSelectedObjectCID = aPageCID; + if ( !m_aSelectedOID.isAutoGeneratedObject() ) + { + m_aSelectedOID = ObjectIdentifier( aPageCID ); + } //check wether the diagram was hit but not selected (e.g. because it has no filling): rtl::OUString aWallCID( ObjectIdentifier::createClassifiedIdentifier( OBJECTTYPE_DIAGRAM_WALL, rtl::OUString() ) );//@todo read CID from model - if( m_aSelectedObjectCID.equals( aPageCID ) || m_aSelectedObjectCID.equals( aWallCID ) || !m_aSelectedObjectCID.getLength() ) + if ( m_aSelectedOID.getObjectCID().equals( aPageCID ) || m_aSelectedOID.getObjectCID().equals( aWallCID ) || !m_aSelectedOID.isAutoGeneratedObject() ) { rtl::OUString aDiagramCID = ObjectIdentifier::createClassifiedIdentifier( OBJECTTYPE_DIAGRAM, rtl::OUString::valueOf( sal_Int32(0) ) ); //todo: if more than one diagram is available in future do chack the list of all diagrams here @@ -290,7 +289,7 @@ void Selection::adaptSelectionToNewPos( const Point& rMousePos, DrawViewWrapper* { if( pDrawViewWrapper->IsObjectHit( pDiagram, rMousePos ) ) { - m_aSelectedObjectCID = aDiagramCID; + m_aSelectedOID = ObjectIdentifier( aDiagramCID ); pNewObj = pDiagram; } } @@ -298,24 +297,21 @@ void Selection::adaptSelectionToNewPos( const Point& rMousePos, DrawViewWrapper* } } - if( bIsRightMouse && m_aSelectedObjectCID_selectOnlyIfNoDoubleClickIsFollowing.getLength() ) - m_aSelectedObjectCID_selectOnlyIfNoDoubleClickIsFollowing = C2U(""); + if ( bIsRightMouse && m_aSelectedOID_selectOnlyIfNoDoubleClickIsFollowing.isValid() ) + { + m_aSelectedOID_selectOnlyIfNoDoubleClickIsFollowing = ObjectIdentifier(); + } } } bool Selection::isResizeableObjectSelected() { - // #i12587# support for shapes in chart - if ( m_xSelectAdditionalShape.is() ) - { - return true; - } - - ObjectType eObjectType = ObjectIdentifier::getObjectType( m_aSelectedObjectCID ); + ObjectType eObjectType = m_aSelectedOID.getObjectType(); switch( eObjectType ) { case OBJECTTYPE_DIAGRAM: case OBJECTTYPE_DIAGRAM_WALL: + case OBJECTTYPE_SHAPE: return true; default: return false; @@ -325,19 +321,21 @@ bool Selection::isResizeableObjectSelected() bool Selection::isRotateableObjectSelected( const uno::Reference< frame::XModel >& xChartModel ) { - return SelectionHelper::isRotateableObject( m_aSelectedObjectCID, xChartModel ); + return SelectionHelper::isRotateableObject( m_aSelectedOID.getObjectCID(), xChartModel ); } bool Selection::isDragableObjectSelected() { - if( m_aSelectedObjectCID.getLength() ) - return ObjectIdentifier::isDragableObject( m_aSelectedObjectCID ); - return m_xSelectAdditionalShape.is(); + if( m_aSelectedOID.isAutoGeneratedObject() ) + { + return ObjectIdentifier::isDragableObject( m_aSelectedOID.getObjectCID() ); + } + return m_aSelectedOID.isAdditionalShape(); } bool Selection::isAdditionalShapeSelected() const { - return m_xSelectAdditionalShape.is(); + return m_aSelectedOID.isAdditionalShape(); } //----------------------------------------------------------------------------- @@ -379,6 +377,20 @@ bool SelectionHelper::findNamedParent( SdrObject*& pInOutObject } //static +bool SelectionHelper::findNamedParent( SdrObject*& pInOutObject + , ObjectIdentifier& rOutObject + , bool bGivenObjectMayBeResult ) +{ + rtl::OUString aName; + if ( findNamedParent( pInOutObject, aName, bGivenObjectMayBeResult ) ) + { + rOutObject = ObjectIdentifier( aName ); + return true; + } + return false; +} + +//static bool SelectionHelper::isDragableObjectHitTwice( const Point& rMPos , const rtl::OUString& rNameOfSelectedObject , const DrawViewWrapper& rDrawViewWrapper ) @@ -394,107 +406,6 @@ bool SelectionHelper::isDragableObjectHitTwice( const Point& rMPos return true; } -/* -rtl::OUString lcl_getObjectCIDToSelect( const Point& rMPos - , const rtl::OUString& rNameOfLastSelectedObject - , DrawViewWrapper& rDrawViewWrapper - , bool bAllowMultiClickSelectionChange - , rtl::OUString& rObjectToSelectIfNoDoubleClickIsFollowing //out parameter only - ) -{ - rtl::OUString aRet; - - ::vos::OGuard aSolarGuard( Application::GetSolarMutex()); - - //bAllowMultiClickSelectionChange==true -> a second click on the same object can lead to a changed selection (e.g. series -> single data point) - - //get object to select: - SdrObject* pNewObj = 0; - { - rObjectToSelectIfNoDoubleClickIsFollowing = C2U(""); - - //the search for the object to select starts with the hit object deepest in the grouping hierarchy (a leaf in the tree) - //further we travel along the grouping hierarchy from child to parent - pNewObj = rDrawViewWrapper.getHitObject(rMPos); - aRet = lcl_getObjectName( pNewObj );//name of pNewObj - rtl::OUString aTestFirstHit = aRet; - - //ignore handle only objects for hit test - while( pNewObj && aRet.match(C2U("HandlesOnly")) ) - { - pNewObj->SetMarkProtect(true); - pNewObj = rDrawViewWrapper.getHitObject(rMPos); - aRet = lcl_getObjectName( pNewObj ); - } - - //accept only named objects while searching for the object to select - //this call may change aRet - if( !findNamedParent( pNewObj, aRet, true ) ) - { - return C2U(""); - } - //if the so far found object is a multi click object further steps are necessary - while( ObjectIdentifier::isMultiClickObject( aRet ) ) - { - bool bSameObjectAsLastSelected = ObjectIdentifier::areIdenticalObjects( rNameOfLastSelectedObject, aRet ); - if( bSameObjectAsLastSelected ) - { - //if the same child is clicked again don't go up further - break; - } - if( ObjectIdentifier::areSiblings(rNameOfLastSelectedObject,aRet) ) - { - //if a sibling of the last selected object is clicked don't go up further - break; - } - SdrObject* pLastChild = pNewObj; - rtl::OUString aLastChildName = aRet; - if(!findNamedParent( pNewObj, aRet, false )) - { - //take the one found so far - break; - } - //if the last selected object is found don't go up further - //but take the last child if selection change is allowed - if( ObjectIdentifier::areIdenticalObjects( rNameOfLastSelectedObject, aRet ) ) - { - if( bAllowMultiClickSelectionChange ) - { - pNewObj = pLastChild; - aRet = aLastChildName; - } - else - rObjectToSelectIfNoDoubleClickIsFollowing = aLastChildName; - - break; - } - } - - //check wether the diagram was hit but not selected: - rtl::OUString aPageCID( ObjectIdentifier::createClassifiedIdentifier( OBJECTTYPE_PAGE, rtl::OUString() ) );//@todo read CID from model - rtl::OUString aWallCID( ObjectIdentifier::createClassifiedIdentifier( OBJECTTYPE_DIAGRAM_WALL, rtl::OUString() ) );//@todo read CID from model - if( aRet.equals( aPageCID ) || aRet.equals( aWallCID ) || !aRet.getLength() ) - { - rtl::OUString aDiagramCID = ObjectIdentifier::createClassifiedIdentifier( OBJECTTYPE_DIAGRAM, rtl::OUString::valueOf( sal_Int32(0) ) ); - //todo: if more than one diagram is available in future do chack the list of all diagrams here - SdrObject* pDiagram = rDrawViewWrapper.getNamedSdrObject( aDiagramCID ); - if( pDiagram ) - { - if( rDrawViewWrapper.IsObjectHit( pDiagram, rMPos ) ) - { - aRet = aDiagramCID; - pNewObj = pDiagram; - } - } - } - - DBG_ASSERT(pNewObj && aRet.getLength(),"somehow lost selected object"); - } - - return aRet; -} -*/ - // static ::rtl::OUString SelectionHelper::getHitObjectCID( const Point& rMPos, diff --git a/chart2/source/controller/main/SelectionHelper.hxx b/chart2/source/controller/main/SelectionHelper.hxx index 2e9016261e29..c4613443cb77 100644 --- a/chart2/source/controller/main/SelectionHelper.hxx +++ b/chart2/source/controller/main/SelectionHelper.hxx @@ -31,6 +31,7 @@ #define _CHART2_SELECTIONHELPER_HXX #include "DrawViewWrapper.hxx" +#include "ObjectIdentifier.hxx" class SdrObject; // header for enum SdrDragMode @@ -89,12 +90,9 @@ private: //member //the content of m_xSelectedShape is ignored in that case //the strings are used for autogenerated chart specific objects //the shape reference is used for additional shapes - ::rtl::OUString m_aSelectedObjectCID;//only single object selection so far - ::rtl::OUString m_aSelectedObjectCID_beforeMouseDown; - ::rtl::OUString m_aSelectedObjectCID_selectOnlyIfNoDoubleClickIsFollowing; - - ::com::sun::star::uno::Reference< - ::com::sun::star::drawing::XShape > m_xSelectAdditionalShape; + ObjectIdentifier m_aSelectedOID; //only single object selection so far + ObjectIdentifier m_aSelectedOID_beforeMouseDown; + ObjectIdentifier m_aSelectedOID_selectOnlyIfNoDoubleClickIsFollowing; }; class SelectionHelper : public MarkHandleProvider @@ -103,6 +101,9 @@ public: static bool findNamedParent( SdrObject*& pInOutObject , rtl::OUString& rOutName , bool bGivenObjectMayBeResult ); + static bool findNamedParent( SdrObject*& pInOutObject + , ObjectIdentifier& rOutObject + , bool bGivenObjectMayBeResult ); static SdrObject* getMarkHandlesObject( SdrObject* pObj ); static E3dScene* getSceneToRotate( SdrObject* pObj ); static bool isDragableObjectHitTwice( const Point& rMPos |