/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * This file incorporates work covered by the following license notice: * * 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 .
*/
void CustomShapeGuideContainer::ActualizeLookupMap() const
{ if ( mbLookupMapStale )
{ // maGuideListLookupMap maps guide name to index in maGuideList // guides were added since last actualization, need to update map based on those // guide names can be reused, and current is the latest one // (see a1 guide in gear6 custom shape preset as example): // go backwards and update if index is higher than previously for ( sal_Int32 nIndex = static_cast<sal_Int32>( maGuideList.size() ) - 1; nIndex >= mnPreviousActSize; --nIndex )
{ constauto it = maGuideListLookupMap.find( maGuideList[ nIndex ].maName ); if ( it != maGuideListLookupMap.end() )
{ if ( nIndex > it->second )
it->second = nIndex;
} else
maGuideListLookupMap[ maGuideList[ nIndex ].maName ] = nIndex;
}
mbLookupMapStale = false;
mnPreviousActSize = static_cast<sal_Int32>( maGuideList.size() );
}
}
// returns the index into the guidelist for a given formula name, // if the return value is < 0 then the guide value could not be found
sal_Int32 CustomShapeGuideContainer::GetCustomShapeGuideValue( const OUString &rFormulaName ) const
{
ActualizeLookupMap(); constauto it = maGuideListLookupMap.find( rFormulaName ); if ( it != maGuideListLookupMap.end() ) return it->second;
return -1;
}
sal_Int32 CustomShapeGuideContainer::SetCustomShapeGuideValue( const CustomShapeGuide& rGuide )
{
ActualizeLookupMap(); // change from previous SetCustomShapeGuideValue behavior: searching using cache traverses backwards constauto it = maGuideListLookupMap.find( rGuide.maName ); if ( it != maGuideListLookupMap.end() ) return it->second;
Sequence< PropertyValues > aHandles( maAdjustHandleList.size() ); auto aHandlesRange = asNonConstRange(aHandles); for ( std::vector<AdjustHandle>::size_type i = 0; i < maAdjustHandleList.size(); i++ )
{
PropertyMap aHandle; // maAdjustmentHandle[ i ].gdRef1 ... maAdjustmentHandle[ i ].gdRef2 ... :( // gdRef1 && gdRef2 -> we do not offer such reference, so it is difficult // to determine the correct adjustment handle that should be updated with the adjustment // position. here is the solution: the adjustment value that is used within the position // has to be updated, in case the position is a formula the first usage of a // adjustment value is decisive if ( maAdjustHandleList[ i ].polar )
{ // Polar handles in DrawingML // 1. don't have reference center, so PROP_Polar isn't needed. // 2. position always use planar coordinates. // 3. use RefAngle and RefR to specify adjustment value to be updated. // 4. The unit of angular adjustment values are 6000th degree.
aHandle.setProperty( PROP_Position, maAdjustHandleList[ i ].pos); if ( maAdjustHandleList[ i ].gdRef1.has_value() )
{
sal_Int32 nIndex = maAdjustmentGuideList.GetCustomShapeGuideValue( maAdjustHandleList[ i ].gdRef1.value() ); if ( nIndex >= 0 )
aHandle.setProperty( PROP_RefR, nIndex);
} if ( maAdjustHandleList[ i ].gdRef2.has_value() )
{
sal_Int32 nIndex = maAdjustmentGuideList.GetCustomShapeGuideValue( maAdjustHandleList[ i ].gdRef2.value() ); if ( nIndex >= 0 )
aHandle.setProperty( PROP_RefAngle, nIndex);
} if ( maAdjustHandleList[ i ].min1.has_value() )
aHandle.setProperty( PROP_RadiusRangeMinimum, maAdjustHandleList[ i ].min1.value()); if ( maAdjustHandleList[ i ].max1.has_value() )
aHandle.setProperty( PROP_RadiusRangeMaximum, maAdjustHandleList[ i ].max1.value());
/* TODO: AngleMin & AngleMax if ( maAdjustHandleList[ i ].min2.has() ) aHandle.setProperty( PROP_ ] = maAdjustHandleList[ i ].min2.get()); if ( maAdjustHandleList[ i ].max2.has() ) aHandle.setProperty( PROP_ ] = maAdjustHandleList[ i ].max2.get());
*/
} else
{
aHandle.setProperty( PROP_Position, maAdjustHandleList[ i ].pos); if ( maAdjustHandleList[ i ].gdRef1.has_value() )
{ // TODO: PROP_RefX and PROP_RefY are not yet part of our file format, // so the handles will not work after save/reload
sal_Int32 nIndex = maAdjustmentGuideList.GetCustomShapeGuideValue( maAdjustHandleList[ i ].gdRef1.value() ); if ( nIndex >= 0 )
aHandle.setProperty( PROP_RefX, nIndex);
} if ( maAdjustHandleList[ i ].gdRef2.has_value() )
{
sal_Int32 nIndex = maAdjustmentGuideList.GetCustomShapeGuideValue( maAdjustHandleList[ i ].gdRef2.value() ); if ( nIndex >= 0 )
aHandle.setProperty( PROP_RefY, nIndex);
} if ( maAdjustHandleList[ i ].min1.has_value() )
aHandle.setProperty( PROP_RangeXMinimum, maAdjustHandleList[ i ].min1.value()); if ( maAdjustHandleList[ i ].max1.has_value() )
aHandle.setProperty( PROP_RangeXMaximum, maAdjustHandleList[ i ].max1.value()); if ( maAdjustHandleList[ i ].min2.has_value() )
aHandle.setProperty( PROP_RangeYMinimum, maAdjustHandleList[ i ].min2.value()); if ( maAdjustHandleList[ i ].max2.has_value() )
aHandle.setProperty( PROP_RangeYMaximum, maAdjustHandleList[ i ].max2.value());
}
aHandlesRange[ i ] = aHandle.makePropertyValueSequence();
}
aPropertyMap.setProperty( PROP_Handles, aHandles); if (!maExtrusionPropertyMap.empty())
{
Sequence< PropertyValue > aExtrusionSequence = maExtrusionPropertyMap.makePropertyValueSequence();
aPropertyMap.setProperty( PROP_Extrusion, aExtrusionSequence);
}
#if OSL_DEBUG_LEVEL >= 2 // Note that the script oox/source/drawingml/customshapes/generatePresetsData.pl looks // for these ==cscode== and ==csdata== markers, so don't "clean up" these SAL_INFOs.
SAL_INFO("oox.cscode", "==cscode== begin");
aPropertyMap.dumpCode( aPropertyMap.makePropertySet() );
SAL_INFO("oox.cscode", "==cscode== end");
SAL_INFO("oox.csdata", "==csdata== begin");
aPropertyMap.dumpData( aPropertyMap.makePropertySet() );
SAL_INFO("oox.csdata", "==csdata== end"); #endif // converting the vector to a sequence
Sequence< PropertyValue > aSeq = aPropertyMap.makePropertyValueSequence();
PropertySet aPropSet( xPropSet );
aPropSet.setProperty( PROP_CustomShapeGeometry, aSeq );
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.