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_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)
114 , __pTableViewItemData(null)
115 , __pTableViewGroupItemData(null)
116 , __pSubItemsList(null)
117 , __pTextSlideTimer(null)
120 for (int i = 0; i <= CUSTOM_LIST_ITEM_STATUS_FOCUSED; i++)
122 __pBitmaps[i] = null;
126 _CustomListItemImpl::~_CustomListItemImpl(void)
128 for (int i = 0; i <= CUSTOM_LIST_ITEM_STATUS_FOCUSED; i++)
130 delete __pBitmaps[i];
133 elements.RemoveAll(true);
137 _CustomListItemImpl::CreateInstanceN(int itemHeight)
139 _CustomListItemImpl* pImpl = new (std::nothrow) _CustomListItemImpl(itemHeight);
140 SysTryReturn(NID_UI_CTRL, pImpl, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
142 SetLastResult(E_SUCCESS);
147 _CustomListItemImpl::RemoveElement(int elementId)
149 _ElementBaseModel* pBaseModel = GetElementModelById(elementId);
150 elements.Remove(*pBaseModel, true);
154 _CustomListItemImpl::SetCheckBox(int elementId)
156 _CheckElementModel* pCheckElement = null;
157 _ElementBaseModel* pBaseModel = GetElementModelById(elementId);
159 if (pBaseModel && pBaseModel->_elementType != LIST_ITEM_ELEMENT_TYPE_CHECKBOX)
164 pCheckElement = new (std::nothrow) _CheckElementModel();
165 SysTryReturn(NID_UI_CTRL, pCheckElement, E_SYSTEM, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
167 pCheckElement->_elementId = elementId;
168 pCheckElement->_elementType = LIST_ITEM_ELEMENT_TYPE_CHECKBOX;
170 elements.Add(*pCheckElement);
175 _CustomListItemImpl::SetElement(int elementId, const Bitmap& normalBitmap, const Bitmap* pFocusedBitmap, const Bitmap* pHighlightedBitmap)
177 _ElementBaseModel* pBaseModel = GetElementModelById(elementId);
178 if (pBaseModel && pBaseModel->_elementType != LIST_ITEM_ELEMENT_TYPE_BITMAP)
180 RemoveElement(elementId);
183 result r = E_SUCCESS;
184 _BitmapElementModel* pBitmapElement = dynamic_cast<_BitmapElementModel*>(pBaseModel);
188 pBitmapElement = new (std::nothrow) _BitmapElementModel();
189 SysTryReturnResult(NID_UI_CTRL, pBitmapElement, E_OUT_OF_MEMORY, "Memory allocation failed.");
191 pBitmapElement->_elementId = elementId;
192 pBitmapElement->_elementType = LIST_ITEM_ELEMENT_TYPE_BITMAP;
193 elements.Add(*pBitmapElement);
197 delete pBitmapElement->__pBitmap[CUSTOM_LIST_ITEM_STATUS_NORMAL];
198 delete pBitmapElement->__pBitmap[CUSTOM_LIST_ITEM_STATUS_SELECTED];
199 delete pBitmapElement->__pBitmap[CUSTOM_LIST_ITEM_STATUS_FOCUSED];
202 pBitmapElement->__pBitmap[CUSTOM_LIST_ITEM_STATUS_NORMAL] = _BitmapImpl::CloneN(normalBitmap);
205 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, E_SYSTEM, r, "[%s] Propagating.", GetErrorMessage(r));
209 pBitmapElement->__pBitmap[CUSTOM_LIST_ITEM_STATUS_FOCUSED] = _BitmapImpl::CloneN(*pFocusedBitmap);
211 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, E_SYSTEM, r, "[%s] Propagating.", GetErrorMessage(r));
215 pBitmapElement->__pBitmap[CUSTOM_LIST_ITEM_STATUS_FOCUSED] = null;
218 if (pHighlightedBitmap)
220 pBitmapElement->__pBitmap[CUSTOM_LIST_ITEM_STATUS_SELECTED] = _BitmapImpl::CloneN(*pHighlightedBitmap);
222 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, E_SYSTEM, r, "[%s] Propagating.", GetErrorMessage(r));
226 pBitmapElement->__pBitmap[CUSTOM_LIST_ITEM_STATUS_SELECTED] = null;
233 _CustomListItemImpl::SetElement(int elementId, const String& text)
235 _ElementBaseModel* pBaseModel = GetElementModelById(elementId);
236 if (pBaseModel && pBaseModel->_elementType != LIST_ITEM_ELEMENT_TYPE_TEXT)
238 RemoveElement(elementId);
241 _TextElementModel* pTextElement = dynamic_cast<_TextElementModel*>(pBaseModel);
245 pTextElement = new (std::nothrow) _TextElementModel(text);
246 SysTryReturnResult(NID_UI_CTRL, pTextElement, E_OUT_OF_MEMORY, "Memory allocation failed.");
248 pTextElement->_elementType = LIST_ITEM_ELEMENT_TYPE_TEXT;
249 pTextElement->_elementId = elementId;
251 elements.Add(*pTextElement);
255 pTextElement->__text = text;
262 _CustomListItemImpl::SetElement(int elementId, const Bitmap& normalBitmap, const Bitmap* pFocusedBitmap)
264 return SetElement(elementId, normalBitmap, pFocusedBitmap, &normalBitmap);
268 _CustomListItemImpl::SetElement(int elementId, const ICustomListElement& element)
270 _ElementBaseModel* pBaseModel = GetElementModelById(elementId);
271 if (pBaseModel && pBaseModel->_elementType != LIST_ITEM_ELEMENT_TYPE_CUSTOM)
273 RemoveElement(elementId);
276 _CustomElementModel* pCustomListElement = dynamic_cast<_CustomElementModel*>(pBaseModel);
278 if (!pCustomListElement)
280 pCustomListElement = new (std::nothrow) _CustomElementModel();
281 SysTryReturnResult(NID_UI_CTRL, pCustomListElement, E_OUT_OF_MEMORY, "Memory allocation failed.");
283 pCustomListElement->_elementId = elementId;
284 pCustomListElement->_elementType = LIST_ITEM_ELEMENT_TYPE_CUSTOM;
285 pCustomListElement->__pListElement = const_cast<ICustomListElement*>(&element);
287 elements.Add(*pCustomListElement);
291 pCustomListElement->__pListElement = const_cast<ICustomListElement*>(&element);
298 _CustomListItemImpl::SetTextSliding(int elementId, bool enable)
300 _TextElementModel* pTextElementModel = dynamic_cast<_TextElementModel*>(GetElementModelById(elementId));
301 SysTryReturn(NID_UI_CTRL, pTextElementModel, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error has occurred. Failed to get element data");
303 pTextElementModel->SetTextSliding(enable);
309 _CustomListItemImpl::StartSliding(void)
311 _TextElementModel* pTextElementModel = null;
313 for (int i = 0; i < elements.GetCount(); i++)
315 pTextElementModel = dynamic_cast<_TextElementModel*>(const_cast<Object*>(elements.GetAt(i)));
316 if (pTextElementModel && pTextElementModel->GetTextSliding())
318 StartTextSlideTimer();
325 _CustomListItemImpl::StopSliding(void)
327 _TextElementModel* pTextElementModel = null;
329 for (int i = 0; i < elements.GetCount(); i++)
331 pTextElementModel = dynamic_cast<_TextElementModel*>(const_cast<Object*>(elements.GetAt(i)));
332 if (pTextElementModel && pTextElementModel->GetTextSliding())
334 _TextElementView* pTextElementView = dynamic_cast<_TextElementView*>(GetElementViewById(pTextElementModel->_elementId));
335 SysTryReturnVoidResult(NID_UI_CTRL, (pTextElementView != null), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
337 pTextElementView->StopTextSlide();
341 StopTextSlideTimer();
345 _CustomListItemImpl::StartTextSlideTimer(void)
347 result r = E_SUCCESS;
349 if (__pTextSlideTimer == null)
351 __pTextSlideTimer = new (std::nothrow) Timer();
352 SysTryReturnVoidResult(NID_UI_CTRL, (__pTextSlideTimer != null), E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
354 r = __pTextSlideTimer->Construct(*this);
355 SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), ,E_SYSTEM, "[E_SYSTEM] A system error has occured. Failed to construct sliding timer.");
359 __pTextSlideTimer->Cancel();
362 r = __pTextSlideTimer->Start(TEXT_SLIDING_TIMER_DURATION);
363 SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , E_SYSTEM, "[E_SYSTEM] A system error has occured. Failed to start sliding timer.");
368 StopTextSlideTimer();
372 _CustomListItemImpl::StopTextSlideTimer(void)
374 delete __pTextSlideTimer;
375 __pTextSlideTimer = null;
379 _CustomListItemImpl::OnTimerExpired(Timer& timer)
381 if (&timer == __pTextSlideTimer)
383 _TextElementModel* pTextElementModel = null;
384 bool timerRequired = false;
386 for (int i = 0; i < elements.GetCount(); i++)
388 pTextElementModel = dynamic_cast<_TextElementModel*>(const_cast<Object*>(elements.GetAt(i)));
389 if (pTextElementModel && pTextElementModel->GetTextSliding())
391 _TextElementView* pTextElementView = dynamic_cast<_TextElementView*>(GetElementViewById(pTextElementModel->_elementId));
392 SysTryReturnVoidResult(NID_UI_CTRL, (pTextElementView != null), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
394 pTextElementView->StartTextSlide();
395 timerRequired = true;
401 StartTextSlideTimer();
407 _CustomListItemImpl::GetElementModelById(int elementId) const
409 _ElementBaseModel* pElementBaseModel = null;
411 for (int i = 0; i < elements.GetCount(); i++)
413 pElementBaseModel = dynamic_cast<_ElementBaseModel*>(const_cast<Object*>(elements.GetAt(i)));
414 SysTryReturn(NID_UI_CTRL, pElementBaseModel, null, E_SYSTEM, "[E_SYSTEM] A system error has occurred. Failed to get element data");
416 if (pElementBaseModel->_elementId == elementId)
418 return pElementBaseModel;
426 _CustomListItemImpl::GetElementViewById(int elementId) const
428 TableViewItemBase* pTableViewItemBase = null;
430 if (__pTableViewItemData)
432 pTableViewItemBase = __pTableViewItemData;
434 else if (__pTableViewGroupItemData)
436 pTableViewItemBase = __pTableViewGroupItemData;
443 _ElementBaseView* pElementBaseView = null;
444 int controlCount = pTableViewItemBase->GetControlCount();
446 for (int count = 0; count < controlCount; count++)
448 pElementBaseView = dynamic_cast<_ElementBaseView*>(const_cast<Control*>(pTableViewItemBase->GetControl(count)));
449 SysTryReturn(NID_UI_CTRL, pElementBaseView, null, E_SYSTEM, "[E_SYSTEM] A system error has occurred. Failed to get element data");
451 if (pElementBaseView->GetElementId() == elementId)
453 return pElementBaseView;
461 _CustomListItemImpl::SetNormalItemBackgroundBitmap(const Bitmap& bitmap)
463 TableViewItemDrawingStatus status = TABLE_VIEW_ITEM_DRAWING_STATUS_NORMAL;
465 if (__pBitmaps[status])
467 delete __pBitmaps[status];
470 __pBitmaps[status] = _BitmapImpl::CloneN(bitmap);
472 SetBackgroundBitmap(bitmap, status);
477 _CustomListItemImpl::SetFocusedItemBackgroundBitmap(const Bitmap& bitmap)
479 TableViewItemDrawingStatus status = TABLE_VIEW_ITEM_DRAWING_STATUS_PRESSED;
481 if (__pBitmaps[status])
483 delete __pBitmaps[status];
486 __pBitmaps[status] = _BitmapImpl::CloneN(bitmap);
488 SetBackgroundBitmap(bitmap, status);
493 _CustomListItemImpl::SetHighlightedItemBackgroundBitmap(const Bitmap& bitmap)
495 TableViewItemDrawingStatus status = TABLE_VIEW_ITEM_DRAWING_STATUS_HIGHLIGHTED;
497 if (__pBitmaps[status])
499 delete __pBitmaps[status];
502 __pBitmaps[status] = _BitmapImpl::CloneN(bitmap);
504 SetBackgroundBitmap(bitmap, status);
509 _CustomListItemImpl::SetBackgroundBitmap(const Bitmap& bitmap, TableViewItemDrawingStatus status)
511 if (__pTableViewItemData)
513 bool returnValue = __pTableViewItemData->SetBackgroundBitmap(__pBitmaps[status], status);
514 result r = GetLastResult();
516 SysTryReturnVoidResult(NID_UI_CTRL, returnValue == true, r, "[%s] Propagating.", GetErrorMessage(r));
518 else if (__pTableViewGroupItemData)
520 bool returnValue = __pTableViewGroupItemData->SetBackgroundBitmap(__pBitmaps[status], status);
521 result r = GetLastResult();
523 SysTryReturnVoidResult(NID_UI_CTRL, returnValue == true, r, "[%s] Propagating.", GetErrorMessage(r));
526 SetLastResult(E_SUCCESS);
531 _CustomListItemImpl::UpdateBitmaps(void)
533 for (int i = 0; i <= CUSTOM_LIST_ITEM_STATUS_FOCUSED; i++)
537 SetBackgroundBitmap(*__pBitmaps[i], (TableViewItemDrawingStatus)i);
545 _CustomListItemImpl::GetCheckElement(void)
547 _ElementBaseModel* pElementBase = null;
548 _CheckElementModel* pCheckElement = null;
550 for (int i = 0; i < elements.GetCount(); i++)
552 pElementBase = dynamic_cast<_ElementBaseModel*>(elements.GetAt(i));
553 SysTryReturn(NID_UI_CTRL, (pElementBase != null), null, E_SYSTEM, "[E_SYSTEM] A system error has occurred. Failed to get element");
555 if (pElementBase->_elementType == LIST_ITEM_ELEMENT_TYPE_CHECKBOX)
557 pCheckElement = dynamic_cast<_CheckElementModel*>(pElementBase);
558 return pCheckElement;
566 _CustomListItemImpl::SetDividerRequired(LinkedList& elementFormatList, Rectangle& checkElementBounds, bool& leftDivider, bool& rightDivider)
568 _ElementFormatData* pFormatData = null;
570 for (int formatDataCount = elementFormatList.GetCount() - 1; formatDataCount >= 0; formatDataCount--)
572 pFormatData = dynamic_cast<_ElementFormatData*>(elementFormatList.GetAt(formatDataCount));
573 SysTryReturnResult(NID_UI_CTRL, (pFormatData != null), E_SYSTEM, "A system error has occurred. Failed to get format data");
575 if (pFormatData->rect.x < checkElementBounds.x)
579 else if (pFormatData->rect.x > checkElementBounds.x + checkElementBounds.width)
589 _CustomListItemImpl::CreateTableViewItem(_TableViewItemParams& tableViewItemParams)
591 TableViewItemBase* pTableViewItemBase = null;
593 if (tableViewItemParams.itemIndex == -1)
595 pTableViewItemBase = CreateTableViewGroupItemN(tableViewItemParams);
599 pTableViewItemBase = CreateTableViewItemN(tableViewItemParams);
602 SysTryReturnResult(NID_UI_CTRL, (pTableViewItemBase != null), E_SYSTEM, "A system error has occurred. Failed to create tableViewItem");
604 _CustomListItemImpl* pCustomListItemImpl = GetItemImpl(tableViewItemParams.pItem);
605 SysTryReturnResult(NID_UI_CTRL, (pCustomListItemImpl != null), E_INVALID_ARG, "Invalid argument is used. CustomListItem is null");
607 _CustomListItemFormatImpl* pFormatImpl = GetFormatImpl(tableViewItemParams.pItem);
608 SysTryReturnResult(NID_UI_CTRL, (pFormatImpl != null), E_INVALID_ARG, "Invalid argument is used. CustomListItemFormat is null");
610 LinkedList* pElementFormat = &pFormatImpl->elementFormatDataList;
611 LinkedList* pElements = &pCustomListItemImpl->elements;
612 _ElementBaseModel* pElementBase = null;
614 for (int elementCount = pElements->GetCount() - 1; elementCount >= 0; elementCount--)
616 pElementBase = dynamic_cast<_ElementBaseModel*>(pElements->GetAt(elementCount));
617 SysTryCatch(NID_UI_CTRL, (pElementBase != null), , E_SYSTEM, "[E_SYSTEM] A system error has occurred. Failed to get element.");
619 if (!pCustomListItemImpl->IsElementIdValid(pElementFormat, pElementBase->_elementId))
621 pElements->RemoveAt(elementCount, true);
622 SysLog(NID_UI_CTRL, "The provided elementId is not present in CustomListItemFormat.");
626 result r = E_SUCCESS;
628 _ElementViewParams elementParams;
629 elementParams.pTableViewItemBase = pTableViewItemBase;
630 elementParams.pElementModel = pElementBase;
631 elementParams.pElementFormatData = pFormatImpl->GetElementFormatById(pElementBase->_elementId);
632 elementParams.isDividerEnabled = tableViewItemParams.isDividerEnabled;
633 elementParams.annexStyle = tableViewItemParams.annexStyle;
634 elementParams.pCustomListItemImpl = pCustomListItemImpl;
635 elementParams.pCheckBitmaps = tableViewItemParams.pCheckBitmaps;
636 elementParams.pElementFormat = pElementFormat;
638 r = pElementBase->CreateElementView(elementParams);
639 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] A system error has occurred. Failed to create element view.");
645 if (tableViewItemParams.itemIndex == -1)
647 _TableViewGroupItemData* pTableViewGroupItemData = dynamic_cast<_TableViewGroupItemData*>(pTableViewItemBase);
648 delete pTableViewGroupItemData;
652 _TableViewItemData* pTableViewItemData = dynamic_cast<_TableViewItemData*>(pTableViewItemBase);
653 delete pTableViewItemData;
660 _CustomListItemImpl::CreateTableViewGroupItemN(_TableViewItemParams& tableViewItemParams)
662 result r = E_SUCCESS;
664 _TableViewGroupItemData* pTableViewGroupItemData = null;
666 pTableViewGroupItemData = new (std::nothrow) _TableViewGroupItemData();
667 SysTryReturn(NID_UI_CTRL, pTableViewGroupItemData, null, E_SYSTEM, "[E_OUT_OF_MEMORY] Memory allocation failed.");
669 r = pTableViewGroupItemData->Construct(FloatDimension(tableViewItemParams.width, tableViewItemParams.pItem->__pCustomListItemImpl->height));
670 SysTryCatch(NID_UI_CTRL, pTableViewGroupItemData, , E_SYSTEM, "[%s] Failed to create an item.", GetErrorMessage(r));
672 pTableViewGroupItemData->groupIndex = tableViewItemParams.groupIndex;
673 tableViewItemParams.pItem->__pCustomListItemImpl->__pTableViewGroupItemData = pTableViewGroupItemData;
675 tableViewItemParams.pItem->__pCustomListItemImpl->UpdateBitmaps();
677 return pTableViewGroupItemData;
680 delete pTableViewGroupItemData;
685 _CustomListItemImpl::CreateTableViewItemN(_TableViewItemParams& tableViewItemParams)
687 result r = E_SUCCESS;
688 _TableViewItemData* pTableViewItemData = null;
690 pTableViewItemData = new (std::nothrow) _TableViewItemData();
691 SysTryReturn(NID_UI_CTRL, pTableViewItemData, null, E_SYSTEM, "[E_OUT_OF_MEMORY] Memory allocation failed.");
693 r = pTableViewItemData->Construct(FloatDimension(tableViewItemParams.width, tableViewItemParams.pItem->__pCustomListItemImpl->height), TABLE_VIEW_ANNEX_STYLE_NORMAL);
694 SysTryCatch(NID_UI_CTRL, pTableViewItemData, , E_SYSTEM, "[%s] Failed to create an item.", GetErrorMessage(r));
696 pTableViewItemData->groupIndex = tableViewItemParams.groupIndex;
697 pTableViewItemData->itemIndex = tableViewItemParams.itemIndex;
698 tableViewItemParams.pItem->__pCustomListItemImpl->__pTableViewItemData = pTableViewItemData;
700 tableViewItemParams.pItem->__pCustomListItemImpl->UpdateBitmaps();
702 return pTableViewItemData;
705 delete pTableViewItemData;
710 _CustomListItemImpl::SetElementData(_ElementBaseModel* pElement)
712 SysTryReturnResult(NID_UI_CTRL, (pElement != null), E_INVALID_ARG, "Invalid argument used. pElement must not be null.");
714 _ElementBaseModel* pTempElement = null;
716 result r = E_SUCCESS;
718 for (; i < elements.GetCount(); i++)
720 pTempElement = dynamic_cast<_ElementBaseModel*>(elements.GetAt(i));
721 SysTryReturnResult(NID_UI_CTRL, pTempElement, E_SYSTEM, "A system error has occurred. Failed to get element");
723 if (pElement->_elementId == pTempElement->_elementId)
729 if (i != elements.GetCount())
731 r = elements.SetAt(*pElement, i, true);
735 r = elements.Add(*pElement);
742 _CustomListItemImpl::IsElementIdValid(LinkedList* pElementFormat, int elementId) const
744 for (int elementFormatDataCount = pElementFormat->GetCount() - 1; elementFormatDataCount >= 0; elementFormatDataCount--)
746 _ElementFormatData* pElementFormatData = dynamic_cast<_ElementFormatData*>(const_cast<Object*>(pElementFormat->GetAt(elementFormatDataCount)));
748 if (pElementFormatData != null && pElementFormatData->elementId == elementId)
757 _CustomListItemFormatImpl*
758 _CustomListItemImpl::GetFormatImpl(CustomListItem* pItem)
760 SysTryReturn(NID_UI_CTRL, (pItem != null), null, E_INVALID_ARG, "[E_INVALID_ARG] Invalid argument is used. CustomListItem is null");
762 CustomListItemFormat* pFormat = pItem->__pCustomListItemFormat;
763 SysTryReturn(NID_UI_CTRL, (pFormat != null), null, E_INVALID_ARG, "[E_INVALID_ARG] Invalid argument is used. CustomListItemFormat is null");
765 return pItem->__pCustomListItemFormat->__pCustomListItemFormatImpl;
769 _CustomListItemImpl::GetItemImpl(CustomListItem* pItem)
771 SysTryReturn(NID_UI_CTRL, (pItem != null), null, E_INVALID_ARG, "[E_INVALID_ARG] Invalid argument is used. CustomListItem is null");
773 return pItem->__pCustomListItemImpl;
777 _CustomListItemImpl::UpdateTableViewItem(_TableViewItemUpdateParams& updateParams)
779 _CustomListItemImpl* pCustomListItemImpl = GetItemImpl(updateParams.pItem);
780 SysTryReturnResult(NID_UI_CTRL, (pCustomListItemImpl != null), E_SYSTEM, "Invalid argument used. __pCustomListItemImpl must not be null");
782 TableViewItemBase* pTableViewItemBase = null;
784 if (pCustomListItemImpl->__pTableViewItemData)
786 pTableViewItemBase = pCustomListItemImpl->__pTableViewItemData;
790 pTableViewItemBase = pCustomListItemImpl->__pTableViewGroupItemData;
793 SysTryReturnResult(NID_UI_CTRL, (pTableViewItemBase != null), E_SYSTEM, "A system error has occurred. Failed to create tableViewItem");
795 _CustomListItemFormatImpl* pFormatImpl = GetFormatImpl(updateParams.pItem);
796 SysTryReturnResult(NID_UI_CTRL, (pFormatImpl != null), E_SYSTEM, "Invalid argument used. Item format must not be null");
798 LinkedList* pElementFormat = &pFormatImpl->elementFormatDataList;
799 _ElementBaseModel* pElementBase = null;
800 bool isValidElementId = false;
802 for (int i = 0; i < pTableViewItemBase->GetControlCount(); i++)
804 Control* pControl = dynamic_cast<Control*>(pTableViewItemBase->GetControl(i));
805 pTableViewItemBase->SetIndividualSelectionEnabled(pControl, false);
808 pTableViewItemBase->RemoveAllControls();
810 for (int elementCount = pCustomListItemImpl->elements.GetCount() -1; elementCount >= 0; elementCount--)
812 isValidElementId = false;
814 pElementBase = dynamic_cast<_ElementBaseModel*>(pCustomListItemImpl->elements.GetAt(elementCount));
815 SysTryReturnResult(NID_UI_CTRL, (pElementBase != null), E_SYSTEM, "Invalid element.");
817 if (!pCustomListItemImpl->IsElementIdValid(pElementFormat, pElementBase->_elementId))
819 pCustomListItemImpl->elements.RemoveAt(elementCount, true);
820 SysLog(NID_UI_CTRL, "The provided elementId is not present in CustomListItemFormat.");
824 result r = E_SUCCESS;
826 _ElementViewParams elementParams;
827 elementParams.pTableViewItemBase = pTableViewItemBase;
828 elementParams.pElementModel = pElementBase;
829 elementParams.pElementFormatData = pFormatImpl->GetElementFormatById(pElementBase->_elementId);
830 elementParams.isDividerEnabled = updateParams.isDividerEnabled;
831 elementParams.annexStyle = updateParams.annexStyle;
832 elementParams.pCustomListItemImpl = pCustomListItemImpl;
833 elementParams.pCheckBitmaps = updateParams.pCheckBitmaps;
834 elementParams.pElementFormat = pElementFormat;
836 r = pElementBase->CreateElementView(elementParams);
837 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, E_SYSTEM, "A system error has occurred. Failed to create element view.");
840 pCustomListItemImpl->UpdateBitmaps();
846 _CustomListItemImpl::OnTouchDoublePressed (const Control &source, const Point ¤tPosition, const TouchEventInfo &touchInfo)
852 _CustomListItemImpl::OnTouchFocusIn (const Control &source, const Point ¤tPosition, const TouchEventInfo &touchInfo)
858 _CustomListItemImpl::OnTouchFocusOut (const Control &source, const Point ¤tPosition, const TouchEventInfo &touchInfo)
860 if (source.IsEnabled() == false || touchInfo.IsFlicked())
865 _ElementBaseView* pCurrentElement = dynamic_cast<_ElementBaseView*>(const_cast<Control*>(&source));
866 SysTryReturnVoidResult(NID_UI_CTRL, (pCurrentElement != null), E_SYSTEM, "[E_SYSTEM] A system error has occurred. Failed to get element");
868 _ListBaseImpl* pListBaseImpl = GetListBaseImplFromElement(source);
869 SysTryReturnVoidResult(NID_UI_CTRL, (pListBaseImpl != null), E_SYSTEM, "[E_SYSTEM] A system error has occurred. Failed to get item.");
871 UpdateElements(source, pCurrentElement->GetElementId(), false, pListBaseImpl->_isDividerEnabled);
873 UpdateItemBackground(source, pListBaseImpl->_isDividerEnabled);
879 _CustomListItemImpl::OnTouchLongPressed (const Control &source, const Point ¤tPosition, const TouchEventInfo &touchInfo)
885 _CustomListItemImpl::OnTouchMoved (const Control &source, const Point ¤tPosition, const TouchEventInfo &touchInfo)
892 _CustomListItemImpl::OnTouchPressed (const Control &source, const Point ¤tPosition, const TouchEventInfo &touchInfo)
894 if (source.IsEnabled() == false || touchInfo.IsFlicked())
898 _ElementBaseView* pCurrentElement = dynamic_cast<_ElementBaseView*>(const_cast<Control*>(&source));
899 SysTryReturnVoidResult(NID_UI_CTRL, (pCurrentElement != null), E_SYSTEM, "[E_SYSTEM] A system error has occurred. Failed to get element");
901 _ListBaseImpl* pListBaseImpl = GetListBaseImplFromElement(source);
902 SysTryReturnVoidResult(NID_UI_CTRL, (pListBaseImpl != null), E_SYSTEM, "[E_SYSTEM] A system error has occurred. Failed to get item.");
904 int elementId = pCurrentElement->GetElementId();
906 UpdateElements(source, elementId, true, pListBaseImpl->_isDividerEnabled);
908 UpdateItemBackground(source, pListBaseImpl->_isDividerEnabled);
912 _CustomListItemImpl::OnTouchReleased (const Control &source, const Point ¤tPosition, const TouchEventInfo &touchInfo)
914 if (source.IsEnabled() == false || touchInfo.IsFlicked())
918 _ElementBaseView* pCurrentElement = dynamic_cast<_ElementBaseView*>(const_cast<Control*>(&source));
919 SysTryReturnVoidResult(NID_UI_CTRL, (pCurrentElement != null), E_SYSTEM, "[E_SYSTEM] A system error has occurred. Failed to get element");
921 _ListBaseImpl* pListBaseImpl = GetListBaseImplFromElement(source);
922 SysTryReturnVoidResult(NID_UI_CTRL, (pListBaseImpl != null), E_SYSTEM, "[E_SYSTEM] A system error has occurred. Failed to get item.");
924 _CheckElementView* pCheckElementView = dynamic_cast<_CheckElementView*>(const_cast<Control*>(&source));
926 UpdateElements(source, pCurrentElement->GetElementId(), false, pListBaseImpl->_isDividerEnabled);
928 if (__isMoved == false)
933 GetIndexFromElement(source, groupIndex, itemIndex);
935 if (((pListBaseImpl->_isDividerEnabled) && (pCheckElementView)) || (!pListBaseImpl->_isDividerEnabled))
937 pListBaseImpl->SetItemChecked(groupIndex, itemIndex, !pListBaseImpl->IsItemChecked(groupIndex, itemIndex));
940 UpdateItemBackground(source, pListBaseImpl->_isDividerEnabled);
942 bool elementIdEnabled = IsElementEventEnabled(source);
943 if (!elementIdEnabled)
945 pListBaseImpl->ProcessItemStateChange(groupIndex, itemIndex, ITEM_SELECTED);
949 pListBaseImpl->ProcessItemStateChange(groupIndex, itemIndex, pCurrentElement->GetElementId(), ITEM_SELECTED);
954 UpdateItemBackground(source, pListBaseImpl->_isDividerEnabled);
963 _CustomListItemImpl::GetViewById(int elementId) const
965 TableViewItemBase* pTableViewItemBase = null;
967 if (__pTableViewItemData)
969 pTableViewItemBase = __pTableViewItemData;
971 else if (__pTableViewGroupItemData)
973 pTableViewItemBase = __pTableViewGroupItemData;
980 _ElementBaseView* pElementBaseView = null;
982 for (int controlIndex = 0; controlIndex < pTableViewItemBase->GetControlCount(); controlIndex++)
984 pElementBaseView = dynamic_cast<_ElementBaseView*>(pTableViewItemBase->GetControl(controlIndex));
985 SysTryReturn(NID_UI_CTRL, (pElementBaseView != null), null, E_SYSTEM, "[E_SYSTEM] Invalid Element added to item");
987 if (pElementBaseView->GetElementId() == elementId)
989 SetLastResult(E_SUCCESS);
990 return pElementBaseView;
994 SetLastResult(E_SYSTEM);
999 _CustomListItemImpl::GetListBaseImplFromElement(const Control& element)
1001 _ElementBaseView* pCurrentElement = dynamic_cast<_ElementBaseView*>(const_cast<Control*>(&element));
1002 SysTryReturn(NID_UI_CTRL, (pCurrentElement != null), null, E_INVALID_ARG, "[E_INVALID_ARG] Invalid argument is used. source is not an element");
1004 TableViewItemBase* pTableViewItemBase = dynamic_cast<TableViewItemBase*>(pCurrentElement->GetParent());
1005 SysTryReturn(NID_UI_CTRL, (pTableViewItemBase != null), null, E_SYSTEM, "[E_INVALID_ARG] Invalid argument is used. source is not an element");
1007 Control* pControl = dynamic_cast<Control*>(pTableViewItemBase->GetParent());
1008 SysTryReturn(NID_UI_CTRL, (pControl != null), null, E_SYSTEM, "[E_INVALID_ARG] Invalid argument is used. source is not an element");
1010 _ListBaseImpl* pListBaseImpl = static_cast<_ListBaseImpl*>(_ControlImpl::GetInstance(*pControl));
1011 SysTryReturn(NID_UI_CTRL, (pListBaseImpl != null), null, E_SYSTEM, "[E_INVALID_ARG] Invalid argument is used. source is not an element");
1013 return pListBaseImpl;
1017 _CustomListItemImpl::GetItemFromElement(const Control& source) const
1019 _ElementBaseView* pCurrentElement = dynamic_cast<_ElementBaseView*>(const_cast<Control*>(&source));
1020 SysTryReturn(NID_UI_CTRL, (pCurrentElement != null), null, E_SYSTEM, "[E_SYSTEM] A system error has occurred. Failed to get element");
1022 _ITableViewBaseItemData* pBaseData = dynamic_cast<_ITableViewBaseItemData*>(pCurrentElement->GetParent());
1023 SysTryReturn(NID_UI_CTRL, (pBaseData != null), null, E_SYSTEM, "[E_SYSTEM] A system error has occurred. Failed to get item.");
1025 _ListBaseImpl* pListBaseImpl = GetListBaseImplFromElement(source);
1026 SysTryReturn(NID_UI_CTRL, (pListBaseImpl != null), null, E_SYSTEM, "[E_SYSTEM] A system error has occurred. Failed to get item.");
1028 int groupIndex = -1;
1031 pBaseData->GetIndex(groupIndex, itemIndex);
1033 CustomListItem* pCustomListItem = pListBaseImpl->GetCustomListItemAt(groupIndex, itemIndex - pListBaseImpl->GetTopItemIndex(groupIndex));
1034 SysTryReturn(NID_UI_CTRL, (pCustomListItem != null), null, E_SYSTEM, "[E_SYSTEM] A system error has occurred. Failed to get item.");
1036 return pCustomListItem;
1040 _CustomListItemImpl::GetIndexFromElement(const Control& source, int& groupIndex, int& itemIndex) const
1042 _ElementBaseView* pCurrentElement = dynamic_cast<_ElementBaseView*>(const_cast<Control*>(&source));
1043 SysTryReturnVoidResult(NID_UI_CTRL, (pCurrentElement != null), E_SYSTEM, "[E_SYSTEM] A system error has occurred. Failed to get element");
1045 _ITableViewBaseItemData* pBaseData = dynamic_cast<_ITableViewBaseItemData*>(pCurrentElement->GetParent());
1046 SysTryReturnVoidResult(NID_UI_CTRL, (pBaseData != null), E_SYSTEM, "[E_SYSTEM] A system error has occurred. Failed to get item.");
1048 _ListBaseImpl* pListBaseImpl = GetListBaseImplFromElement(source);
1049 SysTryReturnVoidResult(NID_UI_CTRL, (pListBaseImpl != null), E_SYSTEM, "[E_SYSTEM] A system error has occurred. Failed to get item.");
1051 pBaseData->GetIndex(groupIndex, itemIndex);
1055 _CustomListItemImpl::IsElementEventEnabled(const Control& element)
1057 CustomListItem* pCustomListItem = GetItemFromElement(element);
1058 SysTryReturn(NID_UI_CTRL, (pCustomListItem != null), false, E_SYSTEM, "[E_SYSTEM] A system error has occurred. Failed to get item.");
1060 CustomListItemFormat* pFormat = pCustomListItem->__pCustomListItemFormat;
1061 SysTryReturn(NID_UI_CTRL, (pFormat != null), false, E_SYSTEM, "[E_SYSTEM] A system error has occurred. Failed to get item.");
1063 _ElementBaseView* pCurrentElement = dynamic_cast<_ElementBaseView*>(const_cast<Control*>(&element));
1064 SysTryReturn(NID_UI_CTRL, (pCurrentElement != null), false, E_SYSTEM, "[E_SYSTEM] A system error has occurred. Failed to get element");
1066 return pFormat->__pCustomListItemFormatImpl->IsElementEventEnabled(pCurrentElement->GetElementId());
1070 _CustomListItemImpl::UpdateElements(const Control &source, int elementId, bool isPressed, bool isDividerEnabled)
1072 bool elementIdEnabled = IsElementEventEnabled(source);
1073 CustomListItemStatus customListItemStatus;
1075 _CheckElementView* pCheckElementView = dynamic_cast<_CheckElementView*>(const_cast<Control*>(&source));
1077 if (isPressed == true)
1079 customListItemStatus = CUSTOM_LIST_ITEM_STATUS_FOCUSED;
1084 customListItemStatus = CUSTOM_LIST_ITEM_STATUS_NORMAL;
1088 int elementCount = elements.GetCount();
1090 if (elementIdEnabled)
1092 if (pCheckElementView)
1094 GetCheckElement()->HandleElementEvent(customListItemStatus);
1095 pCheckElementView->SetPressed(isPressed);
1099 _ElementBaseModel* pElementBaseModel = GetElementModelById(elementId);
1100 SysTryReturnVoidResult(NID_UI_CTRL, (pElementBaseModel != null), E_SYSTEM, "[E_SYSTEM] A system error has occurred. Failed to get item.");
1102 pElementBaseModel->HandleElementEvent(customListItemStatus);
1107 if (isDividerEnabled)
1109 if (pCheckElementView)
1111 GetCheckElement()->HandleElementEvent(customListItemStatus);
1112 pCheckElementView->SetPressed(isPressed);
1116 for (int i = 0; i < elementCount; i++)
1118 _ElementBaseModel* pElementBase = dynamic_cast<_ElementBaseModel*>(elements.GetAt(i));
1119 SysTryReturnVoidResult(NID_UI_CTRL, (pElementBase != null), E_SYSTEM, "[E_SYSTEM] A system error has occurred. Failed to get element");
1121 if (pElementBase->_elementType != LIST_ITEM_ELEMENT_TYPE_CHECKBOX)
1123 pElementBase->HandleElementEvent(customListItemStatus);
1130 for (int i = 0; i < elementCount; i++)
1132 _ElementBaseModel* pElementBase = dynamic_cast<_ElementBaseModel*>(elements.GetAt(i));
1133 SysTryReturnVoidResult(NID_UI_CTRL, (pElementBase != null), E_SYSTEM, "[E_SYSTEM] A system error has occurred. Failed to get element");
1135 pElementBase->HandleElementEvent(customListItemStatus);
1142 _CustomListItemImpl::UpdateItemBackground(const Control& element, bool isDividerEnabled)
1144 TableViewItemBase* pTableViewItemBase = dynamic_cast<TableViewItemBase*>(element.GetParent());
1145 SysTryReturnVoidResult(NID_UI_CTRL, (pTableViewItemBase != null), E_SYSTEM, "[E_SYSTEM] A system error has occurred. Failed to get item.");
1147 _CheckElementView* pCheckElementView = dynamic_cast<_CheckElementView*>(const_cast<Control*>(&element));
1149 bool elementIdEnabled = IsElementEventEnabled(element);
1150 if (!elementIdEnabled)
1152 if (isDividerEnabled)
1154 if (!pCheckElementView)
1156 pTableViewItemBase->SetBackgroundColor(Color(0, 0, 0, 0));
1161 pTableViewItemBase->SetBackgroundColor(Color(0, 0, 0, 0));
1165 pTableViewItemBase->Invalidate(true);
1169 _CustomListItemImpl::DeleteCustomListItem(Tizen::Base::Object* pObj)
1171 CustomListItem* pCustomListItem = dynamic_cast<CustomListItem*>(pObj);
1172 delete pCustomListItem;
1175 }}} //Tizen::Ui::Controls