summaryrefslogtreecommitdiff
path: root/embeddedobj
diff options
context:
space:
mode:
authorNoel Grandin <noel.grandin@collabora.co.uk>2022-05-23 17:18:32 +0200
committerNoel Grandin <noel.grandin@collabora.co.uk>2022-05-24 08:07:49 +0200
commitc59ede12ff06f7c10670d9ea8a631b25237e9f02 (patch)
tree794f6d4f52ce1d770548fe2c8e5331532ac6e2fd /embeddedobj
parent086e5347dcf71bab57c66afd23218ac08623b7ed (diff)
this data does not need to be per-object
Change-Id: I7cf9486d80be103c2e9affd805c7bdac46fafe9a Reviewed-on: https://gerrit.libreoffice.org/c/core/+/134838 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Diffstat (limited to 'embeddedobj')
-rw-r--r--embeddedobj/source/commonembedding/embedobj.cxx72
-rw-r--r--embeddedobj/source/commonembedding/miscobj.cxx36
-rw-r--r--embeddedobj/source/inc/commonembobj.hxx2
3 files changed, 64 insertions, 46 deletions
diff --git a/embeddedobj/source/commonembedding/embedobj.cxx b/embeddedobj/source/commonembedding/embedobj.cxx
index 240112b2483e..0b1cb5785dac 100644
--- a/embeddedobj/source/commonembedding/embedobj.cxx
+++ b/embeddedobj/source/commonembedding/embedobj.cxx
@@ -48,6 +48,7 @@
#include <commonembobj.hxx>
#include "embedobj.hxx"
#include <specialobject.hxx>
+#include <array>
using namespace ::com::sun::star;
@@ -71,6 +72,60 @@ awt::Rectangle GetRectangleInterception( const awt::Rectangle& aRect1, const awt
return aResult;
}
+namespace
+{
+ using IntermediateStatesMap = std::array<std::array<uno::Sequence< sal_Int32 >, NUM_SUPPORTED_STATES>, NUM_SUPPORTED_STATES>;
+ const IntermediateStatesMap & getIntermediateStatesMap()
+ {
+ static const IntermediateStatesMap map = [] () {
+ IntermediateStatesMap tmp;
+
+ // intermediate states
+ // In the following table the first index points to starting state,
+ // the second one to the target state, and the sequence referenced by
+ // first two indexes contains intermediate states, that should be
+ // passed by object to reach the target state.
+ // If the sequence is empty that means that indirect switch from start
+ // state to the target state is forbidden, only if direct switch is possible
+ // the state can be reached.
+
+ tmp[0][2] = { embed::EmbedStates::RUNNING };
+
+ tmp[0][3] = { embed::EmbedStates::RUNNING,
+ embed::EmbedStates::INPLACE_ACTIVE };
+
+ tmp[0][4] = {embed::EmbedStates::RUNNING};
+
+ tmp[1][3] = { embed::EmbedStates::INPLACE_ACTIVE };
+
+ tmp[2][0] = { embed::EmbedStates::RUNNING };
+
+ tmp[3][0] = { embed::EmbedStates::INPLACE_ACTIVE,
+ embed::EmbedStates::RUNNING };
+
+ tmp[3][1] = { embed::EmbedStates::INPLACE_ACTIVE };
+
+ tmp[4][0] = { embed::EmbedStates::RUNNING };
+
+ return tmp;
+ }();
+ return map;
+ }
+
+ // accepted states
+ const css::uno::Sequence< sal_Int32 > & getAcceptedStates()
+ {
+ static const css::uno::Sequence< sal_Int32 > states {
+ /* [0] */ embed::EmbedStates::LOADED,
+ /* [1] */ embed::EmbedStates::RUNNING,
+ /* [2] */ embed::EmbedStates::INPLACE_ACTIVE,
+ /* [3] */ embed::EmbedStates::UI_ACTIVE,
+ /* [4] */ embed::EmbedStates::ACTIVE };
+ assert(states.getLength() == NUM_SUPPORTED_STATES);
+ return states;
+ }
+
+}
sal_Int32 OCommonEmbeddedObject::ConvertVerbToState_Impl( sal_Int32 nVerb )
{
@@ -389,27 +444,28 @@ void OCommonEmbeddedObject::SwitchStateTo_Impl( sal_Int32 nNextState )
uno::Sequence< sal_Int32 > const & OCommonEmbeddedObject::GetIntermediateStatesSequence_Impl( sal_Int32 nNewState )
{
sal_Int32 nCurInd = 0;
- for ( nCurInd = 0; nCurInd < m_aAcceptedStates.getLength(); nCurInd++ )
- if ( m_aAcceptedStates[nCurInd] == m_nObjectState )
+ auto & rAcceptedStates = getAcceptedStates();
+ for ( nCurInd = 0; nCurInd < rAcceptedStates.getLength(); nCurInd++ )
+ if ( rAcceptedStates[nCurInd] == m_nObjectState )
break;
- if ( nCurInd == m_aAcceptedStates.getLength() )
+ if ( nCurInd == rAcceptedStates.getLength() )
throw embed::WrongStateException( "The object is in unacceptable state!",
static_cast< ::cppu::OWeakObject* >(this) );
sal_Int32 nDestInd = 0;
- for ( nDestInd = 0; nDestInd < m_aAcceptedStates.getLength(); nDestInd++ )
- if ( m_aAcceptedStates[nDestInd] == nNewState )
+ for ( nDestInd = 0; nDestInd < rAcceptedStates.getLength(); nDestInd++ )
+ if ( rAcceptedStates[nDestInd] == nNewState )
break;
- if ( nDestInd == m_aAcceptedStates.getLength() )
+ if ( nDestInd == rAcceptedStates.getLength() )
throw embed::UnreachableStateException(
"The state either not reachable, or the object allows the state only as an intermediate one!",
static_cast< ::cppu::OWeakObject* >(this),
m_nObjectState,
nNewState );
- return m_pIntermediateStatesSeqs[nCurInd][nDestInd];
+ return getIntermediateStatesMap()[nCurInd][nDestInd];
}
@@ -486,7 +542,7 @@ uno::Sequence< sal_Int32 > SAL_CALL OCommonEmbeddedObject::getReachableStates()
throw embed::WrongStateException( "The object has no persistence!",
static_cast< ::cppu::OWeakObject* >(this) );
- return m_aAcceptedStates;
+ return getAcceptedStates();
}
diff --git a/embeddedobj/source/commonembedding/miscobj.cxx b/embeddedobj/source/commonembedding/miscobj.cxx
index d8d9a74700c1..0b15376c2535 100644
--- a/embeddedobj/source/commonembedding/miscobj.cxx
+++ b/embeddedobj/source/commonembedding/miscobj.cxx
@@ -139,42 +139,6 @@ void OCommonEmbeddedObject::CommonInit_Impl( const uno::Sequence< beans::NamedVa
if ( m_aClassID.getLength() != 16 /*|| !m_aDocServiceName.getLength()*/ )
throw uno::RuntimeException(); // something goes really wrong
- // accepted states
- m_aAcceptedStates = { /* [0] */ embed::EmbedStates::LOADED,
- /* [1] */ embed::EmbedStates::RUNNING,
- /* [2] */ embed::EmbedStates::INPLACE_ACTIVE,
- /* [3] */ embed::EmbedStates::UI_ACTIVE,
- /* [4] */ embed::EmbedStates::ACTIVE };
- assert(m_aAcceptedStates.getLength() == NUM_SUPPORTED_STATES);
-
-
- // intermediate states
- // In the following table the first index points to starting state,
- // the second one to the target state, and the sequence referenced by
- // first two indexes contains intermediate states, that should be
- // passed by object to reach the target state.
- // If the sequence is empty that means that indirect switch from start
- // state to the target state is forbidden, only if direct switch is possible
- // the state can be reached.
-
- m_pIntermediateStatesSeqs[0][2] = { embed::EmbedStates::RUNNING };
-
- m_pIntermediateStatesSeqs[0][3] = { embed::EmbedStates::RUNNING,
- embed::EmbedStates::INPLACE_ACTIVE };
-
- m_pIntermediateStatesSeqs[0][4] = {embed::EmbedStates::RUNNING};
-
- m_pIntermediateStatesSeqs[1][3] = { embed::EmbedStates::INPLACE_ACTIVE };
-
- m_pIntermediateStatesSeqs[2][0] = { embed::EmbedStates::RUNNING };
-
- m_pIntermediateStatesSeqs[3][0] = { embed::EmbedStates::INPLACE_ACTIVE,
- embed::EmbedStates::RUNNING };
-
- m_pIntermediateStatesSeqs[3][1] = { embed::EmbedStates::INPLACE_ACTIVE };
-
- m_pIntermediateStatesSeqs[4][0] = { embed::EmbedStates::RUNNING };
-
// verbs table
for ( auto const & verb : std::as_const(m_aObjectVerbs) )
{
diff --git a/embeddedobj/source/inc/commonembobj.hxx b/embeddedobj/source/inc/commonembobj.hxx
index 61abe0299ee1..4f641737b468 100644
--- a/embeddedobj/source/inc/commonembobj.hxx
+++ b/embeddedobj/source/inc/commonembobj.hxx
@@ -119,8 +119,6 @@ protected:
css::uno::Sequence< css::embed::VerbDescriptor > m_aObjectVerbs;
- css::uno::Sequence< sal_Int32 > m_aAcceptedStates;
- css::uno::Sequence< sal_Int32 > m_pIntermediateStatesSeqs[NUM_SUPPORTED_STATES][NUM_SUPPORTED_STATES];
std::map< sal_Int32, sal_Int32 > m_aVerbTable;
css::uno::Reference< css::embed::XEmbeddedClient > m_xClientSite;