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 FUiCtrl_ListViewItem.cpp
20 * @brief This is the implementation file for _ListViewItem class.
22 * This file contains the implementation of _ListViewItem class.
25 #include <FBaseSysLog.h>
26 #include <FGrp_BitmapImpl.h>
27 #include <FGrp_EnrichedTextImpl.h>
28 #include <FGrp_TextElementImpl.h>
29 #include <FGrp_TextTextCutLink.h>
30 #include <FGrp_TextTextCutLinkParser.h>
31 #include <FGrp_TextTextSimple.h>
32 #include "FUi_AccessibilityContainer.h"
33 #include "FUi_AccessibilityElement.h"
34 #include "FUi_CoordinateSystemUtils.h"
36 #include "FUi_ResourceManager.h"
37 #include "FUiAnim_VisualElement.h"
38 #include "FUiCtrl_Label.h"
39 #include "FUiCtrl_ListViewContextItem.h"
40 #include "FUiCtrl_ListViewItem.h"
41 #include "FUiCtrl_UiListViewItemEvent.h"
42 #include "FUiCtrl_UiListViewItemEventArg.h"
44 #ifdef MEMORY_LEAK_CHECK
45 #include "mem_leak_check.h"
48 using namespace Tizen::Base;
49 using namespace Tizen::Base::Runtime;
50 using namespace Tizen::Base::Utility;
51 using namespace Tizen::Graphics;
52 using namespace Tizen::Graphics::_Text;
53 using namespace Tizen::Ui;
54 using namespace Tizen::Ui::Animations;
56 namespace Tizen { namespace Ui { namespace Controls
59 _ListViewItem::_ListViewItem(float itemHeight)
60 : _TableViewItem(itemHeight)
61 , __needAlignContextItem(false)
62 , __touchPressed(false)
63 , __touchEnabled(false)
64 , __selectedElementId(-1)
65 , __descriptionTextShowState(false)
66 , __pDescriptionText(null)
68 , __selectionEabled(false)
72 , __prevTouchPos(-1.0f, -1.0f)
73 , __pTextSlideTimer(null)
74 , __pAccessibilityElement(null)
75 , __isContextItemListenerActivated(false)
77 GET_COLOR_CONFIG(TABLEVIEW::ITEM_DESCRIPTION_TEXT_NORMAL, __descriptionTextColor);
79 ___stateChangedInfo.selectionType = LISTVIEW_ITEM_SELECTED;
80 ___stateChangedInfo.elementId = -1;
81 ___stateChangedInfo.pUiLinkInfo = null;
84 _ListViewItem::~_ListViewItem(void)
88 delete ___stateChangedInfo.pUiLinkInfo;
89 ___stateChangedInfo.pUiLinkInfo = null;
91 delete __pTextSlideTimer;
92 __pTextSlideTimer = null;
94 if (__pDescriptionText != null)
96 DetachChild(*__pDescriptionText);
98 delete __pDescriptionText;
99 __pDescriptionText = null;
102 if (__pDivider != null)
104 DetachChild(*__pDivider);
110 _ListViewContextItem* pContextItem = static_cast<_ListViewContextItem*>(GetContextItem());
111 if ((pContextItem != null) && (__pContextItemEventListener != null))
113 if (__isContextItemListenerActivated)
115 pContextItem->RemoveContextItemEventListener(*__pContextItemEventListener);
117 __pContextItemEventListener = null;
118 __isContextItemListenerActivated = false;
121 _AccessibilityContainer* pContainer = GetAccessibilityContainer();
123 if ((__pAccessibilityElement != null) && (pContainer != null))
125 pContainer->RemoveAllElement();
126 __pAccessibilityElement = null;
131 _ListViewItem::CreateListViewItemN(float itemHeight)
133 _ListViewItem* pItem = new (std::nothrow) _ListViewItem(itemHeight);
134 SysTryReturn(NID_UI_CTRL, (pItem != null), null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
136 pItem->AcquireHandle();
138 result r = pItem->Initialize();
139 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r = E_SYSTEM, "[E_SYSTEM] Unable to create _ListViewItem");
150 _ListViewItem::SetListViewItemType(ListViewItemType type)
156 _ListViewItem::AddElement(FloatRectangle& rect, int elementId, const String& text, bool textSliding)
158 result r = E_SUCCESS;
160 SysTryReturn(NID_UI_CTRL, (HasElement(elementId) == false), E_INVALID_ARG, E_INVALID_ARG,
161 ("[E_INVALID_ARG] This elementId already exists."));
163 // Convert String to TextObject
164 TextObject* pText = new (std::nothrow) TextObject();
167 if (text.IsEmpty() == false)
169 TextSimple* pSimpleText = new (std::nothrow) TextSimple(const_cast <wchar_t*>(text.GetPointer()), text.GetLength());
170 pText->AppendElement(*pSimpleText);
172 pText->SetAlignment(TEXT_OBJECT_ALIGNMENT_LEFT | TEXT_OBJECT_ALIGNMENT_MIDDLE);
173 pText->SetWrap(TEXT_OBJECT_WRAP_TYPE_NONE);
176 // Make element object
177 _ListViewItemElement element;
178 memset(&element, 0, sizeof(_ListViewItemElement));
180 element.elementId = elementId;
181 element.elementType = LISTVIEW_ITEM_ELEMENT_TEXT;
182 element.bounds = rect;
184 element.pTextElement = new (std::nothrow) _ListViewItemElementText();
185 SysTryReturn(NID_UI_CTRL, (element.pTextElement != null), (r = GetLastResult()), r, "[%s] Propagating.", GetErrorMessage(r));
187 element.pTextElement->pTextObject = pText;
188 element.pTextElement->textSlidingEnabled = textSliding;
190 GET_SHAPE_CONFIG(LISTVIEW::ITEM_DEFAULT_FONT_SIZE, _CONTROL_ORIENTATION_PORTRAIT, element.pTextElement->textSize);
191 GET_COLOR_CONFIG(TABLEVIEW::ITEM_TEXT_NORMAL, element.pTextElement->textColor[LISTVIEW_ITEM_STATUS_NORMAL]);
192 GET_COLOR_CONFIG(TABLEVIEW::ITEM_TEXT_PRESSED, element.pTextElement->textColor[LISTVIEW_ITEM_STATUS_PRESSED]);
193 GET_COLOR_CONFIG(TABLEVIEW::ITEM_TEXT_HIGHLIGHTED, element.pTextElement->textColor[LISTVIEW_ITEM_STATUS_HIGHLIGHTED]);
195 // Set Visual element for this element
196 _VisualElement* pVE = new (std::nothrow) _VisualElement();
198 pVE->SetImplicitAnimationEnabled(false);
199 pVE->SetContentProvider(&__hitTestVEDelegator);
200 element.pTextElement->pVE = pVE;
202 __elements.push_back(element);
208 _ListViewItem::AddElement(FloatRectangle& rect, int elementId, const EnrichedText* pEnrichedText)
210 SysTryReturn(NID_UI_CTRL, (HasElement(elementId) == false), E_INVALID_ARG, E_INVALID_ARG,
211 ("[E_INVALID_ARG] This elementId already exists."));
213 SysTryReturn(NID_GRP, (pEnrichedText != null) && (_EnrichedTextImpl::GetInstance(*pEnrichedText) != null),
214 E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] This _EnrichedText element is null.");
217 _EnrichedTextImpl* pCloneText = _EnrichedTextImpl::GetInstance(*pEnrichedText)->GetCloneN();
218 SysTryReturn(NID_GRP, (pCloneText != null), E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] This _EnrichedText element can not clone.");
220 TextObject* pText = pCloneText->GetTextObject();
222 // Make element object
223 _ListViewItemElement element;
224 memset(&element, 0, sizeof(_ListViewItemElement));
226 element.elementId = elementId;
227 element.elementType = LISTVIEW_ITEM_ELEMENT_TEXT;
228 element.bounds = rect;
230 element.pTextElement = new (std::nothrow) _ListViewItemElementText();
231 SysTryReturn(NID_UI_CTRL, (element.pTextElement != null), GetLastResult(), GetLastResult(), "[%s] Propagating.",
232 GetErrorMessage(GetLastResult()));
234 element.pTextElement->pTextObject = pText;
235 element.pTextElement->pEnrichedText = pCloneText;
236 element.pTextElement->textSlidingEnabled = false;
238 GET_COLOR_CONFIG(TABLEVIEW::ITEM_TEXT_NORMAL, element.pTextElement->textColor[LISTVIEW_ITEM_STATUS_NORMAL]);
239 GET_COLOR_CONFIG(TABLEVIEW::ITEM_TEXT_PRESSED, element.pTextElement->textColor[LISTVIEW_ITEM_STATUS_PRESSED]);
240 GET_COLOR_CONFIG(TABLEVIEW::ITEM_TEXT_HIGHLIGHTED, element.pTextElement->textColor[LISTVIEW_ITEM_STATUS_HIGHLIGHTED]);
242 // Set Visual element for this element
243 _VisualElement* pVE = new (std::nothrow) _VisualElement();
244 SysTryReturn(NID_UI_CTRL, (pVE != null), E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
247 pVE->SetImplicitAnimationEnabled(false);
248 pVE->SetContentProvider(&__hitTestVEDelegator);
249 element.pTextElement->pVE = pVE;
251 __elements.push_back(element);
257 _ListViewItem::AddElement(FloatRectangle& rect, int elementId, const Bitmap* pNormalBitmap, const Bitmap* pPressedBitmap, const Bitmap* pHighlightedBitmap)
259 SysTryReturn(NID_UI_CTRL, (HasElement(elementId) == false), E_INVALID_ARG, E_INVALID_ARG,
260 ("[E_INVALID_ARG] This elementId already exists."));
262 SysTryReturn(NID_GRP, (pNormalBitmap != null), E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] This Bitmap element is null.");
264 _ListViewItemElement element;
265 _VisualElement* pVE = null;
266 Bitmap* pClonePressedBitmap = null;
267 Bitmap* pCloneHighlightedBitmap = null;
268 result r = E_SUCCESS;
270 Bitmap* pCloneNormalBitmap = _BitmapImpl::CloneN(*pNormalBitmap);
271 SysTryReturn(NID_UI_CTRL, (pCloneNormalBitmap != null), (r = GetLastResult()), r, "[%s] Propagating.", GetErrorMessage(GetLastResult()));
273 if (pPressedBitmap != null)
275 pClonePressedBitmap = _BitmapImpl::CloneN(*pPressedBitmap);
276 SysTryCatch(NID_UI_CTRL, (pClonePressedBitmap != null), (r = GetLastResult()), r, "[%s] Propagating.", GetErrorMessage(GetLastResult()));
279 if (pHighlightedBitmap != null)
281 pCloneHighlightedBitmap = _BitmapImpl::CloneN(*pHighlightedBitmap);
282 SysTryCatch(NID_UI_CTRL, (pCloneHighlightedBitmap != null), (r = GetLastResult()), r, "[%s] Propagating.", GetErrorMessage(GetLastResult()));
285 // Make element object
286 memset(&element, 0, sizeof(_ListViewItemElement));
288 element.elementId = elementId;
289 element.elementType = LISTVIEW_ITEM_ELEMENT_BITMAP;
290 element.bounds = rect;
292 element.pBitmapElement = new (std::nothrow) _ListViewItemElementBitmap();
293 SysTryCatch(NID_UI_CTRL, (element.pBitmapElement != null), (r = GetLastResult()), r, "[%s] Propagating.", GetErrorMessage(GetLastResult()));
295 element.pBitmapElement->pBitmap[LISTVIEW_ITEM_STATUS_NORMAL] = pCloneNormalBitmap;
296 element.pBitmapElement->pBitmap[LISTVIEW_ITEM_STATUS_PRESSED] = pClonePressedBitmap;
297 element.pBitmapElement->pBitmap[LISTVIEW_ITEM_STATUS_HIGHLIGHTED] = pCloneHighlightedBitmap;
299 pVE = new (std::nothrow) _VisualElement();
300 SysTryCatch(NID_UI_CTRL, pVE, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
303 pVE->SetImplicitAnimationEnabled(false);
304 pVE->SetContentProvider(&__hitTestVEDelegator);
305 element.pBitmapElement->pVE = pVE;
307 __elements.push_back(element);
312 delete pCloneNormalBitmap;
313 delete pClonePressedBitmap;
314 delete pCloneHighlightedBitmap;
320 _ListViewItem::AddElement(FloatRectangle& rect, int elementId, const _ICustomElement* pCustom)
322 SysTryReturn(NID_UI_CTRL, (HasElement(elementId) == false), E_INVALID_ARG, E_INVALID_ARG,
323 ("[E_INVALID_ARG] This elementId already exists."));
325 SysTryReturn(NID_GRP, (pCustom != null), E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] This Custom element is null.");
327 // Make element object
328 _ListViewItemElement element;
329 memset(&element, 0, sizeof(_ListViewItemElement));
331 element.elementId = elementId;
332 element.elementType = LISTVIEW_ITEM_ELEMENT_OBJ;
333 element.bounds = rect;
335 element.pCustomElement = new (std::nothrow) _ListViewItemElementCustom();
336 SysTryReturn(NID_UI_CTRL, (element.pCustomElement != null), GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
338 element.pCustomElement->pCustom = const_cast<_ICustomElement*>(pCustom);
340 _VisualElement* pVE = new (std::nothrow) _VisualElement();
341 SysTryReturn(NID_UI_CTRL, (pVE != null), E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
343 pVE->SetImplicitAnimationEnabled(false);
344 pVE->SetContentProvider(&__hitTestVEDelegator);
345 element.pCustomElement->pVE = pVE;
347 if (pVE->GetParent() == null)
349 GetVisualElement()->AttachChild(*(pVE));
350 pVE->SetShowState(true);
351 pVE->SetBounds(rect);
354 __elements.push_back(element);
360 _ListViewItem::DeleteElement(int elementId)
362 _LinkedList <_ListViewItemElement>::_Iterator iter;
364 for (iter = __elements.begin(); iter != __elements.end(); iter++)
366 if (iter->elementId == elementId)
368 DeleteElement(&(*iter));
369 __elements.erase(iter);
379 _ListViewItem::DeleteAllElement(void)
381 _LinkedList <_ListViewItemElement>::_Iterator iter;
383 for (iter = __elements.begin(); iter != __elements.end(); iter++)
385 DeleteElement(&(*iter));
392 _ListViewItem::DeleteElement(_ListViewItemElement* pElement)
394 if (pElement->pTextElement != null)
396 if (pElement->pTextElement->pEnrichedText != null)
398 (pElement->pTextElement->pEnrichedText)->RemoveAllTextElements(true);
400 delete pElement->pTextElement->pEnrichedText;
401 pElement->pTextElement->pEnrichedText = null;
403 pElement->pTextElement->pTextObject = null;
407 delete pElement->pTextElement->pTextObject;
408 pElement->pTextElement->pTextObject = null;
411 if (pElement->pTextElement->pVE != null)
413 pElement->pTextElement->pVE->Destroy();
414 pElement->pTextElement->pVE = null;
417 delete pElement->pTextElement;
418 pElement->pTextElement = null;
421 if (pElement->pBitmapElement != null)
423 for (int i = 0; i < LISTVIEW_ITEM_STATUS_MAX; i++)
425 delete pElement->pBitmapElement->pBitmap[i];
426 pElement->pBitmapElement->pBitmap[i] = null;
429 if (pElement->pBitmapElement->pVE != null)
431 pElement->pBitmapElement->pVE->Destroy();
432 pElement->pBitmapElement->pVE = null;
435 delete pElement->pBitmapElement;
436 pElement->pBitmapElement = null;
439 if (pElement->pCustomElement)
441 delete pElement->pCustomElement->pCustom;
442 pElement->pCustomElement->pCustom = null;
444 if (pElement->pCustomElement->pVE != null)
446 pElement->pCustomElement->pVE->Destroy();
447 pElement->pCustomElement->pVE = null;
450 delete pElement->pCustomElement;
451 pElement->pCustomElement = null;
456 _ListViewItem::HasElement(int elementId)
458 _ListViewItemElement* pElement = GetElement(elementId);
460 return (pElement != null);
464 _ListViewItem::RefreshElement(int elementId)
466 _ListViewItemElement* pElement = GetElement(elementId);
468 if (pElement != null)
470 DrawElement(pElement);
473 return (pElement != null);
477 _ListViewItem::SetLastStateChangedInfo(void)
479 ClearLastStateChangedInfo();
481 int elementId = GetElementIdFromCurrentTouchPosition();
482 _ListViewItemElement* pElement = GetElement(elementId);
484 if ((pElement != null) && (__itemType == LISTVIEW_ITEM_TYPE_CUSTOM))
486 _ListViewItemUiLinkInfo* pInfo = null;
487 int cutlinkTextTouchedIndex = -1;
489 if (IsCutlinkTextSelected(__prevTouchPos, &cutlinkTextTouchedIndex, &pInfo))
491 if ((GetItemStyle() == TABLE_VIEW_ANNEX_STYLE_DETAILED)
492 && (pElement->actionElement == true) && (pElement->selectionEnabled == false))
497 if (cutlinkTextTouchedIndex >= 0)
499 ___stateChangedInfo.selectionType = LISTVIEW_ITEM_UILINK_SELECTED;
500 ___stateChangedInfo.elementId = elementId;
501 ___stateChangedInfo.pUiLinkInfo = pInfo;
505 ___stateChangedInfo.selectionType = LISTVIEW_ITEM_ELEMENT_SELECTED;
506 ___stateChangedInfo.elementId = elementId;
511 if ((GetItemStyle() == TABLE_VIEW_ANNEX_STYLE_DETAILED)
512 && (pElement->actionElement == true) && (pElement->selectionEnabled == false))
517 ___stateChangedInfo.selectionType = LISTVIEW_ITEM_ELEMENT_SELECTED;
518 ___stateChangedInfo.elementId = elementId;
523 ___stateChangedInfo.selectionType = LISTVIEW_ITEM_ELEMENT_SELECTED;
524 ___stateChangedInfo.elementId = -1;
529 _ListViewItem::GetLastStateChangedInfo(_ListViewItemStateChangedInfo& changedInfo) const
531 changedInfo = ___stateChangedInfo;
533 return (___stateChangedInfo.selectionType != LISTVIEW_ITEM_SELECTED);
537 _ListViewItem::ClearLastStateChangedInfo(void)
539 delete ___stateChangedInfo.pUiLinkInfo;
541 ___stateChangedInfo.selectionType = LISTVIEW_ITEM_SELECTED;
542 ___stateChangedInfo.elementId = -1;
543 ___stateChangedInfo.pUiLinkInfo = null;
547 _ListViewItem::SetCurrentStatus(_ListViewItemStatus& currentStatus)
549 // This function was made to modify of ListView::RefreshList().
550 // This function could adversely affect touch event handling. So, you should be used with caution.
552 SetPressedControl((currentStatus.annexStyle == GetItemStyle()) ? currentStatus.pressedControl : TABLE_VIEW_ITEM_PRESSED_ITEM);
553 SetSelectionState(currentStatus.itemSelected);
554 SetLastTouchPressedPosition(currentStatus.currentTouchPosition);
556 if (!currentStatus.itemSelected)
558 SetItemDrawingStatus(LISTVIEW_ITEM_STATUS_NORMAL);
561 __prevTouchPos = currentStatus.currentTouchPosition;
562 __touchEnabled = currentStatus.touchEnabled;
563 __selectionEabled = currentStatus.elementSelectionEnabled;
564 __selectedElementId = currentStatus.selectedElementId;
565 __touchPressed = (currentStatus.itemSelected || currentStatus.elementSelectionEnabled);
567 if (__selectionEabled)
569 SetItemDrawingStatus(LISTVIEW_ITEM_STATUS_NORMAL);
572 _ListViewItemElement* pElement = GetElement(__selectedElementId);
574 // text sliding check and invoke
575 if (pElement != null)
577 if (pElement->elementType == LISTVIEW_ITEM_ELEMENT_TEXT)
579 RefreshElement(__selectedElementId);
581 SetCutlinkTextFocus(currentStatus.currentTouchPosition);
583 if (pElement->pTextElement->textSlidingEnabled)
585 pElement->pTextElement->pTextObject->SetAction(TEXT_OBJECT_ACTION_TYPE_SLIDE_LEFT);
586 pElement->pTextElement->pTextObject->Compose();
588 if (pElement->pTextElement->pTextObject->IsActionOn())
590 StartTextSlideTimer();
599 // set item state changed info
600 SetLastStateChangedInfo();
604 _ListViewItem::GetCurrentStatus(_ListViewItemStatus& currentStatus)
606 // for _TableViewItem
607 currentStatus.annexStyle = GetItemStyle();
608 currentStatus.pressedControl = GetPressedControl();
609 currentStatus.itemSelected = GetSelectionState();
610 currentStatus.currentTouchPosition = __prevTouchPos;
613 currentStatus.touchEnabled = __touchEnabled;
614 currentStatus.elementSelectionEnabled = __selectionEabled;
615 currentStatus.selectedElementId = __selectedElementId;
619 _ListViewItem::IsItemSelected(void)
621 return __touchEnabled;
625 _ListViewItem::GetElementIdFromPosition(const FloatPoint& position) const
627 _LinkedList <_ListViewItemElement>::_ReverseIterator reverseIter;
629 for (reverseIter = __elements.rbegin(); reverseIter != __elements.rend(); reverseIter++)
631 if ((*reverseIter).bounds.Contains(position))
633 return (*reverseIter).elementId;
641 _ListViewItem::GetElementIdFromCurrentTouchPosition(void) const
643 return GetElementIdFromPosition(__prevTouchPos);
646 _ListViewItemElement*
647 _ListViewItem::GetElement(int elementId) const
649 _LinkedList <_ListViewItemElement>::_Iterator iter;
651 for (iter = __elements.begin(); iter != __elements.end(); iter++)
653 if (iter->elementId == elementId)
662 ListViewItemElementType
663 _ListViewItem::GetElementType(int elementId) const
665 _ListViewItemElement* pElement = GetElement(elementId);
667 return ((pElement != null) ? pElement->elementType : LISTVIEW_ITEM_ELEMENT_INVALID);
671 _ListViewItem::GetTextObjectInElement(int elementId) const
673 _ListViewItemElementText* pElement = GetElementText(elementId);
675 return ((pElement != null) ? pElement->pTextObject : null);
678 _ListViewItemElementText*
679 _ListViewItem::GetElementText(int elementId) const
681 _ListViewItemElement* pElement = GetElement(elementId);
683 if ((pElement != null) && (pElement->elementType == LISTVIEW_ITEM_ELEMENT_TEXT)
684 && (pElement->pTextElement->pTextObject != null))
686 return pElement->pTextElement;
692 _ListViewItemElementBitmap*
693 _ListViewItem::GetElementBitmap(int elementId) const
695 _ListViewItemElement* pElement = GetElement(elementId);
697 if ((pElement != null) && (pElement->elementType == LISTVIEW_ITEM_ELEMENT_BITMAP))
699 return pElement->pBitmapElement;
706 _ListViewItem::SetElementSelectionEnabled(int elementId, bool enable)
708 _ListViewItemElement* pElement = GetElement(elementId);
710 if (pElement == null)
715 pElement->actionElement = true;
716 pElement->selectionEnabled = enable;
722 _ListViewItem::GetElementSelectionEnabled(int elementId, bool& enable)
724 _ListViewItemElement* pElement = GetElement(elementId);
726 if ((pElement == null) || (pElement->actionElement == false))
731 enable = pElement->selectionEnabled;
737 _ListViewItem::SetTextCutlinkMask(int elementId, unsigned long mask)
739 _ListViewItemElementText* pElement = GetElementText(elementId);
741 if (pElement == null)
746 pElement->cutlinkMaskType = mask;
752 _ListViewItem::SetTextCutlinkViewMode(int elementId, bool cutlinkViewMode, bool cutlinkParseEnable)
754 _ListViewItemElementText* pElement = GetElementText(elementId);
756 if (pElement == null)
761 pElement->cutlinkViewModeEnabled = cutlinkViewMode;
762 pElement->cutlinkParseEnabled = cutlinkParseEnable;
763 pElement->cutlinkMaskType = LINK_TYPE_MAX;
769 _ListViewItem::SetTextAlignment(int elementId, TextObjectAlignment textAlignment)
771 TextObject* pTextObject = GetTextObjectInElement(elementId);
773 if (pTextObject == null)
778 TextObjectAlignment originAlign = pTextObject->GetAlignment();
780 // reset original alignment
781 if ((0x0007 & textAlignment) != 0x0000) // TextHorizontalAlignment
783 originAlign &= 0x0700;
785 else if ((0x0700 & textAlignment) != 0x0000) // TextVerticalAlignment
787 originAlign &= 0x0007;
790 pTextObject->SetAlignment(originAlign | textAlignment);
796 _ListViewItem::GetTextAlignment(int elementId, TextObjectAlignment& textAlignment) const
798 TextObject* pTextObject = GetTextObjectInElement(elementId);
800 if (pTextObject == null)
805 textAlignment = pTextObject->GetAlignment();
811 _ListViewItem::SetTextWrapType(int elementId, TextObjectWrapType wrapType)
813 TextObject* pTextObject = GetTextObjectInElement(elementId);
815 if (pTextObject == null)
820 pTextObject->SetWrap(wrapType);
826 _ListViewItem::SetTextSize(int elementId, float textSize)
828 _ListViewItemElementText* pElement = GetElementText(elementId);
830 if ((pElement != null) && (textSize > 0.0f))
832 pElement->textSize = textSize;
841 _ListViewItem::SetTextColor(int elementId, Color textColor, ListViewItemDrawingStatus status)
843 _ListViewItemElementText* pElement = GetElementText(elementId);
845 if (pElement == null)
850 pElement->textColor[status] = textColor;
856 _ListViewItem::GetTextColor(int elementId, Color& textColor, ListViewItemDrawingStatus status) const
858 _ListViewItemElementText* pElement = GetElementText(elementId);
860 if (pElement == null)
865 textColor = pElement->textColor[status];
871 _ListViewItem::SetDescriptionText(const String& text)
875 if (__pDescriptionText != null)
877 DetachChild(*__pDescriptionText);
879 delete __pDescriptionText;
880 __pDescriptionText = null;
887 if (__pDescriptionText == null)
889 __pDescriptionText = _Label::CreateLabelN();
890 result r = GetLastResult();
891 SysTryReturn(NID_UI_CTRL, (__pDescriptionText != null), r, r, "[%s] Propagating.", GetErrorMessage(r));
893 __pDescriptionText->SetVisibleState(false);
894 __pDescriptionText->SetMargin(0.0f, 0.0f, 0.0f, 0.0f);
895 __pDescriptionText->SetTextHorizontalAlignment(ALIGNMENT_LEFT);
897 AttachChild(*__pDescriptionText);
900 FloatRectangle bounds = GetBoundsF();
901 FloatRectangle textBounds;
902 float textSize = 0.0f;
905 GET_SHAPE_CONFIG(LISTVIEW::ITEM_DESCRIPTION_TEXT_LEFT_MARGIN, _CONTROL_ORIENTATION_PORTRAIT, textBounds.x);
906 GET_SHAPE_CONFIG(LISTVIEW::ITEM_DESCRIPTION_TEXT_TOP_MARGIN, _CONTROL_ORIENTATION_PORTRAIT, textBounds.y);
907 GET_SHAPE_CONFIG(LISTVIEW::ITEM_DESCRIPTION_TEXT_FONT_SIZE, _CONTROL_ORIENTATION_PORTRAIT, textSize);
909 textBounds.width = bounds.width - (textBounds.x * 2.0f);
911 TextObject* pText = new (std::nothrow) TextObject();
912 SysTryReturn(NID_UI_CTRL, (pText != null), false, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
916 TextSimple* pSimpleText = new (std::nothrow) TextSimple((const_cast<wchar_t*>(text.GetPointer())), text.GetLength());
917 SysTryCatch(NID_UI_CTRL, (pSimpleText != null), (ret = false), E_OUT_OF_MEMORY, "[%s] Propagating.", GetErrorMessage(GetLastResult()));
919 pText->AppendElement(*pSimpleText);
920 pText->SetAlignment(TEXT_OBJECT_ALIGNMENT_LEFT | TEXT_OBJECT_ALIGNMENT_TOP);
921 pText->SetWrap(TEXT_OBJECT_WRAP_TYPE_WORD);
922 pText->SetFont(GetFont(FONT_STYLE_PLAIN, textSize), 0, pText->GetTextLength());
923 pText->SetBounds(FloatRectangle(0.0f, 0.0f, textBounds.width, 1.0f));
926 textBounds.height = pText->GetTotalHeight();
928 __pDescriptionText->SetBounds(FloatRectangle(textBounds.x, bounds.height + textBounds.y, textBounds.width, textBounds.height));
929 __pDescriptionText->SetBackgroundColor(Color(0, 0, 0, 0));
930 __pDescriptionText->SetTextColor(__descriptionTextColor);
931 __pDescriptionText->SetTextConfig(textSize, LABEL_TEXT_STYLE_NORMAL);
932 __pDescriptionText->SetText(text);
942 _ListViewItem::SetDescriptionTextColor(const Color& color)
944 __descriptionTextColor = color;
948 _ListViewItem::GetDescriptionTextHeight(void)
950 if (__pDescriptionText != null)
953 GET_SHAPE_CONFIG(LISTVIEW::ITEM_DESCRIPTION_TEXT_TOP_MARGIN, _CONTROL_ORIENTATION_PORTRAIT, margin);
955 return ((margin * 2.0f) + __pDescriptionText->GetBoundsF().height);
962 _ListViewItem::SetDescriptionTextShowState(bool show)
964 if (__descriptionTextShowState != show)
966 __descriptionTextShowState = show;
968 if (__pDescriptionText != null)
970 __pDescriptionText->SetVisibleState(__descriptionTextShowState);
972 FloatDimension itemDimension = GetSizeF();
973 float descriptionTextHeight = GetDescriptionTextHeight();
975 itemDimension.height += ((__descriptionTextShowState) ? (descriptionTextHeight) : (-descriptionTextHeight));
977 // Set position & item height
978 SetItemCustomHeight((__descriptionTextShowState ? (itemDimension.height - descriptionTextHeight) : 0.0f));
979 SetItemHeight(itemDimension.height);
981 SetSize(itemDimension);
983 if (__pAccessibilityElement != null)
985 SetAccessibilityElement();
992 _ListViewItem::SetContextItemEventListener(_IActionEventListener& listener)
994 __pContextItemEventListener = &listener;
998 _ListViewItem::SetContextItemActivationState(bool activate)
1000 _ListViewContextItem* pContextItem = static_cast<_ListViewContextItem*>(GetContextItem());
1002 if ((pContextItem != null) && (__pContextItemEventListener != null))
1006 pContextItem->AddContextItemEventListener(*__pContextItemEventListener);
1007 __isContextItemListenerActivated = true;
1011 pContextItem->RemoveContextItemEventListener(*__pContextItemEventListener);
1012 __isContextItemListenerActivated = false;
1018 _ListViewItem::OnTouchPressed(const _Control& source, const _TouchInfo& touchinfo)
1020 if ((&source != this) && (source.GetParent() != this))
1025 if (IsTouchPressOnScroll())
1030 ClearLastStateChangedInfo();
1031 StopTextSlideTimer();
1033 FloatPoint pos = touchinfo.GetCurrentPosition();
1034 __prevTouchPos.SetPosition(pos.x, pos.y);
1036 __selectedElementId = GetElementIdFromPosition(pos);
1038 _ListViewItemElement* pElement = GetElement(__selectedElementId);
1040 if (pElement != null)
1042 if ((pElement->actionElement) && (pElement->selectionEnabled))
1044 __selectionEabled = true;
1047 if (pElement->elementType == LISTVIEW_ITEM_ELEMENT_TEXT)
1049 SetCutlinkTextFocus(pos);
1051 if (pElement->pTextElement->textSlidingEnabled)
1053 pElement->pTextElement->pTextObject->SetAction(TEXT_OBJECT_ACTION_TYPE_SLIDE_LEFT);
1054 pElement->pTextElement->pTextObject->Compose();
1056 if (pElement->pTextElement->pTextObject->IsActionOn())
1058 StartTextSlideTimer();
1064 __touchPressed = true;
1065 __touchEnabled = true;
1067 SetLastStateChangedInfo();
1069 _TableViewItem::OnTouchPressed(source, touchinfo);
1071 // for do not occur annex selection.
1072 if (__selectionEabled)
1074 StopTouchPressedTimer();
1075 SetSelectionState(false);
1077 RefreshElement(__selectedElementId);
1084 _ListViewItem::OnTouchReleased(const _Control& source, const _TouchInfo& touchinfo)
1086 if ((&source != this) && (source.GetParent() != this))
1091 if (IsTouchPressOnScroll())
1093 SetTouchPressOnScroll(false);
1097 FloatPoint pos = touchinfo.GetCurrentPosition();
1098 __prevTouchPos.SetPosition(pos.x, pos.y);
1100 __touchPressed = false;
1101 __touchEnabled = false;
1104 ResetCutlinkFocus();
1106 _TableViewItem::OnTouchReleased(source, touchinfo);
1108 if (__selectionEabled)
1110 __selectionEabled = false;
1113 RefreshElement(__selectedElementId);
1115 bool enabled = SetItemTapSoundEnabled(false);
1117 SetItemTapSoundEnabled(enabled);
1120 __selectedElementId = -1;
1126 _ListViewItem::OnTouchMoved(const _Control& source, const _TouchInfo& touchinfo)
1128 FloatPoint pos = touchinfo.GetCurrentPosition();
1129 __prevTouchPos.SetPosition(pos.x, pos.y);
1131 if (IsTouchPressOnScroll())
1133 SetTouchPressOnScroll(false);
1138 ClearLastStateChangedInfo();
1143 __selectedElementId = -1;
1144 __selectionEabled = false;
1145 __touchPressed = false;
1147 _TableViewItem::OnTouchMoved(source, touchinfo);
1153 _ListViewItem::OnTouchCanceled(const _Control& source, const _TouchInfo& touchinfo)
1155 FloatPoint pos = touchinfo.GetCurrentPosition();
1156 __prevTouchPos.SetPosition(pos.x, pos.y);
1160 __selectedElementId = -1;
1161 __selectionEabled = false;
1162 __touchPressed = false;
1163 __touchEnabled = false;
1165 _TableViewItem::OnTouchCanceled(source, touchinfo);
1171 _ListViewItem::OnDraw(void)
1173 bool needDraw = IsItemChanged();
1175 _TableViewItem::OnDraw();
1185 _ListViewItem::OnBoundsChanging(const FloatRectangle& bounds)
1187 FloatDimension currentSize = GetSizeF();
1189 if (!_FloatCompare(currentSize.width, bounds.width) || !_FloatCompare(currentSize.height, bounds.height))
1191 __needAlignContextItem = true;
1198 _ListViewItem::OnBoundsChanged(void)
1200 _TableViewItem::OnBoundsChanged();
1202 if (__needAlignContextItem)
1204 _ListViewContextItem* pContextItem = static_cast<_ListViewContextItem*>(GetContextItem());
1206 if (pContextItem != null)
1208 FloatRectangle bounds = GetBoundsF();
1209 pContextItem->AdjustItemBounds(bounds);
1211 __needAlignContextItem = false;
1217 _ListViewItem::SetItemDrawingStatus(ListViewItemDrawingStatus status)
1219 TableViewItemDrawingStatus parentStatus = TABLE_VIEW_ITEM_DRAWING_STATUS_NORMAL;
1223 case LISTVIEW_ITEM_STATUS_PRESSED:
1224 parentStatus = TABLE_VIEW_ITEM_DRAWING_STATUS_PRESSED;
1227 case LISTVIEW_ITEM_STATUS_HIGHLIGHTED:
1228 parentStatus = TABLE_VIEW_ITEM_DRAWING_STATUS_HIGHLIGHTED;
1232 parentStatus = TABLE_VIEW_ITEM_DRAWING_STATUS_NORMAL;
1236 SetDrawingStatus(parentStatus);
1239 ListViewItemDrawingStatus
1240 _ListViewItem::GetItemDrawingStatus(void)
1242 TableViewItemDrawingStatus parentStatus = GetDrawingStatus();
1244 switch (parentStatus)
1246 case TABLE_VIEW_ITEM_DRAWING_STATUS_PRESSED:
1247 return LISTVIEW_ITEM_STATUS_PRESSED;
1249 case TABLE_VIEW_ITEM_DRAWING_STATUS_HIGHLIGHTED:
1250 return LISTVIEW_ITEM_STATUS_HIGHLIGHTED;
1253 return LISTVIEW_ITEM_STATUS_NORMAL;
1258 _ListViewItem::DrawElement(_ListViewItemElement* pElement)
1260 // Get Current TableViewItem drawing status
1261 ListViewItemDrawingStatus status = GetItemDrawingStatus();
1262 FloatRectangle elementRect;
1264 // Check element selection enabled
1265 if (status != LISTVIEW_ITEM_STATUS_NORMAL)
1267 if (__selectedElementId == -1)
1269 if ((pElement->actionElement) && (pElement->selectionEnabled))
1271 status = LISTVIEW_ITEM_STATUS_NORMAL;
1274 else if (__selectedElementId != pElement->elementId)
1276 bool enabled = false;
1277 if (GetElementSelectionEnabled(__selectedElementId, enabled) && enabled)
1279 status = LISTVIEW_ITEM_STATUS_NORMAL;
1281 else if ((pElement->actionElement) && (pElement->selectionEnabled))
1283 status = LISTVIEW_ITEM_STATUS_NORMAL;
1289 if ((__selectedElementId == pElement->elementId) && __selectionEabled)
1291 status = LISTVIEW_ITEM_STATUS_PRESSED;
1295 Canvas* pCanvas = null;
1297 switch (pElement->elementType)
1299 case LISTVIEW_ITEM_ELEMENT_TEXT:
1300 DrawText(pElement->bounds, status, pElement->pTextElement);
1303 case LISTVIEW_ITEM_ELEMENT_BITMAP:
1304 DrawBitmap(pElement->bounds, status, pElement->pBitmapElement);
1307 case LISTVIEW_ITEM_ELEMENT_OBJ:
1308 pCanvas = pElement->pCustomElement->pVE->GetCanvasN();
1310 if (pCanvas != null)
1312 pCanvas->SetBackgroundColor(Color(0, 0, 0, 0));
1314 elementRect.SetBounds(0.0f, 0.0f, pElement->bounds.width, pElement->bounds.height);
1316 pElement->pCustomElement->pCustom->DrawElement(pCanvas, elementRect, status);
1328 _ListViewItem::DrawElements(void)
1330 _LinkedList <_ListViewItemElement>::_Iterator iter;
1332 for (iter = __elements.begin(); iter != __elements.end(); iter++)
1334 DrawElement(&(*iter));
1339 _ListViewItem::DrawText(FloatRectangle& rect, ListViewItemDrawingStatus status, _ListViewItemElementText* pText)
1341 SysTryReturn(NID_UI_CTRL, (pText != null), false, E_INVALID_ARG, "[E_INVALID_ARG] This Text element is null.");
1343 FloatRectangle bounds(rect.x, rect.y, rect.width, rect.height);
1345 if (pText->pVE->GetParent() == null)
1347 GetVisualElement()->AttachChild(*(pText->pVE));
1348 pText->pVE->SetShowState(true);
1351 if (pText->textSize > 0)
1353 pText->pTextObject->SetFont(GetFont(FONT_STYLE_PLAIN, pText->textSize), 0, pText->pTextObject->GetTextLength());
1356 // Calculate Text element bounds
1357 if (pText->pEnrichedText == null)
1359 FloatDimension textDimension = pText->pTextObject->GetTextExtentF(0, pText->pTextObject->GetTextLength());
1360 textDimension.height += 2.0f;
1361 TextObjectAlignment textAlign = pText->pTextObject->GetAlignment();
1363 if (__itemType == LISTVIEW_ITEM_TYPE_CUSTOM)
1365 if (textDimension.width < bounds.width)
1367 bounds.width = textDimension.width;
1369 if ((0x0007 & textAlign) == TEXT_OBJECT_ALIGNMENT_CENTER)
1371 bounds.x = rect.x + ((rect.width - bounds.width) / 2.0f);
1373 else if ((0x0007 & textAlign) == TEXT_OBJECT_ALIGNMENT_RIGHT)
1375 bounds.x = rect.x + (rect.width - bounds.width);
1378 if (textDimension.height < bounds.height)
1380 bounds.height = textDimension.height;
1382 if ((0x0700 & textAlign) == TEXT_OBJECT_ALIGNMENT_MIDDLE)
1384 bounds.y = rect.y + ((rect.height - bounds.height) / 2.0f);
1386 else if ((0x0700 & textAlign) == TEXT_OBJECT_ALIGNMENT_BOTTOM)
1388 bounds.y = rect.y + (rect.height - bounds.height);
1394 FloatDimension itemDimension = GetSizeF();
1396 if ((itemDimension.width < (bounds.x + bounds.width)) || (itemDimension.height < (bounds.y + bounds.height))
1397 || !_FloatCompare(bounds.width, textDimension.width) || !_FloatCompare(bounds.height, textDimension.height))
1399 TableViewAnnexStyle style = GetItemStyle();
1400 float annexWidth = 0.0f;
1401 float margin = 0.0f;
1403 GET_SHAPE_CONFIG(LISTVIEW::ITEM_ELEMENT_LEFT_MARGIN, _CONTROL_ORIENTATION_PORTRAIT, margin);
1405 if ((style == TABLE_VIEW_ANNEX_STYLE_DETAILED) || (style == TABLE_VIEW_ANNEX_STYLE_ONOFF_SLIDING)
1406 || (style == TABLE_VIEW_ANNEX_STYLE_ONOFF_SLIDING_WITH_DIVIDER))
1408 annexWidth = _TableViewItem::GetAnnexWidth(style);
1411 // initialize element width
1412 bounds.width = GetSize().width - bounds.x - annexWidth - margin;
1415 bounds.y = rect.y + ((rect.height - textDimension.height) / 2.0f);
1416 bounds.width = (bounds.width > textDimension.width) ? textDimension.width : bounds.width;
1417 bounds.height = textDimension.height;
1424 pText->pVE->SetBounds(bounds);
1426 // Check to EnrichedText contains Cutlink
1427 if ((pText->pEnrichedText != null) && (pText->cutlinkViewModeEnabled) && (pText->cutlinkParseEnabled)
1428 && (pText->pTextObject->GetTotalCutLinkElementCount() <= 0))
1430 if (ParseCutlinkText(pText))
1432 pText->pTextObject->SetCutLinkViewMode(true);
1435 else if (pText->pEnrichedText == null)
1437 if (IsItemEnabled())
1439 pText->pTextObject->SetForegroundColor(pText->textColor[status], 0, pText->pTextObject->GetTextLength());
1443 Color disableTextColor;
1444 GET_COLOR_CONFIG(TABLEVIEW::ITEM_TEXT_DISABLED, disableTextColor);
1446 pText->pTextObject->SetForegroundColor(disableTextColor, 0, pText->pTextObject->GetTextLength());
1450 pText->pTextObject->SetAction(TEXT_OBJECT_ACTION_TYPE_ABBREV);
1451 pText->pTextObject->SetBounds(FloatRectangle(0.0f, 0.0f, bounds.width, bounds.height));
1453 Canvas* pCanvas = pText->pVE->GetCanvasN();
1454 SysTryReturn(NID_UI_CTRL, (pCanvas != null), false, GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
1456 pCanvas->SetBackgroundColor(Color(0, 0, 0, 0));
1459 pText->pTextObject->Draw(*_CanvasImpl::GetInstance(*pCanvas));
1467 _ListViewItem::DrawBitmap(FloatRectangle& rect, ListViewItemDrawingStatus status, _ListViewItemElementBitmap* pBitmap)
1469 SysTryReturn(NID_UI_CTRL, (pBitmap != null), false, E_INVALID_ARG, "[E_INVALID_ARG] This Bitmap element is null.");
1471 Bitmap* pDrawBitmap = pBitmap->pBitmap[status];
1472 if ((pDrawBitmap == null) && (status != LISTVIEW_ITEM_STATUS_NORMAL))
1474 pDrawBitmap = pBitmap->pBitmap[LISTVIEW_ITEM_STATUS_NORMAL];
1477 SysTryReturn(NID_UI_CTRL, (pDrawBitmap != null), false, E_INVALID_ARG, "[E_INVALID_ARG] This Bitmap element is null.");
1479 if (pBitmap->pVE->GetParent() == null)
1481 GetVisualElement()->AttachChild(*(pBitmap->pVE));
1482 pBitmap->pVE->SetShowState(true);
1485 pBitmap->pVE->SetBounds(rect);
1487 bool isNinePatchedBitmap = _BitmapImpl::CheckNinePatchedBitmapStrictly(*pDrawBitmap);
1488 String imagePath = _BitmapImpl::GetInstance(*pDrawBitmap)->GetFileName();
1490 if (!isNinePatchedBitmap && !imagePath.IsEmpty())
1492 pBitmap->pVE->SetBackgroundColor(_Colorf(0.0f, 0.0f, 0.0f, 0.0f));
1493 pBitmap->pVE->SetImageSource(imagePath);
1497 pBitmap->pVE->SetImageSource(L"");
1499 Canvas* pCanvas = pBitmap->pVE->GetCanvasN();
1500 SysTryReturn(NID_UI_CTRL, (pCanvas != null), false, GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
1502 pCanvas->SetBackgroundColor(Color(0, 0, 0, 0));
1505 if (isNinePatchedBitmap)
1507 pCanvas->DrawNinePatchedBitmap(FloatRectangle(0.0f, 0.0f, rect.width, rect.height), *pDrawBitmap);
1511 pCanvas->DrawBitmap(FloatRectangle(0.0f, 0.0f, rect.width, rect.height), *pDrawBitmap);
1521 _ListViewItem::DrawDivider(void)
1523 if ((__itemType == LISTVIEW_ITEM_TYPE_GROUP) && (GetItemBackgroundBitmap(LIST_ITEM_STATE_NORMAL) == null))
1525 float lineHeight = 0.0f;
1526 float lineLeftMargin = 0.0f;
1527 float lineBottomMargin = 0.0f;
1528 float lineTopMargin = 0.0f;
1529 GET_SHAPE_CONFIG(LISTVIEW::GROUPITEM_DIVIDER_HEIGHT, _CONTROL_ORIENTATION_PORTRAIT, lineHeight);
1530 GET_SHAPE_CONFIG(LISTVIEW::GROUPITEM_DIVIDER_LEFT_MARGIN, _CONTROL_ORIENTATION_PORTRAIT, lineLeftMargin);
1531 GET_SHAPE_CONFIG(LISTVIEW::GROUPITEM_DIVIDER_BOTTOM_MARGIN, _CONTROL_ORIENTATION_PORTRAIT, lineBottomMargin);
1533 FloatRectangle textBounds;
1534 FloatRectangle bitmapBounds;
1535 _ListViewItemElementText* pElementText = GetElementText(LIST_ITEM_RESERVED_ID_3);
1536 _ListViewItemElementBitmap* pElementBitmap = GetElementBitmap(LIST_ITEM_RESERVED_ID_2);
1538 if ((pElementText != null) && (pElementText->pVE != null))
1540 textBounds = pElementText->pVE->GetBounds();
1543 if ((pElementBitmap != null) && (pElementBitmap->pVE != null))
1545 bitmapBounds = pElementBitmap->pVE->GetBounds();
1548 float textBottomPos = textBounds.y + textBounds.height;
1549 float bitmapBottomPos = bitmapBounds.y + bitmapBounds.height;
1551 lineTopMargin = (textBottomPos > bitmapBottomPos) ? textBottomPos : bitmapBottomPos;
1553 FloatRectangle bounds = GetBoundsF();
1554 float defaultMargin = bounds.height - lineBottomMargin;
1555 lineTopMargin = (lineTopMargin > defaultMargin) ? lineTopMargin : defaultMargin;
1557 if (bounds.height <= lineTopMargin)
1562 if (__pDivider == null)
1564 __pDivider = _Label::CreateLabelN();
1565 SysTryReturnVoidResult(NID_UI_CTRL, __pDivider != null, E_OUT_OF_MEMORY, "[%s] Propagating.", GetErrorMessage(GetLastResult()));
1567 AttachSystemChild(*__pDivider);
1569 _AccessibilityContainer* pContainer = __pDivider->GetAccessibilityContainer();
1570 if (pContainer != null)
1572 pContainer->Activate(false);
1576 Color underLineColor;
1577 GET_COLOR_CONFIG(TABLEVIEW::GROUPITEM_INDEX_BAR_NORMAL, underLineColor);
1579 __pDivider->SetBounds(FloatRectangle(lineLeftMargin, lineTopMargin, bounds.width - lineLeftMargin * 2.0f, lineHeight));
1580 __pDivider->SetBackgroundColor(underLineColor);
1581 __pDivider->Invalidate();
1586 _ListViewItem::StartTextSlideTimer(void)
1588 result r = E_SUCCESS;
1590 if (__pTextSlideTimer == null)
1592 __pTextSlideTimer = new (std::nothrow) Timer();
1594 r = __pTextSlideTimer->Construct(*this);
1595 SysTryCatch(NID_UI, (r == E_SUCCESS), ,E_SYSTEM, ("[E_SYSTEM] Timer cannot construct."));
1599 __pTextSlideTimer->Cancel();
1602 r = __pTextSlideTimer->Start(TEXT_SLIDING_TIMER_DURATION);
1603 SysTryCatch(NID_UI, (r == E_SUCCESS), , E_SYSTEM, ("[E_SYSTEM] Timer Start failed."));
1608 StopTextSlideTimer();
1612 _ListViewItem::StopTextSlideTimer(void)
1614 delete __pTextSlideTimer;
1615 __pTextSlideTimer = null;
1619 _ListViewItem::IsTextSlideTimerRunning(void)
1621 return (__pTextSlideTimer != null);
1625 _ListViewItem::OnTextSlideTimerExpired(void)
1627 if (__selectedElementId != -1)
1629 _ListViewItemElement* pElement = GetElement(__selectedElementId);
1631 if ((pElement != null) && (pElement->pTextElement->pTextObject != null))
1633 TextObject* pTextObject = pElement->pTextElement->pTextObject;
1635 Canvas* pCanvas = (pElement->pTextElement->pVE)->GetCanvasN();
1636 SysTryReturnVoidResult(NID_UI_CTRL, (pCanvas != null), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
1638 pCanvas->SetBackgroundColor(Color(0, 0, 0, 0));
1641 pTextObject->SetForegroundColor(pElement->pTextElement->textColor[LISTVIEW_ITEM_STATUS_PRESSED], 0, pTextObject->GetTextLength());
1642 pTextObject->SetAction(TEXT_OBJECT_ACTION_TYPE_SLIDE_LEFT);
1643 pTextObject->Compose();
1644 if (pTextObject->DrawWithOffset(*_CanvasImpl::GetInstance(*pCanvas)) == E_SUCCESS)
1646 pCanvas->Show(_CoordinateSystemUtils::ConvertToInteger(pElement->bounds));
1647 StartTextSlideTimer();
1661 _ListViewItem::ResetTextSlide(void)
1663 if (IsTextSlideTimerRunning())
1665 StopTextSlideTimer();
1667 _ListViewItemElement* pElement = GetElement(__selectedElementId);
1669 if ((pElement != null) && (pElement->pTextElement->pTextObject != null))
1671 pElement->pTextElement->pTextObject->SetAction(TEXT_OBJECT_ACTION_TYPE_ABBREV);
1672 pElement->pTextElement->pTextObject->SetForegroundColor(pElement->pTextElement->textColor[LISTVIEW_ITEM_STATUS_NORMAL],
1673 0, pElement->pTextElement->pTextObject->GetTextLength());
1679 _ListViewItem::OnTimerExpired(Timer& timer)
1681 _TableViewItem::OnTimerExpired(timer);
1683 if (&timer == __pTextSlideTimer)
1685 OnTextSlideTimerExpired();
1690 _ListViewItem::ParseCutlinkText(_ListViewItemElementText* pElementText)
1692 if ((pElementText == null) || (pElementText->pEnrichedText == null))
1697 TextObject* pTextObject = pElementText->pTextObject;
1698 unsigned long cutlinkMaskType = pElementText->cutlinkMaskType;
1699 TextLinkInfo* pTextLinkInfo = null;
1700 TextLinkInfo* pNextLinkInfo = null;
1701 int currentOffset = 0;
1702 bool isChangingCutlink = false;
1703 wchar_t* pCutlinkString = null;
1706 int strLength = pTextObject->GetTextLength();
1707 wchar_t* pStr = new (std::nothrow) wchar_t[strLength + 1];
1708 SysTryReturn(NID_UI, (pStr != null), false, E_OUT_OF_MEMORY, ("[E_OUT_OF_MEMORY] The memory is insufficient."));
1710 pTextObject->GetText(pStr, strLength);
1712 TextCutLinkParser* pParser = new (std::nothrow) TextCutLinkParser();
1713 SysTryCatch(NID_UI, (pParser != null), (ret = false), E_OUT_OF_MEMORY, ("[E_OUT_OF_MEMORY] The memory is insufficient."));
1715 pParser->SetCutLinkMask(cutlinkMaskType);
1717 pTextLinkInfo = pParser->Parse(pStr, strLength, 0);
1718 SysTryCatch(NID_UI, (pTextLinkInfo != null), (ret = false), E_SYSTEM, ("[E_SYSTEM] TextLinkInfo is not valid."));
1720 // remove all text element in _EnrichedTextImpl
1721 pElementText->pEnrichedText->RemoveAllTextElements(true);
1722 //pTextObject->RemoveAll(true);
1724 while (pTextLinkInfo != null)
1726 isChangingCutlink = false;
1728 switch (pTextLinkInfo->linkType)
1731 if (cutlinkMaskType & LINK_TYPE_URL)
1733 isChangingCutlink = true;
1737 case LINK_TYPE_EMAIL:
1738 if (cutlinkMaskType & LINK_TYPE_EMAIL)
1740 isChangingCutlink = true;
1744 case LINK_TYPE_TEL_NUM:
1745 if (cutlinkMaskType & LINK_TYPE_TEL_NUM)
1747 isChangingCutlink = true;
1751 case LINK_TYPE_APPCONTROL:
1752 if (cutlinkMaskType & LINK_TYPE_APPCONTROL)
1754 isChangingCutlink = true;
1758 case LINK_TYPE_MIME:
1759 if (cutlinkMaskType & LINK_TYPE_MIME)
1761 isChangingCutlink = true;
1769 pCutlinkString = new (std::nothrow) wchar_t[pTextLinkInfo->length + 1];
1771 if (pCutlinkString == null)
1773 while (pTextLinkInfo != null)
1775 pNextLinkInfo = pTextLinkInfo->pNextLinkInfo;
1776 delete pTextLinkInfo;
1777 pTextLinkInfo = pNextLinkInfo;
1779 SysTryCatch(NID_UI, (pTextLinkInfo != null), (ret = false), E_SYSTEM, ("[E_SYSTEM] TextLinkInfo is not valid."));
1782 for (int i = 0; i < pTextLinkInfo->length; i++)
1784 pCutlinkString[i] = pStr[pTextLinkInfo->srcOffset + i];
1787 pCutlinkString[pTextLinkInfo->length] = null;
1789 if (currentOffset < pTextLinkInfo->srcOffset)
1791 TextSimple* pSimpleText = new (std::nothrow) TextSimple(pStr + currentOffset, pTextLinkInfo->srcOffset - currentOffset);
1792 pTextObject->AppendElement(*pSimpleText);
1795 if (isChangingCutlink == true)
1797 TextCutLink* pTextElement = new (std::nothrow) TextCutLink(false, pTextLinkInfo->linkType, pStr + pTextLinkInfo->srcOffset,
1798 pTextLinkInfo->length);
1799 pTextElement->SetEditModeEnable(true);
1800 pTextObject->AppendElement(*pTextElement);
1804 TextSimple* pSimpleText = new (std::nothrow) TextSimple(pCutlinkString, pTextLinkInfo->length);
1805 pTextObject->AppendElement(*pSimpleText);
1808 currentOffset = pTextLinkInfo->srcOffset + pTextLinkInfo->length;
1810 pNextLinkInfo = pTextLinkInfo->pNextLinkInfo;
1811 delete pTextLinkInfo;
1812 pTextLinkInfo = pNextLinkInfo;
1814 delete[] pCutlinkString;
1815 pCutlinkString = null;
1818 if (strLength != currentOffset)
1820 TextSimple* pSimpleText = new (std::nothrow) TextSimple(pStr + currentOffset, strLength - currentOffset);
1821 pTextObject->AppendElement(*pSimpleText);
1824 //pTextObject->SetRange(0, pTextObject->GetLength());
1825 //pTextObject->NotifyTextChanged(0, pTextObject->GetLength());
1826 pTextObject->Compose();
1842 _ListViewItem::IsCutlinkTextSelected(const FloatPoint& position, int* index, _ListViewItemUiLinkInfo** ppInfo) const
1844 int elementId = GetElementIdFromPosition(position);
1845 _ListViewItemElementText* pElement = GetElementText(elementId);
1847 if ((pElement != null) && (pElement->pTextObject) && (pElement->cutlinkViewModeEnabled))
1849 TextObject* pTextObject = pElement->pTextObject;
1850 FloatRectangle displayRect = pTextObject->GetBoundsF();
1851 int selectedIndex = pTextObject->GetCutLinkIndexFromPositionData(position.x - displayRect.x, position.y - displayRect.y);
1853 if (selectedIndex >= 0)
1855 *index = selectedIndex;
1856 TextCutLink* pCutLinkObject = dynamic_cast<TextCutLink*>(pTextObject->GetCutLinkElementAtCutLinkElementIndex(selectedIndex));
1857 if (pCutLinkObject == null)
1862 String cutLinkString(pCutLinkObject->GetText());
1863 LinkType baseLinkType = pCutLinkObject->GetCutLinkType();
1865 if (baseLinkType & pElement->cutlinkMaskType)
1867 _ListViewItemUiLinkInfo* pUiLinkInfo = new (std::nothrow) _ListViewItemUiLinkInfo();
1869 pUiLinkInfo->textInfo = cutLinkString;
1870 pUiLinkInfo->linkType = baseLinkType;
1871 pUiLinkInfo->linkInfo = cutLinkString;
1873 *ppInfo = pUiLinkInfo;
1884 _ListViewItem::SetCutlinkTextFocus(const FloatPoint& position)
1886 int elementId = GetElementIdFromPosition(position);
1887 _ListViewItemElementText* pElement = GetElementText(elementId);
1889 if ((pElement != null) && (pElement->pTextObject != null) && (pElement->cutlinkViewModeEnabled))
1891 TextObject* pTextObject = pElement->pTextObject;
1892 FloatRectangle displayRect = pTextObject->GetBoundsF();
1894 int index = pTextObject->GetCutLinkIndexFromPositionData(position.x - displayRect.x, position.y - displayRect.y);
1898 pTextObject->ChangeCutLinkState(index, true);
1907 _ListViewItem::ResetCutlinkFocus(void)
1909 _LinkedList <_ListViewItemElement>::_Iterator iter;
1911 for (iter = __elements.begin(); iter != __elements.end(); iter++)
1913 if ((iter->elementType == LISTVIEW_ITEM_ELEMENT_TEXT) && (iter->pTextElement->pTextObject))
1915 iter->pTextElement->pTextObject->ResetAllCutLinkElementsState();
1923 _ListViewItem::GetFont(unsigned long fontStyle, float fontSize)
1925 __fontStyle = fontStyle;
1926 __fontSize = fontSize;
1928 return GetFallbackFont();
1932 _ListViewItem::OnFontChanged(Font* pFont)
1934 __fontName = _Control::GetFont();
1936 if (__pDescriptionText != null)
1938 __pDescriptionText->SetFont(__fontName);
1941 if (GetContextItem() != null)
1943 GetContextItem()->SetFont(__fontName);
1948 _ListViewItem::OnFontInfoRequested(unsigned long& style, int& size)
1950 style = __fontStyle;
1951 size = _CoordinateSystemUtils::ConvertToInteger(__fontSize);
1955 _ListViewItem::OnFontInfoRequested(unsigned long& style, float& size)
1957 style = __fontStyle;
1962 CompareAccessibilityElement(_ListViewItemElement* a, _ListViewItemElement* b)
1964 if (_FloatCompare(a->bounds.y, b->bounds.y))
1966 return (a->bounds.x < b->bounds.x);
1969 return (a->bounds.y < b->bounds.y);
1973 _ListViewItem::SetAccessibilityElement(void)
1975 _AccessibilityContainer* pContainer = GetAccessibilityContainer();
1977 if (pContainer != null)
1979 if (__pAccessibilityElement == null)
1981 __pAccessibilityElement = new (std::nothrow) _AccessibilityElement(true);
1982 SysTryReturnVoidResult(NID_UI_CTRL, (__pAccessibilityElement != null), E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
1984 pContainer->AddElement(*__pAccessibilityElement);
1987 __pAccessibilityElement->SetBounds(FloatRectangle(0.0f, 0.0f, GetBoundsF().width, GetBoundsF().height));
1991 _ListViewItem::SetAccessibilityElementTrait(void)
1993 if(__pAccessibilityElement == null)
1997 int groupIndex = -1;
2000 switch (GetItemStyle())
2002 case TABLE_VIEW_ANNEX_STYLE_NORMAL:
2003 GetItemIndex(groupIndex, itemIndex);
2004 if(groupIndex != -1 && itemIndex == -1)
2006 __pAccessibilityElement->SetTraitWithStringId("IDS_TPLATFORM_BODY_GROUP_INDEX");
2010 case TABLE_VIEW_ANNEX_STYLE_MARK:
2011 __pAccessibilityElement->SetTraitWithStringId("IDS_TPLATFORM_BODY_TICKBOX_T_TTS");
2014 case TABLE_VIEW_ANNEX_STYLE_ONOFF_SLIDING:
2015 case TABLE_VIEW_ANNEX_STYLE_ONOFF_SLIDING_WITH_DIVIDER:
2016 __pAccessibilityElement->SetTraitWithStringId("IDS_TPLATFORM_BODY_ON_OFF_BUTTON_T_TTS");
2019 case TABLE_VIEW_ANNEX_STYLE_DETAILED:
2020 __pAccessibilityElement->SetTraitWithStringId("IDS_TPLATFORM_BODY_BUTTON_T_TTS");
2023 case TABLE_VIEW_ANNEX_STYLE_RADIO:
2024 __pAccessibilityElement->SetTraitWithStringId("IDS_TPLATFORM_BODY_RADIO_BUTTON_T_TTS");
2032 _ListViewItem::SetAccessibilityElementValue(void)
2034 if(__pAccessibilityElement == null)
2039 switch (GetItemStyle())
2041 case TABLE_VIEW_ANNEX_STYLE_MARK:
2044 __pAccessibilityElement->SetValueWithStringId("IDS_TPLATFORM_BODY_TICK_T_TTS");
2048 __pAccessibilityElement->SetValueWithStringId("IDS_TPLATFORM_BODY_UNTICK_T_TTS");
2052 case TABLE_VIEW_ANNEX_STYLE_ONOFF_SLIDING:
2053 case TABLE_VIEW_ANNEX_STYLE_ONOFF_SLIDING_WITH_DIVIDER:
2056 __pAccessibilityElement->SetValueWithStringId("IDS_TPLATFORM_BODY_ON");
2060 __pAccessibilityElement->SetValueWithStringId("IDS_TPLATFORM_BODY_OFF");
2064 case TABLE_VIEW_ANNEX_STYLE_RADIO:
2067 __pAccessibilityElement->SetValueWithStringId("IDS_TPLATFORM_BODY_SELECTED_T_TTS");
2071 __pAccessibilityElement->SetValue(L"Unselected");
2080 _ListViewItem::SetAccessibilityElementLabel(void)
2082 if(__pAccessibilityElement == null)
2086 if(__pAccessibilityElement->GetLabel().GetLength() > 0)
2090 _LinkedList <_ListViewItemElement*> accessibilityElementList;
2091 _LinkedList <_ListViewItemElement>::_Iterator iter;
2092 _LinkedList <_ListViewItemElement*>::_Iterator accessibilityIter;
2093 _ListViewItemElement* pElement = null;
2094 String accessibilityName;
2095 String accessibilityLabel;
2096 int groupIndex = -1;
2099 // accessibility element name
2100 GetItemIndex(groupIndex, itemIndex);
2102 if (__itemType == LISTVIEW_ITEM_TYPE_GROUP)
2104 accessibilityName = L"GroupIndex" + Integer::ToString(groupIndex);
2108 accessibilityName = L"ListViewItem" + Integer::ToString(groupIndex) + L"_" + Integer::ToString(itemIndex);
2111 // accessibility element label
2112 for (iter = __elements.begin(); iter != __elements.end(); iter++)
2114 if ((iter->elementType == LISTVIEW_ITEM_ELEMENT_TEXT) || (iter->elementType == LISTVIEW_ITEM_ELEMENT_BITMAP))
2116 accessibilityElementList.push_back(&(*iter));
2120 accessibilityElementList.sort(CompareAccessibilityElement);
2122 for (accessibilityIter = accessibilityElementList.begin(); accessibilityIter != accessibilityElementList.end(); accessibilityIter++)
2124 pElement = *accessibilityIter;
2126 if (pElement->elementType == LISTVIEW_ITEM_ELEMENT_TEXT)
2128 int textLength = pElement->pTextElement->pTextObject->GetTextLength();
2132 wchar_t* pAccessibilityText = new (std::nothrow) wchar_t[textLength + 1];
2133 SysTryReturnVoidResult(NID_UI_CTRL, (pAccessibilityText != null), E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
2135 pElement->pTextElement->pTextObject->GetText(pAccessibilityText, textLength);
2137 accessibilityLabel += String(pAccessibilityText);
2138 accessibilityLabel += L", ";
2140 delete[] pAccessibilityText;
2143 else if (pElement->elementType == LISTVIEW_ITEM_ELEMENT_BITMAP)
2145 accessibilityLabel += L"Icon, ";
2149 accessibilityElementList.clear();
2151 if (accessibilityLabel.IsEmpty())
2153 accessibilityLabel = L"ListViewItem";
2156 if (__descriptionTextShowState)
2158 String descriptionText = __pDescriptionText->GetText();
2159 accessibilityLabel += ((descriptionText.GetLength() > 0) ? (L", " + descriptionText + L"") : L"");
2161 __pAccessibilityElement->SetName(accessibilityName);
2162 __pAccessibilityElement->SetLabel(accessibilityLabel);
2166 _ListViewItem::OnAttachedToMainTree(void)
2168 if((GetParent() != null) && (GetParent()->GetAccessibilityContainer() != null))
2170 GetParent()->GetAccessibilityContainer()->AddChildContainer(*GetAccessibilityContainer());
2173 return _TableViewItem::OnAttachedToMainTree();
2177 _ListViewItem::OnDetachingFromMainTree(void)
2179 if((GetParent() != null) && (GetParent()->GetAccessibilityContainer() != null))
2181 GetParent()->GetAccessibilityContainer()->RemoveChildContainer(*GetAccessibilityContainer());
2184 return _Control::OnDetachingFromMainTree();
2187 _ListViewItemHitTestVEDelegator::_ListViewItemHitTestVEDelegator(void)
2191 _ListViewItemHitTestVEDelegator::~_ListViewItemHitTestVEDelegator(void)
2196 _ListViewItemHitTestVEDelegator::HitTest(VisualElement& target, const FloatPoint& point)
2198 return HIT_TEST_NOWHERE;
2201 }}} // Tizen::Ui::Controls