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 FUiCtrl_CustomListItemImpl.cpp
20 * @brief This file contains implementation of _CustomListItemImpl class
23 #include <FBaseSysLog.h>
24 #include <FGrp_BitmapImpl.h>
25 #include <FGrp_TextTextObject.h>
26 #include "FUiCtrl_CustomListItemImpl.h"
27 #include "FUiCtrl_CustomListItemFormatImpl.h"
28 #include "FUiCtrl_PanelImpl.h"
31 using namespace Tizen::Base;
32 using namespace Tizen::Graphics;
33 using namespace Tizen::Base::Collection;
34 using namespace Tizen::Base::Runtime;
35 using namespace Tizen::Graphics::_Text;
37 namespace Tizen { namespace Ui { namespace Controls
40 const int INVALID_INDEX = -1;
42 _TableViewItemData::_TableViewItemData(void)
48 _TableViewItemData::~_TableViewItemData(void)
53 _TableViewItemData::GetIndex(int& mainIndex, int& subIndex) const
55 mainIndex = groupIndex;
60 _TableViewItemData::SetEnabled(bool enable)
62 Control* pControl = null;
64 for (int count = 0; count < GetControlCount(); count++)
66 pControl = GetControl(count);
70 pControl->SetEnabled(enable);
77 _TableViewGroupItemData::_TableViewGroupItemData(void)
82 _TableViewGroupItemData::~_TableViewGroupItemData(void)
87 _TableViewGroupItemData::GetIndex(int& mainIndex, int& subIndex) const
89 mainIndex = groupIndex;
94 _TableViewGroupItemData::SetEnabled(bool enable)
96 Control* pControl = null;
98 for (int count = 0; count < GetControlCount(); count++)
100 pControl = GetControl(count);
104 pControl->SetEnabled(enable);
111 _CustomListItemImpl::_CustomListItemImpl(int itemHeight)
113 , itemId(LIST_ITEM_UNSPECIFIED_ID)
115 , __pTableViewItemData(null)
116 , __pTableViewGroupItemData(null)
117 , __pSubItemsList(null)
118 , __pTextSlideTimer(null)
121 for (int i = 0; i <= CUSTOM_LIST_ITEM_STATUS_FOCUSED; i++)
123 __pBitmaps[i] = null;
127 _CustomListItemImpl::~_CustomListItemImpl(void)
129 for (int i = 0; i <= CUSTOM_LIST_ITEM_STATUS_FOCUSED; i++)
131 delete __pBitmaps[i];
134 elements.RemoveAll(true);
138 _CustomListItemImpl::CreateInstanceN(int itemHeight)
140 _CustomListItemImpl* pImpl = new (std::nothrow) _CustomListItemImpl(itemHeight);
141 SysTryReturn(NID_UI_CTRL, pImpl, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
143 SetLastResult(E_SUCCESS);
148 _CustomListItemImpl::GetValue(void) const
150 return __percentValue;
154 _CustomListItemImpl::RemoveElement(int elementId)
156 _ElementBaseModel* pBaseModel = GetElementModelById(elementId);
157 elements.Remove(*pBaseModel, true);
161 _CustomListItemImpl::SetCheckBox(int elementId)
163 _CheckElementModel* pCheckElement = null;
164 _ElementBaseModel* pBaseModel = GetElementModelById(elementId);
166 if (pBaseModel && pBaseModel->_elementType != LIST_ITEM_ELEMENT_TYPE_CHECKBOX)
171 pCheckElement = new (std::nothrow) _CheckElementModel();
172 SysTryReturn(NID_UI_CTRL, pCheckElement, E_SYSTEM, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
174 pCheckElement->_elementId = elementId;
175 pCheckElement->_elementType = LIST_ITEM_ELEMENT_TYPE_CHECKBOX;
177 elements.Add(*pCheckElement);
182 _CustomListItemImpl::SetElement(int elementId, const Bitmap& normalBitmap, const Bitmap* pFocusedBitmap, const Bitmap* pHighlightedBitmap)
184 _ElementBaseModel* pBaseModel = GetElementModelById(elementId);
185 if (pBaseModel && pBaseModel->_elementType != LIST_ITEM_ELEMENT_TYPE_BITMAP)
187 RemoveElement(elementId);
190 result r = E_SUCCESS;
191 _BitmapElementModel* pBitmapElement = dynamic_cast<_BitmapElementModel*>(pBaseModel);
195 pBitmapElement = new (std::nothrow) _BitmapElementModel();
196 SysTryReturnResult(NID_UI_CTRL, pBitmapElement, E_OUT_OF_MEMORY, "Memory allocation failed.");
198 pBitmapElement->_elementId = elementId;
199 pBitmapElement->_elementType = LIST_ITEM_ELEMENT_TYPE_BITMAP;
200 elements.Add(*pBitmapElement);
204 delete pBitmapElement->__pBitmap[CUSTOM_LIST_ITEM_STATUS_NORMAL];
205 delete pBitmapElement->__pBitmap[CUSTOM_LIST_ITEM_STATUS_SELECTED];
206 delete pBitmapElement->__pBitmap[CUSTOM_LIST_ITEM_STATUS_FOCUSED];
209 pBitmapElement->__pBitmap[CUSTOM_LIST_ITEM_STATUS_NORMAL] = _BitmapImpl::CloneN(normalBitmap);
212 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, E_SYSTEM, r, "[%s] Propagating.", GetErrorMessage(r));
216 pBitmapElement->__pBitmap[CUSTOM_LIST_ITEM_STATUS_FOCUSED] = _BitmapImpl::CloneN(*pFocusedBitmap);
218 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, E_SYSTEM, r, "[%s] Propagating.", GetErrorMessage(r));
222 pBitmapElement->__pBitmap[CUSTOM_LIST_ITEM_STATUS_FOCUSED] = null;
225 if (pHighlightedBitmap)
227 pBitmapElement->__pBitmap[CUSTOM_LIST_ITEM_STATUS_SELECTED] = _BitmapImpl::CloneN(*pHighlightedBitmap);
229 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, E_SYSTEM, r, "[%s] Propagating.", GetErrorMessage(r));
233 pBitmapElement->__pBitmap[CUSTOM_LIST_ITEM_STATUS_SELECTED] = null;
240 _CustomListItemImpl::SetElement(int elementId, const String& text)
242 _ElementBaseModel* pBaseModel = GetElementModelById(elementId);
243 if (pBaseModel && pBaseModel->_elementType != LIST_ITEM_ELEMENT_TYPE_TEXT)
245 RemoveElement(elementId);
248 _TextElementModel* pTextElement = dynamic_cast<_TextElementModel*>(pBaseModel);
252 pTextElement = new (std::nothrow) _TextElementModel(text);
253 SysTryReturnResult(NID_UI_CTRL, pTextElement, E_OUT_OF_MEMORY, "Memory allocation failed.");
255 pTextElement->_elementType = LIST_ITEM_ELEMENT_TYPE_TEXT;
256 pTextElement->_elementId = elementId;
258 elements.Add(*pTextElement);
262 pTextElement->__text = text;
269 _CustomListItemImpl::SetElement(int elementId, const Bitmap& normalBitmap, const Bitmap* pFocusedBitmap)
271 return SetElement(elementId, normalBitmap, pFocusedBitmap, &normalBitmap);
275 _CustomListItemImpl::SetElement(int elementId, const ICustomListElement& element)
277 _ElementBaseModel* pBaseModel = GetElementModelById(elementId);
278 if (pBaseModel && pBaseModel->_elementType != LIST_ITEM_ELEMENT_TYPE_CUSTOM)
280 RemoveElement(elementId);
283 _CustomElementModel* pCustomListElement = dynamic_cast<_CustomElementModel*>(pBaseModel);
285 if (!pCustomListElement)
287 pCustomListElement = new (std::nothrow) _CustomElementModel();
288 SysTryReturnResult(NID_UI_CTRL, pCustomListElement, E_OUT_OF_MEMORY, "Memory allocation failed.");
290 pCustomListElement->_elementId = elementId;
291 pCustomListElement->_elementType = LIST_ITEM_ELEMENT_TYPE_CUSTOM;
292 pCustomListElement->__pListElement = const_cast<ICustomListElement*>(&element);
294 elements.Add(*pCustomListElement);
298 pCustomListElement->__pListElement = const_cast<ICustomListElement*>(&element);
305 _CustomListItemImpl::SetTextSliding(int elementId, bool enable)
307 _TextElementModel* pTextElementModel = dynamic_cast<_TextElementModel*>(GetElementModelById(elementId));
308 SysTryReturn(NID_UI_CTRL, pTextElementModel, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error has occurred. Failed to get element data");
310 pTextElementModel->SetTextSliding(enable);
316 _CustomListItemImpl::StartSliding(void)
318 _TextElementModel* pTextElementModel = null;
320 for (int i = 0; i < elements.GetCount(); i++)
322 pTextElementModel = dynamic_cast<_TextElementModel*>(const_cast<Object*>(elements.GetAt(i)));
323 if (pTextElementModel && pTextElementModel->GetTextSliding())
325 StartTextSlideTimer();
332 _CustomListItemImpl::StopSliding(void)
334 _TextElementModel* pTextElementModel = null;
336 for (int i = 0; i < elements.GetCount(); i++)
338 pTextElementModel = dynamic_cast<_TextElementModel*>(const_cast<Object*>(elements.GetAt(i)));
339 if (pTextElementModel && pTextElementModel->GetTextSliding())
341 _TextElementView* pTextElementView = dynamic_cast<_TextElementView*>(GetElementViewById(pTextElementModel->_elementId));
342 SysTryReturnVoidResult(NID_UI_CTRL, (pTextElementView != null), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
344 pTextElementView->StopTextSlide();
348 StopTextSlideTimer();
352 _CustomListItemImpl::StartTextSlideTimer(void)
354 result r = E_SUCCESS;
356 if (__pTextSlideTimer == null)
358 __pTextSlideTimer = new (std::nothrow) Timer();
359 SysTryReturnVoidResult(NID_UI_CTRL, (__pTextSlideTimer != null), E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
361 r = __pTextSlideTimer->Construct(*this);
362 SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), ,E_SYSTEM, "[E_SYSTEM] A system error has occured. Failed to construct sliding timer.");
366 __pTextSlideTimer->Cancel();
369 r = __pTextSlideTimer->Start(TEXT_SLIDING_TIMER_DURATION);
370 SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , E_SYSTEM, "[E_SYSTEM] A system error has occured. Failed to start sliding timer.");
375 StopTextSlideTimer();
379 _CustomListItemImpl::StopTextSlideTimer(void)
381 delete __pTextSlideTimer;
382 __pTextSlideTimer = null;
386 _CustomListItemImpl::OnTimerExpired(Timer& timer)
388 if (&timer == __pTextSlideTimer)
390 _TextElementModel* pTextElementModel = null;
391 bool timerRequired = false;
393 for (int i = 0; i < elements.GetCount(); i++)
395 pTextElementModel = dynamic_cast<_TextElementModel*>(const_cast<Object*>(elements.GetAt(i)));
396 if (pTextElementModel && pTextElementModel->GetTextSliding())
398 _TextElementView* pTextElementView = dynamic_cast<_TextElementView*>(GetElementViewById(pTextElementModel->_elementId));
399 SysTryReturnVoidResult(NID_UI_CTRL, (pTextElementView != null), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
401 pTextElementView->StartTextSlide();
402 timerRequired = true;
408 StartTextSlideTimer();
414 _CustomListItemImpl::GetElementModelById(int elementId) const
416 _ElementBaseModel* pElementBaseModel = null;
418 for (int i = 0; i < elements.GetCount(); i++)
420 pElementBaseModel = dynamic_cast<_ElementBaseModel*>(const_cast<Object*>(elements.GetAt(i)));
421 SysTryReturn(NID_UI_CTRL, pElementBaseModel, null, E_SYSTEM, "[E_SYSTEM] A system error has occurred. Failed to get element data");
423 if (pElementBaseModel->_elementId == elementId)
425 return pElementBaseModel;
433 _CustomListItemImpl::GetElementViewById(int elementId) const
435 TableViewItemBase* pTableViewItemBase = null;
437 if (__pTableViewItemData)
439 pTableViewItemBase = __pTableViewItemData;
441 else if (__pTableViewGroupItemData)
443 pTableViewItemBase = __pTableViewGroupItemData;
450 _ElementBaseView* pElementBaseView = null;
451 int controlCount = pTableViewItemBase->GetControlCount();
453 for (int count = 0; count < controlCount; count++)
455 pElementBaseView = dynamic_cast<_ElementBaseView*>(const_cast<Control*>(pTableViewItemBase->GetControl(count)));
456 SysTryReturn(NID_UI_CTRL, pElementBaseView, null, E_SYSTEM, "[E_SYSTEM] A system error has occurred. Failed to get element data");
458 if (pElementBaseView->GetElementId() == elementId)
460 return pElementBaseView;
468 _CustomListItemImpl::SetNormalItemBackgroundBitmap(const Bitmap& bitmap)
470 SetBackgroundBitmap(bitmap, TABLE_VIEW_ITEM_DRAWING_STATUS_NORMAL);
475 _CustomListItemImpl::SetFocusedItemBackgroundBitmap(const Bitmap& bitmap)
477 SetBackgroundBitmap(bitmap, TABLE_VIEW_ITEM_DRAWING_STATUS_PRESSED);
482 _CustomListItemImpl::SetHighlightedItemBackgroundBitmap(const Bitmap& bitmap)
484 SetBackgroundBitmap(bitmap, TABLE_VIEW_ITEM_DRAWING_STATUS_HIGHLIGHTED);
489 _CustomListItemImpl::SetBackgroundBitmap(const Bitmap& bitmap, TableViewItemDrawingStatus status)
491 __pBitmaps[status] = _BitmapImpl::CloneN(bitmap);
493 if (__pTableViewItemData)
495 bool returnValue = __pTableViewItemData->SetBackgroundBitmap(__pBitmaps[status], status);
496 result r = GetLastResult();
498 SysTryReturnVoidResult(NID_UI_CTRL, returnValue == true, r, "[%s] Propagating.", GetErrorMessage(r));
500 else if (__pTableViewGroupItemData)
502 bool returnValue = __pTableViewGroupItemData->SetBackgroundBitmap(__pBitmaps[status], status);
503 result r = GetLastResult();
505 SysTryReturnVoidResult(NID_UI_CTRL, returnValue == true, r, "[%s] Propagating.", GetErrorMessage(r));
508 SetLastResult(E_SUCCESS);
513 _CustomListItemImpl::UpdateBitmaps(void)
515 for (int i = 0; i <= CUSTOM_LIST_ITEM_STATUS_FOCUSED; i++)
519 SetBackgroundBitmap(*__pBitmaps[i], (TableViewItemDrawingStatus)i);
527 _CustomListItemImpl::GetCheckElement(void)
529 _ElementBaseModel* pElementBase = null;
530 _CheckElementModel* pCheckElement = null;
532 for (int i = 0; i < elements.GetCount(); i++)
534 pElementBase = dynamic_cast<_ElementBaseModel*>(elements.GetAt(i));
535 SysTryReturn(NID_UI_CTRL, (pElementBase != null), null, E_SYSTEM, "[E_SYSTEM] A system error has occurred. Failed to get element");
537 if (pElementBase->_elementType == LIST_ITEM_ELEMENT_TYPE_CHECKBOX)
539 pCheckElement = dynamic_cast<_CheckElementModel*>(pElementBase);
540 return pCheckElement;
548 _CustomListItemImpl::SetDividerRequired(LinkedList& elementFormatList, Rectangle& checkElementBounds, bool& leftDivider, bool& rightDivider)
550 _ElementFormatData* pFormatData = null;
552 for (int formatDataCount = elementFormatList.GetCount() - 1; formatDataCount >= 0; formatDataCount--)
554 pFormatData = dynamic_cast<_ElementFormatData*>(elementFormatList.GetAt(formatDataCount));
555 SysTryReturnResult(NID_UI_CTRL, (pFormatData != null), E_SYSTEM, "A system error has occurred. Failed to get format data");
557 if (pFormatData->rect.x < checkElementBounds.x)
561 else if (pFormatData->rect.x > checkElementBounds.x + checkElementBounds.width)
571 _CustomListItemImpl::CreateTableViewItem(_TableViewItemParams& tableViewItemParams)
573 TableViewItemBase* pTableViewItemBase = null;
575 if (tableViewItemParams.itemIndex == -1)
577 pTableViewItemBase = CreateTableViewGroupItemN(tableViewItemParams);
581 pTableViewItemBase = CreateTableViewItemN(tableViewItemParams);
584 SysTryReturnResult(NID_UI_CTRL, (pTableViewItemBase != null), E_SYSTEM, "A system error has occurred. Failed to create tableViewItem");
586 _CustomListItemImpl* pCustomListItemImpl = GetItemImpl(tableViewItemParams.pItem);
587 SysTryReturnResult(NID_UI_CTRL, (pCustomListItemImpl != null), E_INVALID_ARG, "Invalid argument is used. CustomListItem is null");
589 _CustomListItemFormatImpl* pFormatImpl = GetFormatImpl(tableViewItemParams.pItem);
590 SysTryReturnResult(NID_UI_CTRL, (pFormatImpl != null), E_INVALID_ARG, "Invalid argument is used. CustomListItemFormat is null");
592 LinkedList* pElementFormat = &pFormatImpl->elementFormatDataList;
593 LinkedList* pElements = &pCustomListItemImpl->elements;
594 _ElementBaseModel* pElementBase = null;
596 for (int elementCount = pElements->GetCount() - 1; elementCount >= 0; elementCount--)
598 pElementBase = dynamic_cast<_ElementBaseModel*>(pElements->GetAt(elementCount));
599 SysTryCatch(NID_UI_CTRL, (pElementBase != null), , E_SYSTEM, "[E_SYSTEM] A system error has occurred. Failed to get element.");
601 if (!pCustomListItemImpl->IsElementIdValid(pElementFormat, pElementBase->_elementId))
603 pElements->RemoveAt(elementCount, true);
604 SysLog(NID_UI_CTRL, "The provided elementId is not present in CustomListItemFormat.");
608 result r = E_SUCCESS;
610 _ElementViewParams elementParams;
611 elementParams.pTableViewItemBase = pTableViewItemBase;
612 elementParams.pElementModel = pElementBase;
613 elementParams.pElementFormatData = pFormatImpl->GetElementFormatById(pElementBase->_elementId);
614 elementParams.isDividerEnabled = tableViewItemParams.isDividerEnabled;
615 elementParams.annexStyle = tableViewItemParams.annexStyle;
616 elementParams.pCustomListItemImpl = pCustomListItemImpl;
617 elementParams.pCheckBitmaps = tableViewItemParams.pCheckBitmaps;
618 elementParams.pElementFormat = pElementFormat;
620 r = pElementBase->CreateElementView(elementParams);
621 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] A system error has occurred. Failed to create element view.");
627 if (tableViewItemParams.itemIndex == -1)
629 _TableViewGroupItemData* pTableViewGroupItemData = dynamic_cast<_TableViewGroupItemData*>(pTableViewItemBase);
630 delete pTableViewGroupItemData;
634 _TableViewItemData* pTableViewItemData = dynamic_cast<_TableViewItemData*>(pTableViewItemBase);
635 delete pTableViewItemData;
642 _CustomListItemImpl::CreateTableViewGroupItemN(_TableViewItemParams& tableViewItemParams)
644 result r = E_SUCCESS;
646 _TableViewGroupItemData* pTableViewGroupItemData = null;
648 pTableViewGroupItemData = new (std::nothrow) _TableViewGroupItemData();
649 SysTryReturn(NID_UI_CTRL, pTableViewGroupItemData, null, E_SYSTEM, "[E_OUT_OF_MEMORY] Memory allocation failed.");
651 r = pTableViewGroupItemData->Construct(Dimension(tableViewItemParams.width, tableViewItemParams.pItem->__pCustomListItemImpl->height));
652 SysTryCatch(NID_UI_CTRL, pTableViewGroupItemData, , E_SYSTEM, "[%s] Failed to create an item.", GetErrorMessage(r));
655 pTableViewGroupItemData->groupIndex = tableViewItemParams.groupIndex;
656 tableViewItemParams.pItem->__pCustomListItemImpl->__pTableViewGroupItemData = pTableViewGroupItemData;
658 tableViewItemParams.pItem->__pCustomListItemImpl->UpdateBitmaps();
660 return pTableViewGroupItemData;
663 delete pTableViewGroupItemData;
668 _CustomListItemImpl::CreateTableViewItemN(_TableViewItemParams& tableViewItemParams)
670 result r = E_SUCCESS;
671 _TableViewItemData* pTableViewItemData = null;
673 pTableViewItemData = new (std::nothrow) _TableViewItemData();
674 SysTryReturn(NID_UI_CTRL, pTableViewItemData, null, E_SYSTEM, "[E_OUT_OF_MEMORY] Memory allocation failed.");
676 r = pTableViewItemData->Construct(Dimension(tableViewItemParams.width, tableViewItemParams.pItem->__pCustomListItemImpl->height), TABLE_VIEW_ANNEX_STYLE_NORMAL);
677 SysTryCatch(NID_UI_CTRL, pTableViewItemData, , E_SYSTEM, "[%s] Failed to create an item.", GetErrorMessage(r));
679 pTableViewItemData->groupIndex = tableViewItemParams.groupIndex;
680 pTableViewItemData->itemIndex = tableViewItemParams.itemIndex;
681 tableViewItemParams.pItem->__pCustomListItemImpl->__pTableViewItemData = pTableViewItemData;
683 tableViewItemParams.pItem->__pCustomListItemImpl->UpdateBitmaps();
685 return pTableViewItemData;
688 delete pTableViewItemData;
693 _CustomListItemImpl::SetElementData(_ElementBaseModel* pElement)
695 SysTryReturnResult(NID_UI_CTRL, (pElement != null), E_INVALID_ARG, "Invalid argument used. pElement must not be null.");
697 _ElementBaseModel* pTempElement = null;
699 result r = E_SUCCESS;
701 for (; i < elements.GetCount(); i++)
703 pTempElement = dynamic_cast<_ElementBaseModel*>(elements.GetAt(i));
704 SysTryReturnResult(NID_UI_CTRL, pTempElement, E_SYSTEM, "A system error has occurred. Failed to get element");
706 if (pElement->_elementId == pTempElement->_elementId)
712 if (i != elements.GetCount())
714 r = elements.SetAt(*pElement, i, true);
718 r = elements.Add(*pElement);
725 _CustomListItemImpl::IsElementIdValid(LinkedList* pElementFormat, int elementId) const
727 for (int elementFormatDataCount = pElementFormat->GetCount() - 1; elementFormatDataCount >= 0; elementFormatDataCount--)
729 _ElementFormatData* pElementFormatData = dynamic_cast<_ElementFormatData*>(const_cast<Object*>(pElementFormat->GetAt(elementFormatDataCount)));
731 if (pElementFormatData != null && pElementFormatData->elementId == elementId)
740 _CustomListItemFormatImpl*
741 _CustomListItemImpl::GetFormatImpl(CustomListItem* pItem)
743 SysTryReturn(NID_UI_CTRL, (pItem != null), null, E_INVALID_ARG, "[E_INVALID_ARG] Invalid argument is used. CustomListItem is null");
745 CustomListItemFormat* pFormat = pItem->__pCustomListItemFormat;
746 SysTryReturn(NID_UI_CTRL, (pFormat != null), null, E_INVALID_ARG, "[E_INVALID_ARG] Invalid argument is used. CustomListItemFormat is null");
748 return pItem->__pCustomListItemFormat->__pCustomListItemFormatImpl;
752 _CustomListItemImpl::GetItemImpl(CustomListItem* pItem)
754 SysTryReturn(NID_UI_CTRL, (pItem != null), null, E_INVALID_ARG, "[E_INVALID_ARG] Invalid argument is used. CustomListItem is null");
756 return pItem->__pCustomListItemImpl;
760 _CustomListItemImpl::UpdateTableViewItem(_TableViewItemUpdateParams& updateParams)
762 _CustomListItemImpl* pCustomListItemImpl = GetItemImpl(updateParams.pItem);
763 SysTryReturnResult(NID_UI_CTRL, (pCustomListItemImpl != null), E_SYSTEM, "Invalid argument used. __pCustomListItemImpl must not be null");
765 TableViewItemBase* pTableViewItemBase = null;
767 if (pCustomListItemImpl->__pTableViewItemData)
769 pTableViewItemBase = pCustomListItemImpl->__pTableViewItemData;
773 pTableViewItemBase = pCustomListItemImpl->__pTableViewGroupItemData;
776 SysTryReturnResult(NID_UI_CTRL, (pTableViewItemBase != null), E_SYSTEM, "A system error has occurred. Failed to create tableViewItem");
778 _CustomListItemFormatImpl* pFormatImpl = GetFormatImpl(updateParams.pItem);
779 SysTryReturnResult(NID_UI_CTRL, (pFormatImpl != null), E_SYSTEM, "Invalid argument used. Item format must not be null");
781 LinkedList* pElementFormat = &pFormatImpl->elementFormatDataList;
782 _ElementBaseModel* pElementBase = null;
783 bool isValidElementId = false;
785 for (int i = 0; i < pTableViewItemBase->GetControlCount(); i++)
787 Control* pControl = dynamic_cast<Control*>(pTableViewItemBase->GetControl(i));
788 pTableViewItemBase->SetIndividualSelectionEnabled(pControl, false);
791 pTableViewItemBase->RemoveAllControls();
793 for (int elementCount = pCustomListItemImpl->elements.GetCount() -1; elementCount >= 0; elementCount--)
795 isValidElementId = false;
797 pElementBase = dynamic_cast<_ElementBaseModel*>(pCustomListItemImpl->elements.GetAt(elementCount));
798 SysTryReturnResult(NID_UI_CTRL, (pElementBase != null), E_SYSTEM, "Invalid element.");
800 if (!pCustomListItemImpl->IsElementIdValid(pElementFormat, pElementBase->_elementId))
802 pCustomListItemImpl->elements.RemoveAt(elementCount, true);
803 SysLog(NID_UI_CTRL, "The provided elementId is not present in CustomListItemFormat.");
807 result r = E_SUCCESS;
809 _ElementViewParams elementParams;
810 elementParams.pTableViewItemBase = pTableViewItemBase;
811 elementParams.pElementModel = pElementBase;
812 elementParams.pElementFormatData = pFormatImpl->GetElementFormatById(pElementBase->_elementId);
813 elementParams.isDividerEnabled = updateParams.isDividerEnabled;
814 elementParams.annexStyle = updateParams.annexStyle;
815 elementParams.pCustomListItemImpl = pCustomListItemImpl;
816 elementParams.pCheckBitmaps = updateParams.pCheckBitmaps;
817 elementParams.pElementFormat = pElementFormat;
819 r = pElementBase->CreateElementView(elementParams);
820 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, E_SYSTEM, "A system error has occurred. Failed to create element view.");
823 pCustomListItemImpl->UpdateBitmaps();
829 _CustomListItemImpl::OnTouchDoublePressed (const Control &source, const Point ¤tPosition, const TouchEventInfo &touchInfo)
835 _CustomListItemImpl::OnTouchFocusIn (const Control &source, const Point ¤tPosition, const TouchEventInfo &touchInfo)
841 _CustomListItemImpl::OnTouchFocusOut (const Control &source, const Point ¤tPosition, const TouchEventInfo &touchInfo)
843 if (source.IsEnabled() == false || touchInfo.IsFlicked())
848 _ElementBaseView* pCurrentElement = dynamic_cast<_ElementBaseView*>(const_cast<Control*>(&source));
849 SysTryReturnVoidResult(NID_UI_CTRL, (pCurrentElement != null), E_SYSTEM, "[E_SYSTEM] A system error has occurred. Failed to get element");
851 _ListBaseImpl* pListBaseImpl = GetListBaseImplFromElement(source);
852 SysTryReturnVoidResult(NID_UI_CTRL, (pListBaseImpl != null), E_SYSTEM, "[E_SYSTEM] A system error has occurred. Failed to get item.");
854 UpdateElements(source, pCurrentElement->GetElementId(), false, pListBaseImpl->_isDividerEnabled);
856 UpdateItemBackground(source, pListBaseImpl->_isDividerEnabled);
862 _CustomListItemImpl::OnTouchLongPressed (const Control &source, const Point ¤tPosition, const TouchEventInfo &touchInfo)
868 _CustomListItemImpl::OnTouchMoved (const Control &source, const Point ¤tPosition, const TouchEventInfo &touchInfo)
875 _CustomListItemImpl::OnTouchPressed (const Control &source, const Point ¤tPosition, const TouchEventInfo &touchInfo)
877 if (source.IsEnabled() == false || touchInfo.IsFlicked())
881 _ElementBaseView* pCurrentElement = dynamic_cast<_ElementBaseView*>(const_cast<Control*>(&source));
882 SysTryReturnVoidResult(NID_UI_CTRL, (pCurrentElement != null), E_SYSTEM, "[E_SYSTEM] A system error has occurred. Failed to get element");
884 _ListBaseImpl* pListBaseImpl = GetListBaseImplFromElement(source);
885 SysTryReturnVoidResult(NID_UI_CTRL, (pListBaseImpl != null), E_SYSTEM, "[E_SYSTEM] A system error has occurred. Failed to get item.");
887 int elementId = pCurrentElement->GetElementId();
889 UpdateElements(source, elementId, true, pListBaseImpl->_isDividerEnabled);
891 UpdateItemBackground(source, pListBaseImpl->_isDividerEnabled);
895 _CustomListItemImpl::OnTouchReleased (const Control &source, const Point ¤tPosition, const TouchEventInfo &touchInfo)
897 if (source.IsEnabled() == false || touchInfo.IsFlicked())
901 _ElementBaseView* pCurrentElement = dynamic_cast<_ElementBaseView*>(const_cast<Control*>(&source));
902 SysTryReturnVoidResult(NID_UI_CTRL, (pCurrentElement != null), E_SYSTEM, "[E_SYSTEM] A system error has occurred. Failed to get element");
904 _ListBaseImpl* pListBaseImpl = GetListBaseImplFromElement(source);
905 SysTryReturnVoidResult(NID_UI_CTRL, (pListBaseImpl != null), E_SYSTEM, "[E_SYSTEM] A system error has occurred. Failed to get item.");
907 _CheckElementView* pCheckElementView = dynamic_cast<_CheckElementView*>(const_cast<Control*>(&source));
909 UpdateElements(source, pCurrentElement->GetElementId(), false, pListBaseImpl->_isDividerEnabled);
911 if (__isMoved == false)
916 GetIndexFromElement(source, groupIndex, itemIndex);
918 if (((pListBaseImpl->_isDividerEnabled) && (pCheckElementView)) || (!pListBaseImpl->_isDividerEnabled))
920 pListBaseImpl->SetItemChecked(groupIndex, itemIndex, !pListBaseImpl->IsItemChecked(groupIndex, itemIndex));
923 UpdateItemBackground(source, pListBaseImpl->_isDividerEnabled);
925 bool elementIdEnabled = IsElementEventEnabled(source);
926 if (!elementIdEnabled)
928 pListBaseImpl->ProcessItemStateChange(groupIndex, itemIndex, ITEM_SELECTED);
932 pListBaseImpl->ProcessItemStateChange(groupIndex, itemIndex, pCurrentElement->GetElementId(), ITEM_SELECTED);
937 UpdateItemBackground(source, pListBaseImpl->_isDividerEnabled);
946 _CustomListItemImpl::GetViewById(int elementId) const
948 TableViewItemBase* pTableViewItemBase = null;
950 if (__pTableViewItemData)
952 pTableViewItemBase = __pTableViewItemData;
954 else if (__pTableViewGroupItemData)
956 pTableViewItemBase = __pTableViewGroupItemData;
963 _ElementBaseView* pElementBaseView = null;
965 for (int controlIndex = 0; controlIndex < pTableViewItemBase->GetControlCount(); controlIndex++)
967 pElementBaseView = dynamic_cast<_ElementBaseView*>(pTableViewItemBase->GetControl(controlIndex));
968 SysTryReturn(NID_UI_CTRL, (pElementBaseView != null), null, E_SYSTEM, "[E_SYSTEM] Invalid Element added to item");
970 if (pElementBaseView->GetElementId() == elementId)
972 SetLastResult(E_SUCCESS);
973 return pElementBaseView;
977 SetLastResult(E_SYSTEM);
982 _CustomListItemImpl::GetListBaseImplFromElement(const Control& element)
984 _ElementBaseView* pCurrentElement = dynamic_cast<_ElementBaseView*>(const_cast<Control*>(&element));
985 SysTryReturn(NID_UI_CTRL, (pCurrentElement != null), null, E_INVALID_ARG, "[E_INVALID_ARG] Invalid argument is used. source is not an element");
987 TableViewItemBase* pTableViewItemBase = dynamic_cast<TableViewItemBase*>(pCurrentElement->GetParent());
988 SysTryReturn(NID_UI_CTRL, (pTableViewItemBase != null), null, E_SYSTEM, "[E_INVALID_ARG] Invalid argument is used. source is not an element");
990 Control* pControl = dynamic_cast<Control*>(pTableViewItemBase->GetParent());
991 SysTryReturn(NID_UI_CTRL, (pControl != null), null, E_SYSTEM, "[E_INVALID_ARG] Invalid argument is used. source is not an element");
993 _ListBaseImpl* pListBaseImpl = static_cast<_ListBaseImpl*>(_ControlImpl::GetInstance(*pControl));
994 SysTryReturn(NID_UI_CTRL, (pListBaseImpl != null), null, E_SYSTEM, "[E_INVALID_ARG] Invalid argument is used. source is not an element");
996 return pListBaseImpl;
1000 _CustomListItemImpl::GetItemFromElement(const Control& source) const
1002 _ElementBaseView* pCurrentElement = dynamic_cast<_ElementBaseView*>(const_cast<Control*>(&source));
1003 SysTryReturn(NID_UI_CTRL, (pCurrentElement != null), null, E_SYSTEM, "[E_SYSTEM] A system error has occurred. Failed to get element");
1005 _ITableViewBaseItemData* pBaseData = dynamic_cast<_ITableViewBaseItemData*>(pCurrentElement->GetParent());
1006 SysTryReturn(NID_UI_CTRL, (pBaseData != null), null, E_SYSTEM, "[E_SYSTEM] A system error has occurred. Failed to get item.");
1008 _ListBaseImpl* pListBaseImpl = GetListBaseImplFromElement(source);
1009 SysTryReturn(NID_UI_CTRL, (pListBaseImpl != null), null, E_SYSTEM, "[E_SYSTEM] A system error has occurred. Failed to get item.");
1011 int groupIndex = -1;
1014 pBaseData->GetIndex(groupIndex, itemIndex);
1016 CustomListItem* pCustomListItem = pListBaseImpl->GetCustomListItemAt(groupIndex, itemIndex - pListBaseImpl->GetTopItemIndex(groupIndex));
1017 SysTryReturn(NID_UI_CTRL, (pCustomListItem != null), null, E_SYSTEM, "[E_SYSTEM] A system error has occurred. Failed to get item.");
1019 return pCustomListItem;
1023 _CustomListItemImpl::GetIndexFromElement(const Control& source, int& groupIndex, int& itemIndex) const
1025 _ElementBaseView* pCurrentElement = dynamic_cast<_ElementBaseView*>(const_cast<Control*>(&source));
1026 SysTryReturnVoidResult(NID_UI_CTRL, (pCurrentElement != null), E_SYSTEM, "[E_SYSTEM] A system error has occurred. Failed to get element");
1028 _ITableViewBaseItemData* pBaseData = dynamic_cast<_ITableViewBaseItemData*>(pCurrentElement->GetParent());
1029 SysTryReturnVoidResult(NID_UI_CTRL, (pBaseData != null), E_SYSTEM, "[E_SYSTEM] A system error has occurred. Failed to get item.");
1031 _ListBaseImpl* pListBaseImpl = GetListBaseImplFromElement(source);
1032 SysTryReturnVoidResult(NID_UI_CTRL, (pListBaseImpl != null), E_SYSTEM, "[E_SYSTEM] A system error has occurred. Failed to get item.");
1034 pBaseData->GetIndex(groupIndex, itemIndex);
1038 _CustomListItemImpl::IsElementEventEnabled(const Control& element)
1040 CustomListItem* pCustomListItem = GetItemFromElement(element);
1041 SysTryReturn(NID_UI_CTRL, (pCustomListItem != null), false, E_SYSTEM, "[E_SYSTEM] A system error has occurred. Failed to get item.");
1043 CustomListItemFormat* pFormat = pCustomListItem->__pCustomListItemFormat;
1044 SysTryReturn(NID_UI_CTRL, (pFormat != null), false, E_SYSTEM, "[E_SYSTEM] A system error has occurred. Failed to get item.");
1046 _ElementBaseView* pCurrentElement = dynamic_cast<_ElementBaseView*>(const_cast<Control*>(&element));
1047 SysTryReturn(NID_UI_CTRL, (pCurrentElement != null), false, E_SYSTEM, "[E_SYSTEM] A system error has occurred. Failed to get element");
1049 return pFormat->__pCustomListItemFormatImpl->IsElementEventEnabled(pCurrentElement->GetElementId());
1053 _CustomListItemImpl::UpdateElements(const Control &source, int elementId, bool isPressed, bool isDividerEnabled)
1055 bool elementIdEnabled = IsElementEventEnabled(source);
1056 CustomListItemStatus customListItemStatus;
1058 _CheckElementView* pCheckElementView = dynamic_cast<_CheckElementView*>(const_cast<Control*>(&source));
1060 if (isPressed == true)
1062 customListItemStatus = CUSTOM_LIST_ITEM_STATUS_FOCUSED;
1067 customListItemStatus = CUSTOM_LIST_ITEM_STATUS_NORMAL;
1071 int elementCount = elements.GetCount();
1073 if (elementIdEnabled)
1075 if (pCheckElementView)
1077 GetCheckElement()->HandleElementEvent(customListItemStatus);
1078 pCheckElementView->SetPressed(isPressed);
1082 _ElementBaseModel* pElementBaseModel = GetElementModelById(elementId);
1083 SysTryReturnVoidResult(NID_UI_CTRL, (pElementBaseModel != null), E_SYSTEM, "[E_SYSTEM] A system error has occurred. Failed to get item.");
1085 pElementBaseModel->HandleElementEvent(customListItemStatus);
1090 if (isDividerEnabled)
1092 if (pCheckElementView)
1094 GetCheckElement()->HandleElementEvent(customListItemStatus);
1095 pCheckElementView->SetPressed(isPressed);
1099 for (int i = 0; i < elementCount; i++)
1101 _ElementBaseModel* pElementBase = dynamic_cast<_ElementBaseModel*>(elements.GetAt(i));
1102 SysTryReturnVoidResult(NID_UI_CTRL, (pElementBase != null), E_SYSTEM, "[E_SYSTEM] A system error has occurred. Failed to get element");
1104 if (pElementBase->_elementType != LIST_ITEM_ELEMENT_TYPE_CHECKBOX)
1106 pElementBase->HandleElementEvent(customListItemStatus);
1113 for (int i = 0; i < elementCount; i++)
1115 _ElementBaseModel* pElementBase = dynamic_cast<_ElementBaseModel*>(elements.GetAt(i));
1116 SysTryReturnVoidResult(NID_UI_CTRL, (pElementBase != null), E_SYSTEM, "[E_SYSTEM] A system error has occurred. Failed to get element");
1118 pElementBase->HandleElementEvent(customListItemStatus);
1125 _CustomListItemImpl::UpdateItemBackground(const Control& element, bool isDividerEnabled)
1127 TableViewItemBase* pTableViewItemBase = dynamic_cast<TableViewItemBase*>(element.GetParent());
1128 SysTryReturnVoidResult(NID_UI_CTRL, (pTableViewItemBase != null), E_SYSTEM, "[E_SYSTEM] A system error has occurred. Failed to get item.");
1130 _CheckElementView* pCheckElementView = dynamic_cast<_CheckElementView*>(const_cast<Control*>(&element));
1132 bool elementIdEnabled = IsElementEventEnabled(element);
1133 if (!elementIdEnabled)
1135 if (isDividerEnabled)
1137 if (!pCheckElementView)
1139 pTableViewItemBase->SetBackgroundColor(Color(0, 0, 0, 0));
1144 pTableViewItemBase->SetBackgroundColor(Color(0, 0, 0, 0));
1148 pTableViewItemBase->Invalidate(true);
1152 _CustomListItemImpl::DeleteCustomListItem(Tizen::Base::Object* pObj)
1154 CustomListItem* pCustomListItem = dynamic_cast<CustomListItem*>(pObj);
1155 delete pCustomListItem;
1158 }}} //Tizen::Ui::Controls