blob: cd507ed6635c6efaeb20524ab3092574f3de7179 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#include "layoutnodecontext.hxx"
#include "oox/helper/attributelist.hxx"
#include "oox/drawingml/diagram/diagram.hxx"
#include "oox/drawingml/shapecontext.hxx"
#include "diagramdefinitioncontext.hxx"
using namespace ::oox::core;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::xml::sax;
using ::rtl::OUString;
namespace oox { namespace drawingml {
class IfContext
: public LayoutNodeContext
{
public:
IfContext( ContextHandler& rParent,
const Reference< XFastAttributeList >& xAttribs,
const LayoutAtomPtr & pNode )
: LayoutNodeContext( rParent, xAttribs, pNode )
{
ConditionAtomPtr pAtom( boost::dynamic_pointer_cast< ConditionAtom >(pNode) );
OSL_ENSURE( pAtom, "Must pass a ConditionAtom" );
pAtom->iterator().loadFromXAttr( xAttribs );
pAtom->cond().loadFromXAttr( xAttribs );
}
};
class AlgorithmContext
: public ContextHandler
{
public:
AlgorithmContext( ContextHandler& rParent, const Reference< XFastAttributeList >& xAttribs, const LayoutAtomPtr & pNode )
: ContextHandler( rParent )
, mnRevision( 0 )
, mnType( 0 )
, mpNode( pNode )
{
AttributeList aAttribs( xAttribs );
mnRevision = aAttribs.getInteger( XML_rev, 0 );
mnType = xAttribs->getOptionalValueToken( XML_type, 0 );
}
private:
sal_Int32 mnRevision;
sal_Int32 mnType;
LayoutAtomPtr mpNode;
};
class ChooseContext
: public ContextHandler
{
public:
ChooseContext( ContextHandler& rParent, const Reference< XFastAttributeList >& xAttribs, const LayoutAtomPtr & pNode )
: ContextHandler( rParent )
, mbHasElse( false )
, mpNode( pNode )
{
msName = xAttribs->getOptionalValue( XML_name );
}
virtual Reference< XFastContextHandler > SAL_CALL
createFastChildContext( ::sal_Int32 aElement,
const Reference< XFastAttributeList >& xAttribs )
throw (SAXException, RuntimeException)
{
Reference< XFastContextHandler > xRet;
switch( aElement )
{
case XML_if:
{
// CT_When
LayoutAtomPtr pAtom( new ConditionAtom( false ) );
mpNode->addChild( pAtom );
xRet.set( new IfContext( *this, xAttribs, pAtom ) );
break;
}
case XML_else:
// CT_Otherwise
if( !mbHasElse )
{
LayoutAtomPtr pAtom( new ConditionAtom( true ) );
mpNode->addChild( pAtom );
xRet.set( new IfContext( *this, xAttribs, pAtom ) );
mbHasElse = true;
}
else
{
OSL_TRACE( "ignoring second else clause" );
}
break;
default:
break;
}
if( !xRet.is() )
xRet.set(this);
return xRet;
}
private:
bool mbHasElse;
OUString msName;
LayoutAtomPtr mpNode;
};
class ForEachContext
: public LayoutNodeContext
{
public:
ForEachContext( ContextHandler& rParent, const Reference< XFastAttributeList >& xAttribs, const LayoutAtomPtr & pNode )
: LayoutNodeContext( rParent, xAttribs, pNode )
{
ForEachAtomPtr pAtom( boost::dynamic_pointer_cast< ForEachAtom >(pNode) );
OSL_ENSURE( pAtom, "Must pass a ForEachAtom" );
xAttribs->getOptionalValue( XML_ref );
pAtom->iterator().loadFromXAttr( xAttribs );
}
};
// CT_LayoutVariablePropertySet
class LayoutVariablePropertySetContext
: public ContextHandler
{
public:
LayoutVariablePropertySetContext( ContextHandler& rParent, LayoutNode::VarMap & aVar )
: ContextHandler( rParent )
, mVariables( aVar )
{
}
virtual ~LayoutVariablePropertySetContext()
{
}
virtual Reference< XFastContextHandler > SAL_CALL createFastChildContext( ::sal_Int32 aElement, const Reference< XFastAttributeList >& xAttribs )
throw (SAXException, RuntimeException)
{
Reference< XFastContextHandler > xRet;
sal_Int32 nIdx = LayoutNodeContext::tagToVarIdx( getBaseToken( aElement ) );
if( nIdx != -1 )
{
mVariables[ nIdx ] = makeAny( xAttribs->getOptionalValue( XML_val ) );
}
if( !xRet.is() )
xRet.set(this);
return xRet;
}
private:
LayoutNode::VarMap & mVariables;
};
// CT_LayoutNode
LayoutNodeContext::LayoutNodeContext( ContextHandler& rParent,
const Reference< XFastAttributeList >& xAttribs,
const LayoutAtomPtr &pNode )
: ContextHandler( rParent )
, mpNode( pNode )
{
OSL_ENSURE( pNode, "Node must NOT be NULL" );
mpNode->setName( xAttribs->getOptionalValue( XML_name ) );
// TODO shall we even bother?
// b or t
// sal_Int32 nChOrder = xAttributes->getOptionalValueToken( XML_chOrder, XML_b );
// OUString sMoveWith = xAttributes->getOptionalValue( XML_moveWith );
// OUString sStyleLbl = xAttributes->getOptionalValue( XML_styleLbl );
}
LayoutNodeContext::~LayoutNodeContext()
{
}
void SAL_CALL LayoutNodeContext::endFastElement( ::sal_Int32 )
throw (SAXException, RuntimeException)
{
}
/** convert the XML tag to a variable index in the array
* @param aTag the tag, wihout namespace
* @return the variable index. -1 is an error
*/
sal_Int32 LayoutNodeContext::tagToVarIdx( sal_Int32 aTag )
{
sal_Int32 nIdx = -1;
switch( aTag )
{
case DGM_TOKEN( animLvl ):
nIdx = LayoutNode::VAR_animLvl;
break;
case DGM_TOKEN( animOne ):
nIdx = LayoutNode::VAR_animOne;
break;
case DGM_TOKEN( bulletEnabled ):
nIdx = LayoutNode::VAR_bulletEnabled;
break;
case DGM_TOKEN( chMax ):
nIdx = LayoutNode::VAR_chMax;
break;
case DGM_TOKEN( chPref ):
nIdx = LayoutNode::VAR_chPref;
break;
case DGM_TOKEN( dir ):
nIdx = LayoutNode::VAR_dir;
break;
case DGM_TOKEN( hierBranch ):
nIdx = LayoutNode::VAR_hierBranch;
break;
case DGM_TOKEN( orgChart ):
nIdx = LayoutNode::VAR_orgChart;
break;
case DGM_TOKEN( resizeHandles ):
nIdx = LayoutNode::VAR_resizeHandles;
break;
default:
break;
}
return nIdx;
}
Reference< XFastContextHandler > SAL_CALL
LayoutNodeContext::createFastChildContext( ::sal_Int32 aElement,
const Reference< XFastAttributeList >& xAttribs )
throw (SAXException, RuntimeException)
{
Reference< XFastContextHandler > xRet;
switch( aElement )
{
case DGM_TOKEN( layoutNode ):
{
LayoutNodePtr pNode( new LayoutNode() );
mpNode->addChild( pNode );
xRet.set( new LayoutNodeContext( *this, xAttribs, pNode ) );
break;
}
case DGM_TOKEN( shape ):
{
ShapePtr pShape( new Shape() );
xRet.set( new ShapeContext( *this, ShapePtr(), pShape ) );
break;
}
case DGM_TOKEN( extLst ):
return xRet;
case DGM_TOKEN( alg ):
{
// CT_Algorithm
LayoutAtomPtr pAtom( new AlgAtom );
mpNode->addChild( pAtom );
xRet.set( new AlgorithmContext( *this, xAttribs, pAtom ) );
break;
}
case DGM_TOKEN( choose ):
{
// CT_Choose
LayoutAtomPtr pAtom( new ChooseAtom );
mpNode->addChild( pAtom );
xRet.set( new ChooseContext( *this, xAttribs, pAtom ) );
break;
}
case DGM_TOKEN( forEach ):
{
// CT_ForEach
LayoutAtomPtr pAtom( new ForEachAtom );
mpNode->addChild( pAtom );
xRet.set( new ForEachContext( *this, xAttribs, pAtom ) );
break;
}
case DGM_TOKEN( constrLst ):
// CT_Constraints
// TODO
break;
case DGM_TOKEN( presOf ):
{
// CT_PresentationOf
// TODO
xAttribs->getOptionalValue( XML_axis );
xAttribs->getOptionalValue( XML_cnt );
xAttribs->getOptionalValue( XML_hideLastTrans );
xAttribs->getOptionalValue( XML_ptType );
xAttribs->getOptionalValue( XML_st );
xAttribs->getOptionalValue( XML_step );
break;
}
case DGM_TOKEN( ruleLst ):
// CT_Rules
// TODO
break;
case DGM_TOKEN( varLst ):
{
LayoutNodePtr pNode( boost::dynamic_pointer_cast< LayoutNode >( mpNode ) );
if( pNode )
{
xRet.set( new LayoutVariablePropertySetContext( *this, pNode->variables() ) );
}
else
{
OSL_TRACE( "OOX: encountered a varLst in a non layoutNode context" );
}
break;
}
default:
break;
}
if( !xRet.is() )
xRet.set(this);
return xRet;
}
} }