/* * (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 "Shapes\Shape.h" #include "ElementSettings.h" using namespace NSOfficeDrawing; class CElementsContainer; class IElement { public: BOOL m_bIsBackground; ElementType m_etType; CDoubleRect m_rcBounds; RECT m_rcBoundsOriginal; double m_dStartTime; double m_dEndTime; CInteractiveInfo m_oActions; CAnimationInfo m_oAnimations; LONG m_lID; LONG m_lMasterID; LONG m_lPlaceholderID; LONG m_lPlaceholderPosition; LONG m_lPersistIndex; IStream* m_pStream; LONG m_lOffsetTextStyle; LONG m_lOffsetTextProp; CMetricInfo m_oMetric; double m_dRotate; bool m_bFlipH; bool m_bFlipV; public: IElement() { m_dRotate = 0.0; m_bFlipH = false; m_bFlipV = false; } virtual ~IElement() { m_pStream = NULL; m_lOffsetTextStyle = -1; m_lOffsetTextProp = -1; } virtual CString ToXml() = 0; virtual void NormalizeCoords(double dScaleX, double dScaleY) { m_rcBounds.left = dScaleX * m_rcBoundsOriginal.left; m_rcBounds.right = dScaleX * m_rcBoundsOriginal.right; m_rcBounds.top = dScaleY * m_rcBoundsOriginal.top; m_rcBounds.bottom = dScaleY * m_rcBoundsOriginal.bottom; } virtual void SetUpProperties(CProperties* pProps, CElementsContainer* pSlide); virtual IElement* CreateDublicate() = 0; protected: virtual void SetUpProperty(CProperty* pProp, CElementsContainer* pSlide); protected: virtual void SetProperiesToDublicate(IElement* pDublicate) { if (NULL == pDublicate) return; pDublicate->m_bIsBackground = m_bIsBackground; pDublicate->m_etType = m_etType; pDublicate->m_rcBounds = m_rcBounds; pDublicate->m_rcBoundsOriginal.left = m_rcBoundsOriginal.left; pDublicate->m_rcBoundsOriginal.top = m_rcBoundsOriginal.top; pDublicate->m_rcBoundsOriginal.right = m_rcBoundsOriginal.right; pDublicate->m_rcBoundsOriginal.bottom = m_rcBoundsOriginal.bottom; pDublicate->m_dStartTime = m_dStartTime; pDublicate->m_dEndTime = m_dEndTime; pDublicate->m_lID = m_lID; pDublicate->m_lMasterID = m_lMasterID; pDublicate->m_lPlaceholderID = m_lPlaceholderID; pDublicate->m_lPlaceholderPosition = m_lPlaceholderPosition; pDublicate->m_lPersistIndex = m_lPersistIndex; pDublicate->m_pStream = m_pStream; pDublicate->m_lOffsetTextStyle = m_lOffsetTextStyle; pDublicate->m_lOffsetTextProp = m_lOffsetTextProp; pDublicate->m_oMetric = m_oMetric; pDublicate->m_dRotate = m_dRotate; pDublicate->m_bFlipH = m_bFlipH; pDublicate->m_bFlipV = m_bFlipV; } }; class CVideoElement : public IElement { public: CStringW m_strFileName; double m_dVideoDuration; BYTE m_nAlpha; LONG m_lAngle; public: CVideoElement():IElement() { m_bIsBackground = FALSE; m_pStream = NULL; m_lOffsetTextStyle = -1; m_lOffsetTextProp = -1; m_lID = -1; m_lMasterID = -1; m_lPlaceholderID = -1; m_lPlaceholderPosition = -1; m_lPersistIndex = -1; m_etType = etVideo; m_rcBounds.left = 0; m_rcBounds.top = 0; m_rcBounds.right = 1; m_rcBounds.bottom = 1; m_rcBoundsOriginal.left = 0; m_rcBoundsOriginal.top = 0; m_rcBoundsOriginal.right = 1; m_rcBoundsOriginal.bottom = 1; m_strFileName = _T(""); m_dStartTime = 0.0; m_dEndTime = 30.0; m_dVideoDuration = 0.0; m_nAlpha = 0xFF; } virtual ~CVideoElement() { } virtual CString ToXml() { double dCentreX = 100.0 * ((double)(m_rcBounds.right + m_rcBounds.left) / 2) / (double)m_oMetric.m_lMillimetresHor; double dCentreY = 100.0 * ((double)(m_rcBounds.top + m_rcBounds.bottom) / 2) / (double)m_oMetric.m_lMillimetresVer; double dWidth = 100.0 * ((double)(m_rcBounds.right - m_rcBounds.left)) / (double)m_oMetric.m_lMillimetresHor; double dHeight = 100.0 * ((double)(m_rcBounds.bottom - m_rcBounds.top)) / (double)m_oMetric.m_lMillimetresVer; CString strOverlay = _T(""); strOverlay.Format(_T("%d%lf%lf%lf%lf"), m_dStartTime, m_dEndTime, (int)m_nAlpha, dCentreX, dCentreY, dWidth, dHeight, (LONG)m_dRotate); int lIndex = m_strFileName.Find(L"file:///"); if (0 == lIndex) { m_strFileName = m_strFileName.Mid(8); m_strFileName.Replace('/', '\\'); } CString strFileName = StreamUtils::ConvertCStringWToCString(m_strFileName); NSAttributes::CorrectXmlString(strFileName); CString strSingleSource = _T(""); strSingleSource.Format(_T(""), strFileName); return _T("") + strOverlay + strSingleSource + _T(""); } virtual IElement* CreateDublicate() { CVideoElement* pVideoElement = new CVideoElement(); SetProperiesToDublicate((IElement*)pVideoElement); pVideoElement->m_strFileName = m_strFileName; pVideoElement->m_nAlpha = m_nAlpha; pVideoElement->m_dVideoDuration = m_dVideoDuration; return (IElement*)pVideoElement; } }; class CImageElement : public IElement { public: CStringW m_strFileName; BYTE m_nAlpha; bool m_bApplyBounds; CDoubleRect m_rcImageBounds; CString m_strEffects; public: CImageElement():IElement() { m_bIsBackground = FALSE; m_pStream = NULL; m_lOffsetTextStyle = -1; m_lOffsetTextProp = -1; m_lID = -1; m_lMasterID = -1; m_lPlaceholderID = -1; m_lPlaceholderPosition = -1; m_lPersistIndex = -1; m_etType = etPicture; m_rcBounds.left = 0; m_rcBounds.top = 0; m_rcBounds.right = 1; m_rcBounds.bottom = 1; m_rcBoundsOriginal.left = 0; m_rcBoundsOriginal.top = 0; m_rcBoundsOriginal.right = 1; m_rcBoundsOriginal.bottom = 1; m_strFileName = _T(""); m_dStartTime = 0.0; m_dEndTime = 30.0; m_nAlpha = 0xFF; m_bApplyBounds = false; m_rcImageBounds.top = 0.0; m_rcImageBounds.left = 0.0; m_rcImageBounds.right = 0.0; m_rcImageBounds.bottom = 0.0; m_strEffects = _T(""); } virtual ~CImageElement() { } virtual CString ToXml() { LONG lFlags = 0; if (m_bFlipH) lFlags |= 0x0001; if (m_bFlipV) lFlags |= 0x0002; CString strFileName = StreamUtils::ConvertCStringWToCString(m_strFileName); NSAttributes::CorrectXmlString(strFileName); CString strEffect = _T(""); strEffect.Format(_T("\ "), (LONG)m_rcBounds.left, (LONG)m_rcBounds.top, (LONG)m_rcBounds.right, (LONG)m_rcBounds.bottom, m_dRotate, lFlags, StreamUtils::ConvertCStringWToCString(m_strFileName), m_oMetric.m_lMillimetresHor, m_oMetric.m_lMillimetresVer, m_dStartTime, m_dEndTime); return strEffect; } virtual void SetUpProperty(CProperty* pProp, CElementsContainer* pSlide); virtual IElement* CreateDublicate() { CImageElement* pImageElement = new CImageElement(); SetProperiesToDublicate((IElement*)pImageElement); pImageElement->m_strFileName = m_strFileName; pImageElement->m_nAlpha = m_nAlpha; pImageElement->m_bApplyBounds = m_bApplyBounds; pImageElement->m_rcImageBounds.top = m_rcImageBounds.top; pImageElement->m_rcImageBounds.left = m_rcImageBounds.left; pImageElement->m_rcImageBounds.right = m_rcImageBounds.right; pImageElement->m_rcImageBounds.bottom = m_rcImageBounds.bottom; pImageElement->m_strEffects = m_strEffects; return (IElement*)pImageElement; } }; class CTextElement : public IElement { public: CTextAttributesEx m_oSettings; public: CTextElement():IElement() { m_bIsBackground = FALSE; m_pStream = NULL; m_lOffsetTextStyle = -1; m_lOffsetTextProp = -1; m_lID = -1; m_lMasterID = -1; m_lPlaceholderID = -1; m_lPlaceholderPosition = -1; m_lPersistIndex = -1; m_etType = etText; } virtual ~CTextElement() { } virtual CString ToXml() { CGeomShapeInfo oInfo; oInfo.SetBounds(m_rcBounds); oInfo.m_dRotate = m_dRotate; oInfo.m_bFlipH = m_bFlipH; oInfo.m_bFlipV = m_bFlipV; CString strXml = m_oSettings.ToString(oInfo, m_oMetric, m_dStartTime, m_dEndTime); return strXml; } virtual IElement* CreateDublicate() { CTextElement* pTextElement = new CTextElement(); SetProperiesToDublicate((IElement*)pTextElement); pTextElement->m_oSettings = m_oSettings; return (IElement*)pTextElement; } }; class CShapeElement : public IElement { private: NSBaseShape::ClassType m_ClassType; public: int m_lShapeType; CString m_strXmlTransform; CShape m_oShape; public: CShapeElement(NSBaseShape::ClassType ClassType, int eType) :IElement(), m_strXmlTransform(_T("")), m_lShapeType(eType), m_oShape(ClassType, eType) { m_bIsBackground = FALSE; m_ClassType = ClassType; m_pStream = NULL; m_lOffsetTextStyle = -1; m_lOffsetTextProp = -1; m_lID = -1; m_lMasterID = -1; m_lPlaceholderID = -1; m_lPlaceholderPosition = -1; m_lPersistIndex = -1; m_etType = etShape; m_oShape.m_rcBounds = m_rcBounds; m_oShape.m_dStartTime = m_dStartTime; m_oShape.m_dStartTime = m_dEndTime; } CShapeElement(const CString& str):IElement(), m_oShape(NSBaseShape::unknown, 0x1000) { m_lShapeType = 0x1000; m_oShape.LoadFromXML(str); m_ClassType = m_oShape.m_pShape->GetClassType(); } virtual ~CShapeElement() { } virtual CString ToXml() { m_strXmlTransform = _T(""); CGeomShapeInfo oInfo; oInfo.SetBounds(m_rcBounds); oInfo.m_dRotate = m_dRotate; oInfo.m_bFlipH = m_bFlipH; oInfo.m_bFlipV = m_bFlipV; m_strXmlTransform = m_oShape.ToXml(oInfo, m_oMetric, m_dStartTime, m_dEndTime); return m_strXmlTransform; } virtual void SetUpProperties(CProperties* pProps, CElementsContainer* pSlide); virtual IElement* CreateDublicate() { CShapeElement* pShapeElement = new CShapeElement(m_ClassType, m_lShapeType); SetProperiesToDublicate((IElement*)pShapeElement); m_oShape.SetToDublicate(&pShapeElement->m_oShape); pShapeElement->m_strXmlTransform = m_strXmlTransform; return (IElement*)pShapeElement; } }; class CAudioElement : public IElement { public: CStringW m_strFileName; BYTE m_nAmplify; bool m_bWithVideo; double m_dAudioDuration; bool m_bLoop; double m_dClipStartTime; double m_dClipEndTime; public: CAudioElement():IElement() { m_bIsBackground = FALSE; m_pStream = NULL; m_lOffsetTextStyle = -1; m_lOffsetTextProp = -1; m_lID = -1; m_lMasterID = -1; m_lPlaceholderID = -1; m_lPlaceholderPosition = -1; m_lPersistIndex = -1; m_etType = etAudio; m_rcBounds.left = 0; m_rcBounds.top = 0; m_rcBounds.right = 1; m_rcBounds.bottom = 1; m_rcBoundsOriginal.left = 0; m_rcBoundsOriginal.top = 0; m_rcBoundsOriginal.right = 1; m_rcBoundsOriginal.bottom = 1; m_strFileName = _T(""); m_dStartTime = 0.0; m_dEndTime = 30.0; m_nAmplify = 100; m_bWithVideo = false; m_dAudioDuration = 0.0; m_bLoop = false; m_dClipStartTime = 0.0; m_dClipEndTime = -1.0; } virtual ~CAudioElement() { } virtual CString ToXml() { CString strOverlay1 = _T(""); CString strOverlay2 = _T(""); strOverlay1.Format(_T(""), m_dStartTime, m_dEndTime-m_dStartTime, (double)m_nAmplify); int lIndex = m_strFileName.Find(L"file:///"); if (0 == lIndex) { m_strFileName = m_strFileName.Mid(8); m_strFileName.Replace('/', '\\'); m_strFileName.Replace(L"%20", L" "); } CString strFileName = StreamUtils::ConvertCStringWToCString(m_strFileName); NSAttributes::CorrectXmlString(strFileName); strOverlay2.Format(_T(""), m_dClipStartTime, m_dClipEndTime, strFileName); strOverlay1 += strOverlay2; return strOverlay1; } virtual IElement* CreateDublicate() { CAudioElement* pAudioElement = new CAudioElement(); SetProperiesToDublicate((IElement*)pAudioElement); pAudioElement->m_strFileName = m_strFileName; pAudioElement->m_nAmplify = m_nAmplify; pAudioElement->m_bWithVideo = m_bWithVideo; pAudioElement->m_dAudioDuration = m_dAudioDuration; pAudioElement->m_bLoop = m_bLoop; pAudioElement->m_dClipStartTime = m_dClipStartTime; pAudioElement->m_dClipEndTime = m_dClipEndTime; return (IElement*)pAudioElement; } };