2 // Open Service Platform
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
5 // Licensed under the Flora License, Version 1.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://floralicense.org/license/
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_EnrichedTextImpl.cpp
20 * @brief This is the cpp file for _EnrichedTextImpl class.
26 #include "FGrp_EnrichedTextImpl.h"
27 #include "FGrp_TextElementImpl.h"
28 #include "FGrp_TextTextElement.h"
29 #include "FGrp_TextTextObject.h"
30 #include "util/FGrp_Util.h"
33 using namespace Tizen::Base;
34 using namespace Tizen::Base::Utility;
35 using namespace Tizen::Graphics::_Text;
37 namespace Tizen { namespace Graphics
40 _EnrichedTextImpl::_EnrichedTextImpl(void)
46 __verticalAlignment = TEXT_ALIGNMENT_VERTICAL_MIN;
47 __horizontalAlignment = TEXT_ALIGNMENT_HORIZONTAL_MIN;
48 __elementVerticalAlignment = TEXT_ALIGNMENT_VERTICAL_MIN;
49 __pLinkedListTextElementList = null;
50 __pTextElement = null;
51 __isCopiedEnrichedText = false;
52 __pLinkedListTextElementList = null;
53 __pTextElement = null;
56 _EnrichedTextImpl::~_EnrichedTextImpl(void)
58 if (GetTextElementCount() > 0)
60 RemoveAllTextElements(false);
65 delete __pTextElement;
66 __pTextElement = null;
69 if (__pLinkedListTextElementList)
71 delete __pLinkedListTextElementList;
72 __pLinkedListTextElementList = null;
77 _EnrichedTextImpl::Construct(const Tizen::Graphics::Dimension& dim)
79 SysTryReturn(NID_GRP, (dim.width > 0) && (dim.height > 0), E_INVALID_ARG, E_INVALID_ARG
80 , "[E_INVALID_ARG] The argument is invalid. (width = %d height = %d)", dim.width, dim.height);
85 __height = dim.height;
88 __pLinkedListTextElementList = new (std::nothrow) Tizen::Base::Collection::LinkedList;
90 , __pLinkedListTextElementList
91 , r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[%s] Fails to create a element list.", GetErrorMessage(r));
93 __pTextElement = new (std::nothrow) TextElement();
96 , r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[%s] Fails to create a element.", GetErrorMessage(r));
98 __pTextObject.reset(new (std::nothrow)TextObject);
101 , r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[%s] Fails to create a TextObject.", GetErrorMessage(r));
103 __pTextObject->Construct();
104 __pTextObject->SetBounds(Rectangle(0, 0, __width, __height));
105 __pTextObject->SetCutLinkViewMode(true);
106 __pTextObject->SetAlignment(TEXT_OBJECT_ALIGNMENT_LEFT);
107 __pTextObject->HideFrontSpace(TEXT_OBJECT_SPACE_HIDE_TYPE_ONE);
109 // this is only to manage user's bitmap
110 r = __elements.Construct();
115 if (__pLinkedListTextElementList)
117 delete __pLinkedListTextElementList;
118 __pLinkedListTextElementList = null;
123 delete __pTextElement;
124 __pTextElement = null;
131 _EnrichedTextImpl::InsertAt(int elementIndex, Tizen::Graphics::TextElement& element)
133 SysTryReturn(NID_GRP, __pTextObject != null, E_OPERATION_FAILED, E_OPERATION_FAILED
134 , "[E_OPERATION_FAILED] This instance is not constructed yet.");
135 SysTryReturn(NID_GRP, elementIndex >= 0 && elementIndex <= GetTextElementCount()
136 , E_INVALID_ARG, E_INVALID_ARG
137 , "[E_INVALID_ARG] The argument is invalid.");
139 result r = E_SUCCESS;
142 _TextElementImpl* pTextElementImpl = _TextElementImpl::GetInstance(element);
143 if (pTextElementImpl == null)
145 return E_INVALID_ARG;
148 if (pTextElementImpl->GetRegisteringEnrichedText() != null)
150 return E_INVALID_ARG;
152 pTextElementImpl->SetRegisteringEnrichedText(this);
154 count = __pTextObject->GetElementCount();
155 if (elementIndex > count)
157 return E_INVALID_ARG;
160 for (int i = 0; i < elementIndex; i++)
162 _Text::TextElement* pTextComponent = __pTextObject->GetElementAtElementIndex(i);
163 if (pTextComponent != null)
165 textLength = textLength + pTextComponent->GetTextLength();
169 __pTextObject->InsertElementAt(textLength, *(pTextElementImpl->GetComponent()));
170 __pTextObject->Compose();
172 r = __pLinkedListTextElementList->InsertAt(element, elementIndex);
174 if (__isCopiedEnrichedText == false)
178 __elements.InsertAt(*__pTextElement, elementIndex);
186 _EnrichedTextImpl::RemoveAt(int elementIndex, bool deallocate)
188 SysTryReturn(NID_GRP, __pTextObject != null, E_OPERATION_FAILED, E_OPERATION_FAILED
189 , "[E_OPERATION_FAILED] This instance is not constructed yet.");
190 SysTryReturn(NID_GRP, elementIndex >= 0 && elementIndex <= GetTextElementCount()
191 , E_INVALID_ARG, E_INVALID_ARG
192 , "[E_INVALID_ARG] The argument is invalid.");
194 if (__pTextObject.use_count() > 1)
199 result r = E_SUCCESS;
200 int count = GetTextElementCount();
201 TextElement* pTextElement = null;
208 pTextElement = dynamic_cast < TextElement* >(__pLinkedListTextElementList->GetAt(elementIndex));
209 if (pTextElement == null) //Bitmap??
211 __pTextObject->RemoveElementAt(elementIndex, deallocate);
212 __pLinkedListTextElementList->RemoveAt(elementIndex, true);
214 if (__isCopiedEnrichedText == false)
216 __elements.RemoveAt(elementIndex, deallocate);
221 _TextElementImpl* pTextElementImpl = _TextElementImpl::GetInstance(*pTextElement);
222 pTextElementImpl->SetRegisteringEnrichedText(null);
223 _Text::TextElement* pTextComponent = pTextElementImpl->GetComponent();
225 __pTextObject->RemoveElement(*pTextComponent, false);
226 __pLinkedListTextElementList->RemoveAt(elementIndex, deallocate);
228 if (__isCopiedEnrichedText == false)
230 __elements.RemoveAt(elementIndex, false);
238 _EnrichedTextImpl::Remove(Tizen::Graphics::TextElement& element, bool deallocate)
240 SysTryReturn(NID_GRP, __pTextObject != null, E_OPERATION_FAILED, E_OPERATION_FAILED
241 , "[E_OPERATION_FAILED] This instance is not constructed yet.");
243 if (__pTextObject.use_count() > 1)
248 int textElementIndex = 0;
249 result r = E_SUCCESS;
250 TextElement* pTextElement = null;
252 r = __pLinkedListTextElementList->IndexOf(element, textElementIndex);
255 return E_INVALID_ARG;
258 pTextElement = dynamic_cast < TextElement* >(__pLinkedListTextElementList->GetAt(textElementIndex));
261 _TextElementImpl* pTextElementImpl = _TextElementImpl::GetInstance(*pTextElement);
262 pTextElementImpl->SetRegisteringEnrichedText(null);
263 _Text::TextElement* pTextComponent = pTextElementImpl->GetComponent();
265 if (__pTextObject->RemoveElement(*pTextComponent, false) != E_SUCCESS)
267 return E_INVALID_ARG;
270 __pLinkedListTextElementList->RemoveAt(textElementIndex, deallocate);
277 _EnrichedTextImpl::Add(Tizen::Graphics::TextElement& element)
279 SysTryReturn(NID_GRP, __pTextObject != null, E_OPERATION_FAILED, E_OPERATION_FAILED, "[E_OPERATION_FAILED] This instance is not constructed yet.");
281 result r = E_SUCCESS;
283 _TextElementImpl* pTextElementImpl = _TextElementImpl::GetInstance(element);
286 , E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
288 _Text::TextElement* pTextComponent = pTextElementImpl->GetComponent();
291 , E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The argument is invalid.");
293 if (pTextElementImpl->GetRegisteringEnrichedText() != null)
295 return E_INVALID_ARG;
297 pTextElementImpl->SetRegisteringEnrichedText(this);
299 __pTextObject->AppendElement(*pTextComponent);
300 __pTextObject->SetRange(0, __pTextObject->GetTextLength());
301 __pTextObject->Compose();
303 __pLinkedListTextElementList->Add(element);
305 if (__isCopiedEnrichedText == false)
309 __elements.Add(*__pTextElement);
317 _EnrichedTextImpl::RemoveAllTextElements(bool deallocate)
319 SysTryReturn(NID_GRP, __pTextObject != null, E_OPERATION_FAILED, E_OPERATION_FAILED, "[E_OPERATION_FAILED] This instance is not constructed yet.");
321 result r = E_SUCCESS;
322 int elementCount = __pLinkedListTextElementList->GetCount();
324 for (int i = 0; i < elementCount; i++)
326 r = RemoveAt(0, deallocate);
339 _EnrichedTextImpl::RemoveAll(bool deallocate)
341 SysTryReturn(NID_GRP, __pTextObject != null, E_OPERATION_FAILED, E_OPERATION_FAILED, "[E_OPERATION_FAILED] This instance is not constructed yet.");
343 result r = E_SUCCESS;
345 int elementCount = __pLinkedListTextElementList->GetCount();
347 for (int i = 0; i < elementCount; i++)
349 r = RemoveAt(0, deallocate);
362 _EnrichedTextImpl::GetTextElementAt(int elementIndex) const
364 SysTryReturn(NID_GRP, __pTextObject != null, null, E_OPERATION_FAILED
365 , "[E_OPERATION_FAILED] This instance is not constructed yet.");
366 SysTryReturn(NID_GRP, elementIndex >= 0 && elementIndex < GetTextElementCount(), null, E_INVALID_ARG
367 , "[E_INVALID_ARG] The argument is invalid. elementIndex = %d total element count = %d", elementIndex, GetTextElementCount());
369 TextElement* pElement = null;
373 pElement = dynamic_cast < TextElement* >(__pLinkedListTextElementList->GetAt(elementIndex));
375 SetLastResult(E_SUCCESS);
380 _EnrichedTextImpl::GetTextElementCount(void) const
382 SysTryReturn(NID_GRP, __pTextObject != null, 0, E_OPERATION_FAILED
383 , "[E_OPERATION_FAILED] This instance is not constructed yet.");
385 return __pLinkedListTextElementList->GetCount();
389 _EnrichedTextImpl::SetSize(const Tizen::Graphics::Dimension& size)
391 SysTryReturn(NID_GRP, __pTextObject != null, E_OPERATION_FAILED, E_OPERATION_FAILED
392 , "[E_OPERATION_FAILED] This instance is not constructed yet.");
393 SysTryReturn(NID_GRP, (size.width > 0) && (size.height > 0), E_OUT_OF_RANGE, E_OUT_OF_RANGE
394 , "[E_OUT_OF_RANGE] The given rectangle(width:%d,height:%d) is out of range.\n", size.width, size.height);
396 Rectangle rect(0, 0, size.width, size.height);
398 __pTextObject->SetBounds(rect);
399 __width = rect.width;
400 __height = rect.height;
406 _EnrichedTextImpl::SetSize(int width, int height)
408 SysTryReturn(NID_GRP, __pTextObject != null, E_OPERATION_FAILED, E_OPERATION_FAILED
409 , "[E_OPERATION_FAILED] This instance is not constructed yet.");
410 SysTryReturn(NID_GRP, (width > 0) && (height > 0), E_OUT_OF_RANGE, E_OUT_OF_RANGE
411 , "[E_OUT_OF_RANGE] The given rectangle(width:%d,height:%d) is out of range.\n", width, height);
413 Dimension dim(width, height);
415 result r = SetSize(dim);
420 Tizen::Graphics::Dimension
421 _EnrichedTextImpl::GetSize(void) const
423 SysTryReturn(NID_GRP, __pTextObject != null, Dimension(0, 0), E_OPERATION_FAILED
424 , "[E_OPERATION_FAILED] This instance is not constructed yet.");
429 dim.height = __height;
435 _EnrichedTextImpl::GetSize(int& width, int& height) const
437 SysTryReturn(NID_GRP, __pTextObject != null, , E_OPERATION_FAILED
438 , "[E_OPERATION_FAILED] This instance is not constructed yet.");
445 _EnrichedTextImpl::GetWidth(void) const
447 SysTryReturn(NID_GRP, __pTextObject != null, 0, E_OPERATION_FAILED
448 , "[E_OPERATION_FAILED] This instance is not constructed yet.");
454 _EnrichedTextImpl::GetHeight(void) const
456 SysTryReturn(NID_GRP, __pTextObject != null, 0, E_OPERATION_FAILED
457 , "[E_OPERATION_FAILED] This instance is not constructed yet.");
463 _EnrichedTextImpl::SetVerticalAlignment(TextVerticalAlignment alignment)
465 SysTryReturn(NID_GRP, __pTextObject != null, E_OPERATION_FAILED, E_OPERATION_FAILED
466 , "[E_OPERATION_FAILED] This instance is not constructed yet.");
468 TextObjectAlignment verticalAlign = ConvertVAlignment(alignment);
469 if (verticalAlign == TEXT_OBJECT_ALIGNMENT_INVALID)
471 return E_INVALID_ARG;
474 TextObjectAlignment align = static_cast < TextObjectAlignment >((static_cast < TextObjectAlignment >(__pTextObject->GetAlignment())
475 & TEXT_HORIZONTAL_ALIGNMENT) | (verticalAlign & TEXT_VERTICAL_ALIGNMENT));
477 __pTextObject->SetAlignment(align);
478 __verticalAlignment = alignment;
484 _EnrichedTextImpl::SetHorizontalAlignment(TextHorizontalAlignment alignment)
486 SysTryReturn(NID_GRP, __pTextObject != null, E_OPERATION_FAILED, E_OPERATION_FAILED
487 , "[E_OPERATION_FAILED] This instance is not constructed yet.");
489 TextObjectAlignment horizontalAalign = ConvertHAlignment(alignment);
490 if (horizontalAalign == TEXT_OBJECT_ALIGNMENT_INVALID)
492 return E_INVALID_ARG;
495 TextObjectAlignment align = static_cast < TextObjectAlignment >((static_cast < TextObjectAlignment >(__pTextObject->GetAlignment())
496 & TEXT_VERTICAL_ALIGNMENT) | (horizontalAalign & TEXT_HORIZONTAL_ALIGNMENT));
498 __pTextObject->SetAlignment(align);
499 __horizontalAlignment = alignment;
504 TextVerticalAlignment
505 _EnrichedTextImpl::GetVerticalAlignment(void) const
507 SysTryReturn(NID_GRP, __pTextObject != null, TEXT_ALIGNMENT_VERTICAL_MIN, E_OPERATION_FAILED
508 , "[E_OPERATION_FAILED] This instance is not constructed yet.");
510 return __verticalAlignment;
513 TextHorizontalAlignment
514 _EnrichedTextImpl::GetHorizontalAlignment(void) const
516 SysTryReturn(NID_GRP, __pTextObject != null, TEXT_ALIGNMENT_HORIZONTAL_MIN, E_OPERATION_FAILED
517 , "[E_OPERATION_FAILED] This instance is not constructed yet.");
519 return __horizontalAlignment;
523 _EnrichedTextImpl::SetTextWrapStyle(TextWrap wrap)
525 SysTryReturn(NID_GRP, __pTextObject != null, E_OPERATION_FAILED, E_OPERATION_FAILED
526 , "[E_OPERATION_FAILED] This instance is not constructed yet.");
528 SysTryReturn(NID_GRP, (TEXT_WRAP_MIN < wrap) && (wrap < TEXT_WRAP_MAX), E_INVALID_ARG, E_INVALID_ARG
529 , "[E_OPERATION_FAILED] This instance is not constructed yet.");
531 _TextWrapType textWrap = ConvertWrapType(wrap);
533 if (__pTextObject->SetWrap(static_cast < TextObjectWrapType >(textWrap)) != E_SUCCESS)
535 return E_INVALID_ARG;
542 _EnrichedTextImpl::GetTextWrapStyle(void) const
544 SysTryReturn(NID_GRP, __pTextObject != null, TEXT_WRAP_MIN, E_OPERATION_FAILED
545 , "[E_OPERATION_FAILED] This instance is not constructed yet.");
547 _TextWrapType textWrapType = static_cast < _TextWrapType >(__pTextObject->GetWrap());
548 TextWrap textWrap = ConvertWrap(textWrapType);
554 _EnrichedTextImpl::SetTextAbbreviationEnabled(bool enable)
556 SysTryReturn(NID_GRP, __pTextObject != null, E_OPERATION_FAILED, E_OPERATION_FAILED
557 , "[E_OPERATION_FAILED] This instance is not constructed yet.");
559 TextObjectActionType action = TEXT_OBJECT_ACTION_TYPE_NONE;
563 action = TEXT_OBJECT_ACTION_TYPE_ABBREV;
566 __pTextObject->SetAction(action);
572 _EnrichedTextImpl::IsTextAbbreviationEnabled(void) const
574 SysTryReturn(NID_GRP, __pTextObject != null, false, E_OPERATION_FAILED
575 , "[E_OPERATION_FAILED] This instance is not constructed yet.");
578 TextObjectActionType action = __pTextObject->GetAction();
580 if (action & TEXT_OBJECT_ACTION_TYPE_ABBREV)
589 _EnrichedTextImpl::SetLineSpace(int lineSpace)
591 SysTryReturn(NID_GRP, __pTextObject != null, E_OPERATION_FAILED, E_OPERATION_FAILED
592 , "[E_OPERATION_FAILED] This instance is not constructed yet.");
593 SysTryReturn(NID_GRP, lineSpace > 0, E_INVALID_ARG, E_INVALID_ARG
594 , "[E_INVALID_ARG] The argument is invalid.");
596 __lineSpace = lineSpace;
597 __pTextObject->SetLineSpace(__lineSpace);
603 _EnrichedTextImpl::GetLineSpace(void) const
609 _EnrichedTextImpl::Refresh(void)
611 SysTryReturn(NID_GRP, __pTextObject != null, , E_OPERATION_FAILED
612 , "[E_OPERATION_FAILED] This instance is not constructed yet.");
614 __pTextObject->Compose();
618 _EnrichedTextImpl::GetTotalLineCount(void) const
620 SysTryReturn(NID_GRP, __pTextObject != null, 0, E_OPERATION_FAILED
621 , "[E_OPERATION_FAILED] This instance is not constructed yet.");
623 __pTextObject->Compose();
625 return __pTextObject->GetTotalLineCount();
629 _EnrichedTextImpl::GetTotalLineHeight(void) const
631 SysTryReturn(NID_GRP, __pTextObject != null, 0, E_OPERATION_FAILED
632 , "[E_OPERATION_FAILED] This instance is not constructed yet.");
634 int height = __pTextObject->GetTotalHeight();
636 __pTextObject->Compose();
642 _EnrichedTextImpl::GetDisplayLineCount(void) const
644 SysTryReturn(NID_GRP, __pTextObject != null, 0, E_OPERATION_FAILED
645 , "[E_OPERATION_FAILED] This instance is not constructed yet.");
647 int count = __pTextObject->GetDisplayLineCount();
649 __pTextObject->Compose();
660 _EnrichedTextImpl::GetLineLength(int lineIndex) const
662 SysTryReturn(NID_GRP, __pTextObject != null, -1, E_OPERATION_FAILED
663 , "[E_OPERATION_FAILED] This instance is not constructed yet.");
664 SysTryReturn(NID_GRP, GetTextElementCount() != 0, -1, E_OPERATION_FAILED
665 , "[E_OPERATION_FAILED] It doesn't have TextElement.");
666 SysTryReturn(NID_GRP, lineIndex >= 0, -1, E_INVALID_ARG
667 , "[E_INVALID_ARG] The invalid lineIndex(%d) is given.", lineIndex);
669 int totalLineCount = __pTextObject->GetTotalLineCount();
671 if (lineIndex > totalLineCount)
673 return E_INVALID_ARG;
680 __pTextObject->Compose();
682 lineLength = __pTextObject->GetTextLengthAt(lineIndex);
683 if (lineLength == -1)
685 SetLastResult(E_INVALID_ARG);
690 SetLastResult(E_SUCCESS);
696 _EnrichedTextImpl::GetFirstTextIndex(int lineIndex) const
698 SysTryReturn(NID_GRP, __pTextObject != null, -1, E_OPERATION_FAILED
699 , "[E_OPERATION_FAILED] This instance is not constructed yet.");
700 SysTryReturn(NID_GRP, lineIndex >= 0, -1, E_INVALID_ARG
701 , "[E_INVALID_ARG] The invalid lineIndex(%d) is given.", lineIndex);
704 __pTextObject->Compose();
706 int totalLineCount = __pTextObject->GetTotalLineCount();
707 if (lineIndex >= totalLineCount)
709 SetLastResult(E_INVALID_ARG);
713 int textIndex = __pTextObject->GetFirstTextIndexAt(lineIndex);
716 SetLastResult(E_INVALID_ARG);
721 SetLastResult(E_SUCCESS);
727 _EnrichedTextImpl::GetLineIndex(int textIndex) const
729 SysTryReturn(NID_GRP, __pTextObject != null, -1, E_OPERATION_FAILED
730 , "[E_OPERATION_FAILED] This instance is not constructed yet.");
731 SysTryReturn(NID_GRP, textIndex >= 0, -1, E_INVALID_ARG
732 , "[E_INVALID_ARG] The invalid lineIndex(%d) is given.", textIndex);
735 __pTextObject->Compose();
737 int totalLineCount = __pTextObject->GetTotalLineCount();
738 int lineIndex = __pTextObject->GetLineIndexAtTextIndex(textIndex);
740 if ((lineIndex > totalLineCount) || (textIndex > totalLineCount) || (lineIndex == -1))
742 SetLastResult(E_INVALID_ARG);
747 SetLastResult(E_SUCCESS);
753 _EnrichedTextImpl::GetLineHeight(int lineIndex) const
755 SysTryReturn(NID_GRP, __pTextObject != null, -1, E_OPERATION_FAILED
756 , "[E_OPERATION_FAILED] This instance is not constructed yet.");
757 SysTryReturn(NID_GRP, lineIndex >= 0, -1, E_INVALID_ARG
758 , "[E_INVALID_ARG] The invalid lineIndex(%d) is given.\n", lineIndex);
761 __pTextObject->Compose();
763 int totalLineCount = __pTextObject->GetTotalLineCount();
764 if (lineIndex >= totalLineCount)
766 SetLastResult(E_INVALID_ARG);
770 int height = __pTextObject->GetLineHeightAt(lineIndex);
772 SetLastResult(E_SUCCESS);
777 _EnrichedTextImpl::GetTextLength(void) const
779 SysTryReturn(NID_GRP, __pTextObject != null, 0, E_OPERATION_FAILED, "[E_OPERATION_FAILED] This instance is not constructed yet.");
781 if (GetTextElementCount() == 0)
786 __pTextObject->Compose();
788 return __pTextObject->GetTextLength();
792 _EnrichedTextImpl::GetTextExtent(int startTextIndex, int textLength, int& width, int& height, int& actualLength) const
794 SysTryReturn(NID_GRP, __pTextObject != null, E_OPERATION_FAILED, E_OPERATION_FAILED
795 , "[E_OPERATION_FAILED] This instance is not constructed yet.");
796 SysTryReturn(NID_GRP, textLength >= 0, E_INVALID_ARG, E_INVALID_ARG
797 , "[E_INVALID_ARG] The given text length(%d) is invalid\n", textLength);
798 SysTryReturn(NID_GRP, startTextIndex <= GetTextLength(), E_INVALID_ARG, E_INVALID_ARG
799 , "[E_INVALID_ARG] 'startTextIndex' is greater than or equal to the text length.");
805 if (GetTextLength() == 0)
813 if (startTextIndex + textLength <= 0)
821 __pTextObject->Compose();
822 textSize = __pTextObject->GetTextExtent(startTextIndex, textLength);
823 width = textSize.width;
824 height = textSize.height;
826 if (GetTextLength() - startTextIndex > textLength)
828 actualLength = textLength;
832 actualLength = GetTextLength() - startTextIndex;
839 _EnrichedTextImpl::GetTextExtent(int startTextIndex, int textLength, Tizen::Graphics::Dimension& size, int &actualLength) const
841 SysTryReturn(NID_GRP, __pTextObject != null, E_OPERATION_FAILED, E_OPERATION_FAILED, "[E_OPERATION_FAILED] This instance is not constructed yet.\n");
842 SysTryReturn(NID_GRP, textLength >= 0, E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The given text length(%d) is invalid\n", textLength);
843 SysTryReturn(NID_GRP, startTextIndex <= GetTextLength(), E_INVALID_ARG, E_INVALID_ARG,
844 "[E_INVALID_ARG] 'startTextIndex' is greater than or equal to the text length.\n");
848 if (GetTextLength() == 0)
856 if (startTextIndex + textLength <= 0)
864 __pTextObject->Compose();
866 size = __pTextObject->GetTextExtent(startTextIndex, textLength);
867 if (GetTextLength() - startTextIndex > textLength)
869 actualLength = textLength;
873 actualLength = GetTextLength() - startTextIndex;
879 Tizen::Graphics::Dimension
880 _EnrichedTextImpl::GetTextExtent(void) const
882 SysTryReturn(NID_GRP, __pTextObject != null, Dimension(-1, -1), E_OPERATION_FAILED, "[E_OPERATION_FAILED] This instance is not constructed yet.\n");
885 if (GetTextLength() == 0)
890 __pTextObject->Compose();
892 Rectangle rtBound = __pTextObject->GetBounds();
893 if (rtBound.width >= 0 && rtBound.height >= 0)
895 size.width = rtBound.width;
896 size.height = __pTextObject->GetTotalHeight();
910 _EnrichedTextImpl::Add(const Tizen::Graphics::Bitmap& bitmap)
912 SysTryReturn(NID_GRP, __pTextObject != null, E_OPERATION_FAILED, E_OPERATION_FAILED
913 , "[E_OPERATION_FAILED] This instance is not constructed yet.");
914 SysTryReturn(NID_GRP, &bitmap, E_INVALID_ARG, E_INVALID_ARG
915 , "[E_INVALID_ARG] The source bitmap is invalid.");
916 SysTryReturn(NID_GRP, _Util::CheckValidity(&bitmap), E_INVALID_ARG, E_INVALID_ARG
917 , "[E_INVALID_ARG] The source bitmap is invalid.");
919 result r = E_SUCCESS;
921 Bitmap* pBitmap = const_cast < Bitmap* >(&bitmap);
922 Bitmap* pNewBitmap = new (std::nothrow) Bitmap();
923 if (pNewBitmap == null)
925 SysLog(NID_GRP, "[E_OUT_OF_MEMORY] Fail to create a bitmap.");
926 return E_OUT_OF_MEMORY;
929 r = pNewBitmap->Construct(*pBitmap, Rectangle(0, 0, pBitmap->GetWidth(), pBitmap->GetHeight()));
932 , , r, "[%s] Fails to append image.", GetErrorMessage(r));
934 __pTextObject->AppendElement(*pNewBitmap, TEXT_ELEMENT_SOURCE_TYPE_EXTERNAL);
935 __pTextObject->Compose();
937 r = __pLinkedListTextElementList->Add(*pNewBitmap);
940 , , r, "[%s] Fails to add image.", GetErrorMessage(r));
942 if (__isCopiedEnrichedText == false)
944 __elements.Add(bitmap);
959 _EnrichedTextImpl::InsertAt(int elementIndex, const Tizen::Graphics::Bitmap& bitmap)
961 SysTryReturn(NID_GRP, __pTextObject != null, E_OPERATION_FAILED, E_OPERATION_FAILED
962 , "[E_OPERATION_FAILED] This instance is not constructed yet.");
963 SysTryReturn(NID_GRP, &bitmap, E_INVALID_ARG, E_INVALID_ARG
964 , "[E_INVALID_ARG] The source bitmap is invalid.");
965 SysTryReturn(NID_GRP, _Util::CheckValidity(&bitmap), E_INVALID_ARG, E_INVALID_ARG
966 , "[E_INVALID_ARG] The source bitmap is invalid.");
967 SysTryReturn(NID_GRP, elementIndex >= 0 && elementIndex <= GetTextElementCount(), E_OUT_OF_RANGE, E_OUT_OF_RANGE
968 , "[E_OUT_OF_RANGE] The given text index is invalid.");
970 result r = E_SUCCESS;
971 _Text::TextElement* pTextComponent = null;
973 int count = __pTextObject->GetElementCount();
974 if (elementIndex > count)
976 return E_INVALID_ARG;
979 Bitmap* pBitmap = const_cast < Bitmap* >(&bitmap);
980 Bitmap* pNewBitmap = new (std::nothrow) Bitmap();
981 if (pNewBitmap == null)
983 SysLog(NID_GRP, "[E_OUT_OF_MEMORY] Fail to create a bitmap.");
984 return E_OUT_OF_MEMORY;
987 r = pNewBitmap->Construct(*pBitmap, Rectangle(0, 0, pBitmap->GetWidth(), pBitmap->GetHeight()));
990 , , r, "[%s] Fails to insert image.", GetErrorMessage(r));
992 for (int i = 0; i < elementIndex; i++)
994 pTextComponent = __pTextObject->GetElementAtElementIndex(i);
995 if (pTextComponent != null)
997 textLength = textLength + pTextComponent->GetTextLength();
1001 __pTextObject->InsertElementAt(textLength, *pNewBitmap, TEXT_ELEMENT_SOURCE_TYPE_EXTERNAL);
1002 __pTextObject->Compose();
1004 r = __pLinkedListTextElementList->InsertAt(*pNewBitmap, elementIndex);
1007 , , r, "[%s] Fails to insert image.", GetErrorMessage(r));
1009 if (__isCopiedEnrichedText == false)
1011 __elements.InsertAt(bitmap, elementIndex);
1027 _EnrichedTextImpl::GetLinkInfoFromPosition(const Point& point, Tizen::Base::Utility::LinkInfo& linkInfo) const
1029 SysTryReturn(NID_GRP, __pTextObject != null, E_OPERATION_FAILED, E_OPERATION_FAILED
1030 , "[E_OPERATION_FAILED] This instance is not constructed yet.");
1031 SysTryReturn(NID_GRP, GetTextElementCount() > 0, E_OBJ_NOT_FOUND, E_OBJ_NOT_FOUND
1032 , "[E_OBJ_NOT_FOUND] The TextElement does not exist.");
1033 SysTryReturn(NID_GRP, point.x >= 0 && point.y >= 0, E_INVALID_ARG, E_INVALID_ARG
1034 , "[E_INVALID_ARG] The invalid position is given.");
1035 SysTryReturn(NID_GRP, GetWidth() >= point.x && GetHeight() >= point.y, E_INVALID_ARG, E_INVALID_ARG
1036 , "[E_INVALID_ARG] The invalid position is given.");
1038 return GetLinkInfoFromPosition(point.x, point.y, linkInfo);
1042 _EnrichedTextImpl::GetLinkInfoFromPosition(int x, int y, Tizen::Base::Utility::LinkInfo& linkInfo) const
1044 SysTryReturn(NID_GRP, __pTextObject != null, E_OPERATION_FAILED, E_OPERATION_FAILED
1045 , "[E_OPERATION_FAILED] This instance is not constructed yet.");
1046 SysTryReturn(NID_GRP, GetTextElementCount() > 0, E_OBJ_NOT_FOUND, E_OBJ_NOT_FOUND
1047 , "[E_OBJ_NOT_FOUND] The TextElement does not exist.");
1048 SysTryReturn(NID_GRP, x >= 0 && y >= 0, E_INVALID_ARG, E_INVALID_ARG
1049 , "[E_INVALID_ARG] The invalid position is given.");
1050 SysTryReturn(NID_GRP, GetWidth() >= x && GetHeight() >= y, E_INVALID_ARG, E_INVALID_ARG
1051 , "[E_INVALID_ARG] The invalid position is given.");
1055 int textElementIndex = GetTextElementIndexFromPosition(point);
1057 TextElement* pTextElement = GetTextElementAt(textElementIndex);
1058 if (pTextElement == null)
1060 return E_OBJ_NOT_FOUND;
1062 _TextElementImpl* pTextElementImpl = _TextElementImpl::GetInstance(*pTextElement);
1063 if (pTextElementImpl != null)
1065 linkInfo.SetLinkType(pTextElementImpl->GetLinkType());
1066 linkInfo.SetText(pTextElementImpl->GetText());
1067 linkInfo.SetLink(pTextElementImpl->GetLinkText());
1073 TextVerticalAlignment
1074 _EnrichedTextImpl::GetElementVerticalAlignment(void) const
1076 SysTryReturn(NID_GRP, __pTextObject != null, TEXT_ALIGNMENT_VERTICAL_MIN, E_OPERATION_FAILED
1077 , "[E_OPERATION_FAILED] This instance is not constructed yet.");
1079 return __elementVerticalAlignment;
1083 _EnrichedTextImpl::SetElementVerticalAlignment(TextVerticalAlignment alignment)
1085 SysTryReturn(NID_GRP, __pTextObject != null, E_OPERATION_FAILED, E_OPERATION_FAILED
1086 , "[E_OPERATION_FAILED] This instance is not constructed yet.");
1088 TextObjectAlignment elementAlign = ConvertVAlignment(alignment);
1089 if (elementAlign == TEXT_OBJECT_ALIGNMENT_INVALID)
1091 return E_INVALID_ARG;
1094 TextObjectAlignment align =
1095 static_cast < TextObjectAlignment >((static_cast < TextObjectAlignment >(__pTextObject->GetAlignment())
1096 & TEXT_HORIZONTAL_ALIGNMENT) | (elementAlign & TEXT_VERTICAL_ALIGNMENT));
1098 __pTextObject->SetElementVerticalAlignment(align);
1099 __elementVerticalAlignment = alignment;
1104 Tizen::Graphics::Rectangle
1105 _EnrichedTextImpl::GetBounds() const
1107 Rectangle rect(0, 0, __width, __height);
1113 _EnrichedTextImpl::IndexOfFromLinkedList(TextElement& textElement, int& index)
1115 return __pLinkedListTextElementList->IndexOf(textElement, index);
1119 _EnrichedTextImpl::GetTextElementIndexFromPosition(Tizen::Graphics::Point& point) const
1121 _TextElementImpl* pElement = null;
1122 TextElementType type;
1127 offset = GetIndexFromTouchPosition(point.x, point.y);
1129 if (offset < 0 || offset > GetTextLength())
1134 count = GetTextElementCount();
1135 for (int i = 0; i < count; i++)
1137 type = GetTypeFromIndex(i);
1139 if (type == TEXT_ELEMENT_TYPE_IMAGE)
1141 length = length + 1;
1145 pElement = _TextElementImpl::GetInstance(*GetTextElementAt(i));
1148 if (pElement->IsAuto() == true)
1150 length = length + pElement->GetLinkText().GetLength();
1154 String text = pElement->GetText();
1155 length = length + text.GetLength();
1159 if (offset <= length)
1168 _EnrichedTextImpl::GetTextObject(void) const
1170 return __pTextObject.get();
1174 _EnrichedTextImpl::GetTypeFromIndex(int textObjectIndex) const
1176 TextElementType type = TEXT_ELEMENT_TYPE_NONE;
1178 _Text::TextElement* pTextComponent = null;
1180 pTextComponent = __pTextObject->GetElementAtElementIndex(textObjectIndex);
1184 type = pTextComponent->GetType();
1188 return TEXT_ELEMENT_TYPE_NONE;
1195 _EnrichedTextImpl::GetIndexFromTouchPosition(int posX, int posY) const
1197 return __pTextObject->GetTextIndexFromPosition(posX, posY, true);
1201 _EnrichedTextImpl::RemoveFromTextObject(_TextElementImpl* pTextElementImpl)
1203 SysTryReturn(NID_GRP, __pTextObject != null, E_OPERATION_FAILED, E_OPERATION_FAILED
1204 , "[E_OPERATION_FAILED] This instance is not constructed yet.");
1206 _Text::TextElement* pTextComponent = pTextElementImpl->GetComponent();
1207 if (pTextComponent != null)
1209 __pTextObject->RemoveElement(*pTextComponent, false);
1216 _EnrichedTextImpl::InsertAtFromTextObject(int index, _TextElementImpl* pTextElementImpl)
1218 SysTryReturn(NID_GRP, __pTextObject != null, E_OPERATION_FAILED, E_OPERATION_FAILED
1219 , "[E_OPERATION_FAILED] This instance is not constructed yet.");
1222 int count = __pTextObject->GetElementCount();
1225 return E_INVALID_ARG;
1228 _Text::TextElement* pInsertTextComponent = pTextElementImpl->GetComponent();
1229 if (pInsertTextComponent != null)
1231 for (int i = 0; i < index; i++)
1233 _Text::TextElement* pTextComponent = __pTextObject->GetElementAtElementIndex(i);
1234 if (pTextComponent != null)
1236 textLength = textLength + pTextComponent->GetTextLength();
1240 __pTextObject->InsertElementAt(textLength, *pInsertTextComponent);
1241 __pTextObject->Compose();
1248 _EnrichedTextImpl::GetTextElementIndex(_TextElementImpl* pTextElementImpl) const
1250 _Text::TextElement* pTextComponent = pTextElementImpl->GetComponent();
1251 if (pTextComponent != null)
1253 return __pTextObject->GetElementIndexOf(*pTextComponent);
1260 _EnrichedTextImpl::ConvertHAlignment(TextHorizontalAlignment halign)
1262 TextObjectAlignment align = TEXT_OBJECT_ALIGNMENT_LEFT;
1266 case TEXT_ALIGNMENT_LEFT:
1267 align = TEXT_OBJECT_ALIGNMENT_LEFT;
1270 case TEXT_ALIGNMENT_CENTER:
1271 align = TEXT_OBJECT_ALIGNMENT_CENTER;
1274 case TEXT_ALIGNMENT_RIGHT:
1275 align = TEXT_OBJECT_ALIGNMENT_RIGHT;
1279 align = TEXT_OBJECT_ALIGNMENT_INVALID;
1286 TextHorizontalAlignment
1287 _EnrichedTextImpl::ConvertHAlignment(TextObjectAlignment halign)
1289 TextHorizontalAlignment align;
1293 case TEXT_OBJECT_ALIGNMENT_RIGHT:
1294 align = TEXT_ALIGNMENT_RIGHT;
1297 case TEXT_OBJECT_ALIGNMENT_CENTER:
1298 align = TEXT_ALIGNMENT_CENTER;
1301 case TEXT_OBJECT_ALIGNMENT_LEFT:
1304 align = TEXT_ALIGNMENT_LEFT;
1312 _EnrichedTextImpl::ConvertVAlignment(TextVerticalAlignment valign)
1314 TextObjectAlignment align;
1318 case TEXT_ALIGNMENT_TOP:
1319 align = TEXT_OBJECT_ALIGNMENT_TOP;
1322 case TEXT_ALIGNMENT_MIDDLE:
1323 align = TEXT_OBJECT_ALIGNMENT_MIDDLE;
1326 case TEXT_ALIGNMENT_BOTTOM:
1327 align = TEXT_OBJECT_ALIGNMENT_BOTTOM;
1330 case TEXT_ALIGNMENT_BASELINE:
1331 align = TEXT_OBJECT_ALIGNMENT_BASELINE;
1335 align = TEXT_OBJECT_ALIGNMENT_INVALID;
1342 TextVerticalAlignment
1343 _EnrichedTextImpl::ConvertVAlignment(TextObjectAlignment valign)
1345 TextVerticalAlignment align = TEXT_ALIGNMENT_TOP;
1349 case TEXT_OBJECT_ALIGNMENT_TOP:
1350 align = TEXT_ALIGNMENT_TOP;
1353 case TEXT_OBJECT_ALIGNMENT_MIDDLE:
1354 align = TEXT_ALIGNMENT_MIDDLE;
1357 case TEXT_OBJECT_ALIGNMENT_BOTTOM:
1360 align = TEXT_ALIGNMENT_BOTTOM;
1368 _EnrichedTextImpl::ConvertWrapType(TextWrap warp)
1370 _TextWrapType twrap;
1374 case TEXT_WRAP_CHARACTER_WRAP:
1375 twrap = TEXT_WRAP_TYPE_WRAP;
1378 case TEXT_WRAP_WORD_WRAP:
1379 twrap = TEXT_WRAP_TYPE_WORDWRAP;
1383 twrap = TEXT_WRAP_TYPE_NONE;
1391 _EnrichedTextImpl::ConvertWrap(_TextWrapType warp) const
1397 case TEXT_WRAP_TYPE_WRAP:
1398 twrap = TEXT_WRAP_CHARACTER_WRAP;
1401 case TEXT_WRAP_TYPE_WORDWRAP:
1402 twrap = TEXT_WRAP_WORD_WRAP;
1406 twrap = TEXT_WRAP_NONE;
1414 _EnrichedTextImpl::GetCloneN(void) const
1416 SysTryReturn(NID_GRP, __pTextObject != null, null, E_OPERATION_FAILED
1417 , "[E_OPERATION_FAILED] This instance is not constructed yet.");
1419 result r = E_SUCCESS;
1420 _EnrichedTextImpl* pNewEnrichedTextImpl = null;
1422 pNewEnrichedTextImpl = new (std::nothrow)_EnrichedTextImpl(*this);
1423 r = GetLastResult();
1424 SysTryReturn(NID_GRP
1425 , pNewEnrichedTextImpl
1426 , null, r, "[%s] Propagating.", GetErrorMessage(r));
1428 return pNewEnrichedTextImpl;
1431 _EnrichedTextImpl::_EnrichedTextImpl(const _EnrichedTextImpl& rhs)
1433 SysTryReturnVoidResult(NID_GRP, rhs.__pTextObject, E_OPERATION_FAILED, "[E_OPERATION_FAILED] This instance is not initialized.");
1435 result r = E_SUCCESS;
1436 Dimension size = rhs.GetSize();
1438 __width = size.width;
1439 __height = size.height;
1440 __lineSpace = GetLineSpace();
1442 __verticalAlignment = rhs.GetVerticalAlignment();
1443 __horizontalAlignment = rhs.GetHorizontalAlignment();
1444 __elementVerticalAlignment = rhs.GetElementVerticalAlignment();
1445 __pLinkedListTextElementList = null;
1446 __pTextElement = null;
1447 __isCopiedEnrichedText = true;
1448 __pTextObject = rhs.__pTextObject;
1450 __pLinkedListTextElementList = new (std::nothrow) Tizen::Base::Collection::LinkedList;
1451 if (__pLinkedListTextElementList == null)
1453 SetLastResult(E_OUT_OF_MEMORY);
1454 SysLog(NID_GRP, "[E_OUT_OF_MEMORY] Fail to create element list.");
1457 __pTextElement = new (std::nothrow) TextElement();
1458 if (__pTextElement == null)
1460 delete __pLinkedListTextElementList;
1462 SetLastResult(E_OUT_OF_MEMORY);
1463 SysLog(NID_GRP, "[E_OUT_OF_MEMORY] Fail to create element.");
1466 r = __pTextElement->Construct();
1469 delete __pLinkedListTextElementList;
1470 delete __pTextElement;
1472 SysLog(NID_GRP, "[%s] Fail to construct text element.", GetErrorMessage(r));
1477 _EnrichedTextImpl::GetInstance(EnrichedText& enrichedText)
1479 return (&enrichedText != null) ? enrichedText.__pImpl : null;
1482 const _EnrichedTextImpl*
1483 _EnrichedTextImpl::GetInstance(const EnrichedText& enrichedText)
1485 return (&enrichedText != null) ? enrichedText.__pImpl : null;
1489 _EnrichedTextImpl::IsConstructed(void) const
1491 return (this->__pTextObject != null);
1494 }} // Tizen::Graphics