1ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// Copyright 2014 PDFium Authors. All rights reserved.
2ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be
3ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// found in the LICENSE file.
4ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
5ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
7ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include <algorithm>
8ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
9ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa/src/foxitlib.h"
10ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa/src/fee/include/ifde_txtedtbuf.h"
11ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa/src/fee/include/ifde_txtedtengine.h"
12ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa/src/fee/include/ifde_txtedtpage.h"
13ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa/src/fee/include/fx_wordbreak.h"
14ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "fde_txtedtpage.h"
15ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "fde_txtedtengine.h"
16ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "fde_txtedtparag.h"
17ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "fde_txtedtbuf.h"
18ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#define FDE_TXTEDT_TOLERANCE 0.1f
19ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannIFDE_TxtEdtPage* IFDE_TxtEdtPage::Create(IFDE_TxtEdtEngine* pEngine,
20ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                         int32_t nIndex) {
21ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return (IFDE_TxtEdtPage*)new CFDE_TxtEdtPage(pEngine, nIndex);
22ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
23ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFDE_TxtEdtTextSet::CFDE_TxtEdtTextSet(CFDE_TxtEdtPage* pPage)
24ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    : m_pPage(pPage) {}
25ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFDE_TxtEdtTextSet::~CFDE_TxtEdtTextSet() {}
26ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFDE_VISUALOBJTYPE CFDE_TxtEdtTextSet::GetType() {
27ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return FDE_VISUALOBJ_Text;
28ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
29ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFDE_TxtEdtTextSet::GetBBox(FDE_HVISUALOBJ hVisualObj,
30ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                    CFX_RectF& bbox) {
31ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return FALSE;
32ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
33ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFDE_TxtEdtTextSet::GetMatrix(FDE_HVISUALOBJ hVisualObj,
34ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                      CFX_Matrix& matrix) {
35ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return FALSE;
36ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
37ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFDE_TxtEdtTextSet::GetRect(FDE_HVISUALOBJ hVisualObj, CFX_RectF& rt) {
38ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  rt = ((FDE_LPTEXTEDITPIECE)(hVisualObj))->rtPiece;
39ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return TRUE;
40ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
41ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFDE_TxtEdtTextSet::GetClip(FDE_HVISUALOBJ hVisualObj, CFX_RectF& rt) {
42ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return FALSE;
43ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
44ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFDE_TxtEdtTextSet::GetString(FDE_HVISUALOBJ hText,
45ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                      CFX_WideString& wsText) {
46ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FDE_LPTEXTEDITPIECE pPiece = (FDE_LPTEXTEDITPIECE)hText;
47ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_WCHAR* pBuffer = wsText.GetBuffer(pPiece->nCount);
48ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (int32_t i = 0; i < pPiece->nCount; i++) {
49ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pBuffer[i] = m_pPage->GetChar((void*)hText, i);
50ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
51ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  wsText.ReleaseBuffer(pPiece->nCount);
52ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return pPiece->nCount;
53ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
54ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannIFX_Font* CFDE_TxtEdtTextSet::GetFont(FDE_HVISUALOBJ hText) {
55ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_pPage->GetEngine()->GetEditParams()->pFont;
56ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
57ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_FLOAT CFDE_TxtEdtTextSet::GetFontSize(FDE_HVISUALOBJ hText) {
58ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_pPage->GetEngine()->GetEditParams()->fFontSize;
59ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
60ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_ARGB CFDE_TxtEdtTextSet::GetFontColor(FDE_HVISUALOBJ hText) {
61ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_pPage->GetEngine()->GetEditParams()->dwFontColor;
62ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
63ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFDE_TxtEdtTextSet::GetDisplayPos(FDE_HVISUALOBJ hText,
64ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                          FXTEXT_CHARPOS* pCharPos,
65ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                          FX_BOOL bCharCode,
66ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                          CFX_WideString* pWSForms) {
67ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (hText == NULL) {
68ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
69ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
70ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FDE_LPTEXTEDITPIECE pPiece = (FDE_LPTEXTEDITPIECE)hText;
71ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t nLength = pPiece->nCount;
72ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (nLength < 1) {
73ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
74ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
75ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFDE_TxtEdtEngine* pEngine = (CFDE_TxtEdtEngine*)(m_pPage->GetEngine());
76ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  const FDE_TXTEDTPARAMS* pTextParams = pEngine->GetEditParams();
77ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  IFX_TxtBreak* pBreak = pEngine->GetTextBreak();
78ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_DWORD dwLayoutStyle = pBreak->GetLayoutStyles();
79ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_TXTRUN tr;
80ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  tr.pAccess = m_pPage;
81ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  tr.pIdentity = (void*)hText;
82ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  tr.pStr = NULL;
83ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  tr.pWidths = NULL;
84ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  tr.iLength = nLength;
85ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  tr.pFont = pTextParams->pFont;
86ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  tr.fFontSize = pTextParams->fFontSize;
87ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  tr.dwStyles = dwLayoutStyle;
88ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  tr.iCharRotation = pTextParams->nCharRotation;
89ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  tr.dwCharStyles = pPiece->dwCharStyles;
90ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  tr.pRect = &(pPiece->rtPiece);
91ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  tr.wLineBreakChar = pTextParams->wLineBreakChar;
92ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return pBreak->GetDisplayPos(&tr, pCharPos, bCharCode, pWSForms);
93ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
94ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFDE_TxtEdtTextSet::GetCharRects(FDE_HVISUALOBJ hText,
95ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                         CFX_RectFArray& rtArray) {
96ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return GetCharRects_Impl(hText, rtArray);
97ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
98ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFDE_TxtEdtTextSet::GetCharRects_Impl(FDE_HVISUALOBJ hText,
99ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                              CFX_RectFArray& rtArray,
100ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                              FX_BOOL bBBox) {
101ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (hText == NULL) {
102ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
103ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
104ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FDE_LPTEXTEDITPIECE pPiece = (FDE_LPTEXTEDITPIECE)hText;
105ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFDE_TxtEdtEngine* pEngine = (CFDE_TxtEdtEngine*)(m_pPage->GetEngine());
106ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t nLength = pPiece->nCount;
107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (nLength < 1) {
108ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
109ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
110ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  const FDE_TXTEDTPARAMS* pTextParams = pEngine->GetEditParams();
111ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_DWORD dwLayoutStyle = pEngine->GetTextBreak()->GetLayoutStyles();
112ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_TXTRUN tr;
113ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  tr.pAccess = m_pPage;
114ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  tr.pIdentity = (void*)hText;
115ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  tr.pStr = NULL;
116ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  tr.pWidths = NULL;
117ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  tr.iLength = nLength;
118ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  tr.pFont = pTextParams->pFont;
119ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  tr.fFontSize = pTextParams->fFontSize;
120ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  tr.dwStyles = dwLayoutStyle;
121ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  tr.iCharRotation = pTextParams->nCharRotation;
122ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  tr.dwCharStyles = pPiece->dwCharStyles;
123ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  tr.pRect = &(pPiece->rtPiece);
124ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  tr.wLineBreakChar = pTextParams->wLineBreakChar;
125ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return pEngine->GetTextBreak()->GetCharRects(&tr, rtArray, bBBox);
126ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
127ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFDE_TxtEdtPage::CFDE_TxtEdtPage(IFDE_TxtEdtEngine* pEngine, int32_t nPageIndex)
128ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    : m_pIter(nullptr),
129ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pTextSet(nullptr),
130ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pBgnParag(nullptr),
131ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pEndParag(nullptr),
132ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_nRefCount(0),
133ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_nPageStart(-1),
134ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_nCharCount(0),
135ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_nPageIndex(nPageIndex),
136ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_bLoaded(FALSE),
137ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pCharWidth(nullptr) {
138ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_memset(&m_rtPage, 0, sizeof(CFX_RectF));
139ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_memset(&m_rtPageMargin, 0, sizeof(CFX_RectF));
140ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_memset(&m_rtPageContents, 0, sizeof(CFX_RectF));
141ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_memset(&m_rtPageCanvas, 0, sizeof(CFX_RectF));
142ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pEditEngine = (CFDE_TxtEdtEngine*)pEngine;
143ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
144ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFDE_TxtEdtPage::~CFDE_TxtEdtPage() {
145ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_PieceMassArr.RemoveAll(TRUE);
146ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pTextSet) {
147ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    delete m_pTextSet;
148ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pTextSet = NULL;
149ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
150ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pCharWidth) {
151ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    delete[] m_pCharWidth;
152ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pCharWidth = NULL;
153ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
154ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pIter != NULL) {
155ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pIter->Release();
156ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pIter = NULL;
157ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
158ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
159ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFDE_TxtEdtPage::Release() {
160ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  delete this;
161ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
162ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannIFDE_TxtEdtEngine* CFDE_TxtEdtPage::GetEngine() const {
163ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return (IFDE_TxtEdtEngine*)m_pEditEngine;
164ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
165ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFDE_VISUALOBJTYPE CFDE_TxtEdtPage::GetType() {
166ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return FDE_VISUALOBJ_Text;
167ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
168ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFDE_TxtEdtPage::GetBBox(FDE_HVISUALOBJ hVisualObj, CFX_RectF& bbox) {
169ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return FALSE;
170ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
171ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFDE_TxtEdtPage::GetMatrix(FDE_HVISUALOBJ hVisualObj,
172ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                   CFX_Matrix& matrix) {
173ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return FALSE;
174ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
175ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFDE_TxtEdtPage::GetRect(FDE_HVISUALOBJ hVisualObj, CFX_RectF& rt) {
176ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return FALSE;
177ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
178ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFDE_TxtEdtPage::GetClip(FDE_HVISUALOBJ hVisualObj, CFX_RectF& rt) {
179ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return FALSE;
180ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
181ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFDE_TxtEdtPage::GetCharRect(int32_t nIndex,
182ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                     CFX_RectF& rect,
183ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                     FX_BOOL bBBox) const {
184ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(m_nRefCount > 0);
185ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(nIndex >= 0 && nIndex < m_nCharCount);
186ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_nRefCount < 1) {
187ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
188ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
189ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t nCount = m_PieceMassArr.GetSize();
190ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (int32_t i = 0; i < nCount; i++) {
191ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    const FDE_LPTEXTEDITPIECE pPiece = m_PieceMassArr.GetPtrAt(i);
192ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (nIndex >= pPiece->nStart &&
193ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        nIndex < (pPiece->nStart + pPiece->nCount)) {
194ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CFX_RectFArray rectArr;
195ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (bBBox) {
196ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_pTextSet->GetCharRects_Impl((FDE_HVISUALOBJ)pPiece, rectArr, bBBox);
197ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      } else {
198ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_pTextSet->GetCharRects((FDE_HVISUALOBJ)pPiece, rectArr);
199ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
200ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      rect = rectArr[nIndex - pPiece->nStart];
201ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return pPiece->nBidiLevel;
202ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
203ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
204ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(0);
205ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return 0;
206ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
207ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFDE_TxtEdtPage::GetCharIndex(const CFX_PointF& fPoint,
208ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                      FX_BOOL& bBefore) {
209ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL bVertical = m_pEditEngine->GetEditParams()->dwLayoutStyles &
210ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                      FDE_TEXTEDITLAYOUT_DocVertical;
211ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_PointF ptF = fPoint;
212ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  NormalizePt2Rect(ptF, m_rtPageContents, FDE_TXTEDT_TOLERANCE);
213ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t nCount = m_PieceMassArr.GetSize();
214ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_RectF rtLine;
215ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t nBgn = 0;
216ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t nEnd = 0;
217ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL bInLine = FALSE;
218ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t i = 0;
219ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (i = 0; i < nCount; i++) {
220ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    const FDE_LPTEXTEDITPIECE pPiece = m_PieceMassArr.GetPtrAt(i);
221ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!bInLine && (bVertical ? (pPiece->rtPiece.left <= ptF.x &&
222ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                  pPiece->rtPiece.right() > ptF.x)
223ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                               : (pPiece->rtPiece.top <= ptF.y &&
224ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                  pPiece->rtPiece.bottom() > ptF.y))) {
225ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      nBgn = nEnd = i;
226ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      rtLine = pPiece->rtPiece;
227ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      bInLine = TRUE;
228ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else if (bInLine) {
229ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (bVertical ? (!(pPiece->rtPiece.left <= ptF.x &&
230ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                         pPiece->rtPiece.right() > ptF.x))
231ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                    : (pPiece->rtPiece.bottom() <= ptF.y ||
232ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                       pPiece->rtPiece.top > ptF.y)) {
233ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        nEnd = i - 1;
234ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        break;
235ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      } else {
236ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        rtLine.Union(pPiece->rtPiece);
237ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
238ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
239ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
240ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  NormalizePt2Rect(ptF, rtLine, FDE_TXTEDT_TOLERANCE);
241ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t nCaret = 0;
242ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FDE_LPTEXTEDITPIECE pPiece = NULL;
243ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (i = nBgn; i <= nEnd; i++) {
244ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pPiece = m_PieceMassArr.GetPtrAt(i);
245ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    nCaret = m_nPageStart + pPiece->nStart;
246ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (pPiece->rtPiece.Contains(ptF)) {
247ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      CFX_RectFArray rectArr;
248ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pTextSet->GetCharRects((FDE_HVISUALOBJ)pPiece, rectArr);
249ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      int32_t nRtCount = rectArr.GetSize();
250ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      for (int32_t j = 0; j < nRtCount; j++) {
251ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (rectArr[j].Contains(ptF)) {
252ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          nCaret = m_nPageStart + pPiece->nStart + j;
253ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          if (nCaret >= m_pEditEngine->GetTextBufLength()) {
254ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            bBefore = TRUE;
255ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            return m_pEditEngine->GetTextBufLength();
256ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
257ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          FX_WCHAR wChar = m_pEditEngine->GetTextBuf()->GetCharByIndex(nCaret);
258ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          if (wChar == L'\n' || wChar == L'\r') {
259ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            if (wChar == L'\n') {
260ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              if (m_pEditEngine->GetTextBuf()->GetCharByIndex(nCaret - 1) ==
261ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                  L'\r') {
262ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                nCaret--;
263ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              }
264ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            }
265ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            bBefore = TRUE;
266ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            return nCaret;
267ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
268ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          if (bVertical
269ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                  ? (ptF.y > ((rectArr[j].top + rectArr[j].bottom()) / 2))
270ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                  : (ptF.x > ((rectArr[j].left + rectArr[j].right()) / 2))) {
271ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            bBefore = FX_IsOdd(pPiece->nBidiLevel);
272ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          } else {
273ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            bBefore = !FX_IsOdd(pPiece->nBidiLevel);
274ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
275ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          return nCaret;
276ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
277ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
278ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
279ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
280ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  bBefore = TRUE;
281ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return nCaret;
282ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
283ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFDE_TxtEdtPage::GetCharStart() const {
284ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_nPageStart;
285ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
286ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFDE_TxtEdtPage::GetCharCount() const {
287ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_nCharCount;
288ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
289ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFDE_TxtEdtPage::GetDisplayPos(const CFX_RectF& rtClip,
290ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                       FXTEXT_CHARPOS*& pCharPos,
291ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                       FX_LPRECTF pBBox) const {
292ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pCharPos = FX_Alloc(FXTEXT_CHARPOS, m_nCharCount);
293ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t nCharPosCount = 0;
294ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FDE_HVISUALOBJ hVisualObj = NULL;
295ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t nVisualObjCount = m_PieceMassArr.GetSize();
296ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXTEXT_CHARPOS* pos = pCharPos;
297ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_RectF rtObj;
298ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (int32_t i = 0; i < nVisualObjCount; i++) {
299ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    hVisualObj = (FDE_HVISUALOBJ)m_PieceMassArr.GetPtrAt(i);
300ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pTextSet->GetRect(hVisualObj, rtObj);
301ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!rtClip.IntersectWith(rtObj)) {
302ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      continue;
303ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
304ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int32_t nCount = m_pTextSet->GetDisplayPos(hVisualObj, pos, FALSE);
305ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    nCharPosCount += nCount;
306ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pos += nCount;
307ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
308ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if ((nCharPosCount * 5) < (m_nCharCount << 2)) {
309ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FXTEXT_CHARPOS* pTemp = FX_Alloc(FXTEXT_CHARPOS, nCharPosCount);
310ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FXSYS_memcpy(pTemp, pCharPos, sizeof(FXTEXT_CHARPOS) * nCharPosCount);
311ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_Free(pCharPos);
312ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pCharPos = pTemp;
313ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
314ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return nCharPosCount;
315ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
316ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFDE_TxtEdtPage::CalcRangeRectArray(int32_t nStart,
317ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                         int32_t nCount,
318ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                         CFX_RectFArray& RectFArr) const {
319ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t nPieceCount = m_PieceMassArr.GetSize();
320ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t nEnd = nStart + nCount - 1;
321ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL bInRange = FALSE;
322ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  for (int32_t i = 0; i < nPieceCount; i++) {
323ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FDE_LPTEXTEDITPIECE piece = m_PieceMassArr.GetPtrAt(i);
324ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!bInRange) {
325ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (nStart >= piece->nStart && nStart < (piece->nStart + piece->nCount)) {
326ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        int32_t nRangeEnd = piece->nCount - 1;
327ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        FX_BOOL bEnd = FALSE;
328ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (nEnd >= piece->nStart && nEnd < (piece->nStart + piece->nCount)) {
329ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          nRangeEnd = nEnd - piece->nStart;
330ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          bEnd = TRUE;
331ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
332ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        CFX_RectFArray rcArr;
333ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_pTextSet->GetCharRects((FDE_HVISUALOBJ)piece, rcArr);
334ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        CFX_RectF rectPiece = rcArr[nStart - piece->nStart];
335ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        rectPiece.Union(rcArr[nRangeEnd]);
336ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        RectFArr.Add(rectPiece);
337ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (bEnd) {
338ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          return;
339ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
340ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        bInRange = TRUE;
341ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
342ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
343ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (nEnd >= piece->nStart && nEnd < (piece->nStart + piece->nCount)) {
344ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        CFX_RectFArray rcArr;
345ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_pTextSet->GetCharRects((FDE_HVISUALOBJ)piece, rcArr);
346ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        CFX_RectF rectPiece = rcArr[0];
347ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        rectPiece.Union(rcArr[nEnd - piece->nStart]);
348ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        RectFArr.Add(rectPiece);
349ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return;
350ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
351ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      RectFArr.Add(piece->rtPiece);
352ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
353ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
354ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return;
355ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
356ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFDE_TxtEdtPage::SelectWord(const CFX_PointF& fPoint, int32_t& nCount) {
357ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_nRefCount < 0) {
358ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return -1;
359ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
360ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  IFDE_TxtEdtBuf* pBuf = m_pEditEngine->GetTextBuf();
361ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL bBefore;
362ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t nIndex = GetCharIndex(fPoint, bBefore);
363ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (nIndex == m_pEditEngine->GetTextBufLength()) {
364ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    nIndex = m_pEditEngine->GetTextBufLength() - 1;
365ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
366ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (nIndex < 0) {
367ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return -1;
368ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
369ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  IFX_WordBreak* pIter = FX_WordBreak_Create();
370ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pIter->Attach(new CFDE_TxtEdtBufIter((CFDE_TxtEdtBuf*)pBuf));
371ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pIter->SetAt(nIndex);
372ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  nCount = pIter->GetWordLength();
373ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t nRet = pIter->GetWordPos();
374ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pIter->Release();
375ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return nRet;
376ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
377ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFDE_TxtEdtPage::IsLoaded(FX_LPCRECTF pClipBox) {
378ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_bLoaded;
379ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
380ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFDE_TxtEdtPage::LoadPage(FX_LPCRECTF pClipBox, IFX_Pause* pPause) {
381ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_nRefCount > 0) {
382ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_nRefCount++;
383ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return m_nRefCount;
384ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
385ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  IFDE_TxtEdtBuf* pBuf = m_pEditEngine->GetTextBuf();
386ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  const FDE_TXTEDTPARAMS* pParams = m_pEditEngine->GetEditParams();
387ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pIter != NULL) {
388ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pIter->Release();
389ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
390ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_WCHAR wcAlias = 0;
391ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pParams->dwMode & FDE_TEXTEDITMODE_Password) {
392ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    wcAlias = m_pEditEngine->GetAliasChar();
393ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
394ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pIter = new CFDE_TxtEdtBufIter((CFDE_TxtEdtBuf*)pBuf, wcAlias);
395ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  IFX_TxtBreak* pBreak = m_pEditEngine->GetTextBreak();
396ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pBreak->EndBreak(FX_TXTBREAK_ParagraphBreak);
397ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pBreak->ClearBreakPieces();
398ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t nPageLineCount = m_pEditEngine->GetPageLineCount();
399ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t nStartLine = nPageLineCount * m_nPageIndex;
400ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t nEndLine = std::min((nStartLine + nPageLineCount - 1),
401ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                              (m_pEditEngine->GetLineCount() - 1));
402ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t nPageStart, nPageEnd, nTemp, nBgnParag, nStartLineInParag, nEndParag,
403ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      nEndLineInParag;
404ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  nBgnParag = m_pEditEngine->Line2Parag(0, 0, nStartLine, nStartLineInParag);
405ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pBgnParag = (CFDE_TxtEdtParag*)m_pEditEngine->GetParag(nBgnParag);
406ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pBgnParag->LoadParag();
407ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pBgnParag->GetLineRange(nStartLine - nStartLineInParag, nPageStart, nTemp);
408ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  nEndParag = m_pEditEngine->Line2Parag(nBgnParag, nStartLineInParag, nEndLine,
409ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                        nEndLineInParag);
410ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pEndParag = (CFDE_TxtEdtParag*)m_pEditEngine->GetParag(nEndParag);
411ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pEndParag->LoadParag();
412ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pEndParag->GetLineRange(nEndLine - nEndLineInParag, nPageEnd, nTemp);
413ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  nPageEnd += (nTemp - 1);
414ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL bVertial = pParams->dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical;
415ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL bLineReserve =
416ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pParams->dwLayoutStyles & FDE_TEXTEDITLAYOUT_LineReserve;
417ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_FLOAT fLineStart =
418ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      bVertial
419ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          ? (bLineReserve ? (pParams->fPlateWidth - pParams->fLineSpace) : 0.0f)
420ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          : 0.0f;
421ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_FLOAT fLineStep =
422ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      (bVertial && bLineReserve) ? (-pParams->fLineSpace) : pParams->fLineSpace;
423ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_FLOAT fLinePos = fLineStart;
424ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pTextSet == NULL) {
425ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pTextSet = new CFDE_TxtEdtTextSet(this);
426ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
427ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_PieceMassArr.RemoveAll(TRUE);
428ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_DWORD dwBreakStatus = FX_TXTBREAK_None;
429ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t nPieceStart = 0;
430ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pCharWidth != NULL) {
431ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    delete[] m_pCharWidth;
432ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
433ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pCharWidth = new int32_t[nPageEnd - nPageStart + 1];
434ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pBreak->EndBreak(FX_TXTBREAK_ParagraphBreak);
435ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pBreak->ClearBreakPieces();
436ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_nPageStart = nPageStart;
437ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_nCharCount = nPageEnd - nPageStart + 1;
438ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL bReload = FALSE;
439ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_FLOAT fDefCharWidth = 0;
440ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  IFX_CharIter* pIter = m_pIter->Clone();
441ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pIter->SetAt(nPageStart);
442ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pIter->SetAt(nPageStart);
443ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL bFirstPiece = TRUE;
444ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  do {
445ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (bReload) {
446ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      dwBreakStatus = pBreak->EndBreak(FX_TXTBREAK_ParagraphBreak);
447ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
448ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FX_WCHAR wAppend = pIter->GetChar();
449ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      dwBreakStatus = pBreak->AppendChar(wAppend);
450ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
451ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (pIter->GetAt() == nPageEnd && dwBreakStatus < FX_TXTBREAK_LineBreak) {
452ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      dwBreakStatus = pBreak->EndBreak(FX_TXTBREAK_ParagraphBreak);
453ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
454ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (dwBreakStatus > FX_TXTBREAK_PieceBreak) {
455ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      int32_t nPieceCount = pBreak->CountBreakPieces();
456ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      for (int32_t j = 0; j < nPieceCount; j++) {
457ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        const CFX_TxtPiece* pPiece = pBreak->GetBreakPiece(j);
458ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        FDE_TEXTEDITPIECE TxtEdtPiece;
459ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        FXSYS_memset(&TxtEdtPiece, 0, sizeof(FDE_TEXTEDITPIECE));
460ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        TxtEdtPiece.nBidiLevel = pPiece->m_iBidiLevel;
461ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        TxtEdtPiece.nCount = pPiece->GetLength();
462ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        TxtEdtPiece.nStart = nPieceStart;
463ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        TxtEdtPiece.dwCharStyles = pPiece->m_dwCharStyles;
464ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (FX_IsOdd(pPiece->m_iBidiLevel)) {
465ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          TxtEdtPiece.dwCharStyles |= FX_TXTCHARSTYLE_OddBidiLevel;
466ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
467ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        FX_FLOAT fParaBreakWidth = 0.0f;
468ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (pPiece->m_dwStatus > FX_TXTBREAK_PieceBreak) {
469ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          FX_WCHAR wRtChar = pParams->wLineBreakChar;
470ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          if (TxtEdtPiece.nCount >= 2) {
471ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            FX_WCHAR wChar = pBuf->GetCharByIndex(
472ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                m_nPageStart + TxtEdtPiece.nStart + TxtEdtPiece.nCount - 1);
473ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            FX_WCHAR wCharPre = pBuf->GetCharByIndex(
474ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                m_nPageStart + TxtEdtPiece.nStart + TxtEdtPiece.nCount - 2);
475ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            if (wChar == wRtChar) {
476ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              fParaBreakWidth += fDefCharWidth;
477ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            }
478ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            if (wCharPre == wRtChar) {
479ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              fParaBreakWidth += fDefCharWidth;
480ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            }
481ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          } else if (TxtEdtPiece.nCount >= 1) {
482ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            FX_WCHAR wChar = pBuf->GetCharByIndex(
483ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                m_nPageStart + TxtEdtPiece.nStart + TxtEdtPiece.nCount - 1);
484ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            if (wChar == wRtChar) {
485ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              fParaBreakWidth += fDefCharWidth;
486ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            }
487ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          }
488ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
489ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (pParams->dwLayoutStyles & FDE_TEXTEDITLAYOUT_DocVertical) {
490ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          TxtEdtPiece.rtPiece.left = fLinePos;
491ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          TxtEdtPiece.rtPiece.top = (FX_FLOAT)pPiece->m_iStartPos / 20000.0f;
492ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          TxtEdtPiece.rtPiece.width = pParams->fLineSpace;
493ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          TxtEdtPiece.rtPiece.height =
494ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              (FX_FLOAT)pPiece->m_iWidth / 20000.0f + fParaBreakWidth;
495ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        } else {
496ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          TxtEdtPiece.rtPiece.left = (FX_FLOAT)pPiece->m_iStartPos / 20000.0f;
497ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          TxtEdtPiece.rtPiece.top = fLinePos;
498ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          TxtEdtPiece.rtPiece.width =
499ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann              (FX_FLOAT)pPiece->m_iWidth / 20000.0f + fParaBreakWidth;
500ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          TxtEdtPiece.rtPiece.height = pParams->fLineSpace;
501ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
502ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (bFirstPiece) {
503ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          m_rtPageContents = TxtEdtPiece.rtPiece;
504ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          bFirstPiece = FALSE;
505ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        } else {
506ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          m_rtPageContents.Union(TxtEdtPiece.rtPiece);
507ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
508ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        nPieceStart += TxtEdtPiece.nCount;
509ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_PieceMassArr.Add(TxtEdtPiece);
510ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        for (int32_t k = 0; k < TxtEdtPiece.nCount; k++) {
511ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          CFX_Char* ptc = pPiece->GetCharPtr(k);
512ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          m_pCharWidth[TxtEdtPiece.nStart + k] = ptc->m_iCharWidth;
513ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
514ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
515ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      fLinePos += fLineStep;
516ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pBreak->ClearBreakPieces();
517ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
518ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (pIter->GetAt() == nPageEnd && dwBreakStatus == FX_TXTBREAK_LineBreak) {
519ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      bReload = TRUE;
520ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pIter->Next(TRUE);
521ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
522ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } while (pIter->Next(FALSE) && (pIter->GetAt() <= nPageEnd));
523ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_rtPageContents.left != 0) {
524ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_FLOAT fDelta = 0.0f;
525ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (m_rtPageContents.width < pParams->fPlateWidth) {
526ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (pParams->dwAlignment & FDE_TEXTEDITALIGN_Right) {
527ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        fDelta = pParams->fPlateWidth - m_rtPageContents.width;
528ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      } else if (pParams->dwAlignment & FDE_TEXTEDITALIGN_Center) {
529ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if ((pParams->dwLayoutStyles & FDE_TEXTEDITLAYOUT_CombText) &&
530ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann            m_nCharCount > 1) {
531ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          int32_t nCount = m_nCharCount - 1;
532ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          int32_t n = (m_pEditEngine->m_nLimit - nCount) / 2;
533ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          fDelta = (m_rtPageContents.width / nCount) * n;
534ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        } else {
535ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          fDelta = (pParams->fPlateWidth - m_rtPageContents.width) / 2;
536ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
537ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
538ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
539ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_FLOAT fOffset = m_rtPageContents.left - fDelta;
540ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int32_t nCount = m_PieceMassArr.GetSize();
541ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    for (int32_t i = 0; i < nCount; i++) {
542ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FDE_LPTEXTEDITPIECE pPiece = m_PieceMassArr.GetPtrAt(i);
543ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      pPiece->rtPiece.Offset(-fOffset, 0.0f);
544ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
545ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_rtPageContents.Offset(-fOffset, 0.0f);
546ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
547ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pEditEngine->GetEditParams()->dwLayoutStyles &
548ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FDE_TEXTEDITLAYOUT_LastLineHeight) {
549ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_rtPageContents.height -= pParams->fLineSpace - pParams->fFontSize;
550ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int32_t nCount = m_PieceMassArr.GetSize();
551ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FDE_LPTEXTEDITPIECE pPiece = m_PieceMassArr.GetPtrAt(nCount - 1);
552ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pPiece->rtPiece.height = pParams->fFontSize;
553ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
554ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pIter->Release();
555ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_nRefCount = 1;
556ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_bLoaded = TRUE;
557ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return 0;
558ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
559ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFDE_TxtEdtPage::UnloadPage(FX_LPCRECTF pClipBox) {
560ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(m_nRefCount > 0);
561ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_nRefCount--;
562ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_nRefCount == 0) {
563ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_PieceMassArr.RemoveAll();
564ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (m_pTextSet) {
565ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      delete m_pTextSet;
566ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pTextSet = NULL;
567ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
568ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (m_pCharWidth) {
569ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      delete[] m_pCharWidth;
570ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pCharWidth = NULL;
571ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
572ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (m_pBgnParag) {
573ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pBgnParag->UnloadParag();
574ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
575ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (m_pEndParag) {
576ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pEndParag->UnloadParag();
577ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
578ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (m_pIter) {
579ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pIter->Release();
580ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pIter = NULL;
581ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
582ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pBgnParag = NULL;
583ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pEndParag = NULL;
584ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
585ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return;
586ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
587ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannconst CFX_RectF& CFDE_TxtEdtPage::GetContentsBox() {
588ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_rtPageContents;
589ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
590ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_POSITION CFDE_TxtEdtPage::GetFirstPosition(FDE_HVISUALOBJ hCanvas) {
591ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_PieceMassArr.GetSize() < 1) {
592ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return NULL;
593ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
594ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return (FX_POSITION)1;
595ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
596ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFDE_HVISUALOBJ CFDE_TxtEdtPage::GetNext(FDE_HVISUALOBJ hCanvas,
597ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                        FX_POSITION& pos,
598ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                        IFDE_VisualSet*& pVisualSet) {
599ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pTextSet == NULL) {
600ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pos = NULL;
601ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return NULL;
602ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
603ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t nPos = (int32_t)(uintptr_t)pos;
604ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pVisualSet = m_pTextSet;
605ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (nPos + 1 > m_PieceMassArr.GetSize()) {
606ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pos = NULL;
607ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
608ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pos = (FX_POSITION)(uintptr_t)(nPos + 1);
609ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
610ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return (FDE_HVISUALOBJ)(m_PieceMassArr.GetPtrAt(nPos - 1));
611ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
612ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFDE_HVISUALOBJ CFDE_TxtEdtPage::GetParentCanvas(FDE_HVISUALOBJ hCanvas,
613ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                                IFDE_VisualSet*& pVisualSet) {
614ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return NULL;
615ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
616ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_WCHAR CFDE_TxtEdtPage::GetChar(void* pIdentity, int32_t index) const {
617ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t nIndex =
618ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_nPageStart + ((FDE_LPTEXTEDITPIECE)pIdentity)->nStart + index;
619ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (nIndex != m_pIter->GetAt()) {
620ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pIter->SetAt(nIndex);
621ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
622ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_WCHAR wChar = m_pIter->GetChar();
623ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pIter->Next();
624ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return wChar;
625ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
626ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFDE_TxtEdtPage::GetWidth(void* pIdentity, int32_t index) const {
627ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t nWidth =
628ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pCharWidth[((FDE_LPTEXTEDITPIECE)pIdentity)->nStart + index];
629ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return nWidth;
630ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
631ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFDE_TxtEdtPage::NormalizePt2Rect(CFX_PointF& ptF,
632ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                       const CFX_RectF& rtF,
633ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                       FX_FLOAT fTolerance) const {
634ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (rtF.Contains(ptF.x, ptF.y)) {
635ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
636ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
637ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (ptF.x < rtF.left) {
638ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    ptF.x = rtF.left;
639ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else if (ptF.x >= rtF.right()) {
640ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    ptF.x = rtF.right() - fTolerance;
641ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
642ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (ptF.y < rtF.top) {
643ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    ptF.y = rtF.top;
644ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else if (ptF.y >= rtF.bottom()) {
645ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    ptF.y = rtF.bottom() - fTolerance;
646ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
647ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
648