Tizen 2.1 base
[framework/osp/uifw.git] / src / ui / controls / FUiCtrl_TokenEdit.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  * @file                FUiCtrl_TokenEdit.cpp
19  * @brief               This is the implementation file for the _TokenEdit class.
20  */
21
22 #include <FBaseSysLog.h>
23 #include "FUiCtrl_TokenEdit.h"
24 #include "FUiCtrl_TokenEditPresenter.h"
25
26 #include "FUi_AccessibilityContainer.h"
27 #include "FUi_AccessibilityElement.h"
28
29 using namespace Tizen::Base;
30 using namespace Tizen::Graphics;
31 using namespace Tizen::Ui;
32
33 namespace Tizen { namespace Ui { namespace Controls
34 {
35
36 IMPLEMENT_PROPERTY(_TokenEdit);
37
38 _TokenEdit::_TokenEdit(void)
39         : _Edit()
40         , __pTokenEditPresenter(null)
41         , __isSelectedTokenTextColorSet(false)
42         , __pTokenFilter(null)
43         , __pDescriptionTextAccessibilityElement(null)
44         , __pHiddenTokenCountAccessibilityElement(null)
45         , __pExpandableButtonAccessibilityElement(null)
46 {
47         GET_COLOR_CONFIG(TOKENEDIT::TOKEN_BG_NORMAL, __tokenColor[EXPANDABLE_EDIT_AREA_TOKEN_STATUS_NORMAL]);
48         GET_COLOR_CONFIG(TOKENEDIT::TOKEN_BG_SELECTED, __tokenColor[EXPANDABLE_EDIT_AREA_TOKEN_STATUS_SELECTED]);
49
50         GET_COLOR_CONFIG(TOKENEDIT::TOKEN_TEXT_NORMAL, __tokenTextColor[EXPANDABLE_EDIT_AREA_TOKEN_STATUS_NORMAL]);
51         GET_COLOR_CONFIG(TOKENEDIT::TOKEN_TEXT_SELECTED, __tokenTextColor[EXPANDABLE_EDIT_AREA_TOKEN_STATUS_SELECTED]);
52
53         _AccessibilityContainer* pContainer = null;
54         pContainer = GetAccessibilityContainer();
55         if (pContainer)
56         {
57                 pContainer->Activate(true);
58         }
59 }
60
61 _TokenEdit::~_TokenEdit(void)
62 {
63
64 }
65
66 _TokenEdit*
67 _TokenEdit::CreateTokenEditN(void)
68 {
69         _TokenEditPresenter* pPresenter = _TokenEditPresenter::CreateTokenEditPresenterN();
70         result r = GetLastResult();
71         SysTryReturn(NID_UI_CTRL, pPresenter != null, null, r, "[%s] Propagating.", GetErrorMessage(r));
72
73         _TokenEdit* pTokenEdit = new (std::nothrow) _TokenEdit();
74         SysTryCatch(NID_UI_CTRL, pTokenEdit != null, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
75         SysTryCatch(NID_UI_CTRL, GetLastResult() == E_SUCCESS, , GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
76
77         pTokenEdit->AcquireHandle();
78
79         pTokenEdit->SetPresenter(*pPresenter);
80         pTokenEdit->__pTokenEditPresenter = pPresenter;
81
82         return pTokenEdit;
83
84 CATCH:
85         delete pPresenter;
86         delete pTokenEdit;
87         return null;
88 }
89
90 void
91 _TokenEdit::OnDraw(void)
92 {
93         result r = E_SUCCESS;
94
95         if (__pTokenEditPresenter == null)
96         {
97                 return;
98         }
99
100         Canvas* pCanvas = GetCanvasN();
101         SysTryReturnVoidResult(NID_UI_CTRL, pCanvas, GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
102
103         r = __pTokenEditPresenter->Draw(*pCanvas);
104         SysTryReturnVoidResult(NID_UI_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
105
106         delete pCanvas;
107 }
108
109 result
110 _TokenEdit::SetTokenFilter(const _ITokenFilter* pFilter)
111 {
112         result r = E_SUCCESS;
113
114         __pTokenFilter = const_cast <_ITokenFilter*>(pFilter);
115
116         return r;
117 }
118
119 _ITokenFilter*
120 _TokenEdit::GetTokenFilter(void) const
121 {
122         return __pTokenFilter;
123 }
124
125 result
126 _TokenEdit::AppendToken(const String& token)
127 {
128         result r = E_SUCCESS;
129
130         SysAssertf(__pTokenEditPresenter != null, "_TokenEditPresenter instance is null");
131
132         r = __pTokenEditPresenter->MakeToken(token);
133         SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Propagating.");
134
135         return r;
136 }
137
138 result
139 _TokenEdit::InsertTokenAt(int index, const String& token)
140 {
141         result r = E_SUCCESS;
142
143         SysAssertf(__pTokenEditPresenter != null, "_TokenEditPresenter instance is null");
144
145         r = __pTokenEditPresenter->InsertTokenAt(index, token, true);
146         SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Propagating.");
147
148         return r;
149 }
150
151 String
152 _TokenEdit::GetTokenAt(int index) const
153 {
154         SysAssertf(__pTokenEditPresenter != null, "_TokenEditPresenter instance is null");
155
156         return __pTokenEditPresenter->GetTokenAt(index);
157 }
158
159 int
160 _TokenEdit::GetTokenCount(void) const
161 {
162         SysAssertf(__pTokenEditPresenter != null, "_TokenEditPresenter instance is null");
163
164         return __pTokenEditPresenter->GetTokenCount();
165 }
166
167 int
168 _TokenEdit::GetSelectedTokenIndex(void) const
169 {
170         SysAssertf(__pTokenEditPresenter != null, "_TokenEditPresenter instance is null");
171
172         return __pTokenEditPresenter->GetSelectedTokenIndex();
173 }
174
175 bool
176 _TokenEdit::IsTokenEditModeEnabled(void) const
177 {
178         SysAssertf(__pTokenEditPresenter != null, "_TokenEditPresenter instance is null");
179
180         Variant var = GetProperty("tokenEditModeEnabled");
181
182         return var.ToBool();
183 }
184
185 result
186 _TokenEdit::RemoveTokenAt(int index)
187 {
188         SysAssertf(__pTokenEditPresenter != null, "_TokenEditPresenter instance is null");
189
190         return __pTokenEditPresenter->RemoveTokenAt(index, true);
191 }
192
193 result
194 _TokenEdit::SetTokenSelected(int index, bool selected)
195 {
196         SysAssertf(__pTokenEditPresenter != null, "_TokenEditPresenter instance is null");
197
198         return __pTokenEditPresenter->SetTokenSelected(index, selected);
199 }
200
201 result
202 _TokenEdit::SetTokenEditModeEnabled(bool enable)
203 {
204         SysAssertf(__pTokenEditPresenter != null, "_TokenEditPresenter instance is null");
205
206         Variant var(enable);
207
208         return SetProperty("tokenEditModeEnabled", var);
209 }
210
211 Color
212 _TokenEdit::GetTokenColor(ExpandableEditAreaTokenStatus status) const
213 {
214         Variant var;
215
216         switch (status)
217         {
218         case EXPANDABLE_EDIT_AREA_TOKEN_STATUS_NORMAL :
219                 var = GetProperty("normalTokenColor");
220                 break;
221
222         case EXPANDABLE_EDIT_AREA_TOKEN_STATUS_SELECTED :
223                 var = GetProperty("selectedTokenColor");
224                 break;
225
226         default :
227                 break;
228         }
229
230         return var.ToColor();
231 }
232
233 Color
234 _TokenEdit::GetTokenTextColor(void) const
235 {
236         Variant var = GetProperty("tokenTextColor");
237
238         return var.ToColor();
239 }
240
241 result
242 _TokenEdit::SetTokenColor(ExpandableEditAreaTokenStatus status, const Color& color)
243 {
244         result r = E_SUCCESS;
245         Variant var(color);
246
247         switch (status)
248         {
249         case EXPANDABLE_EDIT_AREA_TOKEN_STATUS_NORMAL :
250                 r = SetProperty("normalTokenColor", var);
251                 break;
252
253         case EXPANDABLE_EDIT_AREA_TOKEN_STATUS_SELECTED :
254                 r = SetProperty("selectedTokenColor", var);
255                 break;
256
257         default :
258                 break;
259         }
260
261         return r;
262 }
263
264 result
265 _TokenEdit::SetTokenTextColor(const Color& color)
266 {
267         Variant var(color);
268         return SetProperty("tokenTextColor", var);
269 }
270
271 Color
272 _TokenEdit::GetSelectedTokenTextColor(void) const
273 {
274         Variant var = GetProperty("selectedTokenTextColor");
275
276         return var.ToColor();
277 }
278
279 result
280 _TokenEdit::SetSelectedTokenTextColor(const Color& color)
281 {
282         Variant var(color);
283
284         return SetProperty("selectedTokenTextColor", var);
285 }
286
287 result
288 _TokenEdit::SetTitleText(const String& title)
289 {
290         result r = E_SUCCESS;
291
292         SysAssertf(__pTokenEditPresenter != null, "_TokenEditPresenter instance is null");
293
294         __pTokenEditPresenter->SetDescriptionText(title);
295
296         r = __pTokenEditPresenter->CalculateDescriptionTextRect(title);
297         SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS,  r, "Propagating.");
298
299         r = __pTokenEditPresenter->CalculateTokenPositionFromIndex(0);
300         SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS,  r, "Propagating.");
301
302         r = __pTokenEditPresenter->SetInitialBounds();
303         SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS,  r, "Propagating.");
304
305         return r;
306 }
307
308 String
309 _TokenEdit::GetTitleText(void) const
310 {
311         SysAssertf(__pTokenEditPresenter != null, "_TokenEditPresenter instance is null");
312
313         return __pTokenEditPresenter->GetDescriptionText();
314 }
315
316 void
317 _TokenEdit::SetAutoShrinkModeEnabled(bool enable)
318 {
319         SysAssertf(__pTokenEditPresenter != null, "_TokenEditPresenter instance is null");
320
321         __pTokenEditPresenter->SetAutoShrinkModeEnabled(enable);
322 }
323
324 bool
325 _TokenEdit::IsAutoShrinkModeEnabled(void) const
326 {
327         SysAssertf(__pTokenEditPresenter != null, "_TokenEditPresenter instance is null");
328
329         return __pTokenEditPresenter->IsAutoShrinkModeEnabled();
330 }
331
332 result
333 _TokenEdit::ProcessTokenFiltering(const String& inputString, String& replaceString, bool& enable)
334 {
335         if (__pTokenFilter)
336         {
337                 enable = __pTokenFilter->ReplaceToken(inputString, replaceString);
338         }
339
340         return E_SUCCESS;
341 }
342
343 bool
344 _TokenEdit::OnTouchPressed(const _Control& source, const _TouchInfo& touchinfo)
345 {
346         if (&source != this)
347         {
348                 return false;
349         }
350
351         if (__pTokenEditPresenter == null)
352         {
353                 return false;
354         }
355         return __pTokenEditPresenter->OnTouchPressed(source, touchinfo);
356 }
357
358 bool
359 _TokenEdit::OnTouchReleased(const _Control& source, const _TouchInfo& touchinfo)
360 {
361         if (&source != this)
362         {
363                 return false;
364         }
365         if (__pTokenEditPresenter == null)
366         {
367                 return false;
368         }
369         return __pTokenEditPresenter->OnTouchReleased(source, touchinfo);
370 }
371
372 bool
373 _TokenEdit::OnTouchMoved(const _Control& source, const _TouchInfo& touchinfo)
374 {
375         if (&source != this)
376         {
377                 return false;
378         }
379         if (__pTokenEditPresenter == null)
380         {
381                 return false;
382         }
383         return __pTokenEditPresenter->OnTouchMoved(source, touchinfo);
384 }
385
386 result
387 _TokenEdit::SetPropertyNormalTokenColor(const Variant& color)
388 {
389         ClearLastResult();
390
391         __tokenColor[EXPANDABLE_EDIT_AREA_TOKEN_STATUS_NORMAL] = color.ToColor();
392
393         return E_SUCCESS;
394 }
395
396 Variant
397 _TokenEdit::GetPropertyNormalTokenColor(void) const
398 {
399         ClearLastResult();
400
401         return Variant(__tokenColor[EXPANDABLE_EDIT_AREA_TOKEN_STATUS_NORMAL]);
402 }
403
404 result
405 _TokenEdit::SetPropertySelectedTokenColor(const Variant& color)
406 {
407         ClearLastResult();
408
409         __tokenColor[EXPANDABLE_EDIT_AREA_TOKEN_STATUS_SELECTED] = color.ToColor();
410
411         return E_SUCCESS;
412 }
413
414 Variant
415 _TokenEdit::GetPropertySelectedTokenColor(void) const
416 {
417         ClearLastResult();
418
419         return Variant(__tokenColor[EXPANDABLE_EDIT_AREA_TOKEN_STATUS_SELECTED]);
420 }
421
422 result
423 _TokenEdit::SetPropertyTokenTextColor(const Variant& color)
424 {
425         ClearLastResult();
426
427         __tokenTextColor[EXPANDABLE_EDIT_AREA_TOKEN_STATUS_NORMAL] = color.ToColor();
428         if(!__isSelectedTokenTextColorSet)
429                 __tokenTextColor[EXPANDABLE_EDIT_AREA_TOKEN_STATUS_SELECTED] = color.ToColor();
430
431         return E_SUCCESS;
432 }
433
434 Variant
435 _TokenEdit::GetPropertyTokenTextColor(void) const
436 {
437         ClearLastResult();
438
439         return Variant(__tokenTextColor[EXPANDABLE_EDIT_AREA_TOKEN_STATUS_NORMAL]);
440 }
441
442 result
443 _TokenEdit::SetPropertySelectedTokenTextColor(const Variant& color)
444 {
445         ClearLastResult();
446
447         __isSelectedTokenTextColorSet = true;
448
449         __tokenTextColor[EXPANDABLE_EDIT_AREA_TOKEN_STATUS_SELECTED] = color.ToColor();
450
451         return E_SUCCESS;
452 }
453
454 Variant
455 _TokenEdit::GetPropertySelectedTokenTextColor(void) const
456 {
457         ClearLastResult();
458
459         return Variant(__tokenTextColor[EXPANDABLE_EDIT_AREA_TOKEN_STATUS_SELECTED]);
460 }
461
462
463 result
464 _TokenEdit::SetPropertyTokenEditModeEnabled(const Variant& enable)
465 {
466         SysAssertf(__pTokenEditPresenter != null, "_TokenEditPresenter instance is null");
467
468         ClearLastResult();
469
470         return __pTokenEditPresenter->SetTokenEditModeEnabled(enable.ToBool());
471 }
472
473 Variant
474 _TokenEdit::GetPropertyTokenEditModeEnabled(void) const
475 {
476         SysAssertf(__pTokenEditPresenter != null, "_TokenEditPresenter instance is null");
477
478         ClearLastResult();
479
480         bool enabled = __pTokenEditPresenter->IsTokenEditModeEnabled();
481
482         return Variant(enabled);
483 }
484
485 result
486 _TokenEdit::OnAttachedToMainTree(void)
487 {
488         _AccessibilityContainer* pContainer = null;
489         pContainer = GetAccessibilityContainer();
490         if (pContainer)
491         {
492                 if (__pDescriptionTextAccessibilityElement)
493                 {
494                         return E_SUCCESS;
495                 }
496
497                 if (GetEditStyle() & EDIT_STYLE_TITLE_LEFT)
498                 {
499                         __pDescriptionTextAccessibilityElement = new (std::nothrow) _AccessibilityElement(true);
500                         if (__pDescriptionTextAccessibilityElement)
501                         {
502                                 __pDescriptionTextAccessibilityElement->SetTrait(ACCESSIBILITY_TRAITS_TEXT_FIELD);
503                                 pContainer->AddElement(*__pDescriptionTextAccessibilityElement);
504                         }
505                 }
506
507                 if (IsAutoShrinkModeEnabled())
508                 {
509                         __pHiddenTokenCountAccessibilityElement = new (std::nothrow) _AccessibilityElement(true);
510                         if (__pHiddenTokenCountAccessibilityElement)
511                         {
512                                 __pHiddenTokenCountAccessibilityElement->SetTrait(ACCESSIBILITY_TRAITS_TEXT_FIELD);
513                                 pContainer->AddElement(*__pHiddenTokenCountAccessibilityElement);
514                         }
515
516                         __pExpandableButtonAccessibilityElement = new (std::nothrow) _AccessibilityElement(true);
517                         if (__pExpandableButtonAccessibilityElement)
518                         {
519                                 __pExpandableButtonAccessibilityElement->SetTrait(ACCESSIBILITY_TRAITS_EXPAND_BUTTON);
520                                 pContainer->AddElement(*__pExpandableButtonAccessibilityElement);
521                         }
522                 }
523         }
524
525         return E_SUCCESS;
526 }
527
528 void
529 _TokenEdit::OnBoundsChanged(void)
530 {
531         SysAssertf(__pTokenEditPresenter != null, "_TokenEditPresenter instance is null");
532
533         __pTokenEditPresenter->OnBoundsChanged();
534
535         return;
536 }
537
538 }}} //Tizen::Ui::Controls
539