Tizen 2.1 base
[framework/osp/uifw.git] / src / ui / controls / FUiCtrl_ListViewContextItem.cpp
1 //
2 // Open Service Platform
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
4 //
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
8 //
9 //     http://floralicense.org/license/
10 //
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.
16 //
17
18 /**
19  * @file        FUiCtrl_ListViewContextItem.cpp
20  * @brief   This is the implementation file for _ListViewContextItem class.
21  *
22  * This file contains the implementation of _ListViewContextItem class.
23  */
24
25 #include <FBaseSysLog.h>
26 #include "FUi_ResourceManager.h"
27 #include "FUiCtrl_ListViewContextItem.h"
28
29 #ifdef MEMORY_LEAK_CHECK
30 #include "mem_leak_check.h"
31 #endif
32
33 using namespace Tizen::Base;
34 using namespace Tizen::Graphics;
35
36 namespace Tizen { namespace Ui { namespace Controls
37 {
38
39 _ListViewContextItem::_ListViewContextItem(int itemHeight)
40         : _TableViewItem(itemHeight)
41 {
42         GET_SHAPE_CONFIG(LISTVIEW::CONTEXTITEM_LEFT_MARGIN, _CONTROL_ORIENTATION_PORTRAIT, __margin);
43         GET_SHAPE_CONFIG(LISTVIEW::CONTEXTITEM_ELEMENT_SPACING, _CONTROL_ORIENTATION_PORTRAIT, __elementSpacing);
44         GET_SHAPE_CONFIG(LISTVIEW::CONTEXTITEM_ELEMENT_HEIGHT, _CONTROL_ORIENTATION_PORTRAIT, __elementHeight);
45         GET_SHAPE_CONFIG(LISTVIEW::CONTEXTITEM_ELEMENT_FONT_SIZE, _CONTROL_ORIENTATION_PORTRAIT, __textSize);
46
47         SetBackgroundColor(Color(0, 0, 0, 0));
48 }
49
50 _ListViewContextItem::~_ListViewContextItem(void)
51 {
52         for (int i = __elements.size() - 1; i >= 0; i--)
53         {
54                 _ListViewContextItemElement element = __elements.at(i);
55
56                 DetachChild(*(element.pButton));
57
58                 delete element.pButton;
59                 element.pButton = null;
60
61                 __elements.pop_back();
62         }
63
64         __elements.clear();
65 }
66
67 _ListViewContextItem*
68 _ListViewContextItem::CreateListViewContextItemN(int itemHeight)
69 {
70         _ListViewContextItem* pItem = new (std::nothrow) _ListViewContextItem(itemHeight);
71         SysTryReturn(NID_UI_CTRL, (pItem != null), null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
72
73         pItem->AcquireHandle();
74
75         result r = pItem->Initialize();
76         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r = E_SYSTEM, "[E_SYSTEM] Unable to create TableView Item");
77
78         return pItem;
79
80 CATCH:
81         delete pItem;
82
83         return null;
84 }
85
86 bool
87 _ListViewContextItem::AddElement(int elementId, const String& text, bool enable)
88 {
89         if (text.IsEmpty() || HasElement(elementId))
90         {
91                 return false;
92         }
93
94         _ListViewContextItemElement contextElement;
95         memset(&contextElement, 0, sizeof(_ListViewContextItemElement));
96
97         contextElement.elementId = elementId;
98         contextElement.pButton = _Button::CreateButtonN();
99         SysTryReturn(NID_UI_CTRL, (contextElement.pButton != null), false, E_OUT_OF_MEMORY, "E_OUT_OF_MEMORY] The memory is insufficient.");
100
101         __elements.push_back(contextElement);
102
103         AdjustElementLayout();
104
105         contextElement.pButton->SetActionId(elementId);
106         contextElement.pButton->SetEnableState(enable);
107         //contextElement.pButton->SetMargin(0, 0);
108         contextElement.pButton->SetTextSize(__textSize);
109         contextElement.pButton->SetText(text);
110
111         AttachChild(*(contextElement.pButton));
112
113         return true;
114 }
115
116 bool
117 _ListViewContextItem::AddElement(int elementId, const Bitmap* pNormalBitmap, const Bitmap* pPressedBitmap,
118                 const Bitmap* pHighlightedBitmap, bool enable)
119 {
120         if ((pNormalBitmap == null) || (pPressedBitmap == null) || HasElement(elementId))
121         {
122                 return false;
123         }
124
125         _ListViewContextItemElement contextElement;
126         memset(&contextElement, 0, sizeof(_ListViewContextItemElement));
127
128         contextElement.elementId = elementId;
129         contextElement.pButton = _Button::CreateButtonN();
130         SysTryReturn(NID_UI_CTRL, (contextElement.pButton != null), false, E_OUT_OF_MEMORY, "E_OUT_OF_MEMORY] The memory is insufficient.");
131
132         __elements.push_back(contextElement);
133
134         AdjustElementLayout();
135
136         contextElement.pButton->SetActionId(elementId);
137         contextElement.pButton->SetEnableState(enable);
138         contextElement.pButton->SetBackgroundBitmap(_BUTTON_STATUS_NORMAL, *pNormalBitmap);
139         contextElement.pButton->SetBackgroundBitmap(_BUTTON_STATUS_PRESSED, *pPressedBitmap);
140
141         if (pHighlightedBitmap != null)
142         {
143                 contextElement.pButton->SetBackgroundBitmap(_BUTTON_STATUS_HIGHLIGHTED, *pHighlightedBitmap);
144         }
145
146         AttachChild(*(contextElement.pButton));
147
148         return true;
149 }
150
151 bool
152 _ListViewContextItem::AddElement(int elementId, const String& text, const Bitmap* pNormalBitmap, const Bitmap* pPressedBitmap,
153                 const Bitmap* pHighlightedBitmap, bool enable)
154 {
155         if (text.IsEmpty() || (pNormalBitmap == null) || (pPressedBitmap == null) || HasElement(elementId))
156         {
157                 return false;
158         }
159
160         _ListViewContextItemElement contextElement;
161         memset(&contextElement, 0, sizeof(_ListViewContextItemElement));
162
163         contextElement.elementId = elementId;
164         contextElement.pButton = _Button::CreateButtonN();
165         SysTryReturn(NID_UI_CTRL, (contextElement.pButton != null), false, E_OUT_OF_MEMORY, "E_OUT_OF_MEMORY] The memory is insufficient.");
166
167         __elements.push_back(contextElement);
168
169         AdjustElementLayout();
170
171         contextElement.pButton->SetActionId(elementId);
172         contextElement.pButton->SetEnableState(enable);
173         contextElement.pButton->SetMargin(0, 0);
174         contextElement.pButton->SetTextSize(__textSize);
175         contextElement.pButton->SetText(text);
176         contextElement.pButton->SetBackgroundBitmap(_BUTTON_STATUS_NORMAL, *pNormalBitmap);
177         contextElement.pButton->SetBackgroundBitmap(_BUTTON_STATUS_PRESSED, *pPressedBitmap);
178
179         if (pHighlightedBitmap != null)
180         {
181                 contextElement.pButton->SetBackgroundBitmap(_BUTTON_STATUS_HIGHLIGHTED, *pHighlightedBitmap);
182         }
183
184         AttachChild(*(contextElement.pButton));
185
186         return true;
187 }
188
189 void
190 _ListViewContextItem::AdjustElementLayout(void)
191 {
192         if (__elements.size() == 0)
193         {
194                 return;
195         }
196
197         int elementCount = __elements.size();
198         Rectangle itemBounds = GetBounds();
199         Rectangle elementBounds;
200
201         // Calculate horizontal value
202         if (elementCount == 1)
203         {
204                 int margin = 0;
205                 GET_SHAPE_CONFIG(LISTVIEW::CONTEXTITEM_LEFT_MARGIN_ONE, _CONTROL_ORIENTATION_PORTRAIT, margin);
206
207                 elementBounds.x = __margin + margin;
208                 elementBounds.width = (itemBounds.width - ((__margin + margin) * 2));
209         }
210         else
211         {
212                 elementBounds.x = __margin;
213                 elementBounds.width = ((itemBounds.width - __margin * 2) - (__elementSpacing * (elementCount - 1))) / elementCount;
214         }
215
216         // Calculate vertical value
217         elementBounds.y = (itemBounds.height - __elementHeight) / 2;
218         elementBounds.height = __elementHeight;
219
220         _LinkedList <_ListViewContextItemElement>::_Iterator iter;
221
222         for (iter = __elements.begin(); iter != __elements.end(); iter++)
223         {
224                 if (iter->pButton != null)
225                 {
226                         iter->pButton->SetBounds(elementBounds);
227                 }
228
229                 elementBounds.x += (elementBounds.width + __elementSpacing);
230         }
231 }
232
233 _ListViewContextItemElement*
234 _ListViewContextItem::GetElement(int elementId) const
235 {
236         _LinkedList <_ListViewContextItemElement>::_Iterator iter;
237
238         for (iter = __elements.begin(); iter != __elements.end(); iter++)
239         {
240                 if (iter->elementId == elementId)
241                 {
242                         return &(*iter);
243                 }
244         }
245
246         return null;
247 }
248
249 bool
250 _ListViewContextItem::HasElement(int elementId)
251 {
252         _ListViewContextItemElement* pElement = GetElement(elementId);
253
254         return (pElement != null);
255 }
256
257 int
258 _ListViewContextItem::GetElementIdFromPosition(const Point& position) const
259 {
260         _LinkedList <_ListViewContextItemElement>::_ReverseIterator reverseIter;
261
262         for (reverseIter = __elements.rbegin(); reverseIter != __elements.rend(); reverseIter++)
263         {
264                 if ((*reverseIter).pButton->GetBounds().Contains(position))
265                 {
266                         return (*reverseIter).elementId;
267                 }
268         }
269
270         return -1;
271 }
272
273 void
274 _ListViewContextItem::AddContextItemEventListener(_IActionEventListener& listener)
275 {
276         if (__elements.size() > 0)
277         {
278                 _LinkedList <_ListViewContextItemElement>::_Iterator iter;
279
280                 for (iter = __elements.begin(); iter != __elements.end(); iter++)
281                 {
282                         iter->pButton->AddActionEventListener(listener);
283                 }
284         }
285 }
286
287 void
288 _ListViewContextItem::RemoveContextItemEventListener(_IActionEventListener& listener)
289 {
290         if (__elements.size() > 0)
291         {
292                 _LinkedList <_ListViewContextItemElement>::_Iterator iter;
293
294                 for (iter = __elements.begin(); iter != __elements.end(); iter++)
295                 {
296                         iter->pButton->RemoveActionEventListener(listener);
297                 }
298         }
299 }
300
301 void
302 _ListViewContextItem::AdjustItemBounds(Rectangle& bounds)
303 {
304         Rectangle newBounds = bounds;
305         Dimension itemDimension = GetSize();
306         int margin = 0;
307
308         GET_SHAPE_CONFIG(TABLEVIEW::CONTEXTITEM_RIGHT_MARGIN, _CONTROL_ORIENTATION_PORTRAIT, margin);
309         newBounds.width -= margin;
310
311         if ((itemDimension.width != newBounds.width) || (itemDimension.height != newBounds.height))
312         {
313                 SetBounds(Rectangle(0, 0,newBounds.width, newBounds.height));
314                 AdjustElementLayout();
315         }
316 }
317
318 void
319 _ListViewContextItem::OnFontChanged(Font* pFont)
320 {
321         String fontName = GetFont();
322
323         _LinkedList <_ListViewContextItemElement>::_Iterator iter;
324
325         for (iter = __elements.begin(); iter != __elements.end(); iter++)
326         {
327                 iter->pButton->SetFont(fontName);
328         }
329 }
330
331 }}} // Tizen::Ui::Controls