2 // Open Service Platform
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0/
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an ”AS IS” BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
19 * @file FGrp_TextTextComposite.cpp
20 * @brief This is the implementation file for TextComposite class.
26 #include <FBaseSysLog.h>
27 #include <FApp_AppInfo.h>
28 #include "FGrp_TextCommon.h"
29 #include "FGrp_TextTextElement.h"
30 #include "FGrp_TextTextSimple.h"
31 #include "FGrp_TextTextImage.h"
32 #include "FGrp_TextTextCutLink.h"
33 #include "FGrp_TextTextLine.h"
34 #include "FGrp_TextTextColumn.h"
35 #include "FGrp_TextTextCutLinkListInfo.h"
36 #include "FGrp_TextTextComposite.h"
37 #include "FGrp_TextTextUtility.h"
38 #include "FGrp_CanvasImpl.h"
39 #include "FGrp_CoordinateSystemUtils.h"
41 using namespace Tizen::Base;
42 using namespace Tizen::Base::Utility;
43 using namespace Tizen::Base::Collection;
54 const float LINE_FEED_WIDTH = 8.0f;
57 namespace Tizen { namespace Graphics
63 struct NoneWrapComposeInfo
72 TextComposite::TextComposite(TextElement* pTextElement)
74 __pTextElementList = new (std::nothrow) LinkedList;
75 SysTryReturn(NID_GRP, __pTextElementList, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Insufficient memory.");
77 __wrap = TEXT_OBJECT_WRAP_TYPE_WORD;
82 __displayBlock = false;
83 __defaultBlockColor = Color(183, 212, 247);
86 __ignoreRearBlank = true;
87 __ignoreFrontBlank = false;
89 __rearSpaceHideMode = TEXT_OBJECT_SPACE_HIDE_TYPE_ONE;
90 __frontSpaceHideMode = TEXT_OBJECT_SPACE_HIDE_TYPE_ONE;
93 __elementVertialAlignment = TEXT_OBJECT_ALIGNMENT_BOTTOM;
94 __pCurrentTextColumn = null;
95 __pCutLinkListInfo = new (std::nothrow)TextCutLinkListInfo;
98 wchar_t abbrevText[2];
99 abbrevText[0] = TEXT_ABBREV_CHARACTER;
102 __pAbbrevTextElement = new (std::nothrow)TextSimple(abbrevText, 1, TEXT_ELEMENT_SOURCE_TYPE_INTERNAL, null,
103 Color::GetColor(COLOR_ID_BLACK), Color::GetColor(COLOR_ID_WHITE), Color::GetColor(COLOR_ID_WHITE));
106 if (pTextElement != null)
108 AppendElement(*pTextElement);
110 __drawAbbrevText = false;
111 __drawTextEllipsis = false;
112 __TextObjectEllipsisType = TEXT_OBJECT_ELLIPSIS_TYPE_TAIL;
114 __partialComposingModeEnabled = false;
115 __lineIndexCompositeDone = 0;
116 __totalComposedHeight = 0;
117 __composePartialLimitHeight = 0;
119 __headEllipsisTextLength = 0;
120 __headEllipsisWidth = 0;
121 __middleEllipsisHeadWidth = 0;
122 __middleEllipsisTextLengthInHead = 0;
123 __middleEllipsisTextLengthInTail = 0;
124 __middleEllipsisWidth = 0;
130 TextComposite::~TextComposite(void)
132 Release(__pCutLinkListInfo);
133 Release(__pAbbrevTextElement);
135 if (__pTextElementList)
137 RemoveAllElements(true);
138 delete __pTextElementList;
139 __pTextElementList = null;
144 TextComposite::ForwardAnalyze(int startTextIndex, int textLength, int maxWidth, TextObjectWrapType wrap, int& actualLength,
145 int& width, int& height)
147 float maxWidthF = _CoordinateSystemUtils::ConvertToFloat(maxWidth);
148 float widthF = _CoordinateSystemUtils::ConvertToFloat(width);
149 float heightF = _CoordinateSystemUtils::ConvertToFloat(height);
151 int r = ForwardAnalyze(startTextIndex, textLength, maxWidthF, wrap, actualLength, widthF, heightF);
153 width = _CoordinateSystemUtils::ConvertToInteger(widthF);
154 height = _CoordinateSystemUtils::ConvertToInteger(heightF);
160 TextComposite::ForwardAnalyze(int startTextIndex, int textLength, float maxWidth, TextObjectWrapType wrap, int& actualLength,
161 float& width, float& height)
163 SysTryReturn(NID_GRP, 0 <= startTextIndex && startTextIndex < __length, -1, E_INVALID_ARG
164 , "[E_INVALID_ARG] The argument is invalid. startTextIndex(%d)", startTextIndex);
165 SysTryReturn(NID_GRP, textLength <= __length, -1, E_INVALID_ARG
166 , "[E_INVALID_ARG] The argument is invalid. textLength(%d)", textLength);
168 result r = E_SUCCESS;
169 FloatDimension textSize;
170 int elementTextOffset = 0;
171 int elementIndex = 0;
172 int textIndexFromElementOffset = 0;
173 float remainingWidth = 0;
174 int remainingLength = 0;
176 int currentLength = 0;
177 int ret = TEXT_RETBY_NORMAL;
179 IEnumerator* pEnum = null;
180 TextElement* pTextElement = null;
182 bool isFirstWord = true;
183 FloatDimension tempTextSize;
184 int tempTextCount = 0;
189 pTextElement = GetElementAtTextIndex(startTextIndex, elementTextOffset, elementIndex, currentLength,textIndexFromElementOffset);
190 SysTryReturn(NID_GRP, pTextElement, -1, E_SYSTEM, "[E_SYSTEM] Fail to get text element.");
193 remainingWidth = maxWidth;
194 remainingLength = textLength;
195 currentLength = Math::Min(remainingLength, currentLength);
197 pEnum = __pTextElementList->GetEnumeratorN();
198 for (int i = 0; i <= elementIndex; i++)
200 r = pEnum->MoveNext();
201 SysTryCatch(NID_GRP, r == E_SUCCESS, , r, "[%s] Fail to move next element.", GetErrorMessage(r));
204 while ((remainingWidth != 0) && (remainingLength != 0))
206 ret = pTextElement->ForwardAnalyze(textIndexFromElementOffset, currentLength, remainingWidth,
207 wrap, textCount, textSize.width, textSize.height);
209 if (textSize.width == 0 && textCount == 0)
214 textSize.height += __lineSpacing;
215 remainingWidth -= textSize.width;
216 remainingLength -= textCount;
217 currentLength -= textCount;
219 actualLength += textCount;
220 width += textSize.width;
221 height = (textSize.height > height) ? textSize.height : height;
223 if (__wrap == TEXT_OBJECT_WRAP_TYPE_WORD && ret != TEXT_RETBY_LIMITWIDTH)
225 tempTextCount = actualLength;
226 tempTextSize.width = width;
227 tempTextSize.height = height;
230 if (ret == TEXT_RETBY_OVERWIDTH || ret == TEXT_RETBY_LINEFEED)
235 if (__wrap == TEXT_OBJECT_WRAP_TYPE_WORD)
237 if (ret == TEXT_RETBY_LIMITWIDTH)
239 if (isFirstWord == false)
241 actualLength = tempTextCount;
242 width = tempTextSize.width;
243 height = tempTextSize.height;
245 ret = TEXT_RETBY_NORMAL;
252 if (0 < currentLength)
254 textIndexFromElementOffset += textCount;
260 if (ret == TEXT_RETBY_LIMITWIDTH)
266 if (pEnum->MoveNext() != E_SUCCESS)
271 pTextElement = static_cast < TextElement* >(pEnum->GetCurrent());
272 if (pTextElement == null)
278 textIndexFromElementOffset = pTextElement->GetValue(SET_TEXT_OFFSET);
279 currentLength = Math::Min(pTextElement->GetTextLength(), remainingLength);
282 if (ret == TEXT_RETBY_LIMITLENGTH)
284 ret = TEXT_RETBY_NORMAL;
287 SetLastResult(E_SUCCESS);
297 TextComposite::ForwardAnalyzeWithBaseline(int startTextIndex, int textLength, int maxWidth, TextObjectWrapType wrap, int& actualLength,
298 int& width, int& height, int& baseline)
300 float maxWidthF = _CoordinateSystemUtils::ConvertToFloat(maxWidth);
301 float widthF = _CoordinateSystemUtils::ConvertToFloat(width);
302 float heightF = _CoordinateSystemUtils::ConvertToFloat(height);
303 float baselineF = _CoordinateSystemUtils::ConvertToFloat(baseline);
305 int r = ForwardAnalyzeWithBaseline(startTextIndex, textLength, maxWidthF, wrap, actualLength, widthF, heightF, baselineF);
307 width = _CoordinateSystemUtils::ConvertToInteger(widthF);
308 height = _CoordinateSystemUtils::ConvertToInteger(heightF);
309 baseline = _CoordinateSystemUtils::ConvertToInteger(baselineF);
315 TextComposite::ForwardAnalyzeWithBaseline(int startTextIndex, int textLength, float maxWidth, TextObjectWrapType wrap, int& actualLength,
316 float& width, float& height, float& baseline)
318 SysTryReturn(NID_GRP, 0 <= startTextIndex && startTextIndex < __length
319 , -1, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid. startTextIndex(%d)", startTextIndex);
321 SysTryReturn(NID_GRP, startTextIndex + textLength <= __length
322 , -1, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid. textLength(%d)", textLength);
324 result r = E_SUCCESS;
326 FloatDimension textSize;
327 int elementTextOffset = 0;
328 int elementIndex = 0;
329 int textIndexFromElementOffset = 0;
330 float remainingWidth = 0;
331 int remainingLength = 0;
333 int currentLength = 0;
334 int ret = TEXT_RETBY_NORMAL;
335 bool isMaxHeightImage = false;
337 IEnumerator* pEnum = null;
338 TextElement* pTextElement = null;
340 bool isFirstWord = true;
341 FloatDimension tempTextSize;
342 int tempTextCount = 0;
347 pTextElement = GetElementAtTextIndex(startTextIndex, elementTextOffset, elementIndex, currentLength,
348 textIndexFromElementOffset);
349 SysTryReturn(NID_GRP, pTextElement, -1, E_SYSTEM, "[E_SYSTEM] Fail to get text element.");
352 remainingWidth = maxWidth;
353 remainingLength = textLength;
354 currentLength = Math::Min(remainingLength, currentLength);
355 baseline = pTextElement->GetBaselineF();
357 pEnum = __pTextElementList->GetEnumeratorN();
358 for (int i = 0; i <= elementIndex; i++)
360 r = pEnum->MoveNext();
361 SysTryCatch(NID_GRP, r == E_SUCCESS, , r, "[%s] Fail to move next element.", GetErrorMessage(r));
364 while (remainingLength != 0)
366 ret = pTextElement->ForwardAnalyze(textIndexFromElementOffset, currentLength, remainingWidth,
367 wrap, textCount, textSize.width, textSize.height);
369 textSize.height += __lineSpacing;
370 remainingWidth -= textSize.width;
371 remainingLength -= textCount;
372 currentLength -= textCount;
374 actualLength += textCount;
375 width += textSize.width;
376 baseline = (pTextElement->GetBaselineF() > baseline) ? pTextElement->GetBaselineF() : baseline;
378 if (height < textSize.height)
380 height = textSize.height;
382 (pTextElement->GetType() == TEXT_ELEMENT_TYPE_IMAGE) ? isMaxHeightImage = true : isMaxHeightImage = false;
385 if (__wrap == TEXT_OBJECT_WRAP_TYPE_WORD && ret != TEXT_RETBY_LIMITWIDTH)
387 tempTextCount = actualLength;
388 tempTextSize.width = width;
389 tempTextSize.height = height;
392 if (ret == TEXT_RETBY_OVERWIDTH || ret == TEXT_RETBY_LINEFEED)
397 if (__wrap == TEXT_OBJECT_WRAP_TYPE_WORD)
399 if (ret == TEXT_RETBY_LIMITWIDTH)
401 if (isFirstWord == false)
403 actualLength = tempTextCount;
404 width = tempTextSize.width;
405 height = tempTextSize.height;
407 ret = TEXT_RETBY_NORMAL;
414 if (0 < currentLength)
416 textIndexFromElementOffset += textCount;
422 if (ret == TEXT_RETBY_LIMITWIDTH)
428 if (pEnum->MoveNext() != E_SUCCESS)
433 pTextElement = static_cast < TextElement* >(pEnum->GetCurrent());
434 if (pTextElement == null)
440 textIndexFromElementOffset = pTextElement->GetValue(SET_TEXT_OFFSET);
441 currentLength = Math::Min(pTextElement->GetTextLength(), remainingLength);
444 if (ret == TEXT_RETBY_LIMITLENGTH)
446 ret = TEXT_RETBY_NORMAL;
449 if (isMaxHeightImage)
454 SetLastResult(E_SUCCESS);
464 TextComposite::GetRegion(int textIndex, int textLength, float& width, float& height) const
474 SysTryReturn(NID_GRP, 0 <= textIndex && textIndex < __length, E_INVALID_ARG, E_INVALID_ARG
475 , "[E_INVALID_ARG] The argument is invalid. textIndex(%d) __length(%d)", textIndex, __length);
476 SysTryReturn(NID_GRP, textLength <= __length, E_INVALID_ARG, E_INVALID_ARG
477 , "[E_INVALID_ARG] The argument is invalid. textIndex(%d) __length(%d)", textIndex, __length);
479 result r = E_SUCCESS;
480 IEnumerator* pEnum = null;
481 TextElement* pTextElement = null;
482 FloatDimension textSize;
483 int currentLength = 0;
484 int elementTextOffset = 0;
485 int elementIndex = 0;
486 int textIndexFromElementOffset = 0;
491 pTextElement = GetElementAtTextIndex(textIndex, elementTextOffset, elementIndex, currentLength, textIndexFromElementOffset);
492 SysTryReturn(NID_GRP, pTextElement, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to get text element.");
494 pEnum = __pTextElementList->GetEnumeratorN();
495 for (int i = 0; i <= elementIndex; i++)
497 r = pEnum->MoveNext();
498 SysTryCatch(NID_GRP, r == E_SUCCESS, , r, "[%s] Fail to move next element.", GetErrorMessage(r));
501 currentLength = Math::Min(currentLength, textLength);
503 while (textLength != 0)
505 pTextElement->GetRegion(textIndexFromElementOffset, currentLength, textSize.width, textSize.height);
507 width += textSize.width;
508 height = (height > textSize.height) ? height : textSize.height;
509 textLength -= currentLength;
511 if (pEnum->MoveNext() != E_SUCCESS)
516 pTextElement = static_cast < TextElement* >(pEnum->GetCurrent());
517 if (pTextElement == null)
522 textIndexFromElementOffset = pTextElement->GetValue(SET_TEXT_OFFSET);
523 currentLength = Math::Min(textLength, pTextElement->GetTextLength());
538 TextComposite::GetHeightF(int textIndex) const
545 SysTryReturn(NID_GRP, 0 <= textIndex && textIndex < __length, -1, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
547 TextElement* pTextElement = null;
548 int currentLength = 0;
549 int elementTextOffset = 0;
550 int elementIndex = 0;
551 int textIndexFromElementOffset = 0;
553 pTextElement = GetElementAtTextIndex(textIndex, elementTextOffset, elementIndex, currentLength, textIndexFromElementOffset);
554 SysTryCatch(NID_GRP, pTextElement, , E_SYSTEM, "[E_SYSTEM] Fail to get text element.");
556 return pTextElement->GetHeightF();
563 TextComposite::Draw(_CanvasImpl& canvasImpl, FloatRectangle& displayRect, int startTextIndex, int textLength, const TextObjectAlignment alignment,
564 const TextObjectActionType action)
571 SysTryReturn(NID_GRP, 0 <= startTextIndex && startTextIndex < __length, E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
572 SysTryReturn(NID_GRP, textLength <= __length, E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
574 result r = E_SUCCESS;
575 IEnumerator* pEnum = null;
576 TextElement* pTextElement = null;
577 FloatDimension textSize;
578 FloatDimension spaceCharDim;
579 FloatDimension abbrevTextDim;
580 FloatRectangle adjustedRect = displayRect;
581 FloatRectangle blockRect;
582 int currentLength = 0;
583 int elementTextOffset = 0;
584 int elementIndex = 0;
585 int textIndexFromElementOffset = 0;
586 bool drawAbbrevText = false;
588 if (__ignoreRearBlank && __rearSpaceHideMode == TEXT_OBJECT_SPACE_HIDE_TYPE_ONE)
590 pTextElement = GetElementAtTextIndex(startTextIndex + textLength - 1, elementTextOffset, elementIndex, currentLength, textIndexFromElementOffset);
591 SysTryCatch(NID_GRP, pTextElement, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to get element.");
593 const TextSimple* pSimpleText = dynamic_cast <const TextSimple*>(pTextElement);
594 if (pSimpleText != null)
596 int length = startTextIndex + textLength - elementTextOffset - 1;
597 const wchar_t* pText = pSimpleText->GetText();
598 SysTryReturn(NID_GRP, pText, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to get text.");
600 SysTryReturn(NID_GRP, length >= 0 && length < pSimpleText->GetTextLength()
601 , E_OUT_OF_RANGE, E_OUT_OF_RANGE, "[E_OUT_OF_RANGE] text index(%d) must greater than 0 and must be less than total string length(%d)",length, pSimpleText->GetTextLength());
603 if (pText[length] == (wchar_t)L' ')
605 GetRegion(length + elementTextOffset, 1, spaceCharDim.width, spaceCharDim.height);
611 pTextElement = GetElementAtTextIndex(startTextIndex, elementTextOffset, elementIndex, currentLength, textIndexFromElementOffset);
612 SysTryCatch(NID_GRP, pTextElement, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to get element.");
614 if (__ignoreFrontBlank && __frontSpaceHideMode == TEXT_OBJECT_SPACE_HIDE_TYPE_ONE && textLength > 0)
616 const TextSimple* pSimpleText = dynamic_cast <const TextSimple*>(pTextElement);
617 if (pSimpleText != null)
619 int index = startTextIndex - elementTextOffset;
620 const wchar_t* pText = pSimpleText->GetText();
621 SysTryReturn(NID_GRP, pText, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to get text.");
623 SysTryReturn(NID_GRP, index >= 0 && index < pSimpleText->GetTextLength()
624 , E_OUT_OF_RANGE, E_OUT_OF_RANGE, "[E_OUT_OF_RANGE] text index(%d) must greater than 0 and must be less than total string length(%d)",index, pSimpleText->GetTextLength());
626 if (pText[index] == (wchar_t)L' ')
628 GetRegion(textIndexFromElementOffset, 1, spaceCharDim.width, spaceCharDim.height);
632 textIndexFromElementOffset++;
637 GetRegion(startTextIndex, textLength, textSize.width, textSize.height);
638 if (action == TEXT_OBJECT_ACTION_TYPE_ABBREV)
640 TextElement* pLastTextElement = (textLength == 0) ? GetElementAtTextIndex(startTextIndex) : GetElementAtTextIndex(startTextIndex + textLength - 1);
641 SysTryCatch(NID_GRP, pLastTextElement, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to get element.");
643 if (pLastTextElement->GetType() == TEXT_ELEMENT_TYPE_TEXT)
645 TextSimple* pSimpleText = dynamic_cast < TextSimple* >(pLastTextElement);
646 SysTryCatch(NID_GRP, pSimpleText, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to cast text element.");
648 SetAbbrevObjectFontInfo(pSimpleText);
649 __pAbbrevTextElement->GetRegion(0, 1, abbrevTextDim.width, abbrevTextDim.height);
652 ForwardAnalyze(startTextIndex, __length - startTextIndex, adjustedRect.width - abbrevTextDim.width
653 , TEXT_OBJECT_WRAP_TYPE_CHARACTER, textLength, textSize.width, textSize.height);
655 textSize.width += abbrevTextDim.width;
656 currentLength = Math::Min(currentLength, textLength);
657 drawAbbrevText = true;
660 switch (alignment & TEXT_ALIGNMASK_HORIZ)
662 case TEXT_OBJECT_ALIGNMENT_CENTER:
663 if (textSize.width < adjustedRect.width)
665 adjustedRect.x += (adjustedRect.width - textSize.width) / 2;
669 case TEXT_OBJECT_ALIGNMENT_RIGHT:
670 if (textSize.width < adjustedRect.width)
672 adjustedRect.x += adjustedRect.width - textSize.width;
676 case TEXT_OBJECT_ALIGNMENT_LEFT:
682 pEnum = __pTextElementList->GetEnumeratorN();
683 for (int i = 0; i <= elementIndex; i++)
685 r = pEnum->MoveNext();
686 SysTryCatch(NID_GRP, r == E_SUCCESS, , r, "[%s] Fail to move next element.", GetErrorMessage(r));
689 if (drawAbbrevText && IsRTL(startTextIndex, textLength))
691 if (pTextElement->IsBackGroundDrawingModeEnable())
693 r = canvasImpl.FillRectangle(pTextElement->GetBackgroundColor(), FloatRectangle(adjustedRect.x, displayRect.y, abbrevTextDim.width, displayRect.height));
694 SysTryCatch(NID_GRP, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
697 __pAbbrevTextElement->Draw(canvasImpl, adjustedRect, 0, 1, (TextObjectAlignment)(TEXT_OBJECT_ALIGNMENT_TOP | TEXT_OBJECT_ALIGNMENT_LEFT), action);
699 adjustedRect.x += abbrevTextDim.width;
700 adjustedRect.width -= abbrevTextDim.width;
702 drawAbbrevText = false;
705 blockRect = FloatRectangle(adjustedRect.x, displayRect.y, adjustedRect.width, adjustedRect.height);
706 currentLength = Math::Min(textLength, currentLength);
708 while (textLength > 0)
710 textLength -= currentLength;
712 pTextElement->GetRegion(textIndexFromElementOffset, currentLength, textSize.width, textSize.height);
714 switch (alignment & TEXT_ALIGNMASK_VERT)
716 case TEXT_OBJECT_ALIGNMENT_MIDDLE:
717 adjustedRect.y = displayRect.y + (displayRect.height - textSize.height) / 2;
720 case TEXT_OBJECT_ALIGNMENT_BOTTOM:
721 adjustedRect.y = displayRect.y + (displayRect.height - textSize.height);
724 case TEXT_OBJECT_ALIGNMENT_TOP:
727 adjustedRect.y = displayRect.y;
731 if (pTextElement->IsBackGroundDrawingModeEnable())
733 DrawBackgroundBlock(canvasImpl, FloatRectangle(adjustedRect.x, displayRect.y, adjustedRect.width, adjustedRect.height), startTextIndex, currentLength, alignment, action);
736 bool isAlternateLookEnabled = (pTextElement->GetValue(SET_ALTERNATE_LOOK) > 0) ? true : false;
737 if (__displayBlock && isAlternateLookEnabled == false)
739 DrawBlock(canvasImpl, blockRect, startTextIndex, currentLength, alignment, action);
742 pTextElement->Draw(canvasImpl, adjustedRect, textIndexFromElementOffset, currentLength, alignment, action);
744 adjustedRect.x += textSize.width;
745 adjustedRect.width -= textSize.width;
747 if (!textLength || adjustedRect.width <= 0)
752 startTextIndex += currentLength;
754 if (pEnum->MoveNext() != E_SUCCESS)
759 pTextElement = static_cast < TextElement* >(pEnum->GetCurrent());
760 SysTryCatch(NID_GRP, pTextElement, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to get element.");
762 textIndexFromElementOffset = pTextElement->GetValue(SET_TEXT_OFFSET);
763 currentLength = Math::Min(textLength, pTextElement->GetTextLength());
765 if (currentLength == 0)
773 if (pTextElement->IsBackGroundDrawingModeEnable())
775 r = canvasImpl.FillRectangle(pTextElement->GetBackgroundColor(), FloatRectangle(adjustedRect.x, displayRect.y, abbrevTextDim.width, displayRect.height));
776 SysTryCatch(NID_GRP, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
779 __pAbbrevTextElement->Draw(canvasImpl, adjustedRect, 0, 1, (TextObjectAlignment)(TEXT_OBJECT_ALIGNMENT_TOP | TEXT_OBJECT_ALIGNMENT_LEFT), action);
781 adjustedRect.x += abbrevTextDim.width;
782 adjustedRect.width -= abbrevTextDim.width;
794 TextComposite::DrawWithEliipsis(_CanvasImpl& canvasImpl, FloatRectangle& displayRect, int startTextIndex, int textLength, const TextObjectAlignment alignment,
795 const TextObjectActionType action)
802 SysTryReturn(NID_GRP, 0 <= startTextIndex && startTextIndex < __length, E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
803 SysTryReturn(NID_GRP, textLength <= __length, E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
805 result r = E_SUCCESS;
806 IEnumerator* pEnum = null;
807 TextElement* pTextElement = null;
808 TextElement* pLastDisplayTextElement = null;
809 FloatDimension textSize;
810 FloatDimension spaceCharDim;
811 FloatDimension abbrevTextDim;
812 FloatRectangle adjustedRect = displayRect;
813 FloatRectangle blockRect;
814 int currentLength = 0;
815 int elementTextOffset = 0;
816 int elementIndex = 0;
817 int textIndexFromElementOffset = 0;
818 int LTRTextLength = 0;
819 int RTLTextLength = 0;
820 bool drawAbbrevText = false;
822 if (__ignoreRearBlank && __rearSpaceHideMode == TEXT_OBJECT_SPACE_HIDE_TYPE_ONE)
824 pTextElement = GetElementAtTextIndex(startTextIndex + textLength - 1, elementTextOffset, elementIndex, currentLength, textIndexFromElementOffset);
825 SysTryCatch(NID_GRP, pTextElement, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to get element.");
827 const TextSimple* pSimpleText = dynamic_cast <const TextSimple*>(pTextElement);
828 if (pSimpleText != null)
830 int length = startTextIndex + textLength - elementTextOffset - 1;
831 const wchar_t* pText = pSimpleText->GetText();
832 SysTryReturn(NID_GRP, pText, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to get text.");
834 SysTryReturn(NID_GRP, length >= 0 && length < pSimpleText->GetTextLength()
835 , E_OUT_OF_RANGE, E_OUT_OF_RANGE, "[E_OUT_OF_RANGE] text index(%d) must greater than 0 and must be less than total string length(%d)",length, pSimpleText->GetTextLength());
837 if (pText[length] == (wchar_t)L' ')
839 GetRegion(length + elementTextOffset, 1, spaceCharDim.width, spaceCharDim.height);
845 pTextElement = GetElementAtTextIndex(startTextIndex, elementTextOffset, elementIndex, currentLength, textIndexFromElementOffset);
846 SysTryCatch(NID_GRP, pTextElement, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to get element.");
848 if (__ignoreFrontBlank && __frontSpaceHideMode == TEXT_OBJECT_SPACE_HIDE_TYPE_ONE && textLength > 0)
850 const TextSimple* pSimpleText = dynamic_cast <const TextSimple*>(pTextElement);
851 if (pSimpleText != null)
853 int index = startTextIndex - elementTextOffset;
854 const wchar_t* pText = pSimpleText->GetText();
855 SysTryReturn(NID_GRP, pText, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to get text.");
857 SysTryReturn(NID_GRP, index >= 0 && index < pSimpleText->GetTextLength()
858 , E_OUT_OF_RANGE, E_OUT_OF_RANGE, "[E_OUT_OF_RANGE] text index(%d) must greater than 0 and must be less than total string length(%d)",index, pSimpleText->GetTextLength());
860 if (pText[index] == (wchar_t)L' ')
862 GetRegion(textIndexFromElementOffset, 1, spaceCharDim.width, spaceCharDim.height);
866 textIndexFromElementOffset++;
871 GetRegion(startTextIndex, textLength, textSize.width, textSize.height);
872 if (action == TEXT_OBJECT_ACTION_TYPE_ABBREV)
874 pLastDisplayTextElement = (textLength == 0) ? GetElementAtTextIndex(startTextIndex) : GetElementAtTextIndex(startTextIndex + textLength - 1);
875 SysTryCatch(NID_GRP, pLastDisplayTextElement, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to get element.");
877 if (pLastDisplayTextElement->GetType() == TEXT_ELEMENT_TYPE_TEXT)
879 TextSimple* pSimpleText = dynamic_cast < TextSimple* >(pLastDisplayTextElement);
880 SysTryCatch(NID_GRP, pSimpleText, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to cast text element.");
882 SetAbbrevObjectFontInfo(pSimpleText);
883 __pAbbrevTextElement->GetRegion(0, 1, abbrevTextDim.width, abbrevTextDim.height);
886 ForwardAnalyze(startTextIndex, __length - startTextIndex, adjustedRect.width - abbrevTextDim.width
887 , TEXT_OBJECT_WRAP_TYPE_CHARACTER, textLength, textSize.width, textSize.height);
889 textSize.width += abbrevTextDim.width;
890 currentLength = Math::Min(currentLength, textLength);
891 drawAbbrevText = true;
894 switch (alignment & TEXT_ALIGNMASK_HORIZ)
896 case TEXT_OBJECT_ALIGNMENT_CENTER:
897 if (textSize.width < adjustedRect.width)
899 adjustedRect.x += (adjustedRect.width - textSize.width) / 2;
903 case TEXT_OBJECT_ALIGNMENT_RIGHT:
904 if (textSize.width < adjustedRect.width)
906 adjustedRect.x += adjustedRect.width - textSize.width;
910 case TEXT_OBJECT_ALIGNMENT_LEFT:
916 pEnum = __pTextElementList->GetEnumeratorN();
917 for (int i = 0; i <= elementIndex; i++)
919 r = pEnum->MoveNext();
920 SysTryCatch(NID_GRP, r == E_SUCCESS, , r, "[%s] Fail to move next element.", GetErrorMessage(r));
923 blockRect = FloatRectangle(adjustedRect.x, displayRect.y, adjustedRect.width, adjustedRect.height);
924 currentLength = Math::Min(textLength, currentLength);
928 if (IsRTLCharacter(startTextIndex + currentLength))
930 LTRTextLength = SearchLTRTextIndex(startTextIndex, startTextIndex + currentLength) - startTextIndex;
931 RTLTextLength = textLength - LTRTextLength;
933 if (LTRTextLength <= 0)
935 if (pLastDisplayTextElement->IsBackGroundDrawingModeEnable())
937 r = canvasImpl.FillRectangle(pLastDisplayTextElement->GetBackgroundColor(), FloatRectangle(adjustedRect.x, displayRect.y, abbrevTextDim.width, displayRect.height));
938 SysTryCatch(NID_GRP, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
941 __pAbbrevTextElement->Draw(canvasImpl, adjustedRect, 0, 1, (TextObjectAlignment)(TEXT_OBJECT_ALIGNMENT_TOP | TEXT_OBJECT_ALIGNMENT_LEFT), action);
943 adjustedRect.x += abbrevTextDim.width;
944 adjustedRect.width -= abbrevTextDim.width;
946 drawAbbrevText = false;
951 LTRTextLength = textLength;
956 if (LTRTextLength > 0)
958 currentLength = Math::Min(LTRTextLength, currentLength);
960 while (LTRTextLength > 0)
962 LTRTextLength -= currentLength;
964 pTextElement->GetRegion(textIndexFromElementOffset, currentLength, textSize.width, textSize.height);
966 switch (alignment & TEXT_ALIGNMASK_VERT)
968 case TEXT_OBJECT_ALIGNMENT_MIDDLE:
969 adjustedRect.y = displayRect.y + (displayRect.height - textSize.height) / 2;
972 case TEXT_OBJECT_ALIGNMENT_BOTTOM:
973 adjustedRect.y = displayRect.y + (displayRect.height - textSize.height);
976 case TEXT_OBJECT_ALIGNMENT_TOP:
979 adjustedRect.y = displayRect.y;
983 if (pTextElement->IsBackGroundDrawingModeEnable())
985 DrawBackgroundBlock(canvasImpl, FloatRectangle(adjustedRect.x, displayRect.y, adjustedRect.width, adjustedRect.height), startTextIndex, currentLength, alignment, action);
988 bool isAlternateLookEnabled = (pTextElement->GetValue(SET_ALTERNATE_LOOK) > 0) ? true : false;
989 if (__displayBlock && isAlternateLookEnabled == false)
991 DrawBlock(canvasImpl, blockRect, startTextIndex, currentLength, alignment, action);
994 pTextElement->Draw(canvasImpl, adjustedRect, textIndexFromElementOffset, currentLength, alignment, action);
996 adjustedRect.x += textSize.width;
997 adjustedRect.width -= textSize.width;
999 if (!LTRTextLength || adjustedRect.width <= 0)
1004 startTextIndex += currentLength;
1006 if (pEnum->MoveNext() != E_SUCCESS)
1011 pTextElement = static_cast < TextElement* >(pEnum->GetCurrent());
1012 SysTryCatch(NID_GRP, pTextElement, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to get element.");
1014 textIndexFromElementOffset = pTextElement->GetValue(SET_TEXT_OFFSET);
1015 currentLength = Math::Min(LTRTextLength, pTextElement->GetTextLength());
1017 if (currentLength == 0)
1023 textIndexFromElementOffset += LTRTextLength;
1024 textLength -= LTRTextLength;
1027 if (drawAbbrevText && (RTLTextLength > 0))
1029 if (pTextElement->IsBackGroundDrawingModeEnable())
1031 r = canvasImpl.FillRectangle(pTextElement->GetBackgroundColor(), FloatRectangle(adjustedRect.x, displayRect.y, abbrevTextDim.width, displayRect.height));
1032 SysTryCatch(NID_GRP, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
1035 __pAbbrevTextElement->Draw(canvasImpl, adjustedRect, 0, 1, (TextObjectAlignment)(TEXT_OBJECT_ALIGNMENT_TOP | TEXT_OBJECT_ALIGNMENT_LEFT), action);
1037 adjustedRect.x += abbrevTextDim.width;
1038 adjustedRect.width -= abbrevTextDim.width;
1040 drawAbbrevText = false;
1043 if (RTLTextLength > 0)
1045 currentLength = Math::Min(RTLTextLength, currentLength);
1047 while (RTLTextLength > 0)
1049 RTLTextLength -= currentLength;
1051 pTextElement->GetRegion(textIndexFromElementOffset, currentLength, textSize.width, textSize.height);
1053 switch (alignment & TEXT_ALIGNMASK_VERT)
1055 case TEXT_OBJECT_ALIGNMENT_MIDDLE:
1056 adjustedRect.y = displayRect.y + (displayRect.height - textSize.height) / 2;
1059 case TEXT_OBJECT_ALIGNMENT_BOTTOM:
1060 adjustedRect.y = displayRect.y + (displayRect.height - textSize.height);
1063 case TEXT_OBJECT_ALIGNMENT_TOP:
1066 adjustedRect.y = displayRect.y;
1070 if (pTextElement->IsBackGroundDrawingModeEnable())
1072 DrawBackgroundBlock(canvasImpl, FloatRectangle(adjustedRect.x, displayRect.y, adjustedRect.width, adjustedRect.height), startTextIndex, currentLength, alignment, action);
1075 bool isAlternateLookEnabled = (pTextElement->GetValue(SET_ALTERNATE_LOOK) > 0) ? true : false;
1076 if (__displayBlock && isAlternateLookEnabled == false)
1078 DrawBlock(canvasImpl, blockRect, startTextIndex, currentLength, alignment, action);
1081 pTextElement->Draw(canvasImpl, adjustedRect, textIndexFromElementOffset, currentLength, alignment, action);
1083 adjustedRect.x += textSize.width;
1084 adjustedRect.width -= textSize.width;
1086 if (!RTLTextLength || adjustedRect.width <= 0)
1091 startTextIndex += currentLength;
1093 if (pEnum->MoveNext() != E_SUCCESS)
1098 pTextElement = static_cast < TextElement* >(pEnum->GetCurrent());
1099 SysTryCatch(NID_GRP, pTextElement, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to get element.");
1101 textIndexFromElementOffset = pTextElement->GetValue(SET_TEXT_OFFSET);
1102 currentLength = Math::Min(RTLTextLength, pTextElement->GetTextLength());
1104 if (currentLength == 0)
1110 textLength -= RTLTextLength;
1115 if (pTextElement->IsBackGroundDrawingModeEnable())
1117 r = canvasImpl.FillRectangle(pTextElement->GetBackgroundColor(), FloatRectangle(adjustedRect.x, displayRect.y, abbrevTextDim.width, displayRect.height));
1118 SysTryCatch(NID_GRP, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
1121 __pAbbrevTextElement->Draw(canvasImpl, adjustedRect, 0, 1, (TextObjectAlignment)(TEXT_OBJECT_ALIGNMENT_TOP | TEXT_OBJECT_ALIGNMENT_LEFT), action);
1123 adjustedRect.x += abbrevTextDim.width;
1124 adjustedRect.width -= abbrevTextDim.width;
1136 TextComposite::DrawWithBaseline(_CanvasImpl& canvasImpl, FloatRectangle& displayRect, int startTextIndex, int textLength, const TextObjectAlignment alignment,
1137 const TextObjectActionType action, int baseline)
1139 if (textLength == 0)
1144 SysTryReturn(NID_GRP, 0 <= startTextIndex && startTextIndex < __length, E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1145 SysTryReturn(NID_GRP, textLength <= __length, E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1147 result r = E_SUCCESS;
1148 IEnumerator* pEnum = null;
1149 TextElement* pTextElement = null;
1151 FloatDimension textSize;
1152 FloatDimension spaceCharDim;
1153 FloatDimension abbrevTextDim;
1154 FloatRectangle adjustedRect = displayRect;
1155 FloatRectangle blockRect;
1156 int currentLength = 0;
1157 int elementTextOffset = 0;
1158 int elementIndex = 0;
1159 int textIndexFromElementOffset = 0;
1160 bool drawAbbrevText = false;
1162 if (__ignoreRearBlank && __rearSpaceHideMode == TEXT_OBJECT_SPACE_HIDE_TYPE_ONE)
1164 pTextElement = GetElementAtTextIndex(startTextIndex + textLength - 1, elementTextOffset, elementIndex, currentLength, textIndexFromElementOffset);
1165 SysTryCatch(NID_GRP, pTextElement, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to get element.");
1166 const TextSimple* pSimpleText = dynamic_cast <const TextSimple*>(pTextElement);
1167 if (pSimpleText != null)
1169 int length = startTextIndex + textLength - elementTextOffset - 1;
1170 const wchar_t* pText = pSimpleText->GetText();
1171 SysTryReturn(NID_GRP, pText, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to get text.");
1173 SysTryReturn(NID_GRP, length >= 0 && length < pSimpleText->GetTextLength()
1174 , E_OUT_OF_RANGE, E_OUT_OF_RANGE, "[E_OUT_OF_RANGE] text index(%d) must greater than 0 and must be less than total string length(%d)",length, pSimpleText->GetTextLength());
1176 if (pText[length] == (wchar_t)L' ')
1178 GetRegion(length + elementTextOffset, 1, spaceCharDim.width, spaceCharDim.height);
1184 pTextElement = GetElementAtTextIndex(startTextIndex, elementTextOffset, elementIndex, currentLength, textIndexFromElementOffset);
1185 SysTryCatch(NID_GRP, pTextElement, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to get element.");
1187 if (__ignoreFrontBlank && __frontSpaceHideMode == TEXT_OBJECT_SPACE_HIDE_TYPE_ONE && textLength > 0)
1189 const TextSimple* pSimpleText = dynamic_cast <const TextSimple*>(pTextElement);
1190 if (pSimpleText != null)
1192 int index = startTextIndex - elementTextOffset;
1193 const wchar_t* pText = pSimpleText->GetText();
1194 SysTryReturn(NID_GRP, pText, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to get text.");
1196 SysTryReturn(NID_GRP, index >= 0 && index < pSimpleText->GetTextLength()
1197 , E_OUT_OF_RANGE, E_OUT_OF_RANGE, "[E_OUT_OF_RANGE] text index(%d) must greater than 0 and must be less than total string length(%d)",index, pSimpleText->GetTextLength());
1199 if (pText[index] == (wchar_t)L' ')
1201 GetRegion(textIndexFromElementOffset, 1, spaceCharDim.width, spaceCharDim.height);
1204 textIndexFromElementOffset++;
1209 GetRegion(startTextIndex, textLength, textSize.width, textSize.height);
1210 if (action == TEXT_OBJECT_ACTION_TYPE_ABBREV)
1212 TextElement* pLastTextElement = GetElementAtTextIndex(startTextIndex + textLength - 1);
1213 SysTryCatch(NID_GRP, pLastTextElement, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to get element.");
1215 if (pLastTextElement->GetType() == TEXT_ELEMENT_TYPE_TEXT)
1217 TextSimple* pSimpleText = dynamic_cast < TextSimple* >(pLastTextElement);
1218 SysTryCatch(NID_GRP, pSimpleText, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to cast text element.");
1220 SetAbbrevObjectFontInfo(pSimpleText);
1221 __pAbbrevTextElement->GetRegion(0, 1, abbrevTextDim.width, abbrevTextDim.height);
1224 ForwardAnalyze(startTextIndex, __length - startTextIndex, adjustedRect.width - abbrevTextDim.width
1225 , TEXT_OBJECT_WRAP_TYPE_CHARACTER, textLength, textSize.width, textSize.height);
1227 textSize.width += abbrevTextDim.width;
1228 currentLength = textLength;
1229 drawAbbrevText = true;
1232 switch (alignment & TEXT_ALIGNMASK_HORIZ)
1234 case TEXT_OBJECT_ALIGNMENT_CENTER:
1235 if (textSize.width < adjustedRect.width)
1237 adjustedRect.x += (adjustedRect.width - textSize.width) / 2;
1241 case TEXT_OBJECT_ALIGNMENT_RIGHT:
1242 if (textSize.width < adjustedRect.width)
1244 adjustedRect.x += adjustedRect.width - textSize.width;
1248 case TEXT_OBJECT_ALIGNMENT_LEFT:
1254 pEnum = __pTextElementList->GetEnumeratorN();
1255 for (int i = 0; i <= elementIndex; i++)
1257 r = pEnum->MoveNext();
1258 SysTryCatch(NID_GRP, r == E_SUCCESS, , r, "[%s] Fail to move next element.", GetErrorMessage(r));
1261 blockRect = FloatRectangle(adjustedRect.x, displayRect.y, adjustedRect.width, adjustedRect.height);
1262 adjustedRect.y = displayRect.y + displayRect.height - baseline;
1263 canvasImpl.SetTextOrigin(TEXT_ORIGIN_BASELINE);
1265 currentLength = Math::Min(textLength, currentLength);
1267 while (textLength > 0)
1269 textLength -= currentLength;
1271 pTextElement->GetRegion(textIndexFromElementOffset, currentLength, textSize.width, textSize.height);
1273 if (pTextElement->IsBackGroundDrawingModeEnable())
1275 DrawBackgroundBlock(canvasImpl, FloatRectangle(adjustedRect.x, displayRect.y, adjustedRect.width, adjustedRect.height), startTextIndex, currentLength, alignment, action);
1278 bool isAlternateLookEnabled = (pTextElement->GetValue(SET_ALTERNATE_LOOK) > 0) ? true : false;
1279 if (__displayBlock && isAlternateLookEnabled == false)
1281 DrawBlock(canvasImpl, blockRect, startTextIndex, currentLength, alignment, action);
1284 FloatRectangle imageRect = adjustedRect;
1285 imageRect.y -= textSize.height;
1286 TextElementType objectType = pTextElement->GetType();
1288 if (objectType == TEXT_ELEMENT_TYPE_CUTLINK || objectType == TEXT_ELEMENT_TYPE_TEXT)
1290 pTextElement->Draw(canvasImpl, adjustedRect, textIndexFromElementOffset, currentLength, alignment, action);
1294 pTextElement->Draw(canvasImpl, imageRect, textIndexFromElementOffset, currentLength, alignment, action);
1297 adjustedRect.x += textSize.width;
1298 adjustedRect.width -= textSize.width;
1300 if (!textLength || adjustedRect.width <= 0)
1305 startTextIndex += currentLength;
1307 if (pEnum->MoveNext() != E_SUCCESS)
1312 pTextElement = static_cast < TextElement* >(pEnum->GetCurrent());
1313 SysTryCatch(NID_GRP, pTextElement, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to get element.");
1315 textIndexFromElementOffset = pTextElement->GetValue(SET_TEXT_OFFSET);
1316 currentLength = Math::Min(textLength, pTextElement->GetTextLength());
1318 if (currentLength == 0)
1326 if (pTextElement->IsBackGroundDrawingModeEnable())
1328 r = canvasImpl.FillRectangle(pTextElement->GetBackgroundColor(), FloatRectangle(adjustedRect.x, displayRect.y, abbrevTextDim.width, displayRect.height));
1329 SysTryCatch(NID_GRP, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
1332 __pAbbrevTextElement->Draw(canvasImpl, adjustedRect, 0, 1, (TextObjectAlignment)(TEXT_OBJECT_ALIGNMENT_TOP | TEXT_OBJECT_ALIGNMENT_LEFT), action);
1334 adjustedRect.x += abbrevTextDim.width;
1335 adjustedRect.width -= abbrevTextDim.width;
1338 canvasImpl.SetTextOrigin(TEXT_ORIGIN_LEFT_TOP);
1344 canvasImpl.SetTextOrigin(TEXT_ORIGIN_LEFT_TOP);
1351 TextComposite::DrawWithBaselineWithEllipsis(_CanvasImpl& canvasImpl, FloatRectangle& displayRect, int startTextIndex, int textLength, const TextObjectAlignment alignment,
1352 const TextObjectActionType action, int baseline)
1354 if (textLength == 0)
1359 SysTryReturn(NID_GRP, 0 <= startTextIndex && startTextIndex < __length, E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1360 SysTryReturn(NID_GRP, textLength <= __length, E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1362 result r = E_SUCCESS;
1363 IEnumerator* pEnum = null;
1364 TextElement* pTextElement = null;
1365 TextElement* pLastDisplayTextElement = null;
1366 FloatDimension textSize;
1367 FloatDimension spaceCharDim;
1368 FloatDimension abbrevTextDim;
1369 FloatRectangle adjustedRect = displayRect;
1370 FloatRectangle blockRect;
1371 int currentLength = 0;
1372 int elementTextOffset = 0;
1373 int elementIndex = 0;
1374 int textIndexFromElementOffset = 0;
1375 int LTRTextLength = 0;
1376 int RTLTextLength = 0;
1377 bool drawAbbrevText = false;
1379 if (__ignoreRearBlank && __rearSpaceHideMode == TEXT_OBJECT_SPACE_HIDE_TYPE_ONE)
1381 pLastDisplayTextElement = GetElementAtTextIndex(startTextIndex + textLength - 1, elementTextOffset, elementIndex, currentLength, textIndexFromElementOffset);
1382 SysTryCatch(NID_GRP, pLastDisplayTextElement, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to get element.");
1383 const TextSimple* pSimpleText = dynamic_cast <const TextSimple*>(pLastDisplayTextElement);
1384 if (pSimpleText != null)
1386 int length = startTextIndex + textLength - elementTextOffset - 1;
1387 const wchar_t* pText = pSimpleText->GetText();
1388 SysTryReturn(NID_GRP, pText, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to get text.");
1390 SysTryReturn(NID_GRP, length >= 0 && length < pSimpleText->GetTextLength()
1391 , E_OUT_OF_RANGE, E_OUT_OF_RANGE, "[E_OUT_OF_RANGE] text index(%d) must greater than 0 and must be less than total string length(%d)",length, pSimpleText->GetTextLength());
1393 if (pText[length] == (wchar_t)L' ')
1395 GetRegion(length + elementTextOffset, 1, spaceCharDim.width, spaceCharDim.height);
1401 pTextElement = GetElementAtTextIndex(startTextIndex, elementTextOffset, elementIndex, currentLength, textIndexFromElementOffset);
1402 SysTryCatch(NID_GRP, pTextElement, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to get element.");
1404 if (__ignoreFrontBlank && __frontSpaceHideMode == TEXT_OBJECT_SPACE_HIDE_TYPE_ONE && textLength > 0)
1406 const TextSimple* pSimpleText = dynamic_cast <const TextSimple*>(pTextElement);
1407 if (pSimpleText != null)
1409 int index = startTextIndex - elementTextOffset;
1410 const wchar_t* pText = pSimpleText->GetText();
1411 SysTryReturn(NID_GRP, pText, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to get text.");
1413 SysTryReturn(NID_GRP, index >= 0 && index < pSimpleText->GetTextLength()
1414 , E_OUT_OF_RANGE, E_OUT_OF_RANGE, "[E_OUT_OF_RANGE] text index(%d) must greater than 0 and must be less than total string length(%d)",index, pSimpleText->GetTextLength());
1416 if (pText[index] == (wchar_t)L' ')
1418 GetRegion(textIndexFromElementOffset, 1, spaceCharDim.width, spaceCharDim.height);
1421 textIndexFromElementOffset++;
1426 GetRegion(startTextIndex, textLength, textSize.width, textSize.height);
1427 if (action == TEXT_OBJECT_ACTION_TYPE_ABBREV)
1429 TextElement* pLastTextElement = GetElementAtTextIndex(startTextIndex + textLength - 1);
1430 SysTryCatch(NID_GRP, pLastTextElement, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to get element.");
1432 if (pLastTextElement->GetType() == TEXT_ELEMENT_TYPE_TEXT)
1434 TextSimple* pSimpleText = dynamic_cast < TextSimple* >(pLastTextElement);
1435 SysTryCatch(NID_GRP, pSimpleText, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to cast text element.");
1437 SetAbbrevObjectFontInfo(pSimpleText);
1438 __pAbbrevTextElement->GetRegion(0, 1, abbrevTextDim.width, abbrevTextDim.height);
1441 ForwardAnalyze(startTextIndex, __length - startTextIndex, adjustedRect.width - abbrevTextDim.width
1442 , TEXT_OBJECT_WRAP_TYPE_CHARACTER, textLength, textSize.width, textSize.height);
1444 textSize.width += abbrevTextDim.width;
1445 currentLength = textLength;
1446 drawAbbrevText = true;
1449 switch (alignment & TEXT_ALIGNMASK_HORIZ)
1451 case TEXT_OBJECT_ALIGNMENT_CENTER:
1452 if (textSize.width < adjustedRect.width)
1454 adjustedRect.x += (adjustedRect.width - textSize.width) / 2;
1458 case TEXT_OBJECT_ALIGNMENT_RIGHT:
1459 if (textSize.width < adjustedRect.width)
1461 adjustedRect.x += adjustedRect.width - textSize.width;
1465 case TEXT_OBJECT_ALIGNMENT_LEFT:
1471 pEnum = __pTextElementList->GetEnumeratorN();
1472 for (int i = 0; i <= elementIndex; i++)
1474 r = pEnum->MoveNext();
1475 SysTryCatch(NID_GRP, r == E_SUCCESS, , r, "[%s] Fail to move next element.", GetErrorMessage(r));
1478 blockRect = FloatRectangle(adjustedRect.x, displayRect.y, adjustedRect.width, adjustedRect.height);
1479 adjustedRect.y = displayRect.y + displayRect.height - baseline;
1480 canvasImpl.SetTextOrigin(TEXT_ORIGIN_BASELINE);
1484 if (IsRTLCharacter(startTextIndex + currentLength))
1486 LTRTextLength = SearchLTRTextIndex(startTextIndex, startTextIndex + currentLength) - startTextIndex;
1487 RTLTextLength = textLength - LTRTextLength;
1489 if (LTRTextLength <= 0)
1491 if (pLastDisplayTextElement && pLastDisplayTextElement->IsBackGroundDrawingModeEnable())
1493 r = canvasImpl.FillRectangle(pLastDisplayTextElement->GetBackgroundColor(), FloatRectangle(adjustedRect.x, displayRect.y, abbrevTextDim.width, displayRect.height));
1494 SysTryCatch(NID_GRP, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
1497 __pAbbrevTextElement->Draw(canvasImpl, adjustedRect, 0, 1, (TextObjectAlignment)(TEXT_OBJECT_ALIGNMENT_TOP | TEXT_OBJECT_ALIGNMENT_LEFT), action);
1499 adjustedRect.x += abbrevTextDim.width;
1500 adjustedRect.width -= abbrevTextDim.width;
1502 drawAbbrevText = false;
1507 LTRTextLength = textLength;
1512 if (LTRTextLength > 0)
1514 currentLength = Math::Min(LTRTextLength, currentLength);
1516 while (LTRTextLength > 0)
1518 LTRTextLength -= currentLength;
1520 pTextElement->GetRegion(textIndexFromElementOffset, currentLength, textSize.width, textSize.height);
1522 if (pTextElement->IsBackGroundDrawingModeEnable())
1524 DrawBackgroundBlock(canvasImpl, FloatRectangle(adjustedRect.x, displayRect.y, adjustedRect.width, adjustedRect.height), startTextIndex, currentLength, alignment, action);
1527 bool isAlternateLookEnabled = (pTextElement->GetValue(SET_ALTERNATE_LOOK) > 0) ? true : false;
1528 if (__displayBlock && isAlternateLookEnabled == false)
1530 DrawBlock(canvasImpl, blockRect, startTextIndex, currentLength, alignment, action);
1533 FloatRectangle imageRect = adjustedRect;
1534 imageRect.y -= textSize.height;
1535 TextElementType objectType = pTextElement->GetType();
1537 if (objectType == TEXT_ELEMENT_TYPE_CUTLINK || objectType == TEXT_ELEMENT_TYPE_TEXT)
1539 pTextElement->Draw(canvasImpl, adjustedRect, textIndexFromElementOffset, currentLength, alignment, action);
1543 pTextElement->Draw(canvasImpl, imageRect, textIndexFromElementOffset, currentLength, alignment, action);
1546 adjustedRect.x += textSize.width;
1547 adjustedRect.width -= textSize.width;
1549 if (!LTRTextLength || adjustedRect.width <= 0)
1554 startTextIndex += currentLength;
1556 if (pEnum->MoveNext() != E_SUCCESS)
1561 pTextElement = static_cast < TextElement* >(pEnum->GetCurrent());
1562 SysTryCatch(NID_GRP, pTextElement, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to get element.");
1564 textIndexFromElementOffset = pTextElement->GetValue(SET_TEXT_OFFSET);
1565 currentLength = Math::Min(LTRTextLength, pTextElement->GetTextLength());
1567 if (currentLength == 0)
1573 textIndexFromElementOffset += LTRTextLength;
1574 textLength -= LTRTextLength;
1577 if (drawAbbrevText && (RTLTextLength > 0))
1579 if (pTextElement->IsBackGroundDrawingModeEnable())
1581 r = canvasImpl.FillRectangle(pTextElement->GetBackgroundColor(), FloatRectangle(adjustedRect.x, displayRect.y, abbrevTextDim.width, displayRect.height));
1582 SysTryCatch(NID_GRP, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
1585 __pAbbrevTextElement->Draw(canvasImpl, adjustedRect, 0, 1, (TextObjectAlignment)(TEXT_OBJECT_ALIGNMENT_TOP | TEXT_OBJECT_ALIGNMENT_LEFT), action);
1587 adjustedRect.x += abbrevTextDim.width;
1588 adjustedRect.width -= abbrevTextDim.width;
1590 drawAbbrevText = false;
1593 if (RTLTextLength > 0)
1595 currentLength = Math::Min(RTLTextLength, currentLength);
1597 while (RTLTextLength > 0)
1599 RTLTextLength -= currentLength;
1601 pTextElement->GetRegion(textIndexFromElementOffset, currentLength, textSize.width, textSize.height);
1603 if (pTextElement->IsBackGroundDrawingModeEnable())
1605 DrawBackgroundBlock(canvasImpl, FloatRectangle(adjustedRect.x, displayRect.y, adjustedRect.width, adjustedRect.height), startTextIndex, currentLength, alignment, action);
1608 bool isAlternateLookEnabled = (pTextElement->GetValue(SET_ALTERNATE_LOOK) > 0) ? true : false;
1609 if (__displayBlock && isAlternateLookEnabled == false)
1611 DrawBlock(canvasImpl, blockRect, startTextIndex, currentLength, alignment, action);
1614 FloatRectangle imageRect = adjustedRect;
1615 imageRect.y -= textSize.height;
1616 TextElementType objectType = pTextElement->GetType();
1618 if (objectType == TEXT_ELEMENT_TYPE_CUTLINK || objectType == TEXT_ELEMENT_TYPE_TEXT)
1620 pTextElement->Draw(canvasImpl, adjustedRect, textIndexFromElementOffset, currentLength, alignment, action);
1624 pTextElement->Draw(canvasImpl, imageRect, textIndexFromElementOffset, currentLength, alignment, action);
1627 adjustedRect.x += textSize.width;
1628 adjustedRect.width -= textSize.width;
1630 if (!RTLTextLength || adjustedRect.width <= 0)
1635 startTextIndex += currentLength;
1637 if (pEnum->MoveNext() != E_SUCCESS)
1642 pTextElement = static_cast < TextElement* >(pEnum->GetCurrent());
1643 SysTryCatch(NID_GRP, pTextElement, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to get element.");
1645 textIndexFromElementOffset = pTextElement->GetValue(SET_TEXT_OFFSET);
1646 currentLength = Math::Min(RTLTextLength, pTextElement->GetTextLength());
1648 if (currentLength == 0)
1654 textLength -= RTLTextLength;
1659 if (pTextElement->IsBackGroundDrawingModeEnable())
1661 r = canvasImpl.FillRectangle(pTextElement->GetBackgroundColor(), FloatRectangle(adjustedRect.x, displayRect.y, abbrevTextDim.width, displayRect.height));
1662 SysTryCatch(NID_GRP, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
1665 __pAbbrevTextElement->Draw(canvasImpl, adjustedRect, 0, 1, (TextObjectAlignment)(TEXT_OBJECT_ALIGNMENT_TOP | TEXT_OBJECT_ALIGNMENT_LEFT), action);
1667 adjustedRect.x += abbrevTextDim.width;
1668 adjustedRect.width -= abbrevTextDim.width;
1671 canvasImpl.SetTextOrigin(TEXT_ORIGIN_LEFT_TOP);
1677 canvasImpl.SetTextOrigin(TEXT_ORIGIN_LEFT_TOP);
1684 TextComposite::DrawBlock(_CanvasImpl& canvasImpl, const FloatRectangle& displayRect, int startTextIndex, int textLength,
1685 const TextObjectAlignment align, const TextObjectActionType action)
1687 int lineIndex = __pCurrentTextColumn->GetLineIndexAtTextIndex(startTextIndex);
1688 TextLine* pTextLine = __pCurrentTextColumn->GetTextLine(lineIndex);
1689 SysTryReturn(NID_GRP, pTextLine, E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1691 int lineOffset = pTextLine->GetTextOffset();
1692 int blockStartTextIndex = Math::Max(__workStart, startTextIndex);
1693 int blockEndTextIndex = Math::Min(__workStart + __workLength, startTextIndex + textLength);
1694 int blockTextLength = blockEndTextIndex - blockStartTextIndex;
1696 if (blockStartTextIndex >= blockEndTextIndex)
1701 FloatRectangle lineBounds = pTextLine->GetBoundsF();
1702 blockStartTextIndex -= lineOffset;
1703 blockEndTextIndex -= lineOffset;
1705 FloatRectangle blockRect = displayRect;
1706 blockRect.y = lineBounds.y;
1708 Collection::ArrayListT<_FloatPair>* pGapList = pTextLine->GetTextExtentList();
1712 float blockStart = 0;
1715 _FloatPair currentGap;
1716 IEnumeratorT<_FloatPair >* pGapEnum = pGapList->GetEnumeratorN();
1718 for (int i = 0; i <= blockStartTextIndex; i++)
1720 pGapEnum->MoveNext();
1723 for (int count = 0; count < blockTextLength; count++)
1725 pGapEnum->GetCurrent(currentGap);
1727 if (right == currentGap.first || left == currentGap.second)
1729 blockStart = (currentGap.first < blockStart) ? currentGap.first : blockStart;
1730 blockEnd = (currentGap.second > blockEnd) ? currentGap.second : blockEnd;
1734 if (blockStart != blockEnd)
1736 canvasImpl.FillRectangle(__defaultBlockColor, FloatRectangle(blockRect.x + blockStart, displayRect.y, blockEnd - blockStart, displayRect.height));
1739 blockStart = currentGap.first;
1740 blockEnd = currentGap.second;
1743 left = currentGap.first;
1744 right = currentGap.second;
1746 pGapEnum->MoveNext();
1749 if (blockStart != blockEnd)
1751 canvasImpl.FillRectangle(__defaultBlockColor, FloatRectangle(blockRect.x + blockStart, displayRect.y, blockEnd - blockStart, displayRect.height));
1754 if ((pTextLine->GetEndType() == TEXT_RETBY_LINEFEED) && (pTextLine->GetTextLength() == blockEndTextIndex))
1756 canvasImpl.FillRectangle(__defaultBlockColor, FloatRectangle(blockRect.x + blockEnd, displayRect.y, LINE_FEED_WIDTH, displayRect.height));
1765 TextComposite::DrawBackgroundBlock(_CanvasImpl& canvasImpl, const FloatRectangle& displayRect, int startTextIndex, int textLength,
1766 const TextObjectAlignment align, const TextObjectActionType action)
1768 if (textLength == 0)
1773 TextLine* pTextLine = __pCurrentTextColumn->GetTextLine(__pCurrentTextColumn->GetLineIndexAtTextIndex(startTextIndex));
1774 SysTryReturn(NID_GRP, pTextLine, E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1776 int blockEndTextIndex = startTextIndex + textLength;
1778 float prevRight = 0;
1779 float blockStart = 0;
1781 int currentLength = 0;
1782 int elementTextOffset = 0;
1783 int elementIndex = 0;
1784 int textIndexFromElementOffset = 0;
1786 FloatRectangle lineBounds = pTextLine->GetBoundsF();
1787 blockEndTextIndex -= pTextLine->GetTextOffset();
1788 FloatRectangle blockRect = displayRect;
1789 blockRect.y = lineBounds.y;
1791 TextElement* pTextElement = GetElementAtTextIndex(startTextIndex, elementTextOffset, elementIndex, currentLength, textIndexFromElementOffset);
1792 SysTryReturn(NID_GRP, pTextElement, -1, E_SYSTEM, "[E_SYSTEM] Fail to get text element.");
1794 TextElementType objectType = pTextElement->GetType();
1795 if (objectType == TEXT_ELEMENT_TYPE_CUTLINK || objectType == TEXT_ELEMENT_TYPE_TEXT)
1797 TextSimple* pSimpleText = dynamic_cast < TextSimple* >(pTextElement);
1798 if (pSimpleText != null)
1800 Color backgroundColor = pSimpleText->GetBackgroundColor();
1801 const wchar_t* pText = pSimpleText->GetTextSource();
1803 _FontImpl* pFontImpl = (_FontImpl::GetInstance(*const_cast < Font* >(pSimpleText->GetFont())));
1804 SysTryReturn(NID_GRP, pFontImpl, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to get native font instance.");
1806 Collection::ArrayListT<_FloatPair> elemenGapListF;
1807 pFontImpl->GetTextExtentList(pText, textIndexFromElementOffset, textLength, elemenGapListF);
1809 _FloatPair currentGap;
1810 IEnumeratorT<_FloatPair >* pEnum = elemenGapListF.GetEnumeratorN();
1812 while (pEnum->MoveNext() == E_SUCCESS)
1814 pEnum->GetCurrent(currentGap);
1816 if (prevRight == currentGap.first || prevLeft == currentGap.second)
1818 blockStart = (currentGap.first < blockStart) ? currentGap.first : blockStart;
1819 blockEnd = (currentGap.second > blockEnd) ? currentGap.second : blockEnd;
1823 if (blockStart != blockEnd)
1825 canvasImpl.FillRectangle(backgroundColor, FloatRectangle(blockRect.x + blockStart, displayRect.y, blockEnd - blockStart, displayRect.height));
1828 blockStart = currentGap.first;
1829 blockEnd = currentGap.second;
1832 prevLeft = currentGap.first;
1833 prevRight = currentGap.second;
1836 if (blockStart != blockEnd)
1838 canvasImpl.FillRectangle(backgroundColor, FloatRectangle(blockRect.x + blockStart, displayRect.y, blockEnd - blockStart, displayRect.height));
1841 if ((pTextLine->GetEndType() == TEXT_RETBY_LINEFEED) && (pTextLine->GetTextLength() == blockEndTextIndex))
1843 canvasImpl.FillRectangle(backgroundColor, FloatRectangle(blockRect.x + blockEnd, displayRect.y, LINE_FEED_WIDTH, displayRect.height));
1854 TextComposite::DrawLine(_CanvasImpl& canvasImpl, TextLine* pTextLine, const FloatRectangle& displayRect,
1855 const TextObjectAlignment align, const TextObjectActionType action)
1857 SysTryReturn(NID_GRP, pTextLine, E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1862 FloatRectangle adjustedRect;
1863 FloatRectangle lineBounds;
1864 FloatDimension lineTextSize;
1866 lineLength = pTextLine->GetTextLength();
1867 lineOffset = pTextLine->GetTextOffset();
1869 lineBounds = pTextLine->GetBoundsF();
1870 pTextLine->GetRegion(0, lineLength, lineTextSize.width, lineTextSize.height);
1872 adjustedRect = displayRect;
1873 adjustedRect.width = lineBounds.width;
1874 adjustedRect.height = lineBounds.height;
1876 if (action == TEXT_OBJECT_ACTION_TYPE_ABBREV)
1878 if (__elementVertialAlignment & TEXT_OBJECT_ALIGNMENT_BASELINE)
1880 return DrawWithBaselineWithEllipsis(canvasImpl, adjustedRect, lineOffset, lineLength,
1881 (TextObjectAlignment)((TEXT_ALIGNMASK_HORIZ & align) | TEXT_OBJECT_ALIGNMENT_BASELINE), action, pTextLine->GetBaseline());
1885 return DrawWithEliipsis(canvasImpl, adjustedRect, lineOffset, lineLength,
1886 (TextObjectAlignment)((TEXT_ALIGNMASK_HORIZ & align) | __elementVertialAlignment), action);
1891 if (__elementVertialAlignment & TEXT_OBJECT_ALIGNMENT_BASELINE)
1893 return DrawWithBaseline(canvasImpl, adjustedRect, lineOffset, lineLength,
1894 (TextObjectAlignment)((TEXT_ALIGNMASK_HORIZ & align) | TEXT_OBJECT_ALIGNMENT_BASELINE), action, pTextLine->GetBaseline());
1898 return Draw(canvasImpl, adjustedRect, lineOffset, lineLength,
1899 (TextObjectAlignment)((TEXT_ALIGNMASK_HORIZ & align) | __elementVertialAlignment), action);
1905 TextComposite::GetValue(TextElement* pTextElement, TextComponentInfoValueType type, unsigned int* value) const
1907 SysTryReturn(NID_GRP, pTextElement, E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1909 TextElementType objectType = TextUtility::GetObjectTypeFromValueType(type);
1911 SysTryReturn(NID_GRP, pTextElement->GetType() == objectType, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to get type.");
1913 *value = pTextElement->GetValue(type);
1919 TextComposite::InsertElementAt(TextElement& textElement, int textIndex)
1921 SysTryReturn(NID_GRP, 0 <= textIndex && textIndex <= __length, E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
1923 result r = E_SUCCESS;
1925 TextElement* pCurrentTextElement = null;
1926 TextElement* pNewTextElement = null;
1928 int currentLength = 0;
1929 int elementTextOffset = 0;
1930 int elementIndex = 0;
1931 int textIndexFromElementOffset = 0;
1933 pCurrentTextElement = GetElementAtTextIndex(textIndex, elementTextOffset, elementIndex,
1934 currentLength, textIndexFromElementOffset);
1936 if (pCurrentTextElement != null)
1938 if (textIndex == elementTextOffset)
1940 r = __pTextElementList->InsertAt(textElement, elementIndex);
1941 SysTryReturn(NID_GRP, r == E_SUCCESS, r, r, "[%s] Fail to insert element.", GetErrorMessage(r));
1945 pCurrentTextElement->SetTextLength(pCurrentTextElement->GetTextLength() - currentLength);
1947 r = __pTextElementList->InsertAt(textElement, ++elementIndex);
1948 SysTryReturn(NID_GRP, r == E_SUCCESS, r, r, "[%s] Fail to insert element.", GetErrorMessage(r));
1950 pNewTextElement = pCurrentTextElement->CloneN(SET_ALLVALUE_CLONE, 0);
1951 SysTryReturn(NID_GRP, pNewTextElement, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to clone text element.");
1953 pNewTextElement->SetTextLength(currentLength);
1955 if (textIndexFromElementOffset != 0)
1957 pNewTextElement->SetValue(SET_TEXT_OFFSET, textIndexFromElementOffset);
1960 r = __pTextElementList->InsertAt(*pNewTextElement, ++elementIndex);
1961 SysTryReturn(NID_GRP, r == E_SUCCESS, r, r, "[%s] Fail to insert element.", GetErrorMessage(r));
1966 if (textIndex == __length)
1968 r = __pTextElementList->Add(textElement);
1969 SysTryReturn(NID_GRP, r == E_SUCCESS, r, r, "[%s] Fail to add element.", GetErrorMessage(r));
1977 int elementTextLength = textElement.GetTextLength();
1979 __workStart = textIndex;
1980 __workLength = elementTextLength;
1981 __length += elementTextLength;
1984 TextElementType objectType = textElement.GetType();
1985 if (objectType == TEXT_ELEMENT_TYPE_CUTLINK)
1987 TextCutLink* pLinkElement = dynamic_cast < TextCutLink* >(&textElement);
1988 __pCutLinkListInfo->InsertCutLinkElementInfo(textIndex, *pLinkElement, elementTextLength);
1992 __pCutLinkListInfo->InsertText(textIndex, elementTextLength);
1995 if (objectType == TEXT_ELEMENT_TYPE_CUTLINK || objectType == TEXT_ELEMENT_TYPE_TEXT)
1997 TextSimple* pSimpleText = dynamic_cast < TextSimple* >(&textElement);
1998 if (pSimpleText != null)
2000 pSimpleText->SetUserWrap(__wrap);
2008 TextComposite::AppendElement(TextElement& textElement)
2010 result r = E_SUCCESS;
2011 int elementTextLength = textElement.GetTextLength();
2013 r = __pTextElementList->Add(textElement);
2014 SysTryReturn(NID_GRP, r == E_SUCCESS, r, r, "[%s] Fail to add element.", GetErrorMessage(r));
2016 __workStart = __length;
2017 __workLength = elementTextLength;
2018 __length += elementTextLength;
2021 TextElementType objectType = textElement.GetType();
2022 if (objectType == TEXT_ELEMENT_TYPE_CUTLINK)
2024 TextCutLink* pLinkElement = dynamic_cast < TextCutLink* >(&textElement);
2025 __pCutLinkListInfo->InsertCutLinkElementInfo(__workStart, *pLinkElement, elementTextLength);
2029 __pCutLinkListInfo->InsertText(__workStart, elementTextLength);
2032 if (objectType == TEXT_ELEMENT_TYPE_CUTLINK || objectType == TEXT_ELEMENT_TYPE_TEXT)
2034 TextSimple* pSimpleText = dynamic_cast < TextSimple* >(&textElement);
2035 if (pSimpleText != null)
2037 pSimpleText->SetUserWrap(__wrap);
2045 TextComposite::Remove(int startTextIndex, int textLength)
2047 if (textLength == 0)
2052 result r = E_SUCCESS;
2053 TextElement* pNewTextElement = null;
2054 int startElementIndex = -1;
2055 int endElementIndex = -1;
2056 int elementTextOffset = 0;
2057 int elementIndex = 0;
2058 int currentLength = 0;
2059 int textIndexFromElementOffset = 0;
2060 int textIndex = startTextIndex;
2061 int remainingLength = textLength;
2063 TextElement* pTextElement = GetElementAtTextIndex(textIndex, elementTextOffset, elementIndex, currentLength, textIndexFromElementOffset);
2064 SysTryReturn(NID_GRP, pTextElement, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to get text element.");
2065 SysTryReturn(NID_GRP, currentLength > 0, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] _Text::TextElement is invalid.");
2067 startElementIndex = elementIndex;
2069 if (elementTextOffset == textIndex && remainingLength == currentLength)
2071 __pTextElementList->RemoveAt(elementIndex, true);
2075 else if (elementTextOffset < textIndex && remainingLength < currentLength)
2077 pTextElement->SetTextLength(pTextElement->GetTextLength() - currentLength);
2079 pNewTextElement = pTextElement->CloneN(SET_ALLVALUE_CLONE, 0);
2080 SysTryReturn(NID_GRP, pNewTextElement, r, r, "[E_SYSTEM] Fail to clone text element.");
2082 pNewTextElement->SetTextLength(currentLength - remainingLength);
2083 pNewTextElement->SetValue(SET_TEXT_OFFSET, textIndexFromElementOffset + remainingLength);
2085 r = __pTextElementList->InsertAt(*pNewTextElement, ++elementIndex);
2086 SysTryCatch(NID_GRP, r == E_SUCCESS, , r, "[%s] Fail to insert element.", GetErrorMessage(r));
2088 endElementIndex = elementIndex;
2092 else if (elementTextOffset < textIndex)
2094 pTextElement->SetTextLength(pTextElement->GetTextLength() - currentLength);
2096 textIndex += currentLength;
2097 remainingLength -= currentLength;
2101 while (remainingLength > 0)
2103 pTextElement = static_cast < TextElement* >(__pTextElementList->GetAt(elementIndex));
2106 endElementIndex = elementIndex;
2110 textIndexFromElementOffset = pTextElement->GetValue(SET_TEXT_OFFSET);
2111 currentLength = pTextElement->GetTextLength();
2113 if (remainingLength < currentLength)
2115 pTextElement->SetTextLength(currentLength - remainingLength);
2116 pTextElement->SetValue(SET_TEXT_OFFSET, textIndexFromElementOffset + remainingLength);
2118 endElementIndex = elementIndex;
2123 __pTextElementList->RemoveAt(elementIndex, true);
2126 endElementIndex = elementIndex;
2127 remainingLength -= currentLength;
2131 __length -= textLength;
2132 Optimize(startElementIndex, endElementIndex);
2136 Release(pNewTextElement);
2141 TextComposite::RemoveElementAt(int elementIndex, bool deallocate)
2143 SysTryReturn(NID_GRP, elementIndex >= 0 && elementIndex < __pTextElementList->GetCount()
2144 , E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
2146 result r = E_SUCCESS;
2147 TextElement* pTextElement = null;
2149 pTextElement = static_cast < TextElement* >(__pTextElementList->GetAt(elementIndex));
2150 if (pTextElement != null)
2152 int elementTextLength = pTextElement->GetTextLength();
2153 int elementTextOffset = GetFirstTextIndexAt(elementIndex);
2155 r = __pTextElementList->RemoveAt(elementIndex);
2156 SysTryReturn(NID_GRP, r == E_SUCCESS, r, r, "[%s] Fail to remove element.", GetErrorMessage(r));
2158 if (pTextElement->GetType() == TEXT_ELEMENT_TYPE_CUTLINK)
2160 __pCutLinkListInfo->RemoveCutLinkElementInfo(dynamic_cast < TextCutLink* >(pTextElement));
2164 __pCutLinkListInfo->RemoveText(elementTextOffset, elementTextLength);
2167 __length -= elementTextLength;
2171 Release(pTextElement);
2179 TextComposite::RemoveAllElements(bool deallocate)
2181 result r = E_SUCCESS;
2183 if (__pCutLinkListInfo)
2185 __pCutLinkListInfo->RemoveAllCutLinkElementInfos();
2188 __pTextElementList->RemoveAll(deallocate);
2190 SysTryCatch(NID_GRP, __pTextElementList->GetCount() == 0, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to remove all elements.");
2195 __displayBlock = false;
2210 TextComposite::SearchTextElement(TextElementType type, int textIndex, int& elementTextOffset) const
2212 SysTryReturn(NID_GRP, 0 <= textIndex && textIndex < __length, null, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
2214 result r = E_SUCCESS;
2215 IEnumerator* pEnum = null;
2216 TextElement* pTextElement = null;
2218 int elementIndex = 0;
2219 int currentLength = 0;
2220 int textIndexFromElementOffset = 0;
2222 pTextElement = GetElementAtTextIndex(textIndex, elementTextOffset, elementIndex, currentLength, textIndexFromElementOffset);
2223 SysTryReturn(NID_GRP, pTextElement, null, E_SYSTEM, "[E_SYSTEM] Fail to get text element.");
2225 if (pTextElement->GetType() == type)
2227 return pTextElement;
2230 elementTextOffset += pTextElement->GetTextLength();
2232 pEnum = __pTextElementList->GetEnumeratorN();
2233 for (int i = 0; i < elementIndex; i++)
2235 r = pEnum->MoveNext();
2236 SysTryCatch(NID_GRP, r == E_SUCCESS, , r, "[%s] Fail to move next element.", GetErrorMessage(r));
2239 while (pEnum->MoveNext() == E_SUCCESS)
2241 pTextElement = static_cast < TextElement* >(pEnum->GetCurrent());
2242 if (pTextElement == null)
2247 if (pTextElement->GetType() == type)
2250 SetLastResult(E_SUCCESS);
2251 return pTextElement;
2254 elementTextOffset += pTextElement->GetTextLength();
2258 SetLastResult(E_SUCCESS);
2267 TextComposite::GetTextN(int startTextIndex, int textLength) const
2269 SysTryReturn(NID_GRP, 0 <= startTextIndex && textLength <= __length, null, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
2271 result r = E_SUCCESS;
2272 IEnumerator* pEnum = null;
2274 int currentLength = 0;
2275 int elementTextOffset = 0;
2276 int elementIndex = 0;
2277 int textIndexFromElementOffset = 0;
2279 wchar_t* pText = new (std::nothrow) wchar_t[textLength+1];
2280 SysTryReturn(NID_GRP, pText, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Insufficient memory.");
2282 wchar_t* pTextPointer = pText;
2284 TextElement* pTextElement = GetElementAtTextIndex(startTextIndex, elementTextOffset, elementIndex, currentLength, textIndexFromElementOffset);
2285 SysTryCatch(NID_GRP, pTextElement, , E_SYSTEM, "[E_SYSTEM] Fail to get element.");
2287 textIndexFromElementOffset = startTextIndex - elementTextOffset;
2289 pEnum = __pTextElementList->GetEnumeratorN();
2290 for (int i = 0; i < elementIndex; i++)
2292 r = pEnum->MoveNext();
2295 while (pEnum->MoveNext() == E_SUCCESS)
2297 pTextElement = static_cast < TextElement* >(pEnum->GetCurrent());
2300 currentLength = Math::Min(pTextElement->GetTextLength() - textIndexFromElementOffset, textLength);
2302 TextElementType objectType = pTextElement->GetType();
2304 if (objectType == TEXT_ELEMENT_TYPE_TEXT || objectType == TEXT_ELEMENT_TYPE_CUTLINK)
2306 TextSimple* pSimpleText = dynamic_cast < TextSimple* >(pTextElement);
2309 const wchar_t* pSrcText = pSimpleText->GetText();
2310 TextUtility::CopyText(pTextPointer, &pSrcText[textIndexFromElementOffset], currentLength);
2313 textLength -= currentLength;
2314 pTextPointer += currentLength;
2318 if (textLength <= 0)
2323 textIndexFromElementOffset = 0;
2341 TextComposite::GetCharacter(int textIndex) const
2345 SysTryReturn(NID_GRP, 0 <= textIndex && textIndex <= __length, ch, E_INVALID_ARG
2346 , "[E_INVALID_ARG] The argument is invalid. textIndex(%d), __length(%d)", textIndex, __length);
2348 result r = E_SUCCESS;
2349 IEnumerator* pEnum = null;
2350 int currentLength = 0;
2351 int elementTextOffset = 0;
2352 int elementIndex = 0;
2353 int textIndexFromElementOffset = 0;
2355 TextElement* pTextElement = GetElementAtTextIndex(textIndex, elementTextOffset, elementIndex, currentLength, textIndexFromElementOffset);
2356 SysTryReturn(NID_GRP, pTextElement, ch, E_SYSTEM, "[E_SYSTEM] Fail to get element.");
2358 textIndexFromElementOffset = textIndex - elementTextOffset;
2360 pEnum = __pTextElementList->GetEnumeratorN();
2361 for (int i = 0; i < elementIndex + 1; i++)
2363 r = pEnum->MoveNext();
2366 pTextElement = static_cast < TextElement* >(pEnum->GetCurrent());
2370 TextElementType objectType = pTextElement->GetType();
2372 if (objectType == TEXT_ELEMENT_TYPE_TEXT || objectType == TEXT_ELEMENT_TYPE_CUTLINK)
2374 TextSimple* pSimpleText = dynamic_cast < TextSimple* >(pTextElement);
2377 const wchar_t* pText = pSimpleText->GetText();
2378 ch = pText[textIndexFromElementOffset];
2388 TextComposite::GetText(TextComposite* pTargetCompsiteText, int textIndex, int textLength)
2390 SysTryReturn(NID_GRP, pTargetCompsiteText, E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
2391 SysTryReturn(NID_GRP, 0 < textLength, E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
2393 result r = E_SUCCESS;
2394 IEnumerator* pEnum = null;
2395 TextElement* pTextElement = null;
2396 TextElement* pNewTextElement = null;
2398 int currentLength = 0;
2399 int elementTextOffset = 0;
2400 int elementIndex = 0;
2401 int textIndexFromElementOffset = 0;
2403 if (textIndex == -1 || textIndex < 0)
2408 pTextElement = GetElementAtTextIndex(textIndex, elementTextOffset, elementIndex, currentLength, textIndexFromElementOffset);
2409 SysTryReturn(NID_GRP, pTextElement, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to get element.");
2411 textIndexFromElementOffset = textIndex - elementTextOffset;
2413 pEnum = __pTextElementList->GetEnumeratorN();
2414 for (int i = 0; i < elementIndex; i++)
2416 r = pEnum->MoveNext();
2417 SysTryCatch(NID_GRP, r == E_SUCCESS, , r, "[%s] Fail to move next element.", GetErrorMessage(r));
2420 while (pEnum->MoveNext() == E_SUCCESS)
2422 pTextElement = static_cast < TextElement* >(pEnum->GetCurrent());
2423 if (pTextElement == null)
2428 textIndexFromElementOffset = 0;
2429 currentLength = Math::Min(pTextElement->GetTextLength(), textLength);
2431 pNewTextElement = pTextElement->CopyN(textIndexFromElementOffset, currentLength);
2432 if (pNewTextElement != null)
2434 pTargetCompsiteText->AppendElement(*pNewTextElement);
2437 textLength -= currentLength;
2449 TextComposite::Compose(FloatRectangle& rect, TextColumn* pTextColumn)
2451 SysTryReturn(NID_GRP, pTextColumn, -1, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
2453 __pCurrentTextColumn = pTextColumn;
2457 if (__pTextElementList->GetCount() == 0 || __length == 0)
2459 pTextColumn->RemoveAllLines();
2466 case TEXT_OBJECT_WRAP_TYPE_NONE:
2468 if (__drawAbbrevText)
2470 __pCurrentTextColumn->PrepareCompose();
2471 __drawTextEllipsis = false;
2473 if (__TextObjectEllipsisType == TEXT_OBJECT_ELLIPSIS_TYPE_TAIL)
2475 lineCount = ComposeInNoneWrap(rect);
2477 else if (__TextObjectEllipsisType == TEXT_OBJECT_ELLIPSIS_TYPE_MIDDLE)
2479 lineCount = ComposeInNoneWrapMiddleEllipsis(rect);
2483 lineCount = ComposeInNoneWrapHeadEllipsis(rect);
2488 bool setNoneWrapComposeInfo = false;
2489 NoneWrapComposeInfo noneWrapComposeInfo;
2491 TextLine* pTextLine = __pCurrentTextColumn->GetTextLine(0);
2492 if (pTextLine != null)
2495 noneWrapComposeInfo.prevTextOffset = pTextLine->GetTextOffset();
2496 noneWrapComposeInfo.prevTextLength = pTextLine->GetTextLength();
2497 pTextLine->GetRegion(0, noneWrapComposeInfo.prevTextLength, noneWrapComposeInfo.prevWidth, noneWrapComposeInfo.prevHeight);
2498 noneWrapComposeInfo.prevEndType = pTextLine->GetEndType();
2499 setNoneWrapComposeInfo = true;
2502 __pCurrentTextColumn->PrepareCompose();
2503 __drawTextEllipsis = false;
2504 if (setNoneWrapComposeInfo)
2506 lineCount = ComposeInNoneWrap(rect, &noneWrapComposeInfo);
2510 lineCount = ComposeInNoneWrap(rect);
2514 __pCurrentTextColumn->FinishCompose();
2518 case TEXT_OBJECT_WRAP_TYPE_CHARACTER:
2520 __pCurrentTextColumn->PrepareCompose();
2521 lineCount = ComposeInWrap(rect);
2522 __pCurrentTextColumn->FinishCompose();
2526 case TEXT_OBJECT_WRAP_TYPE_WORD:
2528 if (IsPartialComposingModeEnabled())
2530 if (__pCurrentTextColumn->GetTotalLineCount() == 0)
2532 __pCurrentTextColumn->PrepareCompose();
2534 lineCount = ComposeInPartialMode(rect);
2538 __pCurrentTextColumn->PrepareCompose();
2539 lineCount = ComposeInWrap(rect);
2540 __pCurrentTextColumn->CompareDeletedLine();
2541 __pCurrentTextColumn->FinishCompose();
2552 TextComposite::SetRange(int textStartIndex, int textLength)
2554 SysTryReturn(NID_GRP, 0 <= textStartIndex && textStartIndex <= __length, E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
2556 __workStart = textStartIndex;
2557 __workLength = textLength;
2563 TextComposite::GetRange(int& startTextIndex, int& textLength) const
2565 startTextIndex = __workStart;
2566 textLength = __workLength;
2570 TextComposite::SetDisplayBitmap(const Bitmap* pBitmap)
2572 if (__workLength == 0)
2577 result r = E_SUCCESS;
2578 IEnumerator* pEnum = null;
2579 TextElement* pTextElement = null;
2580 TextElement* pNewTextElement = null;
2581 int startElementIndex = -1;
2582 int endElementIndex = -1;
2583 int textIndex = __workStart;
2584 int textLength = __workLength;
2585 int elementTextOffset = 0;
2586 int elementIndex = 0;
2587 int currentLength = 0;
2588 int textIndexFromElementOffset = 0;
2590 TextComponentInfoValueType type = SET_ALTERNATE_DISPLAY_BITMAP;
2592 BitmapDisplayProperty displayProperty;
2593 displayProperty.displayEnable = true;
2594 displayProperty.pBitmap = pBitmap;
2596 while (textLength > 0)
2598 pTextElement = GetElementAtTextIndex(textIndex, elementTextOffset, elementIndex, currentLength, textIndexFromElementOffset);
2599 SysTryReturn(NID_GRP, pTextElement, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to get text element.");
2600 SysTryReturn(NID_GRP, 0 < currentLength, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] _Text::TextElement is invalid.");
2602 if (pTextElement->GetType() == TEXT_ELEMENT_TYPE_TEXT)
2605 startElementIndex = elementIndex;
2609 textIndex += currentLength;
2610 textLength -= currentLength;
2618 if (elementTextOffset == textIndex && textLength == currentLength)
2620 pTextElement->SetValue(SET_ALTERNATE_DISPLAY_BITMAP, (unsigned int)&displayProperty);
2621 displayProperty.displayEnable = false;
2624 else if (elementTextOffset < textIndex && textLength < currentLength)
2626 pTextElement->SetTextLength(pTextElement->GetTextLength() - currentLength);
2628 pNewTextElement = pTextElement->CloneN(SET_ALTERNATE_DISPLAY_BITMAP, (unsigned int)&displayProperty);
2629 SysTryReturn(NID_GRP, pNewTextElement, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to clone text element.");
2631 pNewTextElement->SetTextLength(textLength);
2632 pNewTextElement->SetValue(SET_TEXT_OFFSET, textIndexFromElementOffset);
2633 displayProperty.displayEnable = false;
2635 r = __pTextElementList->InsertAt(*pNewTextElement, ++elementIndex);
2636 SysTryCatch(NID_GRP, r == E_SUCCESS, , r, "[%s] Fail to insert element.", GetErrorMessage(r));
2638 pNewTextElement = pTextElement->CloneN(SET_ALLVALUE_CLONE, 0);
2639 SysTryReturn(NID_GRP, pNewTextElement, r, r, "[E_SYSTEM] Fail to clone text element.");
2641 pNewTextElement->SetTextLength(currentLength - textLength);
2642 pNewTextElement->SetValue(SET_TEXT_OFFSET, textIndexFromElementOffset + textLength);
2644 r = __pTextElementList->InsertAt(*pNewTextElement, ++elementIndex);
2645 SysTryCatch(NID_GRP, r == E_SUCCESS, , r, "[%s] Fail to insert element.", GetErrorMessage(r));
2647 endElementIndex = elementIndex;
2650 else if (elementTextOffset < textIndex)
2652 pTextElement->SetTextLength(pTextElement->GetTextLength() - currentLength);
2654 pNewTextElement = pTextElement->CloneN(SET_ALTERNATE_DISPLAY_BITMAP, (unsigned int)&displayProperty);
2655 SysTryReturn(NID_GRP, pNewTextElement, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to clone text element.");
2657 pNewTextElement->SetValue(SET_TEXT_OFFSET, textIndexFromElementOffset);
2658 pNewTextElement->SetTextLength(currentLength);
2659 displayProperty.displayEnable = false;
2661 r = __pTextElementList->InsertAt(*pNewTextElement, ++elementIndex);
2662 SysTryCatch(NID_GRP, r == E_SUCCESS, , r, "[%s] Fail to insert element.", GetErrorMessage(r));
2664 textIndex += currentLength;
2665 textLength -= currentLength;
2669 pTextElement = GetElementAtTextIndex(textIndex, elementTextOffset, elementIndex, currentLength, textIndexFromElementOffset);
2670 if (pTextElement == null)
2677 endElementIndex = elementIndex;
2682 pEnum = __pTextElementList->GetEnumeratorN();
2683 for (int i = 0; i <= elementIndex; i++)
2685 r = pEnum->MoveNext();
2686 SysTryCatch(NID_GRP, r == E_SUCCESS, , r, "[%s] Fail to move next element.", GetErrorMessage(r));
2689 while (textLength > 0)
2691 TextElementType objectType = pTextElement->GetType();
2692 TextElementType objectTypeFromValueType = TextUtility::GetObjectTypeFromValueType(type);
2693 unsigned int elementValue = pTextElement->GetValue(SET_ALTERNATE_DISPLAY_BITMAP);
2695 if (objectType == objectTypeFromValueType && (unsigned int)&displayProperty != elementValue)
2697 if (textLength < currentLength)
2699 pNewTextElement = pTextElement->CloneN(SET_ALLVALUE_CLONE, 0);
2700 SysTryReturn(NID_GRP, pNewTextElement, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to clone text element.");
2702 pNewTextElement->SetTextLength(currentLength - textLength);
2703 pNewTextElement->SetValue(SET_TEXT_OFFSET, textIndexFromElementOffset + textLength);
2705 pTextElement->SetValue(SET_ALTERNATE_DISPLAY_BITMAP, (unsigned int)&displayProperty);
2706 pTextElement->SetTextLength(textLength);
2708 r = __pTextElementList->InsertAt(*pNewTextElement, ++elementIndex);
2709 SysTryCatch(NID_GRP, r == E_SUCCESS, , r, "[%s] Fail to insert element.", GetErrorMessage(r));
2715 pTextElement->SetValue(SET_ALTERNATE_DISPLAY_BITMAP, (unsigned int)&displayProperty);
2718 displayProperty.displayEnable = false;
2719 endElementIndex = elementIndex;
2722 elementTextOffset += currentLength;
2723 textLength -= currentLength;
2726 if (pEnum->MoveNext() != E_SUCCESS)
2731 pTextElement = static_cast < TextElement* >(pEnum->GetCurrent());
2732 if (pTextElement == null)
2737 currentLength = pTextElement->GetTextLength();
2738 textIndexFromElementOffset = pTextElement->GetValue(SET_TEXT_OFFSET);
2742 Optimize(startElementIndex, endElementIndex);
2747 Release(pNewTextElement);
2753 TextComposite::GetDisplayBitmap(int textIndex) const
2755 result r = E_SUCCESS;
2756 unsigned int value = 0;
2758 r = GetValue(textIndex, SET_ALTERNATE_DISPLAY_BITMAP, &value);
2759 SysTryReturn(NID_GRP, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
2761 return (Bitmap*)value;
2765 TextComposite::SetFont(Font* pFont)
2767 return SetValueToAllTextElements(SET_FONT, (unsigned int)pFont);
2771 TextComposite::GetFont(int textIndex) const
2773 unsigned int value = 0;
2775 GetValue(textIndex, SET_FONT, &value);
2776 Font* pFont = static_cast < Font* >((void*)value);
2778 SetLastResult(E_SUCCESS);
2784 TextComposite::SetFontSize(int size)
2786 return SetValueToAllTextElements(SET_FONT_SIZE, (unsigned int)size);
2790 TextComposite::SetFontSize(float size)
2792 return SetFontSize(_CoordinateSystemUtils::ConvertToInteger(size));
2796 TextComposite::GetFontSize(int textIndex) const
2798 return _CoordinateSystemUtils::ConvertToInteger(GetFontSizeF(textIndex));
2802 TextComposite::GetFontSizeF(int textIndex) const
2804 unsigned int value = 0;
2806 result r = GetValue(textIndex, SET_FONT_SIZE, &value);
2807 SysTryReturn(NID_GRP, r == E_SUCCESS, -1, r, "[%s] Propagating.", GetErrorMessage(r));
2809 return (float)value;
2813 TextComposite::SetFontStyle(int style)
2815 return SetValueToAllTextElements(SET_FONT_STYLE, (unsigned int)style);
2819 TextComposite::GetFontStyle(int textIndex) const
2821 unsigned int value = 0;
2823 result r = GetValue(textIndex, SET_FONT_STYLE, &value);
2824 SysTryReturn(NID_GRP
2826 , -1, r, "[%s] Propagating.", GetErrorMessage(r));
2832 TextComposite::SetForegroundColor(const Color& color)
2834 return SetValueToAllTextElements(SET_FONT_FGCOLOR, (unsigned int)color.GetRGB32());
2838 TextComposite::GetForegroundColor(int textIndex) const
2840 result r = E_SUCCESS;
2841 unsigned int value = 0;
2843 r = GetValue(textIndex, SET_FONT_FGCOLOR, &value);
2844 SysTryReturn(NID_GRP, r == E_SUCCESS, Color::GetColor(COLOR_ID_BLACK), r, "[%s] Propagating.", GetErrorMessage(r));
2846 return Color(value);
2850 TextComposite::SetBackgroundColor(const Color& color)
2852 return SetValueToAllTextElements(SET_FONT_BGCOLOR, (unsigned int)color.GetRGB32());
2856 TextComposite::GetBackgroundColor(int textIndex) const
2858 result r = E_SUCCESS;
2859 unsigned int value = 0;
2861 r = GetValue(textIndex, SET_FONT_BGCOLOR, &value);
2862 SysTryReturn(NID_GRP, r == E_SUCCESS, Color::GetColor(COLOR_ID_BLACK), r, "[%s] Propagating.", GetErrorMessage(r));
2864 return Color(value);
2868 TextComposite::SetOutlineColor(const Color& color)
2870 return SetValueToAllTextElements(SET_FONT_OUTLINECOLOR, (unsigned int)color.GetRGB32());
2874 TextComposite::GetOutlineColor(int textIndex) const
2876 result r = E_SUCCESS;
2877 unsigned int value = 0;
2879 r = GetValue(textIndex, SET_FONT_OUTLINECOLOR, &value);
2880 SysTryReturn(NID_GRP, r == E_SUCCESS, Color::GetColor(COLOR_ID_BLACK), r, "[%s] Propagating.", GetErrorMessage(r));
2882 return Color(value);
2886 TextComposite::GetAlternativeForegroundColor(int textIndex) const
2888 SysTryReturn(NID_GRP, 0 <= textIndex && textIndex < __length
2889 , Color::GetColor(COLOR_ID_BLACK), E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
2891 result r = E_SUCCESS;
2892 unsigned int value = 0;
2894 r = GetValue(textIndex, SET_ALTERNATIVE_FGCOLOR, &value);
2895 SysTryReturn(NID_GRP, r == E_SUCCESS, Color::GetColor(COLOR_ID_BLACK), r, "[%s] Propagating.", GetErrorMessage(r));
2897 return Color(value);
2901 TextComposite::SetAlternateLookEnabled(bool enable)
2903 return SetValueToAllTextElements(SET_ALTERNATE_LOOK, (unsigned int)enable);
2907 TextComposite::GetMaxLineHeight(void) const
2909 IEnumerator* pEnum = null;
2910 TextElement* pTextElement = null;
2914 pEnum = __pTextElementList->GetEnumeratorN();
2915 while (pEnum->MoveNext() == E_SUCCESS)
2917 pTextElement = static_cast < TextElement* >(pEnum->GetCurrent());
2918 if (pTextElement == null)
2923 height = pTextElement->GetHeight();
2924 maxHeight = Math::Max(maxHeight, height);
2932 TextComposite::GetMaxLineHeightF(void) const
2934 return _CoordinateSystemUtils::ConvertToFloat(GetMaxLineHeight());
2938 TextComposite::GetElementAtTextIndex(int textIndex, int& elementTextOffset, int& elementIndex, int& elementTextLength,
2939 int& textIndexFromElementOffset) const
2941 result r = E_SUCCESS;
2942 IEnumerator* pEnum = null;
2943 TextElement* pTextElement = null;
2945 int currentElementLength = 0;
2947 elementTextOffset = 0;
2949 elementTextLength = 0;
2950 textIndexFromElementOffset = 0;
2952 if (__pTextElementList->GetCount() == 0)
2957 pEnum = __pTextElementList->GetEnumeratorN();
2958 r = pEnum->MoveNext();
2959 SysTryReturn(NID_GRP, r == E_SUCCESS, null, r
2960 , "[%s] Fail to move next element. Now Elements count is (%d)", GetErrorMessage(r), __pTextElementList->GetCount());
2962 pTextElement = static_cast < TextElement* >(pEnum->GetCurrent());
2963 SysTryReturn(NID_GRP, pTextElement, null, E_SYSTEM, "[E_SYSTEM] Fail to get text element.");
2967 currentElementLength = pTextElement->GetTextLength();
2968 if (textIndex < elementTextOffset + currentElementLength)
2970 offset = pTextElement->GetValue(SET_TEXT_OFFSET);
2971 textIndexFromElementOffset = offset + (textIndex - elementTextOffset);
2976 if (currentElementLength == 0 && textIndex == elementTextOffset)
2978 offset = pTextElement->GetValue(SET_TEXT_OFFSET);
2979 textIndexFromElementOffset = offset + (textIndex - elementTextOffset);
2984 pTextElement = null;
2985 if (pEnum->MoveNext() != E_SUCCESS)
2990 pTextElement = static_cast < TextElement* >(pEnum->GetCurrent());
2991 if (pTextElement == null)
2996 elementTextOffset += currentElementLength;
3000 if (pTextElement != null)
3002 elementTextLength = elementTextOffset + currentElementLength - textIndex;
3006 return pTextElement;
3010 TextComposite::GetElementAtTextIndex(int textIndex) const
3012 result r = E_SUCCESS;
3013 IEnumerator* pEnum = null;
3014 TextElement* pTextElement = null;
3015 int currentElementLength = 0;
3016 int elementTextOffset = 0;
3018 if (__pTextElementList->GetCount() == 0 || textIndex < 0)
3023 pEnum = __pTextElementList->GetEnumeratorN();
3024 r = pEnum->MoveNext();
3025 SysTryReturn(NID_GRP, r == E_SUCCESS, null, r, "[%s] Fail to move next element. Now Elements count is (%d)"
3026 , GetErrorMessage(r), __pTextElementList->GetCount());
3028 pTextElement = static_cast < TextElement* >(pEnum->GetCurrent());
3029 SysTryReturn(NID_GRP, pTextElement, null, E_SYSTEM, "[E_SYSTEM] Fail to get text element.");
3033 currentElementLength = pTextElement->GetTextLength();
3034 if (textIndex < elementTextOffset + currentElementLength)
3040 if (currentElementLength == 0 && textIndex == elementTextOffset)
3046 pTextElement = null;
3047 if (pEnum->MoveNext() != E_SUCCESS)
3052 pTextElement = static_cast < TextElement* >(pEnum->GetCurrent());
3053 if (pTextElement == null)
3058 elementTextOffset += currentElementLength;
3062 return pTextElement;
3066 TextComposite::SetWrap(TextObjectWrapType wrap)
3075 IEnumerator* pEnum = null;
3076 TextElement* pTextElement = null;
3078 pEnum = __pTextElementList->GetEnumeratorN();
3079 while (pEnum->MoveNext() == E_SUCCESS)
3081 pTextElement = static_cast < TextElement* >(pEnum->GetCurrent());
3082 if (pTextElement == null)
3087 TextElementType objectType = pTextElement->GetType();
3088 if (objectType == TEXT_ELEMENT_TYPE_TEXT || objectType == TEXT_ELEMENT_TYPE_CUTLINK)
3090 TextSimple* pSimpleText = dynamic_cast < TextSimple* >(pTextElement);
3091 if (pSimpleText != null)
3093 pSimpleText->SetUserWrap(__wrap);
3103 TextComposite::Optimize(int startElementIndex, int endElementIndex)
3105 TextElement* pStartTextElement = null;
3106 TextElement* pEndTextElement = null;
3107 TextElement* pCurrentTextElement = null;
3108 TextElement* pNextTextElement = null;
3109 int elementIndex = 0;
3110 int elementCount = __pTextElementList->GetCount();
3112 if (elementCount == 0)
3117 startElementIndex = (startElementIndex == -1 || startElementIndex < 0) ? 0 : startElementIndex;
3118 endElementIndex = (endElementIndex == -1 || endElementIndex < 0 || endElementIndex > elementCount - 1) ? elementCount - 1 : endElementIndex;
3119 startElementIndex = (0 < startElementIndex) ? startElementIndex - 1 : startElementIndex;
3120 endElementIndex = (endElementIndex < elementCount - 1) ? endElementIndex + 1 : endElementIndex;
3122 if (endElementIndex - startElementIndex < 1)
3127 pStartTextElement = static_cast < TextElement* >(__pTextElementList->GetAt(startElementIndex));
3128 SysTryReturn(NID_GRP, pStartTextElement, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to get text element.");
3130 pEndTextElement = static_cast < TextElement* >(__pTextElementList->GetAt(endElementIndex));
3131 SysTryReturn(NID_GRP, pEndTextElement, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to get text element.");
3135 pCurrentTextElement = pStartTextElement;
3137 elementIndex = startElementIndex + 1;
3138 pNextTextElement = static_cast < TextElement* >(__pTextElementList->GetAt(elementIndex));
3139 if (pNextTextElement == null)
3144 if (TextUtility::CanMerge(pCurrentTextElement, pNextTextElement))
3146 pCurrentTextElement->SetTextLength(pCurrentTextElement->GetTextLength() + pNextTextElement->GetTextLength());
3147 __pTextElementList->RemoveAt(elementIndex, true);
3151 pStartTextElement = pNextTextElement;
3152 startElementIndex++;
3155 pStartTextElement = static_cast < TextElement* >(__pTextElementList->GetAt(startElementIndex));
3156 if (pStartTextElement == null)
3161 while (startElementIndex != endElementIndex);
3167 TextComposite::ChangeTextOffset(wchar_t* pText, int elementIndex, int gap)
3169 SysTryReturn(NID_GRP, 0 <= elementIndex, E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
3170 SysTryReturn(NID_GRP, gap != 0, E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
3172 result r = E_SUCCESS;
3173 IEnumerator* pEnum = null;
3174 TextElement* pTextElement = null;
3176 pEnum = __pTextElementList->GetEnumeratorN();
3177 for (int i = 0; i < elementIndex; i++)
3179 r = pEnum->MoveNext();
3180 SysTryCatch(NID_GRP, r == E_SUCCESS, , r, "[%s] Fail to move next element.", GetErrorMessage(r));
3183 while (pEnum->MoveNext() == E_SUCCESS)
3185 pTextElement = static_cast < TextElement* >(pEnum->GetCurrent());
3186 if (pTextElement == null)
3191 TextElementType objectType = pTextElement->GetType();
3192 if (objectType == TEXT_ELEMENT_TYPE_TEXT || objectType == TEXT_ELEMENT_TYPE_CUTLINK)
3194 TextSimple* pSimpleText = dynamic_cast < TextSimple* >(pTextElement);
3195 if (pSimpleText != null)
3197 pSimpleText->ChangeTextOffset(pText, gap);
3211 TextComposite::NotifyTextChanged(wchar_t* pText, int startTextIndex, int textLength, int gap, Font* pFont,
3212 const Color& fgColor, const Color& bgColor, const Color& outlineColor)
3219 result r = E_SUCCESS;
3220 TextElement* pTextElement = null;
3221 TextElement* pNextTextElement = null;
3223 int currentLength = 0;
3224 int elementTextOffset = 0;
3225 int elementIndex = 0;
3226 int textIndexFromElementOffset = 0;
3227 bool isOptimized = false;
3229 SetWorkWidth(pFont, pText, __workStart, gap);
3233 bool checkNextElement = false;
3235 if (__workStart == startTextIndex)
3237 pTextElement = GetElementAtTextIndex(__workStart, elementTextOffset, elementIndex, currentLength,
3238 textIndexFromElementOffset);
3242 pTextElement = GetElementAtTextIndex(__workStart - 1, elementTextOffset, elementIndex, currentLength,
3243 textIndexFromElementOffset);
3244 checkNextElement = true;
3247 if (pTextElement == null)
3249 TextSimple* pSimpleText = null;
3250 pSimpleText = new (std::nothrow)TextSimple(pText, gap, TEXT_ELEMENT_SOURCE_TYPE_EXTERNAL, pFont, fgColor, bgColor, outlineColor);
3251 SysTryReturn(NID_GRP, pSimpleText, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Insufficient memory.");
3253 pSimpleText->SetTextOffset(__workStart - startTextIndex);
3254 InsertElementAt(*pSimpleText, __workStart);
3260 TextSimple* pSimpleText = null;
3261 bool canMerge = false;
3263 TextElementType objectType = pTextElement->GetType();
3264 if (objectType == TEXT_ELEMENT_TYPE_TEXT || objectType == TEXT_ELEMENT_TYPE_CUTLINK)
3266 pSimpleText = dynamic_cast < TextSimple* >(pTextElement);
3267 if (pSimpleText != null)
3269 if (pSimpleText->IsSame(pText, pFont, fgColor, bgColor, outlineColor, false))
3275 pTextElement = null;
3281 pTextElement = null;
3284 if (!canMerge && checkNextElement)
3286 pTextElement = null;
3288 if (currentLength == 1)
3290 pNextTextElement = static_cast < TextElement* >(__pTextElementList->GetAt(elementIndex+1));
3291 if (pNextTextElement != null)
3293 objectType = pNextTextElement->GetType();
3294 if (objectType == TEXT_ELEMENT_TYPE_TEXT || objectType == TEXT_ELEMENT_TYPE_CUTLINK)
3296 pSimpleText = dynamic_cast < TextSimple* >(pNextTextElement);
3297 if (pSimpleText != null)
3299 if (pSimpleText->IsSame(pText, pFont, fgColor, bgColor, outlineColor, false))
3302 pTextElement = pNextTextElement;
3306 pTextElement = null;
3312 pTextElement = null;
3317 pTextElement = null;
3322 if (pTextElement == null)
3324 TextSimple* pSimpleText = null;
3325 pSimpleText = new (std::nothrow)TextSimple(pText, gap, TEXT_ELEMENT_SOURCE_TYPE_EXTERNAL, pFont, fgColor, bgColor,
3327 SysTryReturn(NID_GRP, pSimpleText, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Insufficient memory.");
3329 pSimpleText->SetTextOffset(__workStart - startTextIndex);
3330 InsertElementAt(*pSimpleText, __workStart);
3333 r = __pTextElementList->IndexOf(*pSimpleText, elementIndex);
3334 SysTryReturn(NID_GRP, r == E_SUCCESS, r, r, "[%s] Fail to get element index.", GetErrorMessage(r));
3338 __pCutLinkListInfo->InsertText(startTextIndex, gap);
3340 pTextElement->SetTextLength(pTextElement->GetTextLength() + gap);
3346 int remainingGap = -gap;
3349 int currentelementIndex = 0;
3351 textIndex = __workStart + remainingGap;
3352 pTextElement = GetElementAtTextIndex(textIndex, elementTextOffset, elementIndex, currentLength,textIndexFromElementOffset);
3353 if (pTextElement == null || elementTextOffset == textIndex)
3355 pTextElement = GetElementAtTextIndex(textIndex - 1, elementTextOffset, elementIndex, currentLength,textIndexFromElementOffset);
3358 SysTryReturn(NID_GRP, pTextElement, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to get text element.");
3360 currentelementIndex = elementIndex;
3361 currentGap = Math::Min(remainingGap, textIndex - elementTextOffset);
3362 if (currentGap == pTextElement->GetTextLength())
3364 RemoveElementAt(currentelementIndex);
3370 pTextElement->SetTextLength(pTextElement->GetTextLength() - currentGap);
3371 __length -= currentGap;
3372 if (currentGap < remainingGap)
3374 TextSimple* pSimpleText = dynamic_cast < TextSimple* >(pTextElement);
3375 if (pSimpleText != null)
3377 int offset = pSimpleText->GetTextOffset();
3378 offset -= (remainingGap - currentGap);
3379 pSimpleText->SetTextOffset(offset);
3384 remainingGap -= currentGap;
3385 while (remainingGap > 0)
3387 pTextElement = static_cast < TextElement* >(__pTextElementList->GetAt(--currentelementIndex));
3388 SysTryReturn(NID_GRP, pTextElement, r, r, "[%s] Fail to get element.", GetErrorMessage(r));
3390 int elementTextLength = pTextElement->GetTextLength();
3391 currentGap = Math::Min(elementTextLength, remainingGap);
3393 if (currentGap == elementTextLength)
3395 RemoveElementAt(currentelementIndex);
3401 __pCutLinkListInfo->RemoveText(__workStart, currentGap);
3402 pTextElement->SetTextLength(elementTextLength - currentGap);
3403 __length -= currentGap;
3406 remainingGap -= currentGap;
3410 ChangeTextOffset(pText, elementIndex + 1, gap);
3414 Optimize(elementIndex, elementIndex);
3421 TextComposite::ForwardAnalyzeWithFocusedObjectType(int textIndex, int textLength, int maxWidth,
3422 int& cursorIndex, TextElementType& type)
3424 return ForwardAnalyzeWithFocusedObjectType(textIndex, textLength
3425 , _CoordinateSystemUtils::ConvertToFloat(maxWidth), cursorIndex, type);
3429 TextComposite::ForwardAnalyzeWithFocusedObjectType(int textIndex, int textLength, float maxWidth,
3430 int& cursorIndex, TextElementType& type)
3432 result r = E_SUCCESS;
3433 FloatDimension textSize;
3434 int currentLength = 0;
3435 int elementTextOffset = 0;
3436 int elementIndex = 0;
3437 int textIndexFromElementOffset = 0;
3439 float remainingWidth = 0;
3440 int remainingLength = 0;
3441 int ret = TEXT_RETBY_NORMAL;
3442 bool isFirstWord = true;
3445 IEnumerator* pEnum = null;
3446 TextElement* pTextElement = null;
3449 type = TEXT_ELEMENT_TYPE_MAX;
3451 pTextElement = GetElementAtTextIndex(textIndex, elementTextOffset, elementIndex, currentLength, textIndexFromElementOffset);
3452 SysTryReturn(NID_GRP, pTextElement, -1, E_SYSTEM, "[E_SYSTEM] Fail to get text element.");
3454 remainingWidth = maxWidth;
3455 remainingLength = textLength;
3457 pEnum = __pTextElementList->GetEnumeratorN();
3458 for (int i = 0; i <= elementIndex; i++)
3460 r = pEnum->MoveNext();
3461 SysTryCatch(NID_GRP, r == E_SUCCESS, , r, "[%s] Fail to move next element.", GetErrorMessage(r));
3464 currentLength = Math::Min(remainingLength, currentLength);
3466 while (remainingWidth > 0 || remainingLength > 0)
3468 ret = pTextElement->ForwardAnalyze(textIndexFromElementOffset, currentLength, remainingWidth, __wrap, textCount , textSize.width, textSize.height);
3469 TextElementType objectType = pTextElement->GetType();
3471 if ((objectType == TEXT_ELEMENT_TYPE_TEXT || objectType == TEXT_ELEMENT_TYPE_CUTLINK) && (ret == TEXT_RETBY_LIMITWIDTH))
3473 FloatDimension tempTextSize;
3474 r = pTextElement->GetRegion(textIndexFromElementOffset, textCount + 1, tempTextSize.width, tempTextSize.height);
3475 SysTryReturn(NID_GRP, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
3477 if ((remainingWidth - textSize.width) > (tempTextSize.width - remainingWidth))
3479 textSize.width = tempTextSize.width;
3484 remainingWidth -= textSize.width;
3485 remainingWidth = (remainingWidth < 0) ? 0 : remainingWidth;
3487 remainingLength -= textCount;
3488 currentLength -= textCount ;
3489 cursorIndex += textCount ;
3491 if (__wrap == TEXT_OBJECT_WRAP_TYPE_WORD && ret != TEXT_RETBY_LIMITWIDTH)
3493 index = cursorIndex;
3496 if (remainingLength <= currentLength)
3501 if (ret == TEXT_RETBY_OVERWIDTH || ret == TEXT_RETBY_LINEFEED)
3506 if (__wrap == TEXT_OBJECT_WRAP_TYPE_WORD)
3508 if (ret == TEXT_RETBY_LIMITWIDTH)
3510 if (isFirstWord == false)
3512 cursorIndex = index;
3513 ret = TEXT_RETBY_NORMAL;
3518 isFirstWord = false;
3520 if (currentLength > 0)
3522 textIndexFromElementOffset += textCount ;
3528 if (ret == TEXT_RETBY_LIMITWIDTH)
3534 if (pEnum->MoveNext() != E_SUCCESS)
3539 pTextElement = static_cast < TextElement* >(pEnum->GetCurrent());
3540 if (pTextElement == null)
3545 textIndexFromElementOffset = pTextElement->GetValue(SET_TEXT_OFFSET);
3546 currentLength = Math::Min(pTextElement->GetTextLength(), remainingLength);
3549 if (ret == TEXT_RETBY_LIMITLENGTH)
3551 ret = TEXT_RETBY_NORMAL;
3554 SetLastResult(E_SUCCESS);
3564 TextComposite::HideFrontSpace(TextObjectSpaceHideType mode)
3566 __ignoreFrontBlank = true;
3567 __frontSpaceHideMode = mode;
3571 TextComposite::HideRearSpace(TextObjectSpaceHideType mode)
3573 __ignoreRearBlank = true;
3574 __rearSpaceHideMode = mode;
3578 TextComposite::ForwardAnalyzeInNoneCursorMode(int startTextIndex, int textLength, int maxWidth, int& textIndex)
3580 return ForwardAnalyzeInNoneCursorMode(startTextIndex, textLength
3581 , _CoordinateSystemUtils::ConvertToFloat(maxWidth), textIndex);
3585 TextComposite::ForwardAnalyzeInNoneCursorMode(int startTextIndex, int textLength, float maxWidth, int& textIndex)
3587 result r = E_SUCCESS;
3588 FloatDimension textSize;
3589 int currentLength = 0;
3590 int elementTextOffset = 0;
3591 int elementIndex = 0;
3592 int textIndexFromElementOffset = 0;
3594 float remainingWidth = 0;
3595 int remainingLength = 0;
3596 int ret = TEXT_RETBY_NORMAL;
3597 bool isFirstWord = true;
3601 IEnumerator* pEnum = null;
3602 TextElement* pTextElement = null;
3604 pTextElement = GetElementAtTextIndex(startTextIndex, elementTextOffset, elementIndex, currentLength, textIndexFromElementOffset);
3605 SysTryReturn(NID_GRP, pTextElement, -1, E_SYSTEM, "[E_SYSTEM] Fail to get text element.");
3608 remainingWidth = maxWidth;
3609 remainingLength = textLength;
3611 pEnum = __pTextElementList->GetEnumeratorN();
3612 for (int i = 0; i <= elementIndex; i++)
3614 r = pEnum->MoveNext();
3615 SysTryCatch(NID_GRP, r == E_SUCCESS, , r, "[%s] Fail to move next element.", GetErrorMessage(r));
3618 currentLength = Math::Min(remainingLength, currentLength);
3620 while (remainingWidth > 0 || remainingLength > 0)
3622 ret = pTextElement->ForwardAnalyze(textIndexFromElementOffset, currentLength, remainingWidth,
3623 __wrap, textCount, textSize.width, textSize.width);
3625 TextElementType objectType = pTextElement->GetType();
3627 if ((objectType == TEXT_ELEMENT_TYPE_TEXT || objectType == TEXT_ELEMENT_TYPE_CUTLINK) && (ret == TEXT_RETBY_LIMITWIDTH))
3629 FloatDimension tempTextSize;
3630 r = pTextElement->GetRegion(textIndexFromElementOffset, textCount + 1, tempTextSize.width, tempTextSize.height);
3631 SysTryReturn(NID_GRP, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
3633 textSize.width = tempTextSize.width;
3637 remainingWidth -= textSize.width;
3638 remainingWidth = (remainingWidth < 0) ? 0 : remainingWidth;
3640 remainingLength -= textCount;
3641 currentLength -= textCount;
3642 textIndex += textCount;
3644 if (__wrap == TEXT_OBJECT_WRAP_TYPE_WORD && ret != TEXT_RETBY_LIMITWIDTH)
3649 if (remainingLength <= currentLength)
3654 if (ret == TEXT_RETBY_OVERWIDTH || ret == TEXT_RETBY_LINEFEED)
3659 if (__wrap == TEXT_OBJECT_WRAP_TYPE_WORD)
3661 if (ret == TEXT_RETBY_LIMITWIDTH)
3663 if (isFirstWord == false)
3666 ret = TEXT_RETBY_NORMAL;
3671 isFirstWord = false;
3673 if (currentLength > 0)
3675 textIndexFromElementOffset += textCount;
3681 if (ret == TEXT_RETBY_LIMITWIDTH)
3687 if (pEnum->MoveNext() != E_SUCCESS)
3692 pTextElement = static_cast < TextElement* >(pEnum->GetCurrent());
3693 if (pTextElement == null)
3698 textIndexFromElementOffset = pTextElement->GetValue(SET_TEXT_OFFSET);
3699 currentLength = Math::Min(pTextElement->GetTextLength(), remainingLength);
3702 if (ret == TEXT_RETBY_LIMITLENGTH)
3704 ret = TEXT_RETBY_NORMAL;
3707 SetLastResult(E_SUCCESS);
3717 TextComposite::GetCutLinkElementCount(void) const
3719 return __pCutLinkListInfo->GetCutLinkElementCount();
3723 TextComposite::GetCutLinkElementIndexAt(int textIndex) const
3725 return __pCutLinkListInfo->GetCutLinkElementIndexAt(textIndex);
3729 TextComposite::GetCutLinkElementAtCutLinkElementIndex(int index) const
3731 return __pCutLinkListInfo->GetCutLinkElementAtCutLinkElementIndex(index);
3735 TextComposite::ResetAllCutLinkElementsState(void)
3737 return __pCutLinkListInfo->ResetAllCutLinkElementsState();
3741 TextComposite::ChangeCutLinkState(int linkIndex, bool select)
3743 return __pCutLinkListInfo->ChangeCutLinkState(linkIndex, select);
3747 TextComposite::SetValueToAllTextElements(TextComponentInfoValueType type, unsigned int value)
3749 if (__workLength == 0)
3754 result r = E_SUCCESS;
3755 IEnumerator* pEnum = null;
3756 TextElement* pTextElement = null;
3757 TextElement* pNewTextElement = null;
3758 int startElementIndex = -1;
3759 int endElementIndex = -1;
3762 int elementTextOffset = 0;
3763 int elementIndex = 0;
3764 int currentLength = 0;
3765 int textIndexFromElementOffset = 0;
3768 textIndex = __workStart;
3769 textLength = __workLength;
3771 while (textLength > 0)
3773 pTextElement = GetElementAtTextIndex(textIndex, elementTextOffset, elementIndex, currentLength, textIndexFromElementOffset);
3774 SysTryReturn(NID_GRP, pTextElement, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to get text element. textIndex(%d)", textIndex);
3775 SysTryReturn(NID_GRP, 0 < currentLength, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] _Text::TextElement is invalid.");
3777 TextElementType objectType = pTextElement->GetType();
3778 unsigned int elementValue = pTextElement->GetValue(type);
3779 TextElementType objectTypeFromValueType = TextUtility::GetObjectTypeFromValueType(type);
3781 if (objectType == objectTypeFromValueType && value != elementValue)
3784 startElementIndex = elementIndex;
3787 else if ((COMMONOBJECT_VALUE_START <= type && type < MAX_COMMONOBJECT_VALUE) && (value != elementValue))
3790 startElementIndex = elementIndex;
3794 textIndex += currentLength;
3795 textLength -= currentLength;
3803 if (elementTextOffset == textIndex && textLength == currentLength)
3805 pTextElement->SetValue(type, value);
3808 else if (elementTextOffset < textIndex && textLength < currentLength)
3810 pTextElement->SetTextLength(pTextElement->GetTextLength() - currentLength);
3812 pNewTextElement = pTextElement->CloneN(type, value);
3813 SysTryReturn(NID_GRP, pNewTextElement, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to clone text element.");
3815 pNewTextElement->SetTextLength(textLength);
3816 pNewTextElement->SetValue(SET_TEXT_OFFSET, textIndexFromElementOffset);
3818 r = __pTextElementList->InsertAt(*pNewTextElement, ++elementIndex);
3819 SysTryCatch(NID_GRP, r == E_SUCCESS, , r, "[%s] Fail to insert element.", GetErrorMessage(r));
3821 pNewTextElement = pTextElement->CloneN(SET_ALLVALUE_CLONE, 0);
3822 SysTryReturn(NID_GRP, pNewTextElement, r, r, "[E_SYSTEM] Fail to clone text element.");
3824 pNewTextElement->SetTextLength(currentLength - textLength);
3825 pNewTextElement->SetValue(SET_TEXT_OFFSET, textIndexFromElementOffset + textLength);
3827 r = __pTextElementList->InsertAt(*pNewTextElement, ++elementIndex);
3828 SysTryCatch(NID_GRP, r == E_SUCCESS, , r, "[%s] Fail to insert element.", GetErrorMessage(r));
3830 endElementIndex = elementIndex;
3833 else if (elementTextOffset < textIndex)
3835 pTextElement->SetTextLength(pTextElement->GetTextLength() - currentLength);
3837 pNewTextElement = pTextElement->CloneN(type, value);
3838 SysTryReturn(NID_GRP, pNewTextElement, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to clone text element.");
3840 pNewTextElement->SetValue(SET_TEXT_OFFSET, textIndexFromElementOffset);
3841 pNewTextElement->SetTextLength(currentLength);
3843 r = __pTextElementList->InsertAt(*pNewTextElement, ++elementIndex);
3844 SysTryCatch(NID_GRP, r == E_SUCCESS, , r, "[%s] Fail to insert element.", GetErrorMessage(r));
3846 textIndex += currentLength;
3847 textLength -= currentLength;
3851 pTextElement = GetElementAtTextIndex(textIndex, elementTextOffset, elementIndex, currentLength, textIndexFromElementOffset);
3852 if (pTextElement == null)
3859 endElementIndex = elementIndex;
3864 pEnum = __pTextElementList->GetEnumeratorN();
3865 for (int i = 0; i <= elementIndex; i++)
3867 r = pEnum->MoveNext();
3868 SysTryCatch(NID_GRP, r == E_SUCCESS, , r, "[%s] Fail to move next element.", GetErrorMessage(r));
3871 while (textLength > 0)
3873 TextElementType objectType = pTextElement->GetType();
3874 TextElementType objectTypeFromValueType = TextUtility::GetObjectTypeFromValueType(type);
3875 unsigned int elementValue = pTextElement->GetValue(type);
3877 if (objectType == objectTypeFromValueType && value != elementValue)
3879 if (textLength < currentLength)
3881 pNewTextElement = pTextElement->CloneN(SET_ALLVALUE_CLONE, 0);
3882 SysTryReturn(NID_GRP, pNewTextElement, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to clone text element.");
3884 pNewTextElement->SetTextLength(currentLength - textLength);
3885 pNewTextElement->SetValue(SET_TEXT_OFFSET, textIndexFromElementOffset + textLength);
3887 pTextElement->SetValue(type, value);
3888 pTextElement->SetTextLength(textLength);
3890 r = __pTextElementList->InsertAt(*pNewTextElement, ++elementIndex);
3891 SysTryCatch(NID_GRP, r == E_SUCCESS, , r, "[%s] Fail to insert element.", GetErrorMessage(r));
3897 pTextElement->SetValue(type, value);
3900 endElementIndex = elementIndex;
3903 elementTextOffset += currentLength;
3904 textLength -= currentLength;
3907 if (pEnum->MoveNext() != E_SUCCESS)
3912 pTextElement = static_cast < TextElement* >(pEnum->GetCurrent());
3913 if (pTextElement == null)
3918 currentLength = pTextElement->GetTextLength();
3919 textIndexFromElementOffset = pTextElement->GetValue(SET_TEXT_OFFSET);
3923 Optimize(startElementIndex, endElementIndex);
3928 Release(pNewTextElement);
3934 TextComposite::SetAbbrevObjectFontInfo(TextSimple* pSimpleText)
3936 SysTryReturn(NID_GRP, __pAbbrevTextElement, false, E_INVALID_STATE, "[E_INVALID_STATE] This instance is not constructed yet.");
3938 __pAbbrevTextElement->SetFont(pSimpleText->GetFont());
3939 __pAbbrevTextElement->SetForegroundColor(pSimpleText->GetForegroundColor());
3940 __pAbbrevTextElement->SetBackgroundColor(pSimpleText->GetBackgroundColor());
3941 __pAbbrevTextElement->SetOutlineColor(pSimpleText->GetOutlineColor());
3942 __pAbbrevTextElement->SetAlternativeForegroundColor(pSimpleText->GetAlternativeForegroundColor());
3943 __pAbbrevTextElement->SetAlternateLookEnabled(pSimpleText->IsAlternateLookEnabled());
3949 TextComposite::ComposeInNoneWrap(FloatRectangle& rect, NoneWrapComposeInfo* pNoneWrapComposeInfo)
3951 SysTryReturn(NID_GRP, __pCurrentTextColumn, -1, E_INVALID_STATE, "[E_INVALID_STATE] This instance is not constructed yet.");
3953 TextLine* pTextLine = null;
3954 FloatRectangle lineBounds;
3955 FloatDimension textSize;
3958 int endType = TEXT_RETBY_NORMAL;
3959 bool isChanged = false;
3963 textIndex = (__workStart < 0) ? 0 : __workStart;
3964 textIndex = (textIndex > __length) ? __length : textIndex;
3965 bool forwardSearch = (textIndex == __length) ? false : true;
3967 if (__pCurrentTextColumn->GetTotalLineCount() > 0)
3969 pTextLine = __pCurrentTextColumn->GetTextLine(0);
3970 SysTryReturn(NID_GRP, pTextLine, -1, E_SYSTEM, "[E_SYSTEM] Fail to get text line.");
3972 lineBounds = pTextLine->GetBoundsF();
3973 endType = pTextLine->GetEndType();
3975 if (lineBounds.width != rect.width)
3980 lineOffset = pTextLine->GetTextOffset();
3981 lineLength = pTextLine->GetTextLength();
3983 if (lineOffset <= textIndex && textIndex < lineOffset + lineLength)
3990 pTextLine = new (std::nothrow)TextLine(this);
3991 SysTryReturn(NID_GRP, pTextLine, -1, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Insufficient memory.");
3995 if (pNoneWrapComposeInfo != null)
3997 lineOffset = pNoneWrapComposeInfo->prevTextOffset;
4006 lineOffset = __length - 1;
4010 lineBounds.width = rect.width;
4013 lineBounds.height = 0;
4015 __pCurrentTextColumn->AddLineDuringCompose(pTextLine);
4022 lineBounds.width = rect.width;
4028 endType = ForwardAnalyzeWithBaseline(lineOffset, __length - lineOffset, lineBounds.width, __wrap,
4029 lineLength, textSize.width, textSize.height, baseline);
4031 lineBounds.height = textSize.height;
4032 pTextLine->SetBounds(lineBounds);
4033 pTextLine->SetTextOffset(lineOffset);
4034 pTextLine->SetTextLength(lineLength);
4035 pTextLine->SetRegion(textSize.width, textSize.height);
4036 pTextLine->SetEndType(endType);
4037 pTextLine->SetBaseline(baseline);
4038 GetTextExtentList(pTextLine);
4044 BackwardAnalyze(lineOffset, lineBounds.width, &textCount, &textSize.width, &textSize.height);
4046 lineBounds.height = textSize.height;
4047 lineOffset -= (textCount - 1);
4048 lineLength = textCount;
4049 endType = (lineOffset == 0) ? TEXT_RETBY_NORMAL : TEXT_RETBY_LIMITWIDTH;
4051 pTextLine->SetBounds(lineBounds);
4052 pTextLine->SetTextOffset(lineOffset);
4053 pTextLine->SetTextLength(lineLength);
4054 pTextLine->SetRegion(textSize.width, textSize.height);
4055 pTextLine->SetEndType(endType);
4056 pTextLine->SetBaseline(baseline);
4057 GetTextExtentList(pTextLine);
4063 pTextLine->SetEndType(TEXT_RETBY_NORMAL);
4067 rect.height = lineBounds.height;
4069 if (textIndex < lineOffset)
4071 lineOffset = textIndex;
4072 endType = ForwardAnalyze(lineOffset, __length - lineOffset, lineBounds.width, __wrap,
4073 lineLength, textSize.width, textSize.height);
4075 lineBounds.height = textSize.height;
4077 else if (forwardSearch && textIndex >= lineOffset + lineLength)
4079 FloatDimension needDim;
4080 GetRegion(lineOffset + lineLength, textIndex - (lineOffset + lineLength) + 1, needDim.width, needDim.height);
4083 float remainingWidth = needDim.width - (lineBounds.width - textSize.width);
4085 FloatDimension charDim;
4086 textSize.width += needDim.width;
4087 lineLength += textIndex - (lineOffset + lineLength) + 1;
4091 GetRegion(lineOffset, 1, charDim.width, charDim.height);
4094 remainingWidth -= charDim.width;
4095 textSize.width -= charDim.width;
4097 if (remainingWidth <= 0)
4103 lineLength -= index;
4105 else if (endType != TEXT_RETBY_LIMITWIDTH && lineLength != __length)
4109 FloatDimension lineTextSize;
4111 float remainingWidth = 0;
4113 pTextLine->GetRegion(0, lineLength, lineTextSize.width, lineTextSize.height);
4114 remainingWidth = lineBounds.width - lineTextSize.width;
4115 BackwardAnalyze(lineOffset - 1, remainingWidth, &textCount, &textSize.width, &textSize.height);
4117 if (textSize.width > 0)
4119 lineOffset -= textCount;
4120 lineLength += textCount;
4121 textSize.width += lineTextSize.width;
4122 lineBounds.height = textSize.height;
4123 endType = TEXT_RETBY_LIMITLENGTH;
4140 pTextLine->SetBounds(lineBounds);
4141 pTextLine->SetRegion(textSize.width, textSize.height);
4142 pTextLine->SetTextLength(lineLength);
4143 pTextLine->SetTextOffset(lineOffset);
4144 pTextLine->SetEndType(endType);
4145 pTextLine->SetBaseline(baseline);
4146 GetTextExtentList(pTextLine);
4152 TextComposite::GetTextExtentList(TextLine* pTextLine) const
4154 result r = E_SUCCESS;
4155 int lineOffset = pTextLine->GetTextOffset();
4156 int lineLength = pTextLine->GetTextLength();
4157 int elementTextOffset = 0;
4158 int elementIndex = 0;
4159 int currentLength = 0;
4160 int textIndexFromElementOffset = 0;
4161 int remainingLength = 0;
4165 TextElement* pTextElement = GetElementAtTextIndex(lineOffset, elementTextOffset, elementIndex, currentLength, textIndexFromElementOffset);
4166 SysTryReturn(NID_GRP, pTextElement, -1, E_SYSTEM, "[E_SYSTEM] Fail to get text element.");
4168 remainingLength = lineLength;
4169 currentLength = Math::Min(remainingLength, currentLength);
4171 IEnumerator* pEnum = __pTextElementList->GetEnumeratorN();
4172 for (int i = 0; i <= elementIndex; i++)
4174 r = pEnum->MoveNext();
4177 Collection::ArrayListT<_FloatPair>* pGapListF = new (std::nothrow) Collection::ArrayListT<_FloatPair>;
4178 _FloatPair currentGap;
4180 while (remainingLength != 0)
4182 TextElementType objectType = pTextElement->GetType();
4183 if (objectType == TEXT_ELEMENT_TYPE_CUTLINK || objectType == TEXT_ELEMENT_TYPE_TEXT)
4185 TextSimple* pSimpleText = dynamic_cast < TextSimple* >(pTextElement);
4186 if (pSimpleText != null)
4188 const Bitmap* pBitmap = pSimpleText->GetBitmap();
4191 currentGap.first = maxWidth;
4192 currentGap.second = currentGap.first + pBitmap->GetWidth();
4194 pGapListF->Add(currentGap);
4195 right = (right < currentGap.second) ? currentGap.second : right;
4199 _FontImpl* pFontImpl = _FontImpl::GetInstance(*const_cast < Font* >(pSimpleText->GetFont()));
4200 SysTryCatch(NID_GRP, pFontImpl, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to get native font instance.");
4202 Collection::ArrayListT<_FloatPair> pCurrentElementGapListF;
4204 const wchar_t* pText = pSimpleText->GetTextSource();
4205 pFontImpl->GetTextExtentList(pText, textIndexFromElementOffset, currentLength, pCurrentElementGapListF);
4207 IEnumeratorT<_FloatPair >* pCurrentElementGapEnum = pCurrentElementGapListF.GetEnumeratorN();
4208 while (pCurrentElementGapEnum->MoveNext() == E_SUCCESS)
4210 pCurrentElementGapEnum->GetCurrent(currentGap);
4212 currentGap.first = maxWidth + currentGap.first;
4213 currentGap.second = maxWidth + currentGap.second;
4215 pGapListF->Add(currentGap);
4216 right = (right < currentGap.second) ? currentGap.second : right;
4219 Release(pCurrentElementGapEnum);
4223 else if (objectType == TEXT_ELEMENT_TYPE_IMAGE)
4225 TextImage* pImageText = dynamic_cast < TextImage* >(pTextElement);
4226 if (pImageText != null)
4228 FloatRectangle rect = pImageText->GetBoundsF();
4230 currentGap.first = maxWidth;
4231 currentGap.second = currentGap.first + rect.width;
4233 pGapListF->Add(currentGap);
4234 right = (right < currentGap.second) ? currentGap.second : right;
4238 remainingLength -= currentLength;
4240 if (pEnum->MoveNext() != E_SUCCESS)
4245 pTextElement = static_cast < TextElement* >(pEnum->GetCurrent());
4246 if (pTextElement == null)
4251 textIndexFromElementOffset = pTextElement->GetValue(SET_TEXT_OFFSET);
4252 currentLength = Math::Min(pTextElement->GetTextLength(), remainingLength);
4257 pTextLine->SetTextExtentList(pGapListF);
4272 TextComposite::ComposeInWrap(FloatRectangle& rect)
4274 SysTryReturn(NID_GRP, __pCurrentTextColumn, -1, E_INVALID_STATE, "[E_INVALID_STATE] This instance is not constructed yet.");
4279 int remainingLength = 0;
4280 float remainingWidth = 0;
4281 float remainingHeight = 0;
4283 bool hasPrevLine = false;
4284 FloatDimension textSize;
4285 TextLine* pTextLine = null;
4287 int endType = TEXT_RETBY_NORMAL;
4288 FloatRectangle lineBounds;
4289 FloatDimension lineTextSize;
4292 int displayLineCount = 0;
4293 float displayHeight = 0;
4295 float lineBaseline = 0;
4297 pTextLine = __pCurrentTextColumn->GetPrevLineChangedStartLine();
4298 if (pTextLine != null)
4300 endType = pTextLine->GetEndType();
4301 lineOffset = pTextLine->GetTextOffset();
4302 lineLength = pTextLine->GetTextLength();
4303 lineBounds = pTextLine->GetBoundsF();
4304 lineBaseline = pTextLine->GetBaselineF();
4305 pTextLine->GetRegion(0, pTextLine->GetTextLength(), lineTextSize.width, lineTextSize.height);
4307 if (endType != TEXT_RETBY_LINEFEED)
4309 textIndex = lineOffset + lineLength;
4310 remainingLength = __length - textIndex;
4311 remainingWidth = lineBounds.width - lineTextSize.width;
4314 if (remainingLength == 0)
4321 textIndex = lineOffset + lineLength;
4322 remainingLength = __length - textIndex;
4323 remainingWidth = rect.width;
4324 offsetY = lineBounds.y + lineBounds.height;
4326 if (remainingLength == 0)
4328 float nextY = offsetY;
4329 lineTextSize.height = lineBounds.height;
4331 pTextLine = new (std::nothrow)TextLine(this);
4332 SysTryReturn(NID_GRP, pTextLine, -1, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Insufficient memory.");
4334 lineBounds.y = nextY;
4336 pTextLine->SetBounds(lineBounds);
4337 pTextLine->SetRegion(0.0f, lineTextSize.height);
4338 pTextLine->SetTextLength(0);
4339 pTextLine->SetTextOffset(textIndex);
4340 pTextLine->SetEndType(TEXT_RETBY_LINEFEED);
4341 pTextLine->SetBaseline(0);
4342 GetTextExtentList(pTextLine);
4344 __pCurrentTextColumn->AddLineDuringCompose(pTextLine);
4346 if (lineBounds.y + lineBounds.height <= rect.height)
4348 __pCurrentTextColumn->SetDisplayLineCount(++displayLineCount);
4349 displayHeight += lineBounds.height;
4350 __pCurrentTextColumn->SetDisplayHeight(displayHeight);
4360 remainingLength = __length;
4361 remainingWidth = rect.width;
4363 __pCurrentTextColumn->SetChangedStartLineIndex(0);
4368 pTextLine = new (std::nothrow)TextLine(this);
4369 SysTryReturn(NID_GRP, pTextLine, -1, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Insufficient memory.");
4371 lineBounds.x = rect.x;
4372 lineBounds.width = rect.width;
4373 lineBounds.y = offsetY;
4374 lineTextSize.height = 0;
4376 if (remainingLength == 0)
4378 lineTextSize.height = GetHeightF(0);
4379 lineBounds.height = lineTextSize.height;
4381 pTextLine->SetBounds(lineBounds);
4382 pTextLine->SetRegion(0.0f, lineTextSize.height);
4383 pTextLine->SetTextLength(0);
4384 pTextLine->SetTextOffset(textIndex);
4385 pTextLine->SetEndType(TEXT_RETBY_NORMAL);
4386 pTextLine->SetBaseline(0);
4387 GetTextExtentList(pTextLine);
4389 __pCurrentTextColumn->AddLineDuringCompose(pTextLine);
4391 if (lineBounds.y + lineBounds.height <= rect.height)
4393 __pCurrentTextColumn->SetDisplayLineCount(++displayLineCount);
4394 displayHeight += lineBounds.height;
4395 __pCurrentTextColumn->SetDisplayHeight(displayHeight);
4402 remainingHeight = rect.height;
4404 while (remainingLength != 0)
4406 ret = ForwardAnalyzeWithBaseline(textIndex, remainingLength, remainingWidth, __wrap, textCount, textSize.width, textSize.height, baseline);
4421 lineOffset = textIndex;
4422 lineLength = textCount;
4423 lineTextSize.width = textSize.width;
4424 lineTextSize.height = textSize.height;
4425 lineBounds.height = textSize.height;
4428 pTextLine->SetBounds(lineBounds);
4429 pTextLine->SetRegion(lineTextSize.width, lineTextSize.height);
4430 pTextLine->SetTextLength(lineLength);
4431 pTextLine->SetTextOffset(lineOffset);
4432 pTextLine->SetEndType(ret);
4433 pTextLine->SetBaseline(baseline);
4434 GetTextExtentList(pTextLine);
4436 __pCurrentTextColumn->AddLineDuringCompose(pTextLine);
4439 if (lineBounds.y + lineBounds.height <= rect.height)
4441 __pCurrentTextColumn->SetDisplayLineCount(++displayLineCount);
4442 displayHeight += lineBounds.height;
4443 __pCurrentTextColumn->SetDisplayHeight(displayHeight);
4448 if (__wrap == TEXT_OBJECT_WRAP_TYPE_WORD)
4450 if (ret != TEXT_RETBY_LIMITWIDTH)
4452 lineLength += textCount;
4453 lineTextSize.width += textSize.width;
4454 lineBounds.height = (lineBounds.height > textSize.height) ? lineBounds.height: textSize.height;
4455 lineTextSize.height = lineBounds.height;
4457 baseline = (lineBaseline > baseline) ? baseline : lineBaseline;
4459 pTextLine->SetBounds(lineBounds);
4460 pTextLine->SetRegion(lineTextSize.width, lineTextSize.height);
4461 pTextLine->SetTextLength(lineLength);
4462 pTextLine->SetEndType(endType);
4463 pTextLine->SetBaseline(baseline);
4464 GetTextExtentList(pTextLine);
4466 __pCurrentTextColumn->CheckComposeDone(pTextLine);
4475 lineLength += textCount;
4476 lineTextSize.width += textSize.width;
4477 lineBounds.height = (lineBounds.height > textSize.height) ? lineBounds.height : textSize.height;
4478 lineTextSize.height = lineBounds.height;
4480 baseline = (lineBaseline > baseline) ? baseline : lineBaseline;
4482 pTextLine->SetBounds(lineBounds);
4483 pTextLine->SetRegion(lineTextSize.width, lineTextSize.height);
4484 pTextLine->SetTextLength(lineLength);
4485 pTextLine->SetEndType(endType);
4486 pTextLine->SetBaseline(baseline);
4487 GetTextExtentList(pTextLine);
4489 __pCurrentTextColumn->CheckComposeDone(pTextLine);
4494 __pCurrentTextColumn->SetChangedStartLineIndex(pTextLine->GetIndex());
4497 hasPrevLine = false;
4500 if (__pCurrentTextColumn->IsComposeDone())
4505 textIndex += textCount;
4506 remainingLength -= textCount;
4508 remainingHeight -= lineTextSize.height;
4510 if (remainingLength > 0)
4512 float nextY = lineBounds.y + lineBounds.height;
4514 pTextLine = new (std::nothrow)TextLine(this);
4515 SysTryReturn(NID_GRP, pTextLine, -1, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Insufficient memory.");
4517 lineBounds.x = rect.x;
4518 lineBounds.y = nextY;
4519 lineBounds.width = rect.width;
4520 lineTextSize.height = 0;
4522 remainingWidth = rect.width;
4526 if (endType == TEXT_RETBY_LINEFEED)
4528 float nextY = lineBounds.y + lineBounds.height;
4529 lineTextSize.height = lineBounds.height;
4531 pTextLine = new (std::nothrow)TextLine(this);
4532 SysTryReturn(NID_GRP, pTextLine, -1, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Insufficient memory.");
4534 lineBounds.x = rect.x;
4535 lineBounds.y = nextY;
4536 lineBounds.width = rect.width;
4537 lineBounds.height = lineTextSize.height;
4539 pTextLine->SetBounds(lineBounds);
4540 pTextLine->SetRegion(0.0f, lineTextSize.height);
4541 pTextLine->SetTextLength(0);
4542 pTextLine->SetTextOffset(textIndex);
4543 pTextLine->SetEndType(TEXT_RETBY_LINEFEED);
4544 pTextLine->SetBaseline(0);
4545 GetTextExtentList(pTextLine);
4547 __pCurrentTextColumn->AddLineDuringCompose(pTextLine);
4550 if (lineBounds.y + lineBounds.height <= rect.height)
4552 __pCurrentTextColumn->SetDisplayLineCount(++displayLineCount);
4553 displayHeight += lineBounds.height;
4554 __pCurrentTextColumn->SetDisplayHeight(displayHeight);
4563 FloatDimension columnTextSize;
4564 __pCurrentTextColumn->GetRegion(0, __length, columnTextSize.width, columnTextSize.height);
4565 rect.height = columnTextSize.height;
4569 __pCurrentTextColumn->SetChangedLastLineIndex(pTextLine->GetIndex());
4572 if (Tizen::App::_AppInfo::IsOspCompat())
4574 __pCurrentTextColumn->SetDisplayLineCount(0);
4575 __pCurrentTextColumn->SetDisplayHeight(0);
4582 TextComposite::ComposeInPartialMode(FloatRectangle& rect)
4584 SysTryReturn(NID_GRP, __pCurrentTextColumn, -1, E_INVALID_STATE
4585 , "[E_INVALID_STATE] This instance is not constructed yet.");
4590 int remainingLength = 0;
4591 float remainingWidth = 0;
4592 float remainingHeight = 0;
4597 FloatDimension textSize;
4598 FloatDimension lineTextSize;
4599 FloatRectangle lineBounds;
4600 bool hasPrevLine = false;
4601 int displayLineCount = 0;
4602 float displayHeight = 0;
4604 float lineBaseline = 0;
4605 TextLine* pTextLine = null;
4606 int endType = TEXT_RETBY_NORMAL;
4608 if (__lineIndexCompositeDone != 0)
4610 pTextLine = __pCurrentTextColumn->GetTextLine(__lineIndexCompositeDone - 1);
4611 lineCount = __lineIndexCompositeDone;
4614 if (pTextLine != null)
4616 endType = pTextLine->GetEndType();
4617 lineOffset = pTextLine->GetTextOffset();
4618 lineLength = pTextLine->GetTextLength();
4619 lineBounds = pTextLine->GetBoundsF();
4620 lineBaseline = pTextLine->GetBaselineF();
4621 pTextLine->GetRegion(0, pTextLine->GetTextLength(), lineTextSize.width, lineTextSize.height);
4623 if (endType != TEXT_RETBY_LINEFEED)
4625 textIndex = lineOffset + lineLength;
4626 remainingLength = __length - textIndex;
4627 remainingWidth = lineBounds.width - lineTextSize.width;
4630 if (remainingLength == 0)
4637 textIndex = lineOffset + lineLength;
4638 remainingLength = __length - textIndex;
4639 remainingWidth = rect.width;
4640 offsetY = lineBounds.y + lineBounds.height;
4642 if (remainingLength == 0)
4644 float nextY = offsetY;
4645 lineTextSize.height = lineBounds.height;
4647 pTextLine = new (std::nothrow)TextLine(this);
4648 SysTryReturn(NID_GRP, pTextLine, -1, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Insufficient memory.");
4650 lineBounds.y = nextY;
4652 pTextLine->SetBounds(lineBounds);
4653 pTextLine->SetRegion(0.0f, lineTextSize.height);
4654 pTextLine->SetTextLength(0);
4655 pTextLine->SetTextOffset(textIndex);
4656 pTextLine->SetEndType(TEXT_RETBY_LINEFEED);
4657 pTextLine->SetBaseline(0);
4658 GetTextExtentList(pTextLine);
4660 __pCurrentTextColumn->AddLineDuringCompose(pTextLine);
4662 if (lineBounds.y + lineBounds.height <= rect.height)
4664 __pCurrentTextColumn->SetDisplayLineCount(++displayLineCount);
4665 displayHeight += lineBounds.height;
4666 __pCurrentTextColumn->SetDisplayHeight(displayHeight);
4676 remainingLength = __length;
4677 remainingWidth = rect.width;
4679 __pCurrentTextColumn->SetChangedStartLineIndex(0);
4684 pTextLine = new (std::nothrow)TextLine(this);
4685 SysTryReturn(NID_GRP, pTextLine, -1, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Insufficient memory.");
4687 lineBounds.x = rect.x;
4688 lineBounds.width = rect.width;
4689 lineBounds.y = offsetY;
4690 lineTextSize.height = 0;
4692 if (remainingLength == 0)
4694 lineTextSize.height = GetHeightF(0);
4695 lineBounds.height = lineTextSize.height;
4697 pTextLine->SetBounds(lineBounds);
4698 pTextLine->SetRegion(0.0f, lineTextSize.height);
4699 pTextLine->SetTextLength(0);
4700 pTextLine->SetTextOffset(textIndex);
4701 pTextLine->SetEndType(TEXT_RETBY_NORMAL);
4702 pTextLine->SetBaseline(0);
4703 GetTextExtentList(pTextLine);
4705 __pCurrentTextColumn->AddLineDuringCompose(pTextLine);
4707 if (lineBounds.y + lineBounds.height <= rect.height)
4709 __pCurrentTextColumn->SetDisplayLineCount(++displayLineCount);
4710 displayHeight += lineBounds.height;
4711 __pCurrentTextColumn->SetDisplayHeight(displayHeight);
4718 remainingHeight = GetComposePartialLimitHeightF();
4719 if (remainingHeight == 0)
4721 remainingHeight = rect.height;
4723 if (remainingHeight < lineBounds.height && remainingLength > 0)
4725 remainingHeight = lineBounds.height;
4728 while (remainingLength != 0)
4730 ret = ForwardAnalyzeWithBaseline(textIndex, remainingLength, remainingWidth, __wrap, textCount, textSize.width, textSize.height, baseline);
4745 lineOffset = textIndex;
4746 lineLength = textCount;
4747 lineTextSize.width = textSize.width;
4748 lineTextSize.height = textSize.height;
4749 lineBounds.height = textSize.height;
4752 pTextLine->SetBounds(lineBounds);
4753 pTextLine->SetRegion(lineTextSize.width, lineTextSize.height);
4754 pTextLine->SetTextLength(lineLength);
4755 pTextLine->SetTextOffset(lineOffset);
4756 pTextLine->SetEndType(endType);
4757 pTextLine->SetBaseline(baseline);
4758 GetTextExtentList(pTextLine);
4760 __pCurrentTextColumn->AddLineDuringCompose(pTextLine);
4762 if (lineBounds.y + lineBounds.height <= rect.height)
4764 __pCurrentTextColumn->SetDisplayLineCount(++displayLineCount);
4765 displayHeight += lineBounds.height;
4766 __pCurrentTextColumn->SetDisplayHeight(displayHeight);
4770 __lineIndexCompositeDone++;
4771 __totalComposedHeight += lineTextSize.height;
4775 if (__wrap == TEXT_OBJECT_WRAP_TYPE_WORD)
4777 if (ret != TEXT_RETBY_LIMITWIDTH)
4779 lineLength += textCount;
4780 lineTextSize.width += textSize.width;
4781 lineBounds.height = (lineBounds.height > textSize.height) ? lineBounds.height: textSize.height;
4782 lineTextSize.height = lineBounds.height;
4784 baseline = (lineBaseline > baseline) ? baseline : lineBaseline;
4786 pTextLine->SetBounds(lineBounds);
4787 pTextLine->SetRegion(lineTextSize.width, lineTextSize.height);
4788 pTextLine->SetTextLength(lineLength);
4789 pTextLine->SetEndType(endType);
4790 pTextLine->SetBaseline(baseline);
4791 GetTextExtentList(pTextLine);
4800 lineLength += textCount;
4801 lineTextSize.width += textSize.width;
4802 lineBounds.height = (lineBounds.height > textSize.height) ? lineBounds.height : textSize.height;
4803 lineTextSize.height = lineBounds.height;
4805 baseline = (lineBaseline > baseline) ? baseline : lineBaseline;
4807 pTextLine->SetBounds(lineBounds);
4808 pTextLine->SetRegion(lineTextSize.width, lineTextSize.height);
4809 pTextLine->SetTextLength(lineLength);
4810 pTextLine->SetEndType(endType);
4811 pTextLine->SetBaseline(baseline);
4812 GetTextExtentList(pTextLine);
4817 __pCurrentTextColumn->SetChangedStartLineIndex(pTextLine->GetIndex());
4820 hasPrevLine = false;
4823 if (__pCurrentTextColumn->IsComposeDone())
4828 textIndex += textCount;
4829 remainingLength -= textCount;
4830 remainingHeight -= lineTextSize.height;
4832 if (remainingHeight < 0)
4837 if (remainingLength > 0)
4839 float nextY = lineBounds.y + lineBounds.height;
4841 pTextLine = new (std::nothrow)TextLine(this);
4842 SysTryReturn(NID_GRP, pTextLine, -1, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Insufficient memory.");
4844 lineBounds.x = rect.x;
4845 lineBounds.y = nextY;
4846 lineBounds.width = rect.width;
4847 lineTextSize.height = 0;
4849 remainingWidth = rect.width;
4853 if (endType == TEXT_RETBY_LINEFEED)
4855 float nextY = lineBounds.y + lineBounds.height;
4856 lineTextSize.height = lineBounds.height;
4858 pTextLine = new (std::nothrow)TextLine(this);
4859 SysTryReturn(NID_GRP, pTextLine, -1, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Insufficient memory.");
4861 lineBounds.x = rect.x;
4862 lineBounds.y = nextY;
4863 lineBounds.width = rect.width;
4864 lineBounds.height = lineTextSize.height;
4866 pTextLine->SetBounds(lineBounds);
4867 pTextLine->SetRegion(0.0f, lineTextSize.height);
4868 pTextLine->SetTextLength(0);
4869 pTextLine->SetTextOffset(textIndex);
4870 pTextLine->SetEndType(TEXT_RETBY_LINEFEED);
4871 pTextLine->SetBaseline(0);
4872 GetTextExtentList(pTextLine);
4874 __pCurrentTextColumn->AddLineDuringCompose(pTextLine);
4878 if (lineBounds.y + lineBounds.height <= rect.height)
4880 __pCurrentTextColumn->SetDisplayLineCount(++displayLineCount);
4881 displayHeight += lineBounds.height;
4882 __pCurrentTextColumn->SetDisplayHeight(displayHeight);
4885 __lineIndexCompositeDone++;
4886 __totalComposedHeight += lineTextSize.height;
4887 __pCurrentTextColumn->FinishCompose();
4894 __pCurrentTextColumn->FinishCompose();
4899 rect.height = __totalComposedHeight;
4903 __pCurrentTextColumn->SetChangedLastLineIndex(pTextLine->GetIndex());
4906 if (Tizen::App::_AppInfo::IsOspCompat())
4908 __pCurrentTextColumn->SetDisplayLineCount(0);
4909 __pCurrentTextColumn->SetDisplayHeight(0);
4916 TextComposite::ComposeInNoneWrapMiddleEllipsis(FloatRectangle& rect)
4918 int endType = TEXT_RETBY_NORMAL;
4919 FloatRectangle lineBounds;
4920 FloatDimension abbrevTextDim;
4921 FloatDimension textSize;
4923 float maxHeight = 0;
4926 lineBounds.width = rect.width;
4929 lineBounds.height = rect.height;
4930 endType = ForwardAnalyzeWithBaseline(0, __length, lineBounds.width, __wrap, length, textSize.width, textSize.height, baseline);
4932 if (endType != TEXT_RETBY_LIMITWIDTH)
4934 __drawTextEllipsis = false;
4935 return ComposeInNoneWrap(rect);
4938 __drawTextEllipsis = true;
4940 TextElement* pTextElement = null;
4941 TextSimple* pSimpleText = null;
4943 pTextElement = static_cast < TextElement* >(__pTextElementList->GetAt(0));
4944 SysTryReturn(NID_GRP, pTextElement, -1, E_SYSTEM, "[E_SYSTEM] Fail to get text element.");
4946 TextElementType objectType = pTextElement->GetType();
4947 SysTryReturn(NID_GRP, objectType == TEXT_ELEMENT_TYPE_CUTLINK || objectType == TEXT_ELEMENT_TYPE_TEXT, -1, E_SYSTEM, "[E_SYSTEM] Fail to get text element.");
4949 pSimpleText = dynamic_cast < TextSimple* >(pTextElement);
4950 if (pSimpleText != null)
4952 SetAbbrevObjectFontInfo(pSimpleText);
4955 __pAbbrevTextElement->GetRegion(0, 1, abbrevTextDim.width, abbrevTextDim.height);
4956 __middleEllipsisWidth = abbrevTextDim.width;
4958 ForwardAnalyze(0, __length, ((lineBounds.width - __middleEllipsisWidth + 10.0f) / 2.0f), __wrap, length, textSize.width, textSize.height);
4959 __middleEllipsisTextLengthInHead = length;
4960 __middleEllipsisHeadWidth = textSize.width;
4962 maxHeight = textSize.height;
4964 ForwardAnalyze(__middleEllipsisTextLengthInHead, __length - __middleEllipsisTextLengthInHead, lineBounds.width - __middleEllipsisWidth -
4965 __middleEllipsisHeadWidth, __wrap, length, textSize.width, textSize.height);
4967 __middleEllipsisTextLengthInTail = length;
4968 maxHeight = (maxHeight < textSize.height) ? textSize.height : maxHeight;
4970 TextLine* pTextLine = new (std::nothrow)TextLine(this);
4971 SysTryReturn(NID_GRP, pTextLine, -1, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Insufficient memory.");
4973 pTextLine->SetBounds(lineBounds);
4974 pTextLine->SetRegion(lineBounds.width, maxHeight);
4975 pTextLine->SetTextLength(__length);
4976 pTextLine->SetTextOffset(0);
4977 pTextLine->SetEndType(TEXT_RETBY_NORMAL);
4978 pTextLine->SetBaseline(baseline);
4979 GetTextExtentList(pTextLine);
4981 __pCurrentTextColumn->AddLineDuringCompose(pTextLine);
4983 lineBounds.height = maxHeight;
4989 TextComposite::ComposeInNoneWrapHeadEllipsis(FloatRectangle& rect)
4991 SysTryReturn(NID_GRP, __pCurrentTextColumn, -1, E_INVALID_STATE, "[E_INVALID_STATE] This instance is not constructed yet.");
4993 int endType = TEXT_RETBY_NORMAL;
4994 FloatRectangle lineBounds;
4995 FloatDimension abbrevTextDim;
4996 FloatDimension textSize;
4998 float maxHeight = 0;
5001 lineBounds.width = rect.width;
5004 lineBounds.height = rect.height;
5005 endType = ForwardAnalyzeWithBaseline(0, __length, lineBounds.width, __wrap, length, textSize.width, textSize.height, baseline);
5007 if (endType != TEXT_RETBY_LIMITWIDTH)
5009 __drawTextEllipsis = false;
5010 return ComposeInNoneWrap(rect);
5013 __drawTextEllipsis = true;
5014 TextElement* pTextElement = null;
5015 TextSimple* pSimpleText = null;
5017 pTextElement = static_cast < TextElement* >(__pTextElementList->GetAt(0));
5018 SysTryReturn(NID_GRP, pTextElement, -1, E_SYSTEM, "[E_SYSTEM] Fail to get text element.");
5020 TextElementType objectType = pTextElement->GetType();
5021 SysTryReturn(NID_GRP, objectType == TEXT_ELEMENT_TYPE_CUTLINK || objectType == TEXT_ELEMENT_TYPE_TEXT
5022 , -1, E_SYSTEM, "[E_SYSTEM] Fail to get text element.");
5024 pSimpleText = dynamic_cast < TextSimple* >(pTextElement);
5025 if (pSimpleText != null)
5027 SetAbbrevObjectFontInfo(pSimpleText);
5030 __pAbbrevTextElement->GetRegion(0, 1, abbrevTextDim.width, abbrevTextDim.height);
5031 __headEllipsisWidth = abbrevTextDim.width;
5033 BackwardAnalyze(__length - 1, lineBounds.width - abbrevTextDim.width, &__headEllipsisTextLength, &textSize.width, &textSize.height);
5034 maxHeight = textSize.height;
5036 TextLine* pTextLine = new (std::nothrow)TextLine(this);
5037 SysTryReturn(NID_GRP, pTextLine, -1, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Insufficient memory.");
5039 pTextLine->SetBounds(lineBounds);
5040 pTextLine->SetRegion(lineBounds.width, maxHeight);
5041 pTextLine->SetTextLength(__length);
5042 pTextLine->SetTextOffset(0);
5043 pTextLine->SetEndType(TEXT_RETBY_NORMAL);
5044 pTextLine->SetBaseline(baseline);
5045 GetTextExtentList(pTextLine);
5047 __pCurrentTextColumn->AddLineDuringCompose(pTextLine);
5049 lineBounds.height = maxHeight;
5055 TextComposite::DrawAbbrev(_CanvasImpl& canvasImpl, const FloatRectangle& displayRect, const TextObjectAlignment align)
5057 if (__TextObjectEllipsisType == TEXT_OBJECT_ELLIPSIS_TYPE_MIDDLE)
5059 return DrawAbbrevInMiddleEllipsis(canvasImpl, displayRect, align);
5061 else if (__TextObjectEllipsisType == TEXT_OBJECT_ELLIPSIS_TYPE_HEAD)
5063 return DrawAbbrevInHeadEllipsis(canvasImpl, displayRect, align);
5070 TextComposite::GetValue(int textIndex, TextComponentInfoValueType type, unsigned int* value) const
5072 IEnumerator* pEnum = null;
5073 TextElement* pTextElement = null;
5075 int elementTextLength = 0;
5077 pEnum = __pTextElementList->GetEnumeratorN();
5078 while (pEnum->MoveNext() == E_SUCCESS)
5080 pTextElement = static_cast < TextElement* >(pEnum->GetCurrent());
5081 if (pTextElement == null)
5086 elementTextLength = pTextElement->GetTextLength();
5088 if (textIndex < offset + elementTextLength)
5090 TextElementType objectType = pTextElement->GetType();
5092 if (objectType != TextUtility::GetObjectTypeFromValueType(type) && objectType != TEXT_ELEMENT_TYPE_CUTLINK)
5095 return E_INVALID_ARG;
5098 *value = pTextElement->GetValue(type);
5103 offset += elementTextLength;
5107 return E_INVALID_ARG;
5111 TextComposite::BackwardAnalyze(int startTextIndex, float maxWidth, int* actualLength, float* width, float* height)
5113 float remainingWidth = 0;
5115 FloatDimension textSize;
5121 remainingWidth = maxWidth;
5124 while (startTextIndex >= 0 && textSize.width < remainingWidth)
5126 GetRegion(startTextIndex, length, textSize.width, textSize.height);
5128 if (textSize.width <= remainingWidth)
5130 *actualLength = length;
5131 *width = textSize.width;
5132 *height = textSize.height;
5143 TextComposite::GetFirstTextIndexAt(int elementIndex) const
5145 SysTryReturn(NID_GRP, elementIndex >= 0 && elementIndex < __pTextElementList->GetCount(), -1, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
5147 IEnumerator* pEnum = null;
5148 TextElement* pTextElement = null;
5151 int elementTextOffset = 0;
5153 if (elementIndex == 0)
5158 pEnum = __pTextElementList->GetEnumeratorN();
5159 while (pEnum->MoveNext() == E_SUCCESS)
5161 pTextElement = static_cast < TextElement* >(pEnum->GetCurrent());
5162 if (pTextElement == null)
5167 if (index == elementIndex)
5172 elementTextOffset += pTextElement->GetTextLength();
5174 pTextElement = null;
5180 if (pTextElement != null)
5182 return elementTextOffset;
5189 TextComposite::DrawAbbrevInMiddleEllipsis(_CanvasImpl& canvasImpl, const FloatRectangle& displayRect, const TextObjectAlignment alignment)
5191 TextLine* pTextLine = __pCurrentTextColumn->GetTextLine(0);
5192 SysTryReturn(NID_GRP, pTextLine, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to get text line.");
5194 FloatDimension textSize;
5195 FloatRectangle adjustedRect;
5197 pTextLine->GetRegion(0, __length, textSize.width, textSize.height);
5198 adjustedRect.x = displayRect.x;
5199 adjustedRect.width = displayRect.width;
5201 switch (alignment & TEXT_ALIGNMASK_VERT)
5203 case TEXT_OBJECT_ALIGNMENT_MIDDLE:
5204 adjustedRect.y = displayRect.y + (displayRect.height - textSize.height) / 2;
5207 case TEXT_OBJECT_ALIGNMENT_BOTTOM:
5208 adjustedRect.y = displayRect.y + (displayRect.height - textSize.height);
5211 case TEXT_OBJECT_ALIGNMENT_TOP:
5214 adjustedRect.y = displayRect.y;
5217 adjustedRect.height = displayRect.height - (displayRect.y - adjustedRect.y);
5219 TextElement* pTextElement = null;
5220 TextSimple* pSimpleText = null;
5222 pTextElement = static_cast < TextElement* >(__pTextElementList->GetAt(0));
5223 SysTryReturn(NID_GRP, pTextElement, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to get text element.");
5225 TextElementType objectType = pTextElement->GetType();
5226 SysTryReturn(NID_GRP, objectType == TEXT_ELEMENT_TYPE_CUTLINK || objectType == TEXT_ELEMENT_TYPE_TEXT
5227 , E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to draw to symbol object.");
5229 pSimpleText = dynamic_cast < TextSimple* >(pTextElement);
5230 if (pSimpleText != null)
5232 SetAbbrevObjectFontInfo(pSimpleText);
5235 DrawPartial(canvasImpl, adjustedRect, 0, __middleEllipsisTextLengthInHead);
5237 adjustedRect.x += __middleEllipsisHeadWidth;
5238 __pAbbrevTextElement->Draw(canvasImpl, adjustedRect, 0, 1, (TextObjectAlignment)(TEXT_OBJECT_ALIGNMENT_TOP | TEXT_OBJECT_ALIGNMENT_LEFT), TEXT_OBJECT_ACTION_TYPE_NONE);
5240 adjustedRect.x += __middleEllipsisWidth;
5241 DrawPartial(canvasImpl, adjustedRect, __length - __middleEllipsisTextLengthInTail, __middleEllipsisTextLengthInTail);
5247 TextComposite::DrawAbbrevInHeadEllipsis(_CanvasImpl& canvasImpl, const FloatRectangle& displayRect, const TextObjectAlignment alignment)
5249 TextLine* pTextLine = __pCurrentTextColumn->GetTextLine(0);
5250 SysTryReturn(NID_GRP, pTextLine, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to get text line.");
5252 result r = E_SUCCESS;
5253 FloatDimension textSize;
5254 FloatRectangle adjustedRect;
5256 pTextLine->GetRegion(0, __length, textSize.width, textSize.height);
5257 adjustedRect.x = displayRect.x;
5258 adjustedRect.width = displayRect.width;
5260 switch (alignment & TEXT_ALIGNMASK_VERT)
5262 case TEXT_OBJECT_ALIGNMENT_MIDDLE:
5263 adjustedRect.y = displayRect.y + (displayRect.height - textSize.height) / 2;
5266 case TEXT_OBJECT_ALIGNMENT_BOTTOM:
5267 adjustedRect.y = displayRect.y + (displayRect.height - textSize.height);
5270 case TEXT_OBJECT_ALIGNMENT_TOP:
5273 adjustedRect.y = displayRect.y;
5276 adjustedRect.height = displayRect.height - (displayRect.y - adjustedRect.y);
5278 TextElement* pTextElement = null;
5279 TextSimple* pSimpleText = null;
5281 pTextElement = static_cast < TextElement* >(__pTextElementList->GetAt(0));
5282 r = GetLastResult();
5283 SysTryReturn(NID_GRP, pTextElement, r, r, "[%s] Fail to get element.", GetErrorMessage(r));
5285 TextElementType objectType = pTextElement->GetType();
5286 SysTryReturn(NID_GRP, objectType == TEXT_ELEMENT_TYPE_CUTLINK || objectType == TEXT_ELEMENT_TYPE_TEXT
5287 , E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to draw to symbol object.");
5289 pSimpleText = dynamic_cast < TextSimple* >(pTextElement);
5290 if (pSimpleText != null)
5292 SetAbbrevObjectFontInfo(pSimpleText);
5295 __pAbbrevTextElement->Draw(canvasImpl, adjustedRect, 0, 1, (TextObjectAlignment)(TEXT_OBJECT_ALIGNMENT_TOP | TEXT_OBJECT_ALIGNMENT_LEFT), TEXT_OBJECT_ACTION_TYPE_NONE);
5297 adjustedRect.x += __headEllipsisWidth;
5298 DrawPartial(canvasImpl, adjustedRect, __length - __headEllipsisTextLength, __headEllipsisTextLength);
5304 TextComposite::DrawPartial(_CanvasImpl& canvasImpl, FloatRectangle& displayRect, int startTextIndex, int textLength)
5306 SysTryReturn(NID_GRP, 0 <= startTextIndex && startTextIndex < __length, E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
5307 SysTryReturn(NID_GRP, textLength <= __length, E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
5309 result r = E_SUCCESS;
5310 IEnumerator* pEnum = null;
5311 TextElement* pTextElement = null;
5313 FloatDimension textSize;
5314 int currentLength = 0;
5315 int textIndexFromElementOffset = 0;
5317 int elementTextOffset = 0;
5318 FloatRectangle adjustedRect = displayRect;
5319 int blockStartTextIndex = 0;
5320 int blockEndTextIndex = 0;
5321 bool isAlternateLookEnabled = false;
5322 int textIndex = startTextIndex;
5324 pTextElement = GetElementAtTextIndex(textIndex, elementTextOffset, nodeIndex, currentLength,
5325 textIndexFromElementOffset);
5326 SysTryReturn(NID_GRP, pTextElement, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Fail to get text element.");
5328 currentLength = Math::Min(textLength, currentLength);
5330 pEnum = __pTextElementList->GetEnumeratorN();
5331 while (textLength > 0)
5333 textLength -= currentLength;
5335 pTextElement->GetRegion(textIndexFromElementOffset, currentLength, textSize.width, textSize.height);
5337 if (pTextElement->IsBackGroundDrawingModeEnable())
5339 r = canvasImpl.FillRectangle(pTextElement->GetBackgroundColor(), FloatRectangle(adjustedRect.x, displayRect.y, textSize.width, displayRect.height));
5340 SysTryReturn(NID_GRP, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
5343 isAlternateLookEnabled = (pTextElement->GetValue(SET_ALTERNATE_LOOK) > 0) ? true : false;
5344 if ((__displayBlock) && (isAlternateLookEnabled == false))
5346 FloatDimension tempTextSize;
5347 float adjustedX = 0;
5349 blockStartTextIndex = Math::Max(__workStart, textIndex);
5350 blockEndTextIndex = Math::Min(__workStart + __workLength, textIndex + currentLength);
5351 if (blockStartTextIndex < blockEndTextIndex)
5353 blockStartTextIndex = textIndexFromElementOffset + (blockStartTextIndex - textIndex);
5354 blockEndTextIndex = textIndexFromElementOffset + (blockEndTextIndex - textIndex);
5355 adjustedX = adjustedRect.x;
5357 if (textIndexFromElementOffset < blockStartTextIndex)
5359 pTextElement->GetRegion(textIndexFromElementOffset, blockStartTextIndex - textIndexFromElementOffset,
5360 tempTextSize.width, tempTextSize.height);
5361 adjustedX += tempTextSize.width;
5364 FloatRectangle blockRect = adjustedRect;
5365 blockRect.x = adjustedX;
5369 pTextElement->Draw(canvasImpl, adjustedRect, textIndexFromElementOffset, currentLength, (TextObjectAlignment)(TEXT_OBJECT_ALIGNMENT_TOP | TEXT_OBJECT_ALIGNMENT_LEFT),
5370 TEXT_OBJECT_ACTION_TYPE_NONE);
5372 adjustedRect.x += textSize.width;
5373 adjustedRect.width -= textSize.width;
5375 if (!textLength || adjustedRect.width <= 0)
5380 textIndex += currentLength;
5382 if (pEnum->MoveNext() != E_SUCCESS)
5387 pTextElement = static_cast < TextElement* >(pEnum->GetCurrent());
5389 textIndexFromElementOffset = pTextElement->GetValue(SET_TEXT_OFFSET);
5390 currentLength = Math::Min(textLength, pTextElement->GetTextLength());
5392 if (currentLength == 0)
5403 TextComposite::SetPartialComposingModeEnabled(bool enable)
5405 __partialComposingModeEnabled = enable;
5409 TextComposite::IsPartialComposingModeEnabled(void) const
5411 return __partialComposingModeEnabled;
5415 TextComposite::InitPartialComposeMode(void)
5417 __lineIndexCompositeDone = 0;
5418 __totalComposedHeight = 0;
5419 __composePartialLimitHeight = 0;
5421 SysTryReturn(NID_GRP, __pCurrentTextColumn, false, E_INVALID_STATE, "[E_INVALID_STATE] This instance is not constructed yet.");
5423 __pCurrentTextColumn->SetFirstDisplayLineIndex(0);
5424 __pCurrentTextColumn->SetFirstDisplayPositionY(0);
5425 __pCurrentTextColumn->PrepareCompose();
5431 TextComposite::IsComposeDone() const
5433 SysTryReturn(NID_GRP, __pCurrentTextColumn, false, E_INVALID_STATE, "[E_INVALID_STATE] This instance is not constructed yet.");
5435 return __pCurrentTextColumn->IsComposeDone();
5439 TextComposite::GetCutLinkObjectInfo(int cutLinkIndex, int& textStartIndex, int& textLength) const
5441 return __pCutLinkListInfo->GetCutLinkObjectInfo(cutLinkIndex, textStartIndex, textLength);
5445 TextComposite::GetTotalComposedHeight(void) const
5447 return _CoordinateSystemUtils::ConvertToInteger(__totalComposedHeight);
5451 TextComposite::GetTotalComposedHeightF(void) const
5453 return __totalComposedHeight;
5457 TextComposite::GetAnalysedTotalHeight(void) const
5459 return _CoordinateSystemUtils::ConvertToInteger(GetAnalysedTotalHeightF());
5463 TextComposite::GetAnalysedTotalHeightF(void) const
5465 TextLine* pTextLine = null;
5466 pTextLine = __pCurrentTextColumn->GetTextLine(__lineIndexCompositeDone - 1);
5473 int lineOffset = pTextLine->GetTextOffset();
5474 int lineLength = pTextLine->GetTextLength();
5476 int composedLength = lineOffset + lineLength;
5477 if (composedLength == 0)
5482 return (float)(GetTotalComposedHeightF() * __length / composedLength);
5486 TextComposite::SetComposePartialLimitHeight(int limitHeight)
5488 __composePartialLimitHeight = _CoordinateSystemUtils::ConvertToFloat(limitHeight);
5492 TextComposite::SetComposePartialLimitHeight(float limitHeight)
5494 __composePartialLimitHeight = limitHeight;
5498 TextComposite::GetComposePartialLimitHeight(void) const
5500 return _CoordinateSystemUtils::ConvertToInteger(__composePartialLimitHeight);
5504 TextComposite::GetComposePartialLimitHeightF(void) const
5506 return __composePartialLimitHeight;
5510 TextComposite::GetObjectType(int textIndex) const
5512 TextElement* pTextElement = null;
5514 int currentLength = 0;
5515 int elementIndex = 0;
5516 int textIndexFromElementOffset = 0;
5517 int elementTextOffset = 0;
5519 pTextElement = GetElementAtTextIndex(textIndex, elementTextOffset, elementIndex, currentLength, textIndexFromElementOffset);
5520 if (pTextElement == null)
5522 return TEXT_ELEMENT_TYPE_NONE;
5526 return pTextElement->GetType();
5531 TextComposite::GetElementIndexOf(TextElement& textElement) const
5535 result r = E_SUCCESS;
5537 r = __pTextElementList->IndexOf(textElement, index);
5538 SysTryReturn(NID_GRP, r == E_SUCCESS, false, r, "[%s] Fail to add element.", GetErrorMessage(r));
5544 TextComposite::GetElementAtElementIndex(int nodeIndex) const
5546 result r = E_SUCCESS;
5548 TextElement* pTextElement = null;
5549 pTextElement = static_cast < TextElement* >(__pTextElementList->GetAt(nodeIndex));
5550 SysTryReturn(NID_GRP, r == E_SUCCESS, null, r, "[%s] Fail to add element.", GetErrorMessage(r));
5552 return pTextElement;
5556 TextComposite::GetTextLength(void) const
5562 TextComposite::GetElementCount(void) const
5564 return __pTextElementList->GetCount();
5568 TextComposite::SetBlock(bool enable)
5570 __displayBlock = enable;
5574 TextComposite::SetImageAlign(TextObjectAlignment align)
5576 return SetValueToAllTextElements(SET_IMAGE_ALIGN, (unsigned int)align);
5580 TextComposite::GetWrap(void) const
5586 TextComposite::SetLineSpace(int gap)
5588 SetLineSpace(_CoordinateSystemUtils::ConvertToFloat(gap));
5592 TextComposite::SetLineSpace(float gap)
5594 __lineSpacing = gap;
5598 TextComposite::GetLineSpace(void) const
5600 return _CoordinateSystemUtils::ConvertToInteger(__lineSpacing);
5604 TextComposite::GetLineSpaceF(void) const
5606 return __lineSpacing;
5610 TextComposite::SetElementVerticalAlignment(TextObjectAlignment alignment)
5612 __elementVertialAlignment = alignment;
5616 TextComposite::GetElementVerticalAlignment(void) const
5618 return __elementVertialAlignment;
5622 TextComposite::SetCursorIndex(int cursorIndex)
5624 __cursorIndex = cursorIndex;
5628 TextComposite::GetCursorIndex(void) const
5630 return __cursorIndex;
5634 TextComposite::SetTextObjectEllipsisType(TextObjectEllipsisType type)
5636 __TextObjectEllipsisType = type;
5639 TextObjectEllipsisType
5640 TextComposite::GetTextObjectEllipsisType(void) const
5642 return __TextObjectEllipsisType;
5646 TextComposite::SetTextAbbreviationEnabled(bool enable)
5648 __drawAbbrevText = enable;
5652 TextComposite::IsTextAbbreviationEnabled(void) const
5654 if (__drawAbbrevText && __drawTextEllipsis)
5663 TextComposite::GetBlock(void) const
5665 return __displayBlock;
5669 TextComposite::GetWorkStart(void) const
5675 TextComposite::GetWorkLength(void) const
5677 return __workLength;
5681 TextComposite::GetImageAlign(int textIndex) const
5683 result r = E_SUCCESS;
5684 unsigned int value = 0;
5686 r = GetValue(textIndex, SET_IMAGE_ALIGN, &value);
5687 SysTryReturn(NID_GRP, r == E_SUCCESS, TEXT_OBJECT_ALIGNMENT_INVALID, r, "[%s] Propagating.", GetErrorMessage(r));
5689 return (TextObjectAlignment)value;
5693 TextComposite::IsChanged(void) const
5699 TextComposite::SetBlockColor(const Color& color)
5701 __defaultBlockColor = color;
5705 TextComposite::GetBlockColor(void) const
5707 return __defaultBlockColor;
5711 TextComposite::GetDisplayableText(FloatRectangle displayRect, TextObjectActionType action)
5713 int firstDisplayLineIndex = __pCurrentTextColumn->GetFirstDisplayLineIndex();
5714 TextLine* pTextLine = __pCurrentTextColumn->GetTextLine(firstDisplayLineIndex);
5715 SysTryReturn(NID_GRP, pTextLine, L"", E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid. (firstDisplayLineIndex = %d)", firstDisplayLineIndex);
5717 int firstDisplayTextIndex = pTextLine->GetTextOffset();
5718 int displayableTextLength = 0;
5719 int displayableLineCount = __pCurrentTextColumn->CalculateDisplayableLineCount(displayRect, action);
5720 int lastDisplayLineIndex = firstDisplayLineIndex + displayableLineCount - 1;
5722 for (int i = firstDisplayLineIndex; i < lastDisplayLineIndex; i++)
5724 pTextLine = __pCurrentTextColumn->GetTextLine(i);
5725 SysTryReturn(NID_GRP, pTextLine, L"", E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid. (line index = %d)", i);
5727 displayableTextLength += pTextLine->GetTextLength();
5730 pTextLine = __pCurrentTextColumn->GetTextLine(lastDisplayLineIndex);
5731 SysTryReturn(NID_GRP, pTextLine, L"", E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid. (lastDisplayLineIndex = %d)", lastDisplayLineIndex);
5733 int lineOffset = pTextLine->GetTextOffset();
5734 int lineLength = pTextLine->GetTextLength();
5735 int elementTextOffset = 0;
5736 int elementIndex = 0;
5737 int currentLength = 0;
5738 int textIndexFromElementOffset = 0;
5739 int remainingLength = lineLength;
5741 if (lineOffset + remainingLength < __length) // abbreviation mode
5743 TextElement* pTextElement = GetElementAtTextIndex(lineOffset, elementTextOffset, elementIndex, currentLength, textIndexFromElementOffset);
5744 SysTryReturn(NID_GRP, pTextElement, String(L""), E_SYSTEM, "[E_SYSTEM] Fail to get element.");
5746 if (__ignoreFrontBlank && __frontSpaceHideMode == TEXT_OBJECT_SPACE_HIDE_TYPE_ONE)
5748 const TextSimple* pSimpleText = dynamic_cast <const TextSimple*>(pTextElement);
5749 if (pSimpleText != null)
5751 int index = lineOffset - elementTextOffset;
5752 const wchar_t* pText = pSimpleText->GetText();
5753 SysTryReturn(NID_GRP, pText, String(L""), E_SYSTEM, "[E_SYSTEM] Fail to get text.");
5755 SysTryReturn(NID_GRP, index >= 0 && index < pSimpleText->GetTextLength()
5756 , String(L""), E_OUT_OF_RANGE, "[E_OUT_OF_RANGE] text index(%d) must greater than 0 and must be less than total string length(%d)"
5757 ,index, pSimpleText->GetTextLength());
5759 if (pText[index] == (wchar_t)L' ')
5767 if (action == TEXT_OBJECT_ACTION_TYPE_ABBREV)
5769 FloatDimension textSize;
5770 FloatDimension abbrevTextSize;
5771 FloatRectangle lineBounds = pTextLine->GetBoundsF();
5773 GetRegion(lineOffset, remainingLength, textSize.width, textSize.height);
5775 TextElement* pLastTextElement = GetElementAtTextIndex(lineOffset + lineLength - 1);
5776 SysTryReturn(NID_GRP, pLastTextElement, -1, E_SYSTEM, "[E_SYSTEM] Fail to get element.");
5778 if (pLastTextElement->GetType() == TEXT_ELEMENT_TYPE_TEXT)
5780 TextSimple* pSimpleText = dynamic_cast < TextSimple* >(pLastTextElement);
5781 SysTryReturn(NID_GRP, pSimpleText, String(L""), E_SYSTEM, "[E_SYSTEM] Fail to cast text element.");
5783 SetAbbrevObjectFontInfo(pSimpleText);
5784 __pAbbrevTextElement->GetRegion(0, 1, abbrevTextSize.width, abbrevTextSize.height);
5787 ForwardAnalyze(lineOffset, __length - lineOffset, lineBounds.width - abbrevTextSize.width
5788 , TEXT_OBJECT_WRAP_TYPE_CHARACTER, lineLength, textSize.width, textSize.height);
5792 displayableTextLength += lineLength;
5794 wchar_t* pText = GetTextN(firstDisplayTextIndex, displayableTextLength);
5795 SysTryReturn(NID_GRP, pText, String(L""), E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Insufficient memory.");
5804 TextComposite::SetWorkWidth(Font* pFont, wchar_t* pText, int workStart, int textLength)
5806 result r = E_SUCCESS;
5810 const wchar_t* pSrc = &pText[workStart];
5812 workLength = Math::Abs(textLength);
5814 r = TextUtility::GetTextExtent(pFont, pSrc, workLength, false, width, height);
5815 SysTryReturn(NID_GRP, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
5819 __workWidth = -width;
5823 __workWidth = width;
5830 TextComposite::GetWorkWidth(void)
5836 TextComposite::SetTextSweepInfo(TextObjectSweepInfo* pTextSweepInfo)
5838 __pSweepInfo = pTextSweepInfo;
5842 TextComposite::GetTextSweepInfo(TextObjectSweepInfo& textSweepInfo)
5844 textSweepInfo.isValid = __pSweepInfo->isValid;
5845 textSweepInfo.sweepType = __pSweepInfo->sweepType;
5846 textSweepInfo.sweepEventType = __pSweepInfo->sweepEventType;
5847 textSweepInfo.anchorTextIndex = __pSweepInfo->anchorTextIndex;
5848 textSweepInfo.anchorLineIndex = __pSweepInfo->anchorLineIndex;
5849 textSweepInfo.sweepRegionStartLineIndex = __pSweepInfo->sweepRegionStartLineIndex;
5850 textSweepInfo.sweepRegionLineCount = __pSweepInfo->sweepRegionLineCount;
5851 textSweepInfo.insertedLineCount = __pSweepInfo->insertedLineCount;
5852 textSweepInfo.deletedLineCount = __pSweepInfo->deletedLineCount;
5853 textSweepInfo.widthChanged = __pSweepInfo->widthChanged;
5857 TextComposite::UpdateTextSweepInfo(TextObjectSweepInfo* pTextSweepInfo)
5859 __pSweepInfo->isValid = pTextSweepInfo->isValid;
5860 __pSweepInfo->sweepType = pTextSweepInfo->sweepType;
5861 __pSweepInfo->sweepEventType = pTextSweepInfo->sweepEventType;
5862 __pSweepInfo->anchorTextIndex = pTextSweepInfo->anchorTextIndex;
5863 __pSweepInfo->anchorLineIndex = pTextSweepInfo->anchorLineIndex;
5864 __pSweepInfo->sweepRegionStartLineIndex = pTextSweepInfo->sweepRegionStartLineIndex;
5865 __pSweepInfo->sweepRegionLineCount = pTextSweepInfo->sweepRegionLineCount;
5866 __pSweepInfo->insertedLineCount = pTextSweepInfo->insertedLineCount;
5867 __pSweepInfo->deletedLineCount = pTextSweepInfo->deletedLineCount;
5868 __pSweepInfo->widthChanged = pTextSweepInfo->widthChanged;
5872 TextComposite::IsRTL(int startTextIndex, int textLength) const
5874 SysTryReturn(NID_GRP, 0 <= startTextIndex && textLength <= __length, false, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
5876 result r = E_SUCCESS;
5877 IEnumerator* pEnum = null;
5879 int currentLength = 0;
5880 int elementTextOffset = 0;
5881 int elementIndex = 0;
5882 int textIndexFromElementOffset = 0;
5889 TextElement* pTextElement = GetElementAtTextIndex(startTextIndex, elementTextOffset, elementIndex, currentLength, textIndexFromElementOffset);
5890 SysTryCatch(NID_GRP, pTextElement, , E_SYSTEM, "[E_SYSTEM] Fail to get element.");
5892 textIndexFromElementOffset = startTextIndex - elementTextOffset;
5894 pEnum = __pTextElementList->GetEnumeratorN();
5895 for (int i = 0; i < elementIndex; i++)
5897 r = pEnum->MoveNext();
5900 while (pEnum->MoveNext() == E_SUCCESS)
5902 pTextElement = static_cast < TextElement* >(pEnum->GetCurrent());
5905 currentLength = Math::Min(pTextElement->GetTextLength() - textIndexFromElementOffset, textLength);
5907 TextElementType objectType = pTextElement->GetType();
5909 if (objectType == TEXT_ELEMENT_TYPE_TEXT || objectType == TEXT_ELEMENT_TYPE_CUTLINK)
5911 TextSimple* pSimpleText = dynamic_cast < TextSimple* >(pTextElement);
5914 const wchar_t* pSrcText = pSimpleText->GetText();
5915 SysTryCatch(NID_GRP, pSrcText, , E_SYSTEM, "[E_SYSTEM] Fail to get text.");
5917 const wchar_t* pPointer = &pSrcText[textIndexFromElementOffset];
5918 SysTryCatch(NID_GRP, pPointer, , E_SYSTEM, "[E_SYSTEM] Fail to get text.");
5920 for (int i = 0; i< currentLength; i++)
5922 if(*pPointer == null)
5926 FriBidiChar bidiText[1] = { *pPointer };
5927 FriBidiCharType type[1] = { 0 };
5928 fribidi_get_bidi_types(bidiText, 1, type);
5930 if ((type[0] & FRIBIDI_MASK_RTL) != 0)
5935 else if (((type[0] & FRIBIDI_MASK_STRONG) != 0) && ((type[0] & FRIBIDI_MASK_LETTER) != 0))
5946 textLength -= currentLength;
5950 if (textLength <= 0)
5955 textIndexFromElementOffset = 0;
5968 TextComposite::IsRTLCharacter(int textIndex) const
5970 SysTryReturn(NID_GRP, 0 <= textIndex, false, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
5973 for (int i = textIndex; i >= 0; i--)
5975 wchar_t ch = GetCharacter(i);
5976 if (TextUtility::IsStrongCharacter(ch))
5978 if (TextUtility::IsRTLCharacter(GetCharacter(i)))
5994 TextComposite::SearchLTRTextIndex(int startTextIndex,int fromTextIndex) const
5996 SysTryReturn(NID_GRP, 0 <= fromTextIndex, -1, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
5999 int LTRTextIndex = -1;
6002 for (int i = fromTextIndex; i >= startTextIndex; i--)
6004 ch = GetCharacter(i);
6006 if (TextUtility::IsLTRCharacter(ch))
6013 LTRTextIndex = i + 1;
6017 ch = GetCharacter(LTRTextIndex);
6018 if (TextUtility::IsStrongCharacter(ch))
6030 LTRTextIndex = (startTextIndex <= LTRTextIndex && LTRTextIndex <= fromTextIndex) ? LTRTextIndex : startTextIndex;
6032 return LTRTextIndex;
6035 }}} // Tizen::Graphics::_Text