mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-07-11 14:00:32 +08:00
git-svn-id: svn://fileserver/activex/AVS/Sources/TeamlabOffice/trunk/ServerComponents@65567 954022d7-b5bf-4e40-9824-e11837661b57
485 lines
12 KiB
C++
485 lines
12 KiB
C++
#pragma once
|
|
#include "../TextAttributesEx.h"
|
|
#include "BaseShape/BaseShape.h"
|
|
|
|
#if defined(PPTX_DEF)
|
|
#include "BaseShape/PPTXShape/PPTXShape.h"
|
|
#endif
|
|
|
|
#if defined(PPT_DEF)
|
|
#include "BaseShape/PPTShape/PPTShape.h"
|
|
#endif
|
|
|
|
using namespace NSPresentationEditor;
|
|
|
|
/***************************************************************
|
|
âîò, ñîçäàâàÿ àâòîôèãóðó, èëè ëþáîé äðóãîé ýëåìåíò
|
|
officedrawing, íàñëåäóÿñü îò ýòîãî êëàññà, â êîíñòðóêòîðå
|
|
çàäàåì âñå ñòðîêîâûå ïàðàìåòðû, è âûçûâàåì SetProperties,
|
|
êîòîðûå ïðèäóò, èëè NULL, íî âûçîâ ýòîé ôóíêöèè - ÎÁßÇÀÒÅËÅÍ!!!
|
|
****************************************************************/
|
|
|
|
const LONG c_ShapeDrawType_Graphic = 0x01;
|
|
const LONG c_ShapeDrawType_Text = 0x02;
|
|
const LONG c_ShapeDrawType_All = c_ShapeDrawType_Graphic | c_ShapeDrawType_Text;
|
|
|
|
class CShape
|
|
{
|
|
public:
|
|
double m_dStartTime;
|
|
double m_dEndTime;
|
|
|
|
CDoubleRect m_rcBounds;
|
|
|
|
long m_lLimoX;
|
|
long m_lLimoY;
|
|
|
|
CTextAttributesEx m_oText;
|
|
|
|
|
|
double m_dWidthLogic;
|
|
double m_dHeightLogic;
|
|
|
|
/* â ìèëëèìåòðàõ!!! */
|
|
double m_dTextMarginX;
|
|
double m_dTextMarginY;
|
|
double m_dTextMarginRight;
|
|
double m_dTextMarginBottom;
|
|
|
|
LONG m_lDrawType;
|
|
|
|
CBaseShape* m_pShape;
|
|
|
|
CString m_strPPTXShape;
|
|
public:
|
|
CShape(NSBaseShape::ClassType ClassType, int ShapeType_) : m_rcBounds()
|
|
{
|
|
m_lDrawType = c_ShapeDrawType_All;
|
|
|
|
m_lLimoX = 0;
|
|
m_lLimoY = 0;
|
|
|
|
m_dStartTime = 0.0;
|
|
m_dEndTime = 0.0;
|
|
|
|
m_dWidthLogic = ShapeSize;
|
|
m_dHeightLogic = ShapeSize;
|
|
|
|
m_dTextMarginX = 0;
|
|
m_dTextMarginY = 0;
|
|
m_dTextMarginRight = 0;
|
|
m_dTextMarginBottom = 0;
|
|
|
|
m_strPPTXShape = _T("");
|
|
|
|
m_pShape = NULL;
|
|
|
|
#if defined(PPTX_DEF)
|
|
if (ClassType == NSBaseShape::pptx)
|
|
{
|
|
m_pShape = new CPPTXShape();
|
|
m_pShape->SetType(NSBaseShape::pptx, ShapeType_);
|
|
}
|
|
#endif
|
|
|
|
#if defined(PPT_DEF)
|
|
if (ClassType == NSBaseShape::ppt)
|
|
{
|
|
m_pShape = CPPTShape::CreateByType((PPTShapes::ShapeType)ShapeType_ );
|
|
if (m_pShape == NULL)
|
|
{
|
|
m_pShape = new CPPTShape();
|
|
m_pShape->SetType(NSBaseShape::ppt, ShapeType_);
|
|
}
|
|
|
|
m_dTextMarginX = 2.54;
|
|
m_dTextMarginY = 1.27;
|
|
m_dTextMarginRight = 2.54;
|
|
m_dTextMarginBottom = 1.27;
|
|
|
|
m_dWidthLogic = ShapeSizeVML;
|
|
m_dHeightLogic = ShapeSizeVML;
|
|
}
|
|
#endif
|
|
|
|
}
|
|
|
|
~CShape()
|
|
{
|
|
RELEASEOBJECT(m_pShape);
|
|
}
|
|
|
|
virtual void ReCalculate()
|
|
{
|
|
m_pShape->ReCalculate();
|
|
}
|
|
|
|
|
|
//virtual CString GetTextXml(CGeomShapeInfo& oGeomInfo, CMetricInfo& pInfo, double dStartTime, double dEndTime, CTheme* pTheme, CLayout* pLayout)
|
|
//{
|
|
// if (m_oText.IsEmptyText())
|
|
// return _T("");
|
|
|
|
// GetTextRect(oGeomInfo);
|
|
// return m_oText.ToString(oGeomInfo, pInfo, dStartTime, dEndTime, pTheme, pLayout);
|
|
//}
|
|
|
|
|
|
//virtual CString GetBrushXml()
|
|
//{
|
|
// if (!m_pShape->m_bConcentricFill)
|
|
// return _T("");
|
|
// return m_oBrush.ToString();
|
|
//}
|
|
|
|
//virtual CString GetPenXml()
|
|
//{
|
|
// return m_oPen.ToString();
|
|
//}
|
|
|
|
virtual void GetTextRect(CGeomShapeInfo& oInfo)
|
|
{
|
|
// ïîêà ñäåëàåì òèïî - çàãëóøêó
|
|
// çäåñü - ïåðåñ÷åò êîîðäèíàò, ó íàñ ïîêà textrect = bounds
|
|
// ïîýòîìó ïîêà íè÷åãî íå ìåíÿåì...
|
|
|
|
bool bIsFound = false;
|
|
|
|
#ifdef PPT_DEF
|
|
// íå î÷åíü óäîáíî ìíå ïåðåñ÷åò ðåêòîâ âåñòè
|
|
// ñäåëàþ òàê, îòäåëüíûì ìåòîäîì â ïïò
|
|
double dPercentLeft = 0;
|
|
double dPercentTop = 0;
|
|
double dPercentRight = 0;
|
|
double dPercentBottom = 0;
|
|
|
|
if (NSBaseShape::ppt == m_pShape->GetClassType())
|
|
{
|
|
// êàê áóäòî ìîãëî áûòü èíà÷å
|
|
CPPTShape* pPPTShape = dynamic_cast<CPPTShape*>(m_pShape);
|
|
if (NULL != pPPTShape)
|
|
{
|
|
pPPTShape->CalcTextRectOffsets(dPercentLeft, dPercentTop, dPercentRight, dPercentBottom);
|
|
|
|
oInfo.m_dLeft += (dPercentLeft * oInfo.m_dWidth);
|
|
oInfo.m_dTop += (dPercentTop * oInfo.m_dHeight);
|
|
|
|
oInfo.m_dWidth -= ((dPercentLeft + dPercentRight) * oInfo.m_dWidth);
|
|
oInfo.m_dHeight -= ((dPercentTop + dPercentBottom) * oInfo.m_dHeight);
|
|
}
|
|
}
|
|
|
|
// òîëüêî ó÷òåì ìàðãèíû
|
|
oInfo.m_dLeft += m_dTextMarginX;
|
|
oInfo.m_dTop += m_dTextMarginY;
|
|
oInfo.m_dWidth -= (m_dTextMarginX + m_dTextMarginRight);
|
|
oInfo.m_dHeight -= (m_dTextMarginY + m_dTextMarginBottom);
|
|
|
|
bIsFound = true;
|
|
#endif
|
|
#ifdef PPTX_DEF
|
|
|
|
if (!bIsFound)
|
|
{
|
|
if (0 < m_pShape->m_arTextRects.size())
|
|
{
|
|
double koef = (std::max)(oInfo.m_dWidth, oInfo.m_dHeight)/ShapeSize;
|
|
oInfo.m_dLeft += m_pShape->m_arTextRects[0].left * koef;
|
|
oInfo.m_dTop += m_pShape->m_arTextRects[0].top * koef;
|
|
oInfo.m_dWidth = (m_pShape->m_arTextRects[0].right - m_pShape->m_arTextRects[0].left) * koef;
|
|
oInfo.m_dHeight = (m_pShape->m_arTextRects[0].bottom - m_pShape->m_arTextRects[0].top) * koef;
|
|
|
|
oInfo.m_dLeft += m_dTextMarginX;
|
|
oInfo.m_dTop += m_dTextMarginY;
|
|
oInfo.m_dWidth -= (m_dTextMarginX + m_dTextMarginRight);
|
|
oInfo.m_dHeight -= (m_dTextMarginY + m_dTextMarginBottom);
|
|
}
|
|
|
|
bIsFound = true;
|
|
}
|
|
#endif
|
|
|
|
|
|
if (oInfo.m_dWidth < 0)
|
|
oInfo.m_dWidth = 1;
|
|
if (oInfo.m_dHeight < 0)
|
|
oInfo.m_dHeight = 1;
|
|
}
|
|
|
|
virtual void GetTextRect(CDoubleRect& oInfo)
|
|
{
|
|
// ïîêà ñäåëàåì òèïî - çàãëóøêó
|
|
// çäåñü - ïåðåñ÷åò êîîðäèíàò, ó íàñ ïîêà textrect = bounds
|
|
// ïîýòîìó ïîêà íè÷åãî íå ìåíÿåì...
|
|
|
|
double dLeft = oInfo.left;
|
|
double dTop = oInfo.top;
|
|
double dWidth = oInfo.GetWidth();
|
|
double dHeight = oInfo.GetHeight();
|
|
|
|
bool bIsFound = false;
|
|
|
|
#ifdef PPT_DEF
|
|
// íå î÷åíü óäîáíî ìíå ïåðåñ÷åò ðåêòîâ âåñòè
|
|
// ñäåëàþ òàê, îòäåëüíûì ìåòîäîì â ïïò
|
|
double dPercentLeft = 0;
|
|
double dPercentTop = 0;
|
|
double dPercentRight = 0;
|
|
double dPercentBottom = 0;
|
|
|
|
if ((m_pShape) && (NSBaseShape::ppt == m_pShape->GetClassType()))
|
|
{
|
|
// êàê áóäòî ìîãëî áûòü èíà÷å
|
|
CPPTShape* pPPTShape = dynamic_cast<CPPTShape*>(m_pShape);
|
|
if (NULL != pPPTShape)
|
|
{
|
|
//pPPTShape->CalcTextRectOffsets(dPercentLeft, dPercentTop, dPercentRight, dPercentBottom);
|
|
|
|
//dLeft += (dPercentLeft * dWidth);
|
|
//dTop += (dPercentTop * dHeight);
|
|
|
|
//dWidth -= ((dPercentLeft + dPercentRight) * dWidth);
|
|
//dHeight -= ((dPercentTop + dPercentBottom) * dHeight);
|
|
}
|
|
}
|
|
|
|
// òîëüêî ó÷òåì ìàðãèíû
|
|
dLeft += m_dTextMarginX;
|
|
dTop += m_dTextMarginY;
|
|
dWidth -= (m_dTextMarginX + m_dTextMarginRight);
|
|
dHeight -= (m_dTextMarginY + m_dTextMarginBottom);
|
|
|
|
bIsFound = true;
|
|
#endif
|
|
#ifdef PPTX_DEF
|
|
|
|
if (!bIsFound && m_pShape)
|
|
{
|
|
if (0 < m_pShape->m_arTextRects.size())
|
|
{
|
|
double koef = (std::max)(dWidth, dHeight)/ShapeSize;
|
|
dLeft += m_pShape->m_arTextRects[0].left * koef;
|
|
dTop += m_pShape->m_arTextRects[0].top * koef;
|
|
dWidth = (m_pShape->m_arTextRects[0].right - m_pShape->m_arTextRects[0].left) * koef;
|
|
dHeight = (m_pShape->m_arTextRects[0].bottom - m_pShape->m_arTextRects[0].top) * koef;
|
|
|
|
dLeft += m_dTextMarginX;
|
|
dTop += m_dTextMarginY;
|
|
dWidth -= (m_dTextMarginX + m_dTextMarginRight);
|
|
dHeight -= (m_dTextMarginY + m_dTextMarginBottom);
|
|
}
|
|
|
|
bIsFound = true;
|
|
}
|
|
#endif
|
|
|
|
|
|
if (dWidth < 0)
|
|
dWidth = 1;
|
|
if (dHeight < 0)
|
|
dHeight = 1;
|
|
|
|
oInfo.left = dLeft;
|
|
oInfo.top = dTop;
|
|
oInfo.right = dLeft + dWidth;
|
|
oInfo.bottom = dTop + dHeight;
|
|
}
|
|
|
|
//virtual CString ToXml(CGeomShapeInfo& oGeomInfo, CMetricInfo& pInfo, double dStartTime, double dEndTime, CTheme* pTheme, CLayout* pLayout)
|
|
//{
|
|
// CString strImageTransform = _T("");
|
|
|
|
// oGeomInfo.m_dLimoX = m_lLimoX;
|
|
// oGeomInfo.m_dLimoY = m_lLimoY;
|
|
|
|
// m_pShape->m_oPath.SetCoordsize((LONG)m_dWidthLogic, (LONG)m_dHeightLogic);
|
|
//
|
|
// CBrush brush; //êîïèè ñ óðîâíÿ âûøå íóæíû
|
|
// CPen pen;
|
|
// CString strDrawing = m_pShape->ToXML(oGeomInfo, pInfo, dStartTime, dEndTime, brush, pen);
|
|
// if (m_lDrawType & c_ShapeDrawType_Graphic)
|
|
// {
|
|
// strImageTransform += strDrawing;
|
|
// }
|
|
// if (m_lDrawType & c_ShapeDrawType_Text)
|
|
// {
|
|
// strImageTransform += GetTextXml(oGeomInfo, pInfo, dStartTime, dEndTime, pTheme, pLayout);
|
|
// }
|
|
|
|
// return strImageTransform;
|
|
//}
|
|
|
|
void ToRenderer(IRenderer* pRenderer, CGeomShapeInfo& oGeomInfo, CMetricInfo& pInfo, double dStartTime, double dEndTime)
|
|
{
|
|
if (m_pShape == NULL)
|
|
return;
|
|
oGeomInfo.m_dLimoX = m_lLimoX;
|
|
oGeomInfo.m_dLimoY = m_lLimoY;
|
|
|
|
m_pShape->m_oPath.SetCoordsize((LONG)m_dWidthLogic, (LONG)m_dHeightLogic);
|
|
|
|
if (m_lDrawType & c_ShapeDrawType_Graphic)
|
|
{
|
|
//m_oPen.SetToRenderer(pRenderer);
|
|
//m_oBrush.SetToRenderer(pRenderer);
|
|
//m_oShadow.SetToRenderer(pRenderer);
|
|
CBrush brush; //êîïèè ñ óðîâíÿ âûøå íóæíû
|
|
CPen pen;
|
|
|
|
m_pShape->ToRenderer(pRenderer, oGeomInfo, dStartTime, dEndTime, pen, brush, pInfo);
|
|
}
|
|
}
|
|
|
|
|
|
virtual bool LoadFromXML(const CString& xml)
|
|
{
|
|
XmlUtils::CXmlNode oNodePict;
|
|
if (oNodePict.FromXmlString(xml))
|
|
{
|
|
return LoadFromXML(oNodePict);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
virtual bool LoadFromXML(XmlUtils::CXmlNode& root)
|
|
{
|
|
#if defined(PPTX_DEF)
|
|
if(_T("ooxml-shape") == root.GetName())
|
|
{
|
|
if(m_pShape != NULL)
|
|
delete m_pShape;
|
|
m_pShape = new CPPTXShape();
|
|
//return m_pShape->LoadFromXML(xml);
|
|
return ((CPPTXShape*)m_pShape)->LoadFromXML(root);
|
|
}
|
|
#endif
|
|
|
|
#if defined(PPT_DEF)
|
|
if(_T("shape") == root.GetName())
|
|
{
|
|
if(m_pShape != NULL)
|
|
delete m_pShape;
|
|
m_pShape = new CPPTShape();
|
|
|
|
SetCoordSize(root);
|
|
SetPen (root);
|
|
SetBrush (root);
|
|
|
|
//return m_pShape->LoadFromXML(xml);
|
|
return ((CPPTShape*)m_pShape)->LoadFromXML(root);
|
|
}
|
|
#endif
|
|
|
|
return false;
|
|
}
|
|
|
|
virtual bool SetToDublicate(CShape* Shape)
|
|
{
|
|
if(Shape == NULL)
|
|
return false;
|
|
|
|
Shape->m_dStartTime = m_dStartTime;
|
|
Shape->m_dEndTime = m_dEndTime;
|
|
|
|
Shape->m_rcBounds = m_rcBounds;
|
|
|
|
Shape->m_lLimoX = m_lLimoX;
|
|
Shape->m_lLimoY = m_lLimoY;
|
|
|
|
Shape->m_oText = m_oText;
|
|
|
|
Shape->m_dWidthLogic = m_dWidthLogic;
|
|
Shape->m_dHeightLogic = m_dHeightLogic;
|
|
|
|
Shape->m_lDrawType = m_lDrawType;
|
|
|
|
Shape->m_dTextMarginX = m_dTextMarginX;
|
|
Shape->m_dTextMarginY = m_dTextMarginY;
|
|
Shape->m_dTextMarginRight = m_dTextMarginRight;
|
|
Shape->m_dTextMarginBottom = m_dTextMarginBottom;
|
|
|
|
if (m_pShape)
|
|
return m_pShape->SetToDublicate(Shape->m_pShape);
|
|
return true;
|
|
}
|
|
|
|
|
|
void SetPen(XmlUtils::CXmlNode& oNodePict)
|
|
{
|
|
XmlUtils::CXmlNode oNodeTemplate;
|
|
if (oNodePict.GetNode(_T("stroke"), oNodeTemplate))
|
|
{
|
|
CString strColor = oNodeTemplate.GetAttributeOrValue(_T("strokecolor"));
|
|
//if (strColor != _T(""))
|
|
// m_oPen.Color.FromString(strColor);
|
|
//CString strSize = oNodeTemplate.GetAttributeOrValue(_T("strokeweight"));
|
|
//if (strSize != _T(""))
|
|
// m_oPen.Size = XmlUtils::GetDouble(strSize);
|
|
//CString strStroke = oNodeTemplate.GetAttributeOrValue(_T("stroked"));
|
|
//if (strStroke != _T(""))
|
|
// m_oPen.Alpha = 0;
|
|
|
|
}
|
|
if (oNodePict.GetNode(_T("v:stroke"), oNodeTemplate))
|
|
{
|
|
CString strColor = oNodeTemplate.GetAttributeOrValue(_T("dashstyle"));
|
|
//if (strColor != _T(""))
|
|
// m_oPen.DashStyle = XmlUtils::GetInteger(strColor);
|
|
}
|
|
}
|
|
|
|
void SetBrush(XmlUtils::CXmlNode& oNodePict)
|
|
{
|
|
XmlUtils::CXmlNode oNodeTemplate;
|
|
if (oNodePict.GetNode(_T("fillcolor"), oNodeTemplate))
|
|
{
|
|
CString strColor = oNodeTemplate.GetAttributeOrValue(_T("val"));
|
|
//if (strColor != _T(""))
|
|
// m_oBrush.Color1.FromString(strColor);
|
|
}
|
|
}
|
|
|
|
void SetCoordSize(XmlUtils::CXmlNode& oNodePict)
|
|
{
|
|
if (_T("shape") == oNodePict.GetName())
|
|
{
|
|
XmlUtils::CXmlNode oNodeTemplate;
|
|
if (oNodePict.GetNode(_T("coordsize"), oNodeTemplate))
|
|
{
|
|
CString strCoordSize = oNodeTemplate.GetAttributeOrValue(_T("val"));
|
|
if (strCoordSize != _T(""))
|
|
{
|
|
std::vector<CString> oArray;
|
|
NSStringUtils::ParseString(_T(","), strCoordSize, &oArray);
|
|
m_dWidthLogic = XmlUtils::GetInteger(oArray[0]);
|
|
m_dHeightLogic = XmlUtils::GetInteger(oArray[1]);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
CString id = oNodePict.GetAttributeOrValue(_T("type"));
|
|
if (id != _T(""))
|
|
{
|
|
m_dWidthLogic = 21600;
|
|
m_dHeightLogic = 21600;
|
|
}
|
|
else
|
|
{
|
|
XmlUtils::CXmlNode oNodeTemplate;
|
|
if (oNodePict.GetNode(_T("template"), oNodeTemplate))
|
|
{
|
|
CString strCoordSize = oNodeTemplate.GetAttributeOrValue(_T("coordsize"));
|
|
if (strCoordSize != _T(""))
|
|
{
|
|
std::vector<CString> oArray;
|
|
NSStringUtils::ParseString(_T(","), strCoordSize, &oArray);
|
|
m_dWidthLogic = XmlUtils::GetInteger(oArray[0]);
|
|
m_dHeightLogic = XmlUtils::GetInteger(oArray[1]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|