#pragma once #include "Structures.h" #include "TextStructures.h" namespace NSPresentationEditor { class CTheme; class CLayout; class CTextAttributesEx { public: LONG m_lTextMasterType; // only ppt property public: DWORD m_lTextType; LONG m_lPlaceholderType; LONG m_lPlaceholderID; // граница RECT m_oBounds; // настройки по-умолчанию CTextAttributes m_oAttributes; CAtlArray m_arParagraphs; // параметры ВСЕГО текста (наверное тут их много будет потом) BOOL m_bVertical; BOOL m_bRightToLeft; LONG m_lWrapMode; // 0 - square, default; 1 - none wrap // для ппт. чтобы не менять счас ничего CTextRuler m_oRuler; CTextStyles m_oLayoutStyles; CTextStyles m_oStyles; // из пптх bool m_bIsSlideFontRef; LONG m_lFontRef; public: CTextAttributesEx() : m_oAttributes(), m_arParagraphs(), m_oRuler(), m_oLayoutStyles(), m_oStyles() { m_lTextType = 0; m_lPlaceholderType = -1; m_lPlaceholderID = -1; m_lFontRef = -1; m_bIsSlideFontRef = false; m_oBounds.left = 0; m_oBounds.top = 0; m_oBounds.right = 50; m_oBounds.bottom = 50; m_bVertical = FALSE; m_bRightToLeft = FALSE; m_lWrapMode = 0; m_lTextMasterType = -1; } CTextAttributesEx& operator =(const CTextAttributesEx& oSrc) { m_oBounds = oSrc.m_oBounds; m_lTextType = oSrc.m_lTextType; m_lPlaceholderType = oSrc.m_lPlaceholderType; m_lPlaceholderID = oSrc.m_lPlaceholderID; m_lFontRef = oSrc.m_lFontRef; m_bIsSlideFontRef = oSrc.m_bIsSlideFontRef; m_oAttributes = oSrc.m_oAttributes; m_bVertical = oSrc.m_bVertical; m_bRightToLeft = oSrc.m_bRightToLeft; m_lWrapMode = oSrc.m_lWrapMode; m_arParagraphs.Copy(oSrc.m_arParagraphs); m_oRuler = oSrc.m_oRuler; m_oLayoutStyles = oSrc.m_oLayoutStyles; m_oStyles = oSrc.m_oStyles; m_lTextMasterType = oSrc.m_lTextMasterType; return *this; } CTextAttributesEx(const CTextAttributesEx& oSrc) { *this = oSrc; } CString ToString(CGeomShapeInfo& oInfo, CMetricInfo& pMetricInfo, double dStartTime, double dEndTime, CTheme* pTheme, CLayout* pLayout); CString ToHTML(CGeomShapeInfo& oInfo, CMetricInfo& pMetricInfo, double dStartTime, double dEndTime, const CElemInfo& oElemInfo, CTheme* pTheme, CLayout* pLayout); public: inline void NormalizeString(CString& strText) { strText.Replace(_T("&"), _T("&")); strText.Replace(_T("'"), _T("'")); strText.Replace(_T("<"), _T("<")); strText.Replace(_T(">"), _T(">")); strText.Replace(_T("\""), _T(""")); // и на всякий случай уберем в конце нули BSTR bsText = strText.AllocSysString(); strText = (CString)bsText; SysFreeString(bsText); } void RecalcParagraphs(CTheme* pTheme = NULL); void CorrectRuler() { size_t lCount = m_arParagraphs.GetCount(); for (size_t i = 0; i < lCount; ++i) { CTextPFRun* pPar = &m_arParagraphs[i].m_oPFRun; WORD lIndentLevel = (WORD)m_arParagraphs[i].m_lTextLevel; switch (lIndentLevel) { case 0: { if (m_oRuler.LeftMargin1.is_init()) pPar->leftMargin = (LONG)m_oRuler.LeftMargin1.get(); if (m_oRuler.Indent1.is_init()) pPar->indent = (LONG)m_oRuler.Indent1.get(); if (pPar->indent.is_init() && pPar->leftMargin.get()) pPar->indent.get() -= pPar->leftMargin.get(); break; } case 1: { if (m_oRuler.LeftMargin2.is_init()) pPar->leftMargin = (LONG)m_oRuler.LeftMargin2.get(); if (m_oRuler.Indent2.is_init()) pPar->indent = (LONG)m_oRuler.Indent2.get(); if (pPar->indent.is_init() && pPar->leftMargin.get()) pPar->indent.get() -= pPar->leftMargin.get(); break; } case 2: { if (m_oRuler.LeftMargin3.is_init()) pPar->leftMargin = (LONG)m_oRuler.LeftMargin3.get(); if (m_oRuler.Indent3.is_init()) pPar->indent = (LONG)m_oRuler.Indent3.get(); if (pPar->indent.is_init() && pPar->leftMargin.get()) pPar->indent.get() -= pPar->leftMargin.get(); break; } case 3: { if (m_oRuler.LeftMargin4.is_init()) pPar->leftMargin = (LONG)m_oRuler.LeftMargin4.get(); if (m_oRuler.Indent4.is_init()) pPar->indent = (LONG)m_oRuler.Indent4.get(); if (pPar->indent.is_init() && pPar->leftMargin.get()) pPar->indent.get() -= pPar->leftMargin.get(); break; } case 4: { if (m_oRuler.LeftMargin5.is_init()) pPar->leftMargin = (LONG)m_oRuler.LeftMargin5.get(); if (m_oRuler.Indent5.is_init()) pPar->indent = (LONG)m_oRuler.Indent5.get(); if (pPar->indent.is_init() && pPar->leftMargin.get()) pPar->indent.get() -= pPar->leftMargin.get(); break; } default: break; }; } } void CorrectRuler(CTextPFRun* pPar, WORD lIndentLevel) { switch (lIndentLevel) { case 0: { if (m_oRuler.LeftMargin1.is_init()) pPar->leftMargin = (LONG)m_oRuler.LeftMargin1.get(); if (m_oRuler.Indent1.is_init()) pPar->indent = (LONG)m_oRuler.Indent1.get(); if (pPar->indent.is_init() && pPar->leftMargin.get()) pPar->indent.get() -= pPar->leftMargin.get(); break; } case 1: { if (m_oRuler.LeftMargin2.is_init()) pPar->leftMargin = (LONG)m_oRuler.LeftMargin2.get(); if (m_oRuler.Indent2.is_init()) pPar->indent = (LONG)m_oRuler.Indent2.get(); if (pPar->indent.is_init() && pPar->leftMargin.get()) pPar->indent.get() -= pPar->leftMargin.get(); break; } case 2: { if (m_oRuler.LeftMargin3.is_init()) pPar->leftMargin = (LONG)m_oRuler.LeftMargin3.get(); if (m_oRuler.Indent3.is_init()) pPar->indent = (LONG)m_oRuler.Indent3.get(); if (pPar->indent.is_init() && pPar->leftMargin.get()) pPar->indent.get() -= pPar->leftMargin.get(); break; } case 3: { if (m_oRuler.LeftMargin4.is_init()) pPar->leftMargin = (LONG)m_oRuler.LeftMargin4.get(); if (m_oRuler.Indent4.is_init()) pPar->indent = (LONG)m_oRuler.Indent4.get(); if (pPar->indent.is_init() && pPar->leftMargin.get()) pPar->indent.get() -= pPar->leftMargin.get(); break; } case 4: { if (m_oRuler.LeftMargin5.is_init()) pPar->leftMargin = (LONG)m_oRuler.LeftMargin5.get(); if (m_oRuler.Indent5.is_init()) pPar->indent = (LONG)m_oRuler.Indent5.get(); if (pPar->indent.is_init() && pPar->leftMargin.get()) pPar->indent.get() -= pPar->leftMargin.get(); break; } default: break; }; } bool IsEmptyText() { return (0 == m_arParagraphs.GetCount()) ? true : false; } }; }