222 lines
4.9 KiB
C++
222 lines
4.9 KiB
C++
#include "TblCell.h"
|
|
#include "CtrlCharacter.h"
|
|
|
|
#include "../Common/NodeNames.h"
|
|
|
|
namespace HWP
|
|
{
|
|
CTblCell::CTblCell(int nSize, CHWPStream& oBuffer, int nOff, int nVersion)
|
|
: m_nSize(nSize)
|
|
{
|
|
oBuffer.SavePosition();
|
|
|
|
oBuffer.Skip(2);
|
|
|
|
oBuffer.ReadShort(m_shColAddr);
|
|
oBuffer.ReadShort(m_shRowAddr);
|
|
oBuffer.ReadShort(m_shColSpan);
|
|
oBuffer.ReadShort(m_shRowSpan);
|
|
oBuffer.ReadInt(m_nWidth);
|
|
oBuffer.ReadInt(m_nHeight);
|
|
|
|
for (unsigned int unIndex = 0; unIndex < 4; ++unIndex)
|
|
m_arMargin[unIndex] = oBuffer.ReadShort();
|
|
|
|
oBuffer.ReadShort(m_shBorderFill);
|
|
|
|
oBuffer.Skip(nSize - oBuffer.GetDistanceToLastPos(true));
|
|
}
|
|
|
|
CTblCell::CTblCell(CXMLReader& oReader, EHanType eType)
|
|
{
|
|
switch (eType)
|
|
{
|
|
case EHanType::HWPX: ReadFromHWPX(oReader); return;
|
|
case EHanType::HWPML: ReadFromHWPML(oReader); return;
|
|
default: break;
|
|
}
|
|
}
|
|
|
|
void CTblCell::ReadFromHWPX(CXMLReader &oReader)
|
|
{
|
|
m_shBorderFill = oReader.GetAttributeInt("borderFillIDRef");
|
|
|
|
WHILE_READ_NEXT_NODE_WITH_NAME(oReader)
|
|
{
|
|
if ("hp:cellAddr" == sNodeName)
|
|
{
|
|
START_READ_ATTRIBUTES(oReader)
|
|
{
|
|
if ("colAddr" == sAttributeName)
|
|
m_shColAddr = oReader.GetInt();
|
|
else if ("rowAddr" == sAttributeName)
|
|
m_shRowAddr = oReader.GetInt();
|
|
}
|
|
END_READ_ATTRIBUTES(oReader)
|
|
}
|
|
else if ("hp:cellSpan" == sNodeName)
|
|
{
|
|
START_READ_ATTRIBUTES(oReader)
|
|
{
|
|
if ("colSpan" == sAttributeName)
|
|
m_shColSpan = oReader.GetInt();
|
|
else if ("rowSpan" == sAttributeName)
|
|
m_shRowSpan = oReader.GetInt();
|
|
}
|
|
END_READ_ATTRIBUTES(oReader)
|
|
}
|
|
else if ("hp:cellSz" == sNodeName)
|
|
{
|
|
START_READ_ATTRIBUTES(oReader)
|
|
{
|
|
if ("width" == sAttributeName)
|
|
m_nWidth = oReader.GetInt();
|
|
else if ("height" == sAttributeName)
|
|
m_nHeight = oReader.GetInt();
|
|
}
|
|
END_READ_ATTRIBUTES(oReader)
|
|
}
|
|
else if ("hp:cellSz" == sNodeName)
|
|
ReadCellMargin(oReader, EHanType::HWPX);
|
|
else if ("hp:subList" == sNodeName)
|
|
{
|
|
m_eVertAlign = ::HWP::GetVertAlign(oReader.GetAttributeA("vertAlign"), EHanType::HWPX);
|
|
|
|
WHILE_READ_NEXT_NODE_WITH_ONE_NAME(oReader, "hp:p")
|
|
ReadCell(oReader, EHanType::HWPX);
|
|
END_WHILE
|
|
}
|
|
}
|
|
END_WHILE
|
|
}
|
|
|
|
void CTblCell::ReadFromHWPML(CXMLReader &oReader)
|
|
{
|
|
START_READ_ATTRIBUTES(oReader)
|
|
{
|
|
if ("Name" == sAttributeName)
|
|
m_sMergedColName = oReader.GetText();
|
|
else if ("ColAddr" == sAttributeName)
|
|
m_shColAddr = oReader.GetInt();
|
|
else if ("RowAddr" == sAttributeName)
|
|
m_shRowAddr = oReader.GetInt();
|
|
else if ("ColSpan" == sAttributeName)
|
|
m_shColSpan = oReader.GetInt();
|
|
else if ("RowSpan" == sAttributeName)
|
|
m_shRowSpan = oReader.GetInt();
|
|
else if ("Width" == sAttributeName)
|
|
m_nWidth = oReader.GetInt();
|
|
else if ("Height" == sAttributeName)
|
|
m_nHeight = oReader.GetInt();
|
|
else if ("BorderFill" == sAttributeName)
|
|
m_shBorderFill = oReader.GetInt();
|
|
}
|
|
END_READ_ATTRIBUTES(oReader)
|
|
|
|
WHILE_READ_NEXT_NODE_WITH_NAME(oReader)
|
|
{
|
|
if ("CELLMARGIN" == sNodeName)
|
|
ReadCellMargin(oReader, EHanType::HWPML);
|
|
else if ("PARALIST" == sNodeName)
|
|
{
|
|
m_eVertAlign = ::HWP::GetVertAlign(oReader.GetAttributeA("VertAlign"), EHanType::HWPML);
|
|
|
|
WHILE_READ_NEXT_NODE_WITH_ONE_NAME(oReader, "P")
|
|
ReadCell(oReader, EHanType::HWPML);
|
|
END_WHILE
|
|
}
|
|
}
|
|
END_WHILE
|
|
}
|
|
|
|
void CTblCell::ReadCellMargin(CXMLReader &oReader, EHanType eType)
|
|
{
|
|
START_READ_ATTRIBUTES(oReader)
|
|
{
|
|
if (GetAttributeName(EAttribute::Left, eType) == sAttributeName)
|
|
m_arMargin[0] = oReader.GetInt();
|
|
else if (GetAttributeName(EAttribute::Right, eType) == sAttributeName)
|
|
m_arMargin[1] = oReader.GetInt();
|
|
else if (GetAttributeName(EAttribute::Top, eType) == sAttributeName)
|
|
m_arMargin[2] = oReader.GetInt();
|
|
else if (GetAttributeName(EAttribute::Bottom, eType) == sAttributeName)
|
|
m_arMargin[3] = oReader.GetInt();
|
|
}
|
|
END_READ_ATTRIBUTES(oReader)
|
|
}
|
|
|
|
void HWP::CTblCell::ReadCell(CXMLReader &oReader, EHanType eType)
|
|
{
|
|
CCellParagraph *pCellParagraphs = new CCellParagraph(oReader, eType);
|
|
|
|
if (nullptr == pCellParagraphs)
|
|
return;
|
|
|
|
if (ECtrlObjectType::Character != pCellParagraphs->GetCtrls().back()->GetCtrlType())
|
|
pCellParagraphs->AddCtrl(new CCtrlCharacter(L" _", ECtrlCharType::PARAGRAPH_BREAK));
|
|
|
|
m_arParas.push_back(pCellParagraphs);
|
|
}
|
|
|
|
void CTblCell::SetVertAlign(EVertAlign eVertAlign)
|
|
{
|
|
m_eVertAlign = eVertAlign;
|
|
}
|
|
|
|
void CTblCell::AddParagraph(CCellParagraph* pParagraph)
|
|
{
|
|
m_arParas.push_back(pParagraph);
|
|
}
|
|
|
|
int CTblCell::GetSize()
|
|
{
|
|
return m_nSize;
|
|
}
|
|
|
|
short CTblCell::GetColAddr() const
|
|
{
|
|
return m_shColAddr;
|
|
}
|
|
|
|
short CTblCell::GetRowAddr() const
|
|
{
|
|
return m_shRowAddr;
|
|
}
|
|
|
|
short CTblCell::GetColSpan() const
|
|
{
|
|
return m_shColSpan;
|
|
}
|
|
|
|
short CTblCell::GetRowSpan() const
|
|
{
|
|
return m_shRowSpan;
|
|
}
|
|
|
|
VECTOR<CCellParagraph*> CTblCell::GetParagraphs() const
|
|
{
|
|
return m_arParas;
|
|
}
|
|
|
|
int CTblCell::GetWidth() const
|
|
{
|
|
return m_nWidth;
|
|
}
|
|
|
|
int CTblCell::GetHeight() const
|
|
{
|
|
return m_nHeight;
|
|
}
|
|
|
|
EVertAlign CTblCell::GetVertAlign() const
|
|
{
|
|
return m_eVertAlign;
|
|
}
|
|
|
|
short CTblCell::GetBorderFillID() const
|
|
{
|
|
return m_shBorderFill;
|
|
}
|
|
|
|
}
|