DocumentServer/ActiveX/Common/OfficeDrawing/Shapes/BaseShape/PPTShape/pptshape.h
nikolay ivanov a8be6b9e72 init repo
2014-07-05 18:22:49 +00:00

727 lines
15 KiB
C++

/*
* (c) Copyright Ascensio System SIA 2010-2014
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia,
* EU, LV-1021.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
#pragma once
#include "Formula.h"
#include <string>
#include "./../BaseShape.h"
#include "../../../../XmlUtils.h"
#include "..\..\CustomGeomShape.h"
using namespace NSOfficeDrawing;
namespace PPTShapes
{
enum ShapeType : unsigned short
{
sptMin = 0,
sptNotPrimitive = sptMin,
sptCRect = 1,
sptCRoundRect = 2,
sptCEllipse = 3,
sptCDiamond = 4,
sptCIsocelesTriangle = 5,
sptCRtTriangle = 6,
sptCParallelogram = 7,
sptCTrapezoid = 8,
sptCHexagon = 9,
sptCOctagon = 10,
sptCPlus = 11,
sptCStar5 = 12,
sptCRightArrow = 13,
sptCThickArrow = 14,
sptCHomePlate = 15,
sptCCube = 16,
sptCBalloon = 17,
sptCSeal = 18,
sptCArc = 19,
sptCLine = 20,
sptCPlaque = 21,
sptCCan = 22,
sptCDonut = 23,
sptCTextSimple = 24,
sptCTextOctagon = 25,
sptCTextHexagon = 26,
sptCTextCurve = 27,
sptCTextWave = 28,
sptCTextRing = 29,
sptCTextOnCurve = 30,
sptCTextOnRing = 31,
sptCStraightConnector1 = 32,
sptCBentConnector2 = 33,
sptCBentConnector3 = 34,
sptCBentConnector4 = 35,
sptCBentConnector5 = 36,
sptCCurvedConnector2 = 37,
sptCCurvedConnector3 = 38,
sptCCurvedConnector4 = 39,
sptCCurvedConnector5 = 40,
sptCCallout1 = 41,
sptCCallout2 = 42,
sptCCallout3 = 43,
sptCAccentCallout1 = 44,
sptCAccentCallout2 = 45,
sptCAccentCallout3 = 46,
sptCBorderCallout1 = 47,
sptCBorderCallout2 = 48,
sptCBorderCallout3 = 49,
sptCAccentBorderCallout1 = 50,
sptCAccentBorderCallout2 = 51,
sptCAccentBorderCallout3 = 52,
sptCRibbon = 53,
sptCRibbon2 = 54,
sptCChevron = 55,
sptCPentagon = 56,
sptCNoSmoking = 57,
sptCStar8 = 58,
sptCStar16 = 59,
sptCStar32 = 60,
sptCWedgeRectCallout = 61,
sptCWedgeRoundRectCallout = 62,
sptCWedgeEllipseCallout = 63,
sptCWave = 64,
sptCFoldedCorner = 65,
sptCLeftArrow = 66,
sptCDownArrow = 67,
sptCUpArrow = 68,
sptCLeftRightArrow = 69,
sptCUpDownArrow = 70,
sptCIrregularSeal1 = 71,
sptCIrregularSeal2 = 72,
sptCLightningBolt = 73,
sptCHeart = 74,
sptCFrame = 75,
sptCQuadArrow = 76,
sptCLeftArrowCallout = 77,
sptCRightArrowCallout = 78,
sptCUpArrowCallout = 79,
sptCDownArrowCallout = 80,
sptCLeftRightArrowCallout = 81,
sptCUpDownArrowCallout = 82,
sptCQuadArrowCallout = 83,
sptCBevel = 84,
sptCLeftBracket = 85,
sptCRightBracket = 86,
sptCLeftBrace = 87,
sptCRightBrace = 88,
sptCLeftUpArrow = 89,
sptCBentUpArrow = 90,
sptCBentArrow = 91,
sptCStar24 = 92,
sptCStripedRightArrow = 93,
sptCNotchedRightArrow = 94,
sptCBlockArc = 95,
sptCSmileyFace = 96,
sptCVerticalScroll = 97,
sptCHorizontalScroll = 98,
sptCCircularArrow = 99,
sptCNotchedCircularArrow = 100,
sptCUturnArrow = 101,
sptCCurvedRightArrow = 102,
sptCCurvedLeftArrow = 103,
sptCCurvedUpArrow = 104,
sptCCurvedDownArrow = 105,
sptCCloudCallout = 106,
sptCEllipseRibbon = 107,
sptCEllipseRibbon2 = 108,
sptCFlowChartProcess = 109,
sptCFlowChartDecision = 110,
sptCFlowChartInputOutput = 111,
sptCFlowChartPredefinedProcess = 112,
sptCFlowChartInternalStorage = 113,
sptCFlowChartDocument = 114,
sptCFlowChartMultidocument = 115,
sptCFlowChartTerminator = 116,
sptCFlowChartPreparation = 117,
sptCFlowChartManualInput = 118,
sptCFlowChartManualOperation = 119,
sptCFlowChartConnector = 120,
sptCFlowChartPunchedCard = 121,
sptCFlowChartPunchedTape = 122,
sptCFlowChartSummingJunction = 123,
sptCFlowChartOr = 124,
sptCFlowChartCollate = 125,
sptCFlowChartSort = 126,
sptCFlowChartExtract = 127,
sptCFlowChartMerge = 128,
sptCFlowChartOfflineStorage = 129,
sptCFlowChartOnlineStorage = 130,
sptCFlowChartMagneticTape = 131,
sptCFlowChartMagneticDisk = 132,
sptCFlowChartMagneticDrum = 133,
sptCFlowChartDisplay = 134,
sptCFlowChartDelay = 135,
sptCTextPlain = 136,
sptCTextStop = 137,
sptCTextTriangle = 138,
sptCTextTriangleInverted = 139,
sptCTextChevron = 140,
sptCTextChevronInverted = 141,
sptCTextRingInside = 142,
sptCTextRingOutside = 143,
sptCTextArchUp = 144,
sptCTextArchDown = 145,
sptCTextCircle = 146,
sptCTextButton = 147,
sptCTextArchUpPour = 148,
sptCTextArchDownPour = 149,
sptCTextCirclePour = 150,
sptCTextButtonPour = 151,
sptCTextCurveUp = 152,
sptCTextCurveDown = 153,
sptCTextCascadeUp = 154,
sptCTextCascadeDown = 155,
sptCTextWave1 = 156,
sptCTextWave2 = 157,
sptCTextWave3 = 158,
sptCTextWave4 = 159,
sptCTextInflate = 160,
sptCTextDeflate = 161,
sptCTextInflateBottom = 162,
sptCTextDeflateBottom = 163,
sptCTextInflateTop = 164,
sptCTextDeflateTop = 165,
sptCTextDeflateInflate = 166,
sptCTextDeflateInflateDeflate = 167,
sptCTextFadeRight = 168,
sptCTextFadeLeft = 169,
sptCTextFadeUp = 170,
sptCTextFadeDown = 171,
sptCTextSlantUp = 172,
sptCTextSlantDown = 173,
sptCTextCanUp = 174,
sptCTextCanDown = 175,
sptCFlowChartAlternateProcess = 176,
sptCFlowChartOffpageConnector = 177,
sptCCallout90 = 178,
sptCAccentCallout90 = 179,
sptCBorderCallout90 = 180,
sptCAccentBorderCallout90 = 181,
sptCLeftRightUpArrow = 182,
sptCSun = 183,
sptCMoon = 184,
sptCBracketPair = 185,
sptCBracePair = 186,
sptCStar4 = 187,
sptCDoubleWave = 188,
sptCActionButtonBlank = 189,
sptCActionButtonHome = 190,
sptCActionButtonHelp = 191,
sptCActionButtonInformation = 192,
sptCActionButtonForwardNext = 193,
sptCActionButtonBackPrevious = 194,
sptCActionButtonEnd = 195,
sptCActionButtonBeginning = 196,
sptCActionButtonReturn = 197,
sptCActionButtonDocument = 198,
sptCActionButtonSound = 199,
sptCActionButtonMovie = 200,
sptCHostControl = 201,
sptCTextBox = 202,
sptCChartPlus = 203,
sptCChartStar,
sptCChartX,
sptCChord,
sptCCloud,
sptCCorner,
sptCCornerTabs,
sptCDecagon,
sptCDiagStripe,
sptCDodecagon,
sptCFunnel,
sptCGear6,
sptCGear9,
sptCHalfFrame,
sptCHeptagon,
sptCLeftCircularArrow,
sptCLeftRightCircularArrow,
sptCLeftRightRibbon,
sptCLineInv,
sptCMathDivide,
sptCMathEqual,
sptCMathMinus,
sptCMathMultiply,
sptCMathNotEqual,
sptCMathPlus,
sptCNonIsoscelesTrapezoid,
sptCPie,
sptCPieWedge,
sptCPlaqueTabs,
sptCRound1Rect,
sptCRound2DiagRect,
sptCRound2SameRect,
sptCSnip1Rect,
sptCSnip2DiagRect,
sptCSnip2SameRect,
sptCSnipRoundRect,
sptCSquareTabs,
sptCStar10,
sptCStar12,
sptCStar6,
sptCStar7,
sptCSwooshArrow,
sptCTeardrop,
sptCTextDoubleWave1,
sptCTriangle,
sptMax,
sptNil = 0x0FFF,
sptCustom = 0x1000
};
}
class CElementsContainer;
class CProperties;
class CProperty;
class CShape;
class CPPTShape : public CBaseShape
{
public:
PPTShapes::ShapeType m_eType;
NSGuidesVML::CFormulasManager m_oManager;
NSCustomVML::CCustomVML m_oCustomVML;
CString m_strPathLimoX;
CString m_strPathLimoY;
CAtlArray<CString> m_arStringTextRects;
public:
CPPTShape() : CBaseShape(), m_arStringTextRects()
{
m_eType = PPTShapes::sptMin;
m_arStringTextRects.Add(_T("0,0,21600,21600"));
m_strPathLimoX = _T("");
m_strPathLimoY = _T("");
}
~CPPTShape()
{
}
virtual bool LoadFromXML(const CString& xml)
{
XmlUtils::CXmlNode oNodePict;
if (oNodePict.FromXmlString(xml))
{
return LoadFromXML(oNodePict);
}
return false;
}
virtual bool LoadFromXML(XmlUtils::CXmlNode& oNodePict)
{
CString id = oNodePict.GetAttributeOrValue(_T("type"));
bool isPathList = false;
if (id != _T(""))
{
SetShapeType((PPTShapes::ShapeType)XmlUtils::GetInteger(id));
}
else
{
XmlUtils::CXmlNode oNodeTemplate;
if (oNodePict.GetNode(_T("template"), oNodeTemplate))
{
CString strAdj = oNodeTemplate.GetAttributeOrValue(_T("adj"));
LoadAdjustValuesList(strAdj);
XmlUtils::CXmlNode oNodeGuides;
if (oNodeTemplate.GetNode(_T("v:formulas"), oNodeGuides))
{
LoadGuidesList(oNodeGuides.GetXml());
}
CString strPath = oNodeTemplate.GetAttributeOrValue(_T("path"));
if (strPath != _T(""))
{
LoadPathList(strPath);
isPathList = true;
}
}
}
XmlUtils::CXmlNode oNodeGuides;
if (oNodePict.GetNode(_T("path"), oNodeGuides))
{
CString strPath = oNodeGuides.GetAttributeOrValue(_T("val"));
if (strPath != _T(""))
{
LoadPathList(strPath);
isPathList = true;
}
}
if (!isPathList)
ReCalculate();
return true;
}
virtual bool LoadAdjustValuesList(const CString& xml)
{
CSimpleArray<CString> arAdj;
NSStringUtils::ParseString(_T(","), xml, &arAdj);
m_arAdjustments.RemoveAll();
for (int nIndex = 0; nIndex < arAdj.GetSize(); ++nIndex)
{
m_arAdjustments.Add((LONG)XmlUtils::GetInteger(arAdj[nIndex]));
}
return true;
}
virtual bool LoadGuidesList(const CString& xml)
{
XmlUtils::CXmlNode oNodeGuides;
if (oNodeGuides.FromXmlString(xml) && (_T("v:formulas") == oNodeGuides.GetName()))
{
m_oManager.RemoveAll();
XmlUtils::CXmlNodes oList;
if (oNodeGuides.GetNodes(_T("v:f"), oList))
{
int lCount = oList.GetCount();
for (int nIndex = 0; nIndex < lCount; ++nIndex)
{
XmlUtils::CXmlNode oNodeFormula;
oList.GetAt(nIndex, oNodeFormula);
m_oManager.AddFormula(oNodeFormula.GetAttributeOrValue(_T("eqn")));
}
}
m_oManager.Clear(&m_arAdjustments);
m_oManager.CalculateResults();
return true;
}
return false;
}
virtual void AddGuide(const CString& strGuide)
{
m_oManager.AddFormula(strGuide);
}
virtual bool LoadAdjustHandlesList(const CString& xml)
{
return true;
}
virtual bool LoadConnectorsList(const CString& xml)
{
return true;
}
virtual bool LoadTextRect(const CString& xml)
{
CSimpleArray<CString> oArray;
NSStringUtils::ParseString(_T(";"), xml, &oArray);
LONG lCount = (LONG)oArray.GetSize();
if (lCount <= 0)
return true;
m_arStringTextRects.RemoveAll();
for (LONG i = 0; i < lCount; ++i)
{
m_arStringTextRects.Add(oArray[i]);
}
return true;
}
virtual bool LoadPathList(const CString& xml)
{
m_strPath = xml;
m_oPath.FromXML(xml, m_oManager);
return true;
}
virtual bool SetAdjustment(long index, long value)
{
return (TRUE == m_arAdjustments.SetAtIndex(index, value));
}
virtual CString ToXML(CGeomShapeInfo& GeomInfo, CMetricInfo& MetricInfo, double StartTime, double EndTime, CBrush_& Brush, CPen_& Pen)
{
if ((_T("") != m_strPathLimoX) || _T("") != m_strPathLimoY)
{
m_strPath = (GeomInfo.m_dWidth >= GeomInfo.m_dHeight) ? m_strPathLimoX : m_strPathLimoY;
ReCalculate();
m_oPath.SetCoordsize(21600, 21600);
}
return m_oPath.ToXml(GeomInfo, StartTime, EndTime, Pen, Brush, MetricInfo, NSBaseShape::ppt);
}
virtual void ReCalculate()
{
m_oManager.Clear(&m_arAdjustments);
m_oManager.CalculateResults();
LoadPathList(m_strPath);
}
static CPPTShape* CreateByType(PPTShapes::ShapeType type);
virtual const ClassType GetClassType()const
{
return NSBaseShape::ppt;
}
virtual bool SetProperties(CBaseShape* Shape)
{
if(Shape == NULL)
return false;
if(Shape->GetClassType() != NSBaseShape::ppt)
return false;
m_oManager = ((CPPTShape*)Shape)->m_oManager;
m_strPathLimoX = ((CPPTShape*)Shape)->m_strPathLimoX;
m_strPathLimoY = ((CPPTShape*)Shape)->m_strPathLimoY;
m_arStringTextRects.Copy(((CPPTShape*)Shape)->m_arStringTextRects);
return CBaseShape::SetProperties(Shape);
}
virtual bool SetToDublicate(CBaseShape* Shape)
{
if(Shape == NULL)
return false;
if(Shape->GetClassType() != NSBaseShape::ppt)
return false;
((CPPTShape*)Shape)->m_oManager = m_oManager;
((CPPTShape*)Shape)->m_strPathLimoX = m_strPathLimoX;
((CPPTShape*)Shape)->m_strPathLimoY = m_strPathLimoY;
((CPPTShape*)Shape)->m_arStringTextRects.Copy(m_arStringTextRects);
return CBaseShape::SetToDublicate(Shape);
}
bool SetShapeType(PPTShapes::ShapeType type)
{
CPPTShape* l_pShape = CreateByType(type);
if(l_pShape != NULL)
{
m_eType = type;
SetProperties(l_pShape);
delete l_pShape;
return true;
}
m_eType = PPTShapes::sptCustom;
return false;
}
virtual void SetProperty(CProperty* pProperty, CElementsContainer* pSlide, CShape* pParentShape);
virtual void SetColor(const DWORD& dwVal, CColor_& oColor, CElementsContainer* pSlide);
void SetProperties(CProperties* pProperties, CElementsContainer* pSlide, CShape* pParentShape);
void CalcTextRectOffsets(double& dPercentLeft, double& dPercentTop, double& dPercentRight, double& dPercentBottom, LONG nIndex = 0)
{
dPercentLeft = 0;
dPercentTop = 0;
dPercentRight = 0;
dPercentBottom = 0;
if ((nIndex < 0) || (nIndex >= (LONG)m_arStringTextRects.GetCount()))
return;
if (m_oPath.m_arParts.GetSize() == 0)
return;
LONG lWidth = m_oPath.m_arParts[0].width;
LONG lHeight = m_oPath.m_arParts[0].height;
CSimpleArray<CString> oArray;
NSStringUtils::ParseString(_T(","), m_arStringTextRects[nIndex], &oArray);
if (4 != oArray.GetSize())
return;
LONG lLeft = 0;
LONG lTop = 0;
LONG lRight = 0;
LONG lBottom = 0;
bool bOk = true;
bOk = (bOk && GetPos(oArray[0], lLeft));
bOk = (bOk && GetPos(oArray[1], lTop));
bOk = (bOk && GetPos(oArray[2], lRight));
bOk = (bOk && GetPos(oArray[3], lBottom));
if (!bOk)
return;
dPercentLeft = (double)lLeft / lWidth;
dPercentTop = (double)lTop / lHeight;
dPercentRight = (double)(lWidth - lRight) / lWidth;
dPercentBottom = (double)(lHeight - lBottom) / lHeight;
}
protected:
bool GetPos(CString str, LONG& lValue)
{
if (str.GetLength() == 0)
return false;
TCHAR mem = str.GetAt(0);
bool bFormula = false;
if ('@' == mem)
{
bFormula = true;
str.Delete(0);
}
if (!NSStringUtils::IsNumber(str))
return false;
lValue = 0;
lValue = _ttoi(str);
if (bFormula)
{
if (lValue >= 0 || lValue < m_oManager.m_arResults.GetSize())
{
lValue = m_oManager.m_arResults[lValue];
return true;
}
return false;
}
return true;
}
};