Fix for N_SE-46376 and N_SE-46424/Firing CancelButton events on Enter
[framework/osp/uifw.git] / src / ui / controls / FUiCtrl_SearchBar.cpp
1 //
2 // Open Service Platform
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
4 //
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
8 //
9 //     http://www.apache.org/licenses/LICENSE-2.0/
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_SearchBar.cpp
20  * @brief               This is the implementation file for the _SearchBar class.
21  */
22
23 #include <FBaseErrorDefine.h>
24 #include <FBaseSysLog.h>
25 #include <FGrp_BitmapImpl.h>
26 #include "FUiAnim_VisualElement.h"
27 #include "FUi_ResourceManager.h"
28 #include "FUiCtrl_SearchBar.h"
29 #include "FUiCtrl_SearchBarPresenter.h"
30 #include "FUiCtrl_Form.h"
31 #include "FUiCtrl_Edit.h"
32 #include "FUiCtrl_Panel.h"
33 #include "FUiCtrl_OverlayPanel.h"
34 #include "FUiCtrl_Keypad.h"
35 #include "FUiCtrl_ColorPicker.h"
36 #include "FUiCtrl_ActionEvent.h"
37 #include "FUiCtrl_TextBlockEvent.h"
38 #include "FUiCtrl_TextEvent.h"
39 #include "FUi_AccessibilityContainer.h"
40 #include "FUi_AccessibilityElement.h"
41 #include "FUi_AccessibilityManager.h"
42 #include "FUi_CoordinateSystemUtils.h"
43 #include "FUiCtrl_SearchBarImpl.h"
44 #include "FUiCtrl_EditFieldImpl.h"
45 #include "FUiCtrl_ButtonImpl.h"
46 #include <FSys_SettingInfoImpl.h>
47
48
49 using namespace Tizen::Graphics;
50 using namespace Tizen::Ui;
51 using namespace Tizen::Ui::Animations;
52 using namespace Tizen::Base;
53 using namespace Tizen::Base::Runtime;
54 using namespace Tizen::Locales;
55 using namespace Tizen::System;
56
57 namespace Tizen { namespace Ui { namespace Controls
58 {
59
60 IMPLEMENT_PROPERTY(_SearchBar);
61
62 _SearchBar::_SearchBar(void)
63         : __pSearchBarPresenter(null)
64         , __pClippedGroupControl(null)
65         , __pEdit(null)
66         , __pCancelButton(null)
67         , __pContainer(null)
68         , __pContentControl(null)
69         , __actionId(0)
70         , __searchBarStyle(0)
71         , __isButtonEnabled(true)
72         , __isUsableCancelButton(false)
73         , __isUserContainerBounds(false)
74         , __isCancelActionInProgress(false)
75         , __isUserGuideTextColor(false)
76         , __isKeypadOpening(false)
77         , __isupdateContentBounds(false)
78         , __isFocusCallbackToBeFired(true)
79         , __isButtonTextChangedByApp(false)
80         , __contentVisibilitySetByApp(true)
81         , __isInFocusMode(false)
82         , __keypadAction(CORE_KEYPAD_ACTION_SEARCH)
83         , __pBackgroundBitmap(null)
84         , __backgroundColor(Color())
85         , __contentColor(Color())
86         , __pActionEvent(null)
87         , __pKeypadEvent(null)
88         , __pTextBlockEvent(null)
89         , __pTextEvent(null)
90         , __pSearchBarEvent(null)
91         , __pLanguageEvent(null)
92         , __pAccessibilitySearchBarElement(null)
93 {
94         for (int i = 0; i < SEARCHBAR_BUTTON_COLOR_MAX; i++)
95         {
96                 __buttonColor[i] = Color(0);
97                 __buttonTextColor[i] = Color(0);
98         }
99
100         for (int i = 0; i < SEARCHBAR_COLOR_MAX; i++)
101         {
102                 __color[i] = Color(0);
103                 __textColor[i] = Color(0);
104                 __guideTextColor[i] = Color(0);
105         }
106
107         _AccessibilityContainer* pContainer = GetAccessibilityContainer();
108         if (pContainer)
109         {
110                 pContainer->Activate(true);
111         }
112 }
113
114 _SearchBar::~_SearchBar(void)
115 {
116         SettingInfo::RemoveSettingEventListener(*this);
117
118         delete __pSearchBarPresenter;
119         __pSearchBarPresenter = null;
120
121         if (__pClippedGroupControl)
122         {
123                 DetachChild(*__pClippedGroupControl);
124
125                 delete __pClippedGroupControl;
126                 __pClippedGroupControl = null;
127         }
128
129         if (__pContainer)
130         {
131                 DetachChild(*__pContainer);
132
133                 delete __pContainer;
134                 __pContainer = null;
135         }
136
137         if (__pActionEvent)
138         {
139                 delete __pActionEvent;
140                 __pActionEvent = null;
141         }
142
143         if (__pKeypadEvent)
144         {
145                 delete __pKeypadEvent;
146                 __pKeypadEvent = null;
147         }
148
149         if (__pTextBlockEvent)
150         {
151                 delete __pTextBlockEvent;
152                 __pTextBlockEvent = null;
153         }
154
155         if (__pTextEvent)
156         {
157                 delete __pTextEvent;
158                 __pTextEvent = null;
159         }
160
161         if (__pSearchBarEvent)
162         {
163                 delete __pSearchBarEvent;
164                 __pSearchBarEvent = null;
165         }
166
167         if (__pLanguageEvent)
168         {
169                 delete __pLanguageEvent;
170                 __pLanguageEvent = null;
171         }
172
173         if (__pAccessibilitySearchBarElement)
174         {
175                 __pAccessibilitySearchBarElement->Activate(false);
176                 __pAccessibilitySearchBarElement = null;
177         }
178
179         delete __pBackgroundBitmap;
180         __pBackgroundBitmap = null;
181 }
182
183 _SearchBar*
184 _SearchBar::CreateSearchBarN(void)
185 {
186         _SearchBar* pSearchBar = new (std::nothrow) _SearchBar;
187         SysTryReturn(NID_UI_CTRL, pSearchBar, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
188         if (GetLastResult() != E_SUCCESS)
189         {
190                 delete pSearchBar;
191                 return null;
192         }
193
194         pSearchBar->AcquireHandle();
195         pSearchBar->SetTouchPressThreshold(_TOUCH_PRESS_THRESHOLD_INSENSITIVE);
196
197         return pSearchBar;
198 }
199
200 result
201 _SearchBar::Initialize(bool enableSearchBarButton, CoreKeypadAction keypadAction)
202 {
203         result r = E_SUCCESS;
204
205         // Setting Button color
206         GET_COLOR_CONFIG(SEARCHBAR::BUTTON_BG_NORMAL, __buttonColor[SEARCH_BAR_BUTTON_STATUS_NORMAL]);
207         GET_COLOR_CONFIG(SEARCHBAR::BUTTON_BG_PRESSED, __buttonColor[SEARCH_BAR_BUTTON_STATUS_PRESSED]);
208         GET_COLOR_CONFIG(SEARCHBAR::BUTTON_BG_HIGHLIGHTED, __buttonColor[SEARCH_BAR_BUTTON_STATUS_HIGHLIGHTED]);
209         GET_COLOR_CONFIG(SEARCHBAR::BUTTON_BG_DISABLED, __buttonColor[SEARCH_BAR_BUTTON_STATUS_DISABLED]);
210
211         GET_COLOR_CONFIG(SEARCHBAR::BUTTON_TEXT_NORMAL, __buttonTextColor[SEARCH_BAR_BUTTON_STATUS_NORMAL]);
212         GET_COLOR_CONFIG(SEARCHBAR::BUTTON_TEXT_PRESSED, __buttonTextColor[SEARCH_BAR_BUTTON_STATUS_PRESSED]);
213         GET_COLOR_CONFIG(SEARCHBAR::BUTTON_TEXT_HIGHLIGHTED, __buttonTextColor[SEARCH_BAR_BUTTON_STATUS_HIGHLIGHTED]);
214         GET_COLOR_CONFIG(SEARCHBAR::BUTTON_TEXT_DISABLED, __buttonTextColor[SEARCH_BAR_BUTTON_STATUS_DISABLED]);
215
216         GET_COLOR_CONFIG(SEARCHBAR::CONTENT_AREA_BG_NORMAL, __contentColor);
217
218         for (int i = 0; i < SEARCHBAR_COLOR_MAX; i++)
219         {
220                 switch(i)
221                 {
222                 case SEARCH_FIELD_STATUS_DISABLED:
223                         GET_COLOR_CONFIG(SEARCHBAR::EDIT_BG_DISABLED, __color[i]);
224                         GET_COLOR_CONFIG(SEARCHBAR::EDIT_TEXT_DISABLED, __textColor[i]);
225                         GET_COLOR_CONFIG(SEARCHBAR::GUIDE_TEXT_DISABLED, __guideTextColor[i]);
226                         break;
227
228                 case SEARCH_FIELD_STATUS_HIGHLIGHTED:
229                         GET_COLOR_CONFIG(SEARCHBAR::EDIT_BG_NORMAL, __color[i]);
230                         GET_COLOR_CONFIG(SEARCHBAR::EDIT_TEXT_HIGHLIGHTED, __textColor[i]);
231                         GET_COLOR_CONFIG(SEARCHBAR::GUIDE_TEXT_NORMAL, __guideTextColor[i]);
232                         break;
233                 default:
234                         GET_COLOR_CONFIG(SEARCHBAR::EDIT_BG_NORMAL, __color[i]);
235                         GET_COLOR_CONFIG(SEARCHBAR::EDIT_TEXT_NORMAL, __textColor[i]);
236                         GET_COLOR_CONFIG(SEARCHBAR::GUIDE_TEXT_NORMAL, __guideTextColor[i]);
237                         break;
238                 }
239         }
240
241         GET_COLOR_CONFIG(SEARCHBAR::BG_NORMAL, __backgroundColor);
242
243         __isUsableCancelButton = enableSearchBarButton;
244         __keypadAction = keypadAction;
245
246         GetVisualElement()->SetClipChildrenEnabled(false);
247
248         r = CreateClippedGroupControl();
249         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, E_SYSTEM, E_SYSTEM,
250                      "[E_SYSTEM] A system error has occurred. The construction of parent control for clipped group control failed.");
251
252         r = CreateSearchField();
253         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, E_SYSTEM, E_SYSTEM,
254                      "[E_SYSTEM] A system error has occurred. The edit construction failed.");
255         r = CreateCancelButton();
256         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, E_SYSTEM, E_SYSTEM,
257                      "[E_SYSTEM] A system error has occurred. The cancel button construction failed.");
258
259         SetContentsArea();
260         r = CreateContentsArea();
261         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, E_SYSTEM, E_SYSTEM,
262                      "[E_SYSTEM] A system error has occurred. The construction of parent for content failed.");
263
264         _SearchBarPresenter* pPresenter = new (std::nothrow) _SearchBarPresenter;
265         SysTryReturn(NID_UI_CTRL, pPresenter, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
266
267         r = pPresenter->Construct(*this);
268         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
269
270         r = pPresenter->Install();
271         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
272
273         __pSearchBarPresenter = pPresenter;
274
275         InitializeAccessibility();
276
277         r = _SettingInfoImpl::AddSettingEventListener(*this);
278         SysTryCatch(NID_UI, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
279
280         return r;
281
282 CATCH:
283         delete pPresenter;
284         pPresenter = null;
285
286         return r;
287 }
288
289 result
290 _SearchBar::CreateSearchField(void)
291 {
292         result r = E_SUCCESS;
293
294         FloatRectangle editBounds;
295         float horizontalMargin = 0.0f;
296         float verticalMargin = 0.0f;
297         float iconHorizontalMargin = 0.0f;
298         float textHorizontalMargin = 0.0f;
299         float iconWidth = 0.0f;
300         float textSize = 0.0f;
301         float searchBarMinHeight = 0.0f;
302         float searchBarMinWidthModeNormal = 0.0f;
303
304         FloatRectangle searchBarBounds = GetBoundsF();
305         _ControlOrientation orientation = _ControlManager::GetInstance()->GetOrientation();
306
307         GET_SHAPE_CONFIG(SEARCHBAR::HORIZONTAL_MARGIN, orientation, horizontalMargin);
308         GET_SHAPE_CONFIG(SEARCHBAR::VERTICAL_MARGIN, orientation, verticalMargin);
309         GET_SHAPE_CONFIG(SEARCHBAR::ICON_HORIZONTAL_MARGIN, orientation, iconHorizontalMargin);
310         GET_SHAPE_CONFIG(SEARCHBAR::ICON_WIDTH, orientation, iconWidth);
311         GET_SHAPE_CONFIG(SEARCHBAR::TEXT_HORIZONTAL_MARGIN, orientation, textHorizontalMargin);
312         GET_SHAPE_CONFIG(SEARCHBAR::SEARCH_FIELD_MIN_WIDTH_NORMAL_MODE, orientation, searchBarMinWidthModeNormal);
313         GET_SHAPE_CONFIG(SEARCHBAR::MIN_HEIGHT, orientation, searchBarMinHeight);
314
315         float searchFieldMinHeight = searchBarMinHeight - (verticalMargin * 2.0f);
316
317         editBounds.x = horizontalMargin;
318
319         if (searchBarBounds.height < searchBarMinHeight)
320         {
321                 verticalMargin = (searchBarBounds.height - searchFieldMinHeight)/2.0f;
322                 if (verticalMargin < 0.0f)
323                 {
324                         verticalMargin = 0.0f;
325                 }
326         }
327
328         editBounds.y = verticalMargin;
329
330         editBounds.width = searchBarBounds.width - (editBounds.x * 2.0f);
331         editBounds.height = searchBarBounds.height - (editBounds.y * 2.0f);
332
333         editBounds.width = (editBounds.width > searchBarMinWidthModeNormal) ? editBounds.width : searchBarMinWidthModeNormal;
334         editBounds.height = (editBounds.height > searchFieldMinHeight) ? editBounds.height : searchFieldMinHeight;
335
336         _SearchBarImpl* pSearchBarImpl = static_cast<_SearchBarImpl*>(GetUserData());
337         __pEdit = &(pSearchBarImpl->GetEditFieldImpl()->GetCore());
338
339         SysTryReturnResult(NID_UI_CTRL, __pEdit != null, E_SYSTEM,
340                            "[E_SYSTEM] A system error has occured. Failed to get _Edit instance");
341
342         __pEdit->SetKeypadCommandButtonVisible(false);
343         __pEdit->SetBounds(editBounds);
344         __pEdit->AddKeypadEventListener(*this);
345         __pEdit->AddTextBlockEventListener(*this);
346         __pEdit->AddTextEventListener(*this);
347
348         GET_SHAPE_CONFIG(SEARCHBAR::EDIT_TEXT_SIZE, orientation, textSize);
349         __pEdit->SetTextSize(textSize);
350
351         __pEdit->SetHorizontalMargin(iconHorizontalMargin + iconWidth + textHorizontalMargin, EDIT_TEXT_LEFT_MARGIN);
352         __pEdit->SetHorizontalMargin(textHorizontalMargin, EDIT_TEXT_RIGHT_MARGIN);
353         __pEdit->SetLimitLength(SEARCHBAR_TEXT_LENGTH_MAX);
354
355         for (int status = 0; status < SEARCHBAR_COLOR_MAX; status++)
356         {
357                 EditStatus editStatus = ConvertSearchBarStatus((SearchFieldStatus) status);
358                 __pEdit->SetColor(editStatus, __color[status]);
359         }
360
361         __pEdit->SetTextColor(EDIT_TEXT_COLOR_NORMAL, __textColor[SEARCH_FIELD_STATUS_NORMAL]);
362         __pEdit->SetTextColor(EDIT_TEXT_COLOR_DISABLED, __textColor[SEARCH_FIELD_STATUS_DISABLED]);
363         __pEdit->SetTextColor(EDIT_TEXT_COLOR_HIGHLIGHTED, __textColor[SEARCH_FIELD_STATUS_HIGHLIGHTED]);
364
365         __pEdit->ReplaceDefaultBackgroundBitmapForSearchBar();
366
367         __pEdit->SetKeypadAction(__keypadAction);
368
369         r = __pClippedGroupControl->AttachChild(*__pEdit);
370         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , E_SYSTEM,
371                     "[E_SYSTEM] A system error has occurred. Failed to attach edit as child.");
372
373         return E_SUCCESS;
374
375 CATCH:
376         delete __pEdit;
377         __pEdit = null;
378
379         return r;
380 }
381
382 result
383 _SearchBar::CreateCancelButton(void)
384 {
385         result r = E_SUCCESS;
386
387         float textSize = 0.0f;
388         String cancelButtonText;
389
390         _ControlOrientation orientation = _ControlManager::GetInstance()->GetOrientation();
391
392         _SearchBarImpl* pSearchBarImpl = static_cast<_SearchBarImpl*>(GetUserData());
393         __pCancelButton = &(pSearchBarImpl->GetButtonImpl()->GetCore());
394
395         SysTryReturnResult(NID_UI_CTRL, __pCancelButton != null, E_SYSTEM,
396                            "[E_SYSTEM] A system error has occured. Failed to get _Edit instance");
397
398         r = GetLastResult();
399         SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Propagating.");
400
401         r = ResizeCancelButton();
402         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
403
404         GET_STRING_CONFIG(IDS_TPLATFORM_BUTTON_CANCEL_ABB, cancelButtonText);
405         r = __pCancelButton->SetText(cancelButtonText);
406         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
407
408         GET_SHAPE_CONFIG(SEARCHBAR::BUTTON_TEXT_SIZE, orientation, textSize);
409         r = __pCancelButton->SetTextSize(textSize);
410         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
411
412         __pCancelButton->SetTextHorizontalAlignment(ALIGNMENT_CENTER);
413         __pCancelButton->SetTextVerticalAlignment(ALIGNMENT_MIDDLE);
414
415         r = __pCancelButton->SetActionId(__actionId);
416         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
417
418         r = __pCancelButton->AddActionEventListener(*this);
419         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
420
421         __pCancelButton->SetVisibleState(false);
422
423         for (int status = 0; status < SEARCHBAR_BUTTON_COLOR_MAX; status++)
424         {
425                 _ButtonStatus buttonStatus = ConvertSearchBarButtonStatus((SearchBarButtonStatus) status);
426
427                 r = __pCancelButton->SetColor(buttonStatus, __buttonColor[status]);
428                 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
429
430                 r = __pCancelButton->SetTextColor(buttonStatus, __buttonTextColor[status]);
431                 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
432         }
433
434         r = __pClippedGroupControl->AttachChild(*__pCancelButton);
435         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , E_SYSTEM,
436                     "[E_SYSTEM] A system error has occurred. Failed to attach button as child.");
437
438         return E_SUCCESS;
439
440 CATCH:
441         delete __pCancelButton;
442         __pCancelButton = null;
443
444         return r;
445 }
446
447 result
448 _SearchBar::CreateContentsArea(void)
449 {
450         result r = E_SUCCESS;
451
452         __pContainer = _Control::CreateControlN();
453
454         r = GetLastResult();
455         SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Propagating.");
456
457         __pContainer->SetVisibleState(false);
458
459         r = AttachChild(*__pContainer);
460         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , E_SYSTEM,
461                     "[E_SYSTEM] A system error has occurred. Failed to attach the parent of content.");
462
463         return E_SUCCESS;
464
465 CATCH:
466         delete __pContainer;
467         __pContainer = null;
468
469         return r;
470 }
471
472 void
473 _SearchBar::SetContentsArea(void)
474 {
475         if (__isUserContainerBounds)
476         {
477                 return;
478         }
479
480         FloatDimension screenSize = _ControlManager::GetInstance()->GetScreenSizeF();
481         float width = screenSize.width;
482         float height = screenSize.height;
483
484         _Control* pParent = GetParentForm();
485         if (pParent != null)
486         {
487                 width = pParent->GetClientBoundsF().width;
488                 height = pParent->GetClientBoundsF().height;
489         }
490
491         FloatRectangle controlBounds = GetBoundsF();
492         controlBounds = CoordinateSystem::AlignToDevice(FloatRectangle(controlBounds));
493
494         __contentAreaBounds.x = 0.0f;
495         __contentAreaBounds.y = controlBounds.height;
496         __contentAreaBounds.width = width - controlBounds.x;
497         __contentAreaBounds.height = height - (controlBounds.y + controlBounds.height);
498
499         if (__pContainer)
500         {
501                 result r = E_SUCCESS;
502                 r = __pContainer->SetBounds(__contentAreaBounds);
503                 SysTryReturnVoidResult(NID_UI_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
504         }
505         return;
506 }
507
508 _Control*
509 _SearchBar::GetContent(void) const
510 {
511         return __pContentControl;
512 }
513
514 result
515 _SearchBar::SetContent(const _Control* pContent)
516 {
517         __pContentControl = const_cast <_Control*>(pContent);
518         result r = E_SUCCESS;
519
520         if (__pContainer)
521         {
522                 r = __pContainer->AttachChild(*__pContentControl);
523                 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Propagating");
524         }
525
526         return r;
527 }
528
529 result
530 _SearchBar::UpdateContentArea(bool invalidate)
531 {
532         return __pSearchBarPresenter->UpdateContentArea(invalidate);
533 }
534
535 result
536 _SearchBar::SetContentAreaVisible(bool visible, bool isCalledByApp)
537 {
538         SysTryReturn(NID_UI_CTRL, __pContainer, E_SYSTEM, E_SYSTEM,
539                      "[E_SYSTEM] A system error has occurred. The instance of parent to content is null.");
540
541         SearchBarMode searchBarMode = GetMode();
542         if (searchBarMode == SEARCH_BAR_MODE_INPUT)
543         {
544                 __pContainer->SetVisibleState(visible);
545         }
546
547         if (isCalledByApp)
548         {
549                 __contentVisibilitySetByApp = visible;
550         }
551
552         return __pSearchBarPresenter->SetContentAreaVisible(visible);
553 }
554
555 bool
556 _SearchBar::IsContentAreaVisible(void) const
557 {
558         return __pSearchBarPresenter->IsContentAreaVisible();
559 }
560
561 result
562 _SearchBar::SetContentAreaSize(const Dimension& size)
563 {
564         return SetProperty("contentAreaSize", Variant(size));
565 }
566
567 Dimension
568 _SearchBar::GetContentAreaSize(void) const
569 {
570         Variant size = GetProperty("contentAreaSize");
571
572         return size.ToDimension();
573 }
574
575 SearchBarMode
576 _SearchBar::GetMode(void) const
577 {
578         return __pSearchBarPresenter->GetMode();
579 }
580
581 bool
582 _SearchBar::IsModeLocked(void) const
583 {
584         return __pSearchBarPresenter->IsModeLocked();
585 }
586
587 result
588 _SearchBar::SetMode(SearchBarMode mode)
589 {
590         _AccessibilityElement* pEditElement = __pEdit->GetTextAccessibilityElement();
591         if (mode == SEARCH_BAR_MODE_NORMAL)
592         {
593                 pEditElement->SetHint("Double Tap To Type Search Text");
594         }
595         else
596         {
597                 pEditElement->SetHint("Enter Search Text");
598         }
599
600         pEditElement->SetTrait("SearchBar");
601         pEditElement->SetName("SearchField");
602
603         return __pSearchBarPresenter->SetMode(mode);
604 }
605
606 result
607 _SearchBar::SetModeLocked(bool modeLocked)
608 {
609         if (modeLocked == true && GetMode() == SEARCH_BAR_MODE_NORMAL)
610         {
611                 __pEdit->SetViewModeEnabled(true);
612         }
613
614         if (modeLocked == false && __pEdit->IsViewModeEnabled())
615         {
616                 __pEdit->SetViewModeEnabled(false);
617         }
618
619         return __pSearchBarPresenter->SetModeLocked(modeLocked);
620 }
621
622 int
623 _SearchBar::GetButtonActionId(void) const
624 {
625         Variant actionId = GetProperty("buttonActionId");
626
627         return actionId.ToInt();
628 }
629
630 Color
631 _SearchBar::GetButtonColor(SearchBarButtonStatus status) const
632 {
633         Variant buttonColor;
634
635         switch (status)
636         {
637         case SEARCH_BAR_BUTTON_STATUS_NORMAL:
638                 buttonColor = GetProperty("buttonNormalColor");
639                 break;
640         case SEARCH_BAR_BUTTON_STATUS_PRESSED:
641                 buttonColor = GetProperty("buttonPressedColor");
642                 break;
643         case SEARCH_BAR_BUTTON_STATUS_HIGHLIGHTED:
644                 buttonColor = GetProperty("buttonHighlightedColor");
645                 break;
646         case SEARCH_BAR_BUTTON_STATUS_DISABLED:
647                 buttonColor = GetProperty("buttonDisabledColor");
648                 break;
649         default:
650                 break;
651         }
652
653         return buttonColor.ToColor();
654 }
655
656 Color
657 _SearchBar::GetButtonTextColor(SearchBarButtonStatus status) const
658 {
659         Variant buttonTextColor;
660
661         switch (status)
662         {
663         case SEARCH_BAR_BUTTON_STATUS_NORMAL:
664                 buttonTextColor = GetProperty("buttonNormalTextColor");
665                 break;
666         case SEARCH_BAR_BUTTON_STATUS_PRESSED:
667                 buttonTextColor = GetProperty("buttonPressedTextColor");
668                 break;
669         case SEARCH_BAR_BUTTON_STATUS_HIGHLIGHTED:
670                 buttonTextColor = GetProperty("buttonHighlightedTextColor");
671                 break;
672         case SEARCH_BAR_BUTTON_STATUS_DISABLED:
673                 buttonTextColor = GetProperty("buttonDisabledTextColor");
674                 break;
675         default:
676                 break;
677         }
678
679         return buttonTextColor.ToColor();
680 }
681
682 SearchBarButtonStatus
683 _SearchBar::GetButtonStatus(void) const
684 {
685         SysTryReturn(NID_UI_CTRL, __pCancelButton, SEARCH_BAR_BUTTON_STATUS_NORMAL, E_SYSTEM,
686                      "[E_SYSTEM] A system error has occurred. The cancel button instance is null.");
687
688         SearchBarButtonStatus buttonStatus = SEARCH_BAR_BUTTON_STATUS_NORMAL;
689
690         if (__isButtonEnabled == false)
691         {
692                 buttonStatus = SEARCH_BAR_BUTTON_STATUS_DISABLED;
693         }
694
695         return buttonStatus;
696 }
697
698 result
699 _SearchBar::SetButtonText(const String& text)
700 {
701         SysTryReturn(NID_UI_CTRL, __pCancelButton, E_SYSTEM, E_SYSTEM,
702                      "[E_SYSTEM] A system error has occurred. The cancel button instance is null.");
703
704         result r = E_SUCCESS;
705
706         r = __pCancelButton->SetText(text);
707         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, E_SYSTEM, E_SYSTEM,
708                      "[E_SYSTEM] A system error has occurred. Failed to set text.");
709
710         __isButtonTextChangedByApp = true;
711
712         return r;
713 }
714
715 result
716 _SearchBar::SetButtonActionId(int actionId)
717 {
718         return SetProperty("buttonActionId", Variant(actionId));
719 }
720
721 result
722 _SearchBar::SetButtonEnabled(bool enabled)
723 {
724         SysTryReturn(NID_UI_CTRL, __pCancelButton, E_SYSTEM, E_SYSTEM,
725                      "[E_SYSTEM] A system error has occurred. The cancel button instance is null.");
726
727         __pCancelButton->SetEnableState(enabled);
728
729         __isButtonEnabled = enabled;
730
731         return E_SUCCESS;
732 }
733
734 result
735 _SearchBar::SetButtonColor(SearchBarButtonStatus status, const Color& color)
736 {
737         result r = E_SUCCESS;
738
739         switch (status)
740         {
741         case SEARCH_BAR_BUTTON_STATUS_NORMAL:
742                 r = SetProperty("buttonNormalColor", Variant(color));
743                 break;
744         case SEARCH_BAR_BUTTON_STATUS_PRESSED:
745                 r = SetProperty("buttonPressedColor", Variant(color));
746                 break;
747         case SEARCH_BAR_BUTTON_STATUS_HIGHLIGHTED:
748                 r = SetProperty("buttonHighlightedColor", Variant(color));
749                 break;
750         case SEARCH_BAR_BUTTON_STATUS_DISABLED:
751                 r = SetProperty("buttonDisabledColor", Variant(color));
752                 break;
753         default:
754                 break;
755         }
756
757         return r;
758 }
759
760 result
761 _SearchBar::SetButtonTextColor(SearchBarButtonStatus status, const Color& color)
762 {
763         result r = E_SUCCESS;
764
765         switch (status)
766         {
767         case SEARCH_BAR_BUTTON_STATUS_NORMAL:
768                 r = SetProperty("buttonNormalTextColor", Variant(color));
769                 break;
770         case SEARCH_BAR_BUTTON_STATUS_PRESSED:
771                 r = SetProperty("buttonPressedTextColor", Variant(color));
772                 break;
773         case SEARCH_BAR_BUTTON_STATUS_HIGHLIGHTED:
774                 r = SetProperty("buttonHighlightedTextColor", Variant(color));
775                 break;
776         case SEARCH_BAR_BUTTON_STATUS_DISABLED:
777                 r = SetProperty("buttonDisabledTextColor", Variant(color));
778                 break;
779         default:
780                 break;
781         }
782
783         return r;
784 }
785
786 result
787 _SearchBar::AppendCharacter(const Character& character)
788 {
789         SysTryReturn(NID_UI_CTRL, __pEdit, E_SYSTEM, E_SYSTEM,
790                      "[E_SYSTEM] A system error has occurred. The edit instance is null.");
791         SysTryReturn(NID_UI_CTRL, character.CompareTo(null), E_SYSTEM, E_SYSTEM,
792                      "[E_SYSTEM] A system error has occurred. The character is null.");
793
794         result r = E_SUCCESS;
795
796         r = __pEdit->AppendCharacter(character);
797         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, E_SYSTEM, E_SYSTEM,
798                      "[E_SYSTEM] A system error has occurred. Failed to set character.");
799
800         return r;
801 }
802
803 result
804 _SearchBar::AppendText(const String& text)
805 {
806         SysTryReturn(NID_UI_CTRL, __pEdit, E_SYSTEM, E_SYSTEM,
807                      "[E_SYSTEM] A system error has occurred. The edit instance is null.");
808         SysTryReturn(NID_UI_CTRL, text.IsEmpty() == false, E_SYSTEM, E_SYSTEM,
809                      "[E_SYSTEM] A system error has occurred. The text is empty.");
810
811         result r = E_SUCCESS;
812
813         r = __pEdit->AppendText(text);
814         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, E_SYSTEM, E_SYSTEM,
815                      "[E_SYSTEM] A system error has occurred. Failed to set text.");
816
817         return r;
818 }
819
820 result
821 _SearchBar::SetText(const String& text)
822 {
823         SysTryReturn(NID_UI_CTRL, __pEdit, E_SYSTEM, E_SYSTEM,
824                      "[E_SYSTEM] A system error has occurred. The edit instance is null.");
825
826         result r = E_SUCCESS;
827
828         int limitLength = __pEdit->GetTextLimitLength();
829         int textLength = text.GetLength();
830         SysTryReturn(NID_UI_CTRL, limitLength >= textLength, E_SYSTEM, E_SYSTEM,
831                      "[E_SYSTEM] A system error has occurred. textLength exceeds the limitLength");
832
833         r = __pEdit->SetText(text);
834         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, E_SYSTEM, E_SYSTEM,
835                      "[E_SYSTEM] A system error has occurred. Failed to set text.");
836
837         return r;
838 }
839
840 result
841 _SearchBar::InsertCharacterAt(int index, const Character& character)
842 {
843         SysTryReturn(NID_UI_CTRL, __pEdit, E_SYSTEM, E_SYSTEM,
844                      "[E_SYSTEM] A system error has occurred. The edit instance is null.");
845         SysTryReturn(NID_UI_CTRL, index > -1, E_OUT_OF_RANGE, E_OUT_OF_RANGE,
846                      "[E_OUT_OF_RANGE] index(%d) is out of range.", index);
847         SysTryReturn(NID_UI_CTRL, character.CompareTo(null), E_SYSTEM, E_SYSTEM,
848                      "[E_SYSTEM] A system error has occurred. The character is null.");
849
850         result r = E_SUCCESS;
851
852         int textLength = 0;
853         int limitLength = 0;
854         limitLength = __pEdit->GetTextLimitLength();
855         textLength = __pEdit->GetTextLength() + 1;
856
857         SysTryReturn(NID_UI_CTRL, limitLength >= textLength, E_MAX_EXCEEDED, E_MAX_EXCEEDED,
858                      "[E_MAX_EXCEEDED] limitLength(%d) exceeds the maximum limit textLength(%d).", limitLength, textLength);
859
860         SysTryReturn(NID_UI_CTRL, index <= __pEdit->GetTextLength(), E_OUT_OF_RANGE, E_OUT_OF_RANGE,
861                      "[E_OUT_OF_RANGE] index(%d) is out of range of current textLength(%d).", index, __pEdit->GetTextLength());
862
863         r = __pEdit->InsertCharacterAt(index, character);
864         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, E_SYSTEM, E_SYSTEM,
865                      "[E_SYSTEM] A system error has occurred. Failed to set text.");
866
867         return r;
868 }
869
870 result
871 _SearchBar::InsertTextAt(int index, const String& text)
872 {
873         SysTryReturn(NID_UI_CTRL, __pEdit, E_SYSTEM, E_SYSTEM,
874                      "[E_SYSTEM] A system error has occurred. The edit instance is null.");
875         SysTryReturn(NID_UI_CTRL, index > -1, E_OUT_OF_RANGE, E_OUT_OF_RANGE,
876                      "[E_OUT_OF_RANGE] index(%d) is out of range.", index);
877
878         result r = E_SUCCESS;
879
880         int textLength = 0;
881         int limitLength = 0;
882         limitLength = __pEdit->GetTextLimitLength();
883         textLength = __pEdit->GetTextLength() + text.GetLength();
884
885         SysTryReturn(NID_UI_CTRL, limitLength >= textLength, E_MAX_EXCEEDED, E_MAX_EXCEEDED,
886                      "[E_MAX_EXCEEDED] limitLength(%d) exceeds the maximum limit textLength(%d).", limitLength, textLength);
887         SysTryReturn(NID_UI_CTRL, index <= __pEdit->GetTextLength(), E_OUT_OF_RANGE, E_OUT_OF_RANGE,
888                      "[E_OUT_OF_RANGE] index(%d) is out of range of current textLength(%d).", index, __pEdit->GetTextLength());
889
890         r = __pEdit->InsertTextAt(index, text);
891         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, E_SYSTEM, E_SYSTEM,
892                      "[E_SYSTEM] A system error has occurred. Failed to insert text.");
893
894         return r;
895 }
896
897 result
898 _SearchBar::DeleteCharacterAt(int index)
899 {
900         SysTryReturn(NID_UI_CTRL, __pEdit, E_SYSTEM, E_SYSTEM,
901                      "[E_SYSTEM] A system error has occurred. The edit instance is null.");
902         SysTryReturn(NID_UI_CTRL, index > -1, E_INVALID_ARG, E_INVALID_ARG,
903                      "[E_INVALID_ARG] Invalid argument(s) is used. index = %d", index);
904
905         result r = E_SUCCESS;
906         int textLength = 0;
907         textLength = __pEdit->GetTextLength();
908
909         SysTryReturn(NID_UI_CTRL, textLength > index, E_OUT_OF_RANGE, E_OUT_OF_RANGE,
910                      "[E_OUT_OF_RANGE] index(%d) is out of range. textLength(%d)", index, textLength);
911
912         r = __pEdit->DeleteCharacterAt(index);
913         SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, E_SYSTEM,
914                            "[E_SYSTEM] A system error has occured. Failed to delete character.");
915
916         return r;
917 }
918
919 result
920 _SearchBar::Clear(void)
921 {
922         SysTryReturn(NID_UI_CTRL, __pEdit, E_SYSTEM, E_SYSTEM,
923                      "[E_SYSTEM] A system error has occurred. The edit instance is null.");
924
925         return __pEdit->ClearText();
926 }
927
928 int
929 _SearchBar::GetTextLength(void) const
930 {
931         SysTryReturn(NID_UI_CTRL, __pEdit, -1, E_SYSTEM,
932                      "[E_SYSTEM] A system error has occurred. The edit instance is null.");
933
934         return __pEdit->GetTextLength();
935 }
936
937 String
938 _SearchBar::GetText(void) const
939 {
940         SysTryReturn(NID_UI_CTRL, __pEdit, String(), E_SYSTEM,
941                      "[E_SYSTEM] A system error has occurred. The edit instance is null.");
942
943         return __pEdit->GetText();
944 }
945
946 String
947 _SearchBar::GetText(int start, int end) const
948 {
949         SysTryReturn(NID_UI_CTRL, __pEdit, String(), E_SYSTEM,
950                      "[E_SYSTEM] A system error has occurred. The edit instance is null.");
951
952         return __pEdit->GetText(start, end);
953 }
954
955 int
956 _SearchBar::GetLimitLength(void) const
957 {
958         SysTryReturn(NID_UI_CTRL, __pEdit, -1, E_SYSTEM,
959                      "[E_SYSTEM] A system error has occurred. The edit instance is null.");
960
961         return __pEdit->GetTextLimitLength();
962 }
963
964 result
965 _SearchBar::SetLimitLength(int limitLength)
966 {
967         SysTryReturn(NID_UI_CTRL, __pEdit, E_SYSTEM, E_SYSTEM,
968                      "[E_SYSTEM] A system error has occurred. The edit instance is null.");
969         SysTryReturn(NID_UI_CTRL, limitLength > 0, E_INVALID_ARG, E_INVALID_ARG,
970                      "[E_INVALID_ARG] Invalid argument(s) is used.limitLength = %d", limitLength);
971
972         String tempString = GetText();
973
974         int textLength = tempString.GetLength();
975         SysTryReturn(NID_UI_CTRL, limitLength >= textLength, E_INVALID_ARG, E_INVALID_ARG,
976                      "[E_INVALID_ARG] Invalid argument(s) is used. limitLength = %d, textLength = %d", limitLength, textLength);
977
978         result r = __pEdit->SetLimitLength(limitLength);
979         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
980
981         r = SetText(tempString);
982         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, E_SYSTEM, r, "[%s] Propagating.", GetErrorMessage(r));
983
984         return E_SUCCESS;
985 }
986
987 result
988 _SearchBar::ShowKeypad(void) const
989 {
990         SysTryReturn(NID_UI_CTRL, __pEdit, E_SYSTEM, E_SYSTEM,
991                      "[E_SYSTEM] A system error has occurred. The edit instance is null.");
992
993         SearchBarMode mode = __pSearchBarPresenter->GetMode();
994         SysTryReturn(NID_UI_CTRL, mode == SEARCH_BAR_MODE_INPUT, E_INVALID_STATE, E_INVALID_STATE,
995                      "[E_INVALID_STATE] The SearchBar is currently in Normal mode.");
996         return __pEdit->ShowKeypad();
997 }
998
999 result
1000 _SearchBar::HideKeypad(void)
1001 {
1002         SysTryReturn(NID_UI_CTRL, __pEdit, E_SYSTEM, E_SYSTEM,
1003                      "[E_SYSTEM] A system error has occurred. The edit instance is null.");
1004
1005         SearchBarMode mode = __pSearchBarPresenter->GetMode();
1006         SysTryReturn(NID_UI_CTRL, mode == SEARCH_BAR_MODE_INPUT, E_SYSTEM, E_SYSTEM,
1007                      "[E_SYSTEM] A system error has occurred. The SearchBar is currently in Normal mode.");
1008
1009         result r = __pEdit->HideKeypad();
1010
1011         SetContentsArea();
1012
1013         return r;
1014 }
1015
1016 float
1017 _SearchBar::GetSearchFieldTextSizeF(void) const
1018 {
1019         SysTryReturn(NID_UI_CTRL, __pEdit, -1, E_SYSTEM,
1020                      "[E_SYSTEM] A system error has occurred. The edit instance is null.");
1021
1022         return __pEdit->GetTextSizeF();
1023 }
1024
1025 result
1026 _SearchBar::SetSearchFieldTextSize(float size)
1027 {
1028         SysTryReturn(NID_UI_CTRL, __pEdit, E_SYSTEM, E_SYSTEM,
1029                      "[E_SYSTEM] A system error has occurred. The edit instance is null.");
1030
1031         return __pEdit->SetTextSize(size);
1032 }
1033
1034 result
1035 _SearchBar::GetBlockRange(int& start, int& end) const
1036 {
1037         SysTryReturn(NID_UI_CTRL, __pEdit, E_SYSTEM, E_SYSTEM,
1038                      "[E_SYSTEM] A system error has occurred. The edit instance is null.");
1039
1040         int startIndex = -1;
1041         int endIndex = -1;
1042
1043         __pEdit->GetBlockRange(startIndex, endIndex);
1044         SysTryReturn(NID_UI_CTRL, (startIndex > -1 && endIndex > 0), E_SYSTEM, E_SYSTEM,
1045                      "[E_SYSTEM] A system error has occurred. Failed to get text block range.");
1046
1047         start = startIndex;
1048         end = endIndex - 1;
1049
1050         return E_SUCCESS;
1051 }
1052
1053 result
1054 _SearchBar::ReleaseBlock(void)
1055 {
1056         SysTryReturn(NID_UI_CTRL, __pEdit, E_SYSTEM, E_SYSTEM,
1057                      "[E_SYSTEM] A system error has occurred. The edit instance is null.");
1058
1059         result r = E_SUCCESS;
1060
1061         int start = 0;
1062         int end = 0;
1063
1064         r = GetBlockRange(start, end);
1065         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
1066
1067         return __pEdit->ReleaseTextBlock();
1068 }
1069
1070 result
1071 _SearchBar::SetBlockRange(int start, int end)
1072 {
1073         SysTryReturn(NID_UI_CTRL, __pEdit, E_SYSTEM, E_SYSTEM,
1074                      "[E_SYSTEM] A system error has occurred. The edit instance is null.");
1075
1076         result r = E_SUCCESS;
1077
1078         int textLength = 0;
1079         textLength = __pEdit->GetTextLength();
1080
1081         SysTryReturn(NID_UI_CTRL, (start < end && start >= 0 && textLength >= end), E_OUT_OF_RANGE, E_OUT_OF_RANGE,
1082                      "[E_OUT_OF_RANGE] start (%d) and end (%d) is out of range.", start, end - 1);
1083
1084         r = SetCursorPosition(start);
1085         SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Propagating.");
1086
1087         r = __pEdit->BeginTextBlock();
1088         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, E_SYSTEM, E_SYSTEM,
1089                      "[E_SYSTEM] A system error has occurred. Failed to set text block range.");
1090
1091         r = SetCursorPosition(end);
1092         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, E_SYSTEM, E_SYSTEM,
1093                      "[E_SYSTEM] A system error has occurred. Failed to set cursor position.");
1094
1095         return E_SUCCESS;
1096 }
1097
1098 result
1099 _SearchBar::RemoveTextBlock(void)
1100 {
1101         SysTryReturn(NID_UI_CTRL, __pEdit, E_SYSTEM, E_SYSTEM,
1102                      "[E_SYSTEM] A system error has occurred. The edit instance is null.");
1103
1104         result r = E_SUCCESS;
1105
1106         r = __pEdit->RemoveTextBlock();
1107         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
1108
1109         return r;
1110 }
1111
1112 Color
1113 _SearchBar::GetColor(void) const
1114 {
1115         Variant backgroundColor = GetProperty("color");
1116
1117         return backgroundColor.ToColor();
1118 }
1119
1120 Color
1121 _SearchBar::GetSearchFieldColor(SearchFieldStatus status) const
1122 {
1123         Variant searchFieldColor;
1124
1125         switch (status)
1126         {
1127         case SEARCH_FIELD_STATUS_NORMAL:
1128                 searchFieldColor = GetProperty("searchFieldNormalColor");
1129                 break;
1130         case SEARCH_FIELD_STATUS_HIGHLIGHTED:
1131                 searchFieldColor = GetProperty("searchFieldHighlightedColor");
1132                 break;
1133         case SEARCH_FIELD_STATUS_DISABLED:
1134                 searchFieldColor = GetProperty("searchFieldDisabledColor");
1135                 break;
1136         default:
1137                 break;
1138         }
1139
1140         return searchFieldColor.ToColor();
1141 }
1142
1143
1144 Color
1145 _SearchBar::GetSearchFieldTextColor(SearchFieldStatus status) const
1146 {
1147         Variant searchFieldTextColor;
1148
1149         switch (status)
1150         {
1151         case SEARCH_FIELD_STATUS_NORMAL:
1152                 searchFieldTextColor = GetProperty("searchFieldNormalTextColor");
1153                 break;
1154         case SEARCH_FIELD_STATUS_HIGHLIGHTED:
1155                 searchFieldTextColor = GetProperty("searchFieldHighlightedTextColor");
1156                 break;
1157         case SEARCH_FIELD_STATUS_DISABLED:
1158                 searchFieldTextColor = GetProperty("searchFieldDisabledTextColor");
1159                 break;
1160         default:
1161                 break;
1162         }
1163
1164         return searchFieldTextColor.ToColor();
1165 }
1166
1167
1168 result
1169 _SearchBar::SetBackgroundBitmap(const Bitmap& bitmap)
1170 {
1171         Bitmap* pNewBitmap = _BitmapImpl::CloneN(bitmap);
1172         SysTryReturn(NID_UI_CTRL, pNewBitmap, E_SYSTEM, E_SYSTEM,
1173                      "[E_SYSTEM] A system error has occurred. The creation of bitmap failed.");
1174
1175         delete __pBackgroundBitmap;
1176         __pBackgroundBitmap = null;
1177
1178         __pBackgroundBitmap = pNewBitmap;
1179
1180         return E_SUCCESS;
1181 }
1182
1183 Bitmap*
1184 _SearchBar::GetBackgroundBitmap(void) const
1185 {
1186         return __pBackgroundBitmap;
1187 }
1188
1189 result
1190 _SearchBar::SetColor(const Color& color)
1191 {
1192         return SetProperty("color", Variant(color));
1193 }
1194
1195 result
1196 _SearchBar::SetSearchFieldColor(SearchFieldStatus status, const Color& color)
1197 {
1198         result r = E_SUCCESS;
1199
1200         switch (status)
1201         {
1202         case SEARCH_FIELD_STATUS_NORMAL:
1203                 r = SetProperty("searchFieldNormalColor", Variant(color));
1204                 break;
1205         case SEARCH_FIELD_STATUS_HIGHLIGHTED:
1206                 r = SetProperty("searchFieldHighlightedColor", Variant(color));
1207                 break;
1208         case SEARCH_FIELD_STATUS_DISABLED:
1209                 r = SetProperty("searchFieldDisabledColor", Variant(color));
1210                 break;
1211         default:
1212                 break;
1213         }
1214
1215         return r;
1216 }
1217
1218
1219 result
1220 _SearchBar::SetSearchFieldTextColor(SearchFieldStatus status, const Color& color)
1221 {
1222         result r = E_SUCCESS;
1223
1224         switch (status)
1225         {
1226         case SEARCH_FIELD_STATUS_NORMAL:
1227                 r = SetProperty("searchFieldNormalTextColor", Variant(color));
1228                 break;
1229         case SEARCH_FIELD_STATUS_HIGHLIGHTED:
1230                 r = SetProperty("searchFieldHighlightedTextColor", Variant(color));
1231                 break;
1232         case SEARCH_FIELD_STATUS_DISABLED:
1233                 r = SetProperty("searchFieldDisabledTextColor", Variant(color));
1234                 break;
1235         default:
1236                 break;
1237         }
1238
1239         return r;
1240 }
1241
1242
1243 String
1244 _SearchBar::GetGuideText(void) const
1245 {
1246         SysTryReturn(NID_UI_CTRL, __pEdit, String(), E_SYSTEM,
1247                      "[E_SYSTEM] A system error has occurred. The edit instance is null.");
1248
1249         return __pEdit->GetGuideText();
1250 }
1251
1252 result
1253 _SearchBar::SetGuideText(const String& guideText)
1254 {
1255         SysTryReturn(NID_UI_CTRL, __pEdit, E_SYSTEM, E_SYSTEM,
1256                      "[E_SYSTEM] A system error has occurred. The edit instance is null.");
1257
1258         __pEdit->SetGuideText(guideText);
1259
1260         return E_SUCCESS;
1261 }
1262
1263 Color
1264 _SearchBar::GetGuideTextColor(void) const
1265 {
1266         SysTryReturn(NID_UI_CTRL, __pEdit, E_SYSTEM, E_SYSTEM,
1267                      "[E_SYSTEM] A system error has occurred. The edit instance is null.");
1268
1269         return __pEdit->GetGuideTextColor();
1270 }
1271
1272 result
1273 _SearchBar::SetGuideTextColor(const Color& color)
1274 {
1275         SysTryReturn(NID_UI_CTRL, __pEdit, E_SYSTEM, E_SYSTEM,
1276                      "[E_SYSTEM] A system error has occurred. The edit instance is null.");
1277
1278         __isUserGuideTextColor = true;
1279         return __pEdit->SetGuideTextColor(color);
1280 }
1281
1282 int
1283 _SearchBar::GetCursorPosition(void) const
1284 {
1285         SysTryReturn(NID_UI_CTRL, __pEdit, -1, E_SYSTEM,
1286                      "[E_SYSTEM] A system error has occurred. The edit instance is null.");
1287
1288         return __pEdit->GetCursorPosition();
1289 }
1290
1291 result
1292 _SearchBar::SetCursorPosition(int index)
1293 {
1294         SysTryReturn(NID_UI_CTRL, __pEdit, E_SYSTEM, E_SYSTEM,
1295                      "[E_SYSTEM] A system error has occurred. The edit instance is null.");
1296         SysTryReturn(NID_UI_CTRL, index > -1, E_OUT_OF_RANGE, E_OUT_OF_RANGE,
1297                      "[E_OUT_OF_RANGE] index(%d) is out of range.", GetErrorMessage(E_OUT_OF_RANGE), index);
1298
1299         int textLength = -1;
1300         textLength = __pEdit->GetTextLength();
1301
1302         SysTryReturn(NID_UI_CTRL, (index > -1 && index <= textLength), E_OUT_OF_RANGE, E_OUT_OF_RANGE,
1303                      "[E_OUT_OF_RANGE] index(%d) is out of range.", index);
1304
1305         return __pEdit->SetCursorPosition(index);
1306 }
1307
1308 bool
1309 _SearchBar::IsLowerCaseModeEnabled(void) const
1310 {
1311         SysTryReturn(NID_UI_CTRL, __pEdit, E_SYSTEM, E_SYSTEM,
1312                      "[E_SYSTEM] A system error has occurred. The edit instance is null.");
1313
1314         return __pEdit->IsLowerCaseModeEnabled();
1315 }
1316
1317 void
1318 _SearchBar::SetLowerCaseModeEnabled(bool enable)
1319 {
1320         SysTryReturnVoidResult(NID_UI_CTRL, __pEdit, E_SYSTEM,
1321                                "[E_SYSTEM] A system error has occurred. The edit instance is null.");
1322
1323         __pEdit->SetLowerCaseModeEnabled(enable);
1324 }
1325
1326 EllipsisPosition
1327 _SearchBar::GetEllipsisPosition(void) const
1328 {
1329         SysTryReturn(NID_UI_CTRL, __pEdit, ELLIPSIS_POSITION_START, E_SYSTEM,
1330                      "[E_SYSTEM] A system error has occurred. The edit instance is null.");
1331
1332         return __pEdit->GetEllipsisPosition();
1333 }
1334
1335 result
1336 _SearchBar::SetEllipsisPosition(EllipsisPosition position)
1337 {
1338         SysTryReturn(NID_UI_CTRL, __pEdit, E_SYSTEM, E_SYSTEM,
1339                      "[E_SYSTEM] A system error has occurred. The edit instance is null.");
1340         __pEdit->SetEllipsisPosition(position);
1341
1342         return E_SUCCESS;
1343 }
1344
1345 CoreKeypadAction
1346 _SearchBar::GetKeypadAction(void) const
1347 {
1348         return __keypadAction;
1349 }
1350
1351 bool
1352 _SearchBar::IsTextPredictionEnabled(void) const
1353 {
1354         SysTryReturn(NID_UI_CTRL, __pEdit, false, E_SYSTEM,
1355                      "[E_SYSTEM] A system error has occurred. The edit instance is null.");
1356         return __pEdit->IsTextPredictionEnabled();
1357 }
1358
1359 result
1360 _SearchBar::SetTextPredictionEnabled(bool enable)
1361 {
1362         SysTryReturn(NID_UI_CTRL, __pEdit, E_SYSTEM, E_SYSTEM,
1363                      "[E_SYSTEM] A system error has occurred. The edit instance is null.");
1364         return __pEdit->SetTextPredictionEnabled(enable);
1365 }
1366
1367 result
1368 _SearchBar::SetCurrentLanguage(LanguageCode languageCode)
1369 {
1370         return __pEdit->SetCurrentLanguage(languageCode);
1371 }
1372
1373 result
1374 _SearchBar::GetCurrentLanguage(LanguageCode& language) const
1375 {
1376         return __pEdit->GetCurrentLanguage(language);
1377 }
1378
1379 result
1380 _SearchBar::AddActionEventListener(const _IActionEventListener& listener)
1381 {
1382         result r = E_SUCCESS;
1383
1384         if (__pActionEvent == null)
1385         {
1386                 __pActionEvent = _ActionEvent::CreateInstanceN(*this);
1387                 r = GetLastResult();
1388                 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Propagating.");
1389
1390                 __pActionEvent->AddListener(listener);
1391         }
1392
1393         return r;
1394 }
1395
1396 result
1397 _SearchBar::RemoveActionEventListener(const _IActionEventListener& listener)
1398 {
1399         SysTryReturn(NID_UI_CTRL, __pActionEvent, E_SYSTEM, E_SYSTEM,
1400                      "[E_SYSTEM] A system error has occurred. The action event instance is null.");
1401         result r = E_SUCCESS;
1402
1403         r = __pActionEvent->RemoveListener(listener);
1404         SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Propagating.");
1405
1406         return r;
1407 }
1408
1409 result
1410 _SearchBar::AddKeypadEventListener(const _IKeypadEventListener& listener)
1411 {
1412         result r = E_SUCCESS;
1413
1414         if (__pKeypadEvent == null)
1415         {
1416                 __pKeypadEvent = _KeypadEvent::CreateInstanceN(*this);
1417                 r = GetLastResult();
1418                 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Propagating.");
1419
1420                 r = __pKeypadEvent->AddListener(listener);
1421                 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Propagating.");
1422         }
1423
1424         return r;
1425 }
1426
1427 result
1428 _SearchBar::RemoveKeypadEventListener(const _IKeypadEventListener& listener)
1429 {
1430         SysTryReturn(NID_UI_CTRL, __pKeypadEvent, E_SYSTEM, E_SYSTEM,
1431                      "[E_SYSTEM] A system error has occurred. The keypad event instance is null.");
1432         result r = E_SUCCESS;
1433
1434         r = __pKeypadEvent->RemoveListener(listener);
1435         SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Propagating.");
1436
1437         return r;
1438 }
1439
1440 result
1441 _SearchBar::AddTextBlockEventListener(const _ITextBlockEventListener& listener)
1442 {
1443         result r = E_SUCCESS;
1444
1445         if (__pTextBlockEvent == null)
1446         {
1447                 __pTextBlockEvent = _TextBlockEvent::CreateInstanceN(*this);
1448                 r = GetLastResult();
1449                 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Propagating.");
1450
1451                 r = __pTextBlockEvent->AddListener(listener);
1452                 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Propagating.");
1453
1454         }
1455
1456         return r;
1457 }
1458
1459 result
1460 _SearchBar::RemoveTextBlockEventListener(const _ITextBlockEventListener& listener)
1461 {
1462         SysTryReturn(NID_UI_CTRL, __pTextBlockEvent, E_SYSTEM, E_SYSTEM,
1463                      "[E_SYSTEM] A system error has occurred. The text block event instance is null.");
1464         result r = E_SUCCESS;
1465
1466         r = __pTextBlockEvent->RemoveListener(listener);
1467         SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Propagating.");
1468
1469         return r;
1470 }
1471
1472
1473 result
1474 _SearchBar::AddTextEventListener(const _ITextEventListener& listener)
1475 {
1476         result r = E_SUCCESS;
1477
1478         if (__pTextEvent == null)
1479         {
1480                 __pTextEvent = _TextEvent::CreateInstanceN(*this);
1481                 r = GetLastResult();
1482                 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Propagating.");
1483
1484                 r = __pTextEvent->AddListener(listener);
1485                 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Propagating.");
1486         }
1487
1488         return r;
1489 }
1490
1491 result
1492 _SearchBar::RemoveTextEventListener(const _ITextEventListener& listener)
1493 {
1494         SysTryReturn(NID_UI_CTRL, __pTextEvent, E_SYSTEM, E_SYSTEM,
1495                      "[E_SYSTEM] A system error has occurred. The text event instance is null.");
1496         result r = E_SUCCESS;
1497
1498         r = __pTextEvent->RemoveListener(listener);
1499         SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Propagating.");
1500
1501         return r;
1502 }
1503
1504 result
1505 _SearchBar::AddSearchBarEventListener(const _ISearchBarEventListener& listener)
1506 {
1507         result r = E_SUCCESS;
1508
1509         if (__pSearchBarEvent == null)
1510         {
1511                 __pSearchBarEvent = _SearchBarEvent::CreateInstanceN(*this);
1512                 r = GetLastResult();
1513                 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Propagating.");
1514
1515                 r = __pSearchBarEvent->AddListener(listener);
1516                 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Propagating.");
1517         }
1518
1519         return r;
1520 }
1521
1522 result
1523 _SearchBar::RemoveSearchBarEventListener(const _ISearchBarEventListener& listener)
1524 {
1525         SysTryReturn(NID_UI_CTRL, __pSearchBarEvent, E_SYSTEM, E_SYSTEM,
1526                      "[E_SYSTEM] A system error has occurred. The searchbar event instance is null.");
1527         result r = E_SUCCESS;
1528
1529         r = __pSearchBarEvent->RemoveListener(listener);
1530         SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Propagating.");
1531
1532         return r;
1533 }
1534
1535 result
1536 _SearchBar::AddLanguageEventListener(const _ILanguageEventListener& listener)
1537 {
1538         result r = E_SUCCESS;
1539
1540         if (__pLanguageEvent == null)
1541         {
1542                 __pLanguageEvent = _LanguageEvent::CreateInstanceN(*this);
1543                 r = GetLastResult();
1544                 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Propagating.");
1545
1546                 r = __pLanguageEvent->AddListener(listener);
1547                 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Propagating.");
1548         }
1549
1550         return r;
1551 }
1552
1553 result
1554 _SearchBar::RemoveLanguageEventListener(const _ILanguageEventListener& listener)
1555 {
1556         SysTryReturn(NID_UI_CTRL, __pLanguageEvent, E_SYSTEM, E_SYSTEM, "[E_SYSTEM] This instance isn't constructed.");
1557         result r = E_SUCCESS;
1558
1559         __pLanguageEvent->RemoveListener(listener);
1560         SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Propagating.");
1561
1562         return r;
1563 }
1564
1565 void
1566 _SearchBar::OnBoundsChanged(void)
1567 {
1568         if (__pSearchBarPresenter != null)
1569         {
1570                 __isupdateContentBounds = true;
1571                 __pSearchBarPresenter->OnBoundsChanged();
1572         }
1573
1574         if (__pAccessibilitySearchBarElement)
1575         {
1576                 __pAccessibilitySearchBarElement->SetBounds(FloatRectangle(0.0f, 0.0f, GetBoundsF().width, GetBoundsF().height));
1577         }
1578         return;
1579 }
1580
1581 void
1582 _SearchBar::OnChangeLayout(_ControlOrientation orientation)
1583 {
1584         __isupdateContentBounds = true;
1585         return;
1586 }
1587
1588 void
1589 _SearchBar::OnDraw(void)
1590 {
1591         if (!__isUserGuideTextColor)
1592         {
1593                 SearchFieldStatus status = GetCurrentStatus();
1594                 __pEdit->SetGuideTextColor(__guideTextColor[status]);
1595         }
1596
1597         if (__isupdateContentBounds)
1598         {
1599                 SetContentsArea();
1600                 __isupdateContentBounds = false;
1601         }
1602         __pSearchBarPresenter->Draw();
1603         return;
1604 }
1605
1606 _UiTouchEventDelivery
1607 _SearchBar::OnPreviewTouchReleased(const _Control& source, const _TouchInfo& touchinfo)
1608 {
1609         _Edit* pEdit = dynamic_cast <_Edit*>(const_cast <_Control*>(&source));
1610         if (pEdit == null)
1611         {
1612                 return _UI_TOUCH_EVENT_DELIVERY_YES;
1613         }
1614
1615         if (pEdit->IsClearIconPressed())
1616         {
1617                 return _UI_TOUCH_EVENT_DELIVERY_YES;
1618         }
1619
1620         SetContentAreaVisible(__contentVisibilitySetByApp);     //When a touch happens on SearchField
1621         SetFocusCallbackParameter(true);
1622         SetMode(SEARCH_BAR_MODE_INPUT);
1623
1624         return _UI_TOUCH_EVENT_DELIVERY_YES;
1625 }
1626
1627 void
1628 _SearchBar::FireButtonActionEvent(const _Control &source, int actionId)
1629 {
1630         if (__actionId == actionId)
1631         {
1632                 __isCancelActionInProgress = true;
1633                 SetFocusCallbackParameter(true);
1634                 SetMode(SEARCH_BAR_MODE_NORMAL);
1635
1636                 SetFocused();
1637
1638                 if (__pActionEvent)
1639                 {
1640                         IEventArg* pEventArg = _ActionEvent::CreateActionEventArgN(__actionId);
1641                         result r = GetLastResult();
1642                         SysTryReturnVoidResult(NID_UI_CTRL, pEventArg, r, "[%s] Propagating.", GetErrorMessage(r));
1643
1644                         __pActionEvent->Fire(*pEventArg);
1645                 }
1646                 __isCancelActionInProgress = false;
1647         }
1648 }
1649
1650 void
1651 _SearchBar::OnActionPerformed(const _Control& source, int actionId)
1652 {
1653         FireButtonActionEvent(source, actionId);
1654         return;
1655 }
1656
1657 // Keypad callbacks
1658 void
1659 _SearchBar::OnKeypadWillOpen(void)
1660 {
1661         if (!__isKeypadOpening)
1662         {
1663                 if (__pKeypadEvent)
1664                 {
1665                         IEventArg* pEventArg = _KeypadEvent::CreateKeypadEventArgN(CORE_KEYPAD_ACTION_SEARCH, CORE_KEYPAD_EVENT_STATUS_CREATED);
1666                         result r = GetLastResult();
1667                         SysTryReturnVoidResult(NID_UI_CTRL, pEventArg, r, "[%s] Propagating.", GetErrorMessage(r));
1668
1669                         __pKeypadEvent->Fire(*pEventArg);
1670                 }
1671         }
1672
1673         __isKeypadOpening = true;
1674         return;
1675 }
1676
1677 void
1678 _SearchBar::OnKeypadOpened(void)
1679 {
1680         if (__pKeypadEvent)
1681         {
1682                 IEventArg* pEventArg = _KeypadEvent::CreateKeypadEventArgN(CORE_KEYPAD_ACTION_SEARCH, CORE_KEYPAD_EVENT_STATUS_OPEN);
1683                 result r = GetLastResult();
1684                 SysTryReturnVoidResult(NID_UI_CTRL, pEventArg, r, "[%s] Propagating.", GetErrorMessage(r));
1685
1686                 __pKeypadEvent->Fire(*pEventArg);
1687         }
1688
1689         __isKeypadOpening = false;
1690         SetContentsArea();
1691         return;
1692 }
1693
1694 void
1695 _SearchBar::OnKeypadClosed(void)
1696 {
1697         if (__pKeypadEvent)
1698         {
1699                 IEventArg* pEventArg = _KeypadEvent::CreateKeypadEventArgN(CORE_KEYPAD_ACTION_SEARCH, CORE_KEYPAD_EVENT_STATUS_CLOSE);
1700                 result r = GetLastResult();
1701                 SysTryReturnVoidResult(NID_UI_CTRL, pEventArg, r, "[%s] Propagating.", GetErrorMessage(r));
1702
1703                 __pKeypadEvent->Fire(*pEventArg);
1704         }
1705
1706         __isKeypadOpening = false;
1707
1708         SetContentsArea();
1709         return;
1710 }
1711
1712 void
1713 _SearchBar::OnKeypadBoundsChanged(void)
1714 {
1715         if (__pKeypadEvent)
1716         {
1717                 IEventArg* pEventArg = _KeypadEvent::CreateKeypadEventArgN(CORE_KEYPAD_ACTION_SEARCH, CORE_KEYPAD_EVENT_STATUS_BOUNDS_CHANGED);
1718                 result r = GetLastResult();
1719                 SysTryReturnVoidResult(NID_UI_CTRL, pEventArg, r, "[%s] Propagating.", GetErrorMessage(r));
1720
1721                 __pKeypadEvent->Fire(*pEventArg);
1722         }
1723
1724         SetContentsArea();
1725         return;
1726 }
1727
1728 void
1729 _SearchBar::OnKeypadActionPerformed(CoreKeypadAction keypadAction)
1730 {
1731         if (__pKeypadEvent)
1732         {
1733                 IEventArg* pEventArg = _KeypadEvent::CreateKeypadEventArgN(keypadAction, CORE_KEYPAD_EVENT_STATUS_ENTERACTION);
1734                 result r = GetLastResult();
1735                 SysTryReturnVoidResult(NID_UI_CTRL, pEventArg, r, "[%s] Propagating.", GetErrorMessage(r));
1736
1737                 __pKeypadEvent->Fire(*pEventArg);
1738         }
1739         return;
1740 }
1741
1742 // TextBlock callbacks
1743 void
1744 _SearchBar::OnTextBlockSelected(_Control& source, int start, int end)
1745 {
1746         if (__pTextBlockEvent)
1747         {
1748                 IEventArg* pEventArg = _TextBlockEvent::CreateTextBlockEventArgN(start, end);
1749                 result r = GetLastResult();
1750                 SysTryReturnVoidResult(NID_UI_CTRL, pEventArg, r, "[%s] Propagating.", GetErrorMessage(r));
1751
1752                 __pTextBlockEvent->Fire(*pEventArg);
1753         }
1754         return;
1755 }
1756
1757 // Text callbacks
1758 void
1759 _SearchBar::OnTextValueChanged(const _Control& source)
1760 {
1761         if (GetTextLength())
1762         {
1763                 SetContentAreaVisible(__contentVisibilitySetByApp);
1764         }
1765
1766         if (!__isCancelActionInProgress)
1767         {
1768                 SetContentDimming();
1769                 if (__pTextEvent != null)
1770                 {
1771                         IEventArg* pEventArg = _TextEvent::CreateTextEventArgN(CORE_TEXT_EVENT_CHANGED);
1772                         result r = GetLastResult();
1773                         SysTryReturnVoidResult(NID_UI_CTRL, pEventArg, r, "[%s] Propagating.", GetErrorMessage(r));
1774
1775                         __pTextEvent->Fire(*pEventArg);
1776                 }
1777         }
1778         return;
1779 }
1780
1781 void
1782 _SearchBar::OnTextValueChangeCanceled(const _Control& source)
1783 {
1784         if (__pTextEvent != null)
1785         {
1786                 IEventArg* pEventArg = _TextEvent::CreateTextEventArgN(CORE_TEXT_EVENT_CANCELED);
1787                 result r = GetLastResult();
1788                 SysTryReturnVoidResult(NID_UI_CTRL, pEventArg, r, "[%s] Propagating.", GetErrorMessage(r));
1789
1790                 __pTextEvent->Fire(*pEventArg);
1791         }
1792         return;
1793 }
1794
1795 result
1796 _SearchBar::OnAttachedToMainTree(void)
1797 {
1798         SetContentsArea();
1799         return E_SUCCESS;
1800 }
1801
1802 void
1803 _SearchBar::OnFontChanged(Font* pFont)
1804 {
1805         __pCancelButton->SetFont(pFont->GetFaceName());
1806         __pEdit->SetFont(*pFont);
1807         return;
1808 }
1809
1810 void
1811 _SearchBar::OnFontInfoRequested(unsigned long& style, int& size)
1812 {
1813         style = FONT_STYLE_PLAIN;
1814         size = __pCancelButton->GetTextSize();
1815
1816         return;
1817 }
1818
1819 bool
1820 _SearchBar::OnFocusGained(const _Control& source)
1821 {
1822         return _Control::OnFocusGained(source);
1823 }
1824
1825 bool
1826 _SearchBar::OnFocusLost(const _Control &source)
1827 {
1828         return _Control::OnFocusLost(source);
1829 }
1830
1831 void
1832 _SearchBar::OnDrawFocus(void)
1833 {
1834         __isInFocusMode = true;
1835         __pEdit->SetSearchFieldFocus(true);
1836         _Control::OnDrawFocus();
1837
1838         return;
1839 }
1840
1841 void
1842 _SearchBar::OnFocusModeStateChanged(void)
1843 {
1844         __isInFocusMode = false;
1845
1846         if (__pEdit->IsFocused())
1847         {
1848                 __pEdit->SetSearchFieldFocus(false);
1849                 __pEdit->Invalidate();
1850         }
1851
1852         if (__pCancelButton->IsFocused())
1853         {
1854                 __pCancelButton->OnFocusModeStateChanged();
1855         }
1856
1857         return;
1858 }
1859
1860 bool
1861 _SearchBar::IsChildControlFocusManage(void) const
1862 {
1863         return true;
1864 }
1865
1866 bool
1867 _SearchBar::OnPreviewKeyPressed(const _Control &source, const _KeyInfo &keyInfo)
1868 {
1869         if (!__pEdit->IsUsbKeyboardConnected())
1870         {
1871                         return false;
1872         }
1873
1874         _KeyCode keyCode = keyInfo.GetKeyCode();
1875
1876         switch (keyCode)
1877         {
1878                 case _KEY_UP:
1879                 case _KEY_DOWN:
1880                 case _KEY_TAB:
1881                         SetFocusCallbackParameter(true);
1882                         if ((__pContentControl && __pContentControl->IsVisible() == false) || !__pContentControl)
1883                         {
1884                                 SetContentAreaVisible(false);
1885                         }
1886
1887                         break;
1888                 default:
1889                         break;
1890         }
1891         return false;
1892 }
1893
1894 bool
1895 _SearchBar::OnKeyPressed(const _Control& source, const _KeyInfo& keyInfo)
1896 {
1897         if (!__pEdit->IsUsbKeyboardConnected())
1898         {
1899                 return false;
1900         }
1901
1902         if (!__isInFocusMode)
1903         {
1904                 return false;
1905         }
1906
1907         _KeyCode keyCode = keyInfo.GetKeyCode();
1908
1909         switch (keyCode)
1910         {
1911                 case _KEY_RIGHT:
1912                         if (&source == this)
1913                         {
1914                                 SetContentAreaVisible(__contentVisibilitySetByApp);
1915                                 SetFocusCallbackParameter(true);
1916                                 SetMode(SEARCH_BAR_MODE_INPUT);
1917                                 __pEdit->SetFocused();
1918                         }
1919
1920                         SetFocusCallbackParameter(false);
1921
1922                         if (&source == __pEdit)
1923                         {
1924                                 if ((!__isButtonEnabled || !__isUsableCancelButton) && __pContentControl && __pContentControl->IsVisible() && __pContentControl->GetEnableState())
1925                                 {
1926                                         __pContentControl->SetFocused();
1927                                         __pContentControl->OnDrawFocus();
1928
1929                                         return true;
1930                                 }
1931                                 else if (__isButtonEnabled && __isUsableCancelButton)
1932                                 {
1933                                         __pCancelButton->SetFocused();
1934                                 }
1935
1936                                 return true;
1937                         }
1938
1939                         if (&source == __pCancelButton && __pContentControl && __pContentControl->IsVisible() && __pContentControl->GetEnableState())
1940                         {
1941                                 __pContentControl->SetFocused();
1942                                 __pContentControl->OnDrawFocus();
1943
1944                                 return true;
1945                         }
1946
1947                         break;
1948
1949                 case _KEY_LEFT:
1950                         if (&source == __pCancelButton)
1951                         {
1952                                 __pEdit->SetFocused();
1953                                 return true;
1954                         }
1955
1956                         if (&source == __pContentControl)
1957                         {
1958                                 if ((__isButtonEnabled && __isUsableCancelButton))
1959                                 {
1960                                         __pCancelButton->SetFocused();
1961                                 }
1962                                 else
1963                                 {
1964                                         __pEdit->SetFocused();
1965                                 }
1966                                 return true;
1967                         }
1968
1969                         break;
1970
1971                 case _KEY_ENTER:
1972                         if (&source == __pCancelButton)
1973                         {
1974                                 FireButtonActionEvent(source, __actionId);
1975                                 _Control::OnDrawFocus();
1976
1977                                 return true;
1978                         }
1979
1980                         break;
1981
1982                 default:
1983                         return false;
1984         }
1985
1986         return false;
1987 }
1988
1989 void
1990 _SearchBar::OnSettingChanged(Tizen::Base::String& key)
1991 {
1992         if (__isButtonTextChangedByApp || !__isUsableCancelButton)
1993         {
1994                 return;
1995         }
1996
1997         if (key.Equals(L"http://tizen.org/setting/locale.language", false))
1998         {
1999                 String cancelText;
2000                 GET_STRING_CONFIG(IDS_TPLATFORM_BUTTON_CANCEL_ABB, cancelText);
2001                 __pCancelButton->SetText(cancelText);
2002                 __pCancelButton->Invalidate();
2003         }
2004
2005         return;
2006 }
2007
2008 Canvas*
2009 _SearchBar::OnCanvasRequestedN(const FloatRectangle& bounds)
2010 {
2011         return __pSearchBarPresenter->OnCanvasRequestedN(bounds);
2012 }
2013
2014 _Control*
2015 _SearchBar::GetParentForm(void) const
2016 {
2017         _Form* pForm = null;
2018         _Control* pControlCore = GetParent();
2019
2020         while (true)
2021         {
2022                 if (pControlCore == null)
2023                 {
2024                         SysLog(NID_UI_CTRL,"[E_SYSTEM] The parent form is null.");
2025
2026                         return null;
2027                 }
2028
2029                 pForm = dynamic_cast <_Form*>(pControlCore);
2030
2031                 if (pForm != null)
2032                 {
2033                         break;
2034                 }
2035
2036                 pControlCore = pControlCore->GetParent();
2037         }
2038
2039         return pControlCore;
2040 }
2041
2042 _Button*
2043 _SearchBar::GetSearchBarButton(void) const
2044 {
2045         return __pCancelButton;
2046 }
2047
2048 _Edit*
2049 _SearchBar::GetSearchField(void)
2050 {
2051         return __pEdit;
2052 }
2053
2054 _Control*
2055 _SearchBar::GetSearchBarContainer(void) const
2056 {
2057         return __pContainer;
2058 }
2059
2060 _Control*
2061 _SearchBar::GetClippedGroupControl(void) const
2062 {
2063         return __pClippedGroupControl;
2064 }
2065
2066 bool
2067 _SearchBar::IsUsableCancelButton(void) const
2068 {
2069         return __isUsableCancelButton;
2070 }
2071
2072 EditStatus
2073 _SearchBar::ConvertSearchBarStatus(SearchFieldStatus status)
2074 {
2075         EditStatus editStatus = EDIT_STATUS_NORMAL;
2076         switch (status)
2077         {
2078         case SEARCH_FIELD_STATUS_NORMAL:
2079                 editStatus = EDIT_STATUS_NORMAL;
2080                 break;
2081
2082         case SEARCH_FIELD_STATUS_DISABLED:
2083                 editStatus = EDIT_STATUS_DISABLED;
2084                 break;
2085
2086         case SEARCH_FIELD_STATUS_HIGHLIGHTED:
2087                 editStatus = EDIT_STATUS_HIGHLIGHTED;
2088                 break;
2089         default:
2090                 break;
2091         }
2092
2093         return editStatus;
2094 }
2095
2096 _ButtonStatus
2097 _SearchBar::ConvertSearchBarButtonStatus(SearchBarButtonStatus status)
2098 {
2099         _ButtonStatus buttonStatus = _BUTTON_STATUS_NORMAL;
2100
2101         switch (status)
2102         {
2103         case SEARCH_BAR_BUTTON_STATUS_NORMAL:
2104                 buttonStatus = _BUTTON_STATUS_NORMAL;
2105                 break;
2106
2107         case SEARCH_BAR_BUTTON_STATUS_PRESSED:
2108                 buttonStatus = _BUTTON_STATUS_PRESSED;
2109                 break;
2110
2111         case SEARCH_BAR_BUTTON_STATUS_HIGHLIGHTED:
2112                 buttonStatus = _BUTTON_STATUS_HIGHLIGHTED;
2113                 break;
2114
2115         case SEARCH_BAR_BUTTON_STATUS_DISABLED:
2116                 buttonStatus = _BUTTON_STATUS_DISABLED;
2117                 break;
2118         default:
2119                 break;
2120         }
2121
2122         return buttonStatus;
2123 }
2124
2125 result
2126 _SearchBar::SendSearchBarEvent(_SearchBarEventStatus status)
2127 {
2128         result r = E_SUCCESS;
2129         if (__pSearchBarEvent)
2130         {
2131                 IEventArg* pEventArg = _SearchBarEvent::CreateSearchBarEventArgN(status);
2132                 r = GetLastResult();
2133                 SysTryReturn(NID_UI_CTRL, pEventArg, r, r, "[%s] Propagating.", GetErrorMessage(r));
2134
2135                 if (IsContentAreaVisible() == false)
2136                 {
2137                         SetContentAreaVisible(false);
2138                 }
2139
2140                 __pSearchBarEvent->Fire(*pEventArg);
2141         }
2142
2143         return E_SUCCESS;
2144 }
2145
2146 void
2147 _SearchBar::SetHeaderVisibleState(bool visible)
2148 {
2149         if (__pSearchBarPresenter != null)
2150         {
2151                 __pSearchBarPresenter->SetHeaderVisibleState(visible);
2152         }
2153         return;
2154 }
2155
2156 result
2157 _SearchBar::SetPropertyButtonActionId(const Variant& actionId)
2158 {
2159         SysTryReturn(NID_UI_CTRL, __pCancelButton, E_SYSTEM, E_SYSTEM,
2160                      "[E_SYSTEM] A system error has occurred. The cancel button instance is null.");
2161         SysTryReturn(NID_UI_CTRL, actionId.ToInt() > -1, E_INVALID_ARG, E_INVALID_ARG,
2162                      "[E_INVALID_ARG] Invalid argument(s) is used. actionId.ToInt() = %d", actionId.ToInt());
2163
2164         result r = E_SUCCESS;
2165
2166         r = __pCancelButton->SetPropertyActionId(actionId);
2167         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, E_SYSTEM, E_SYSTEM,
2168                      "[%s] A system error has occurred. Failed to set actionId.", GetErrorMessage(E_SYSTEM));
2169
2170         __actionId = actionId.ToInt();
2171
2172         return r;
2173 }
2174
2175 Variant
2176 _SearchBar::GetPropertyButtonActionId(void) const
2177 {
2178         SysTryReturn(NID_UI_CTRL, __pCancelButton, Variant(-1), E_SYSTEM,
2179                      "[E_SYSTEM] A system error has occurred. The cancel button instance is null.");
2180
2181         return Variant(__actionId);
2182 }
2183
2184 result
2185 _SearchBar::SetPropertyButtonDisabledColor(const Variant& color)
2186 {
2187         SysTryReturn(NID_UI_CTRL, __pCancelButton, E_SYSTEM, E_SYSTEM,
2188                      "[E_SYSTEM] A system error has occurred. The cancel button instance is null.");
2189
2190         result r = E_SUCCESS;
2191
2192         r = __pCancelButton->SetPropertyDisabledColor(color);
2193         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, E_SYSTEM, E_SYSTEM,
2194                      "[E_SYSTEM] A system error has occurred. Failed to set button color.");
2195
2196         __buttonColor[SEARCH_BAR_BUTTON_STATUS_DISABLED] = color.ToColor();
2197
2198         return r;
2199 }
2200
2201 Variant
2202 _SearchBar::GetPropertyButtonDisabledColor(void) const
2203 {
2204         SysTryReturn(NID_UI_CTRL, __pCancelButton, Variant(Color()), E_SYSTEM,
2205                      "[E_SYSTEM] A system error has occurred. The cancel button instance is null.");
2206
2207         return Variant(__buttonColor[SEARCH_BAR_BUTTON_STATUS_DISABLED]);
2208 }
2209
2210 result
2211 _SearchBar::SetPropertyButtonHighlightedColor(const Variant& color)
2212 {
2213         SysTryReturn(NID_UI_CTRL, __pCancelButton, E_SYSTEM, E_SYSTEM,
2214                      "[E_SYSTEM] A system error has occurred. The cancel button instance is null.");
2215
2216         result r = E_SUCCESS;
2217
2218         r = __pCancelButton->SetPropertyHighlightedColor(color);
2219         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, E_SYSTEM, E_SYSTEM,
2220                      "[E_SYSTEM] A system error has occurred. Failed to set button color.");
2221
2222         __buttonColor[SEARCH_BAR_BUTTON_STATUS_HIGHLIGHTED] = color.ToColor();
2223
2224         return r;
2225 }
2226
2227 Variant
2228 _SearchBar::GetPropertyButtonHighlightedColor(void) const
2229 {
2230         SysTryReturn(NID_UI_CTRL, __pCancelButton, Variant(Color()), E_SYSTEM,
2231                      "[E_SYSTEM] A system error has occurred. The cancel button instance is null.");
2232
2233         return Variant(__buttonColor[SEARCH_BAR_BUTTON_STATUS_HIGHLIGHTED]);
2234 }
2235
2236 result
2237 _SearchBar::SetPropertyButtonNormalColor(const Variant& color)
2238 {
2239         SysTryReturn(NID_UI_CTRL, __pCancelButton, E_SYSTEM, E_SYSTEM,
2240                      "[E_SYSTEM] A system error has occurred. The cancel button instance is null.");
2241
2242         result r = E_SUCCESS;
2243
2244         r = __pCancelButton->SetPropertyNormalColor(color);
2245         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, E_SYSTEM, E_SYSTEM,
2246                      "[E_SYSTEM] A system error has occurred. Failed to set button color.");
2247
2248         __buttonColor[SEARCH_BAR_BUTTON_STATUS_NORMAL] = color.ToColor();
2249
2250         return r;
2251 }
2252
2253 Variant
2254 _SearchBar::GetPropertyButtonNormalColor(void) const
2255 {
2256         SysTryReturn(NID_UI_CTRL, __pCancelButton, Variant(Color()), E_SYSTEM,
2257                      "[E_SYSTEM] A system error has occurred. The cancel button instance is null.");
2258
2259         return Variant(__buttonColor[SEARCH_BAR_BUTTON_STATUS_NORMAL]);
2260 }
2261
2262 result
2263 _SearchBar::SetPropertyButtonPressedColor(const Variant& color)
2264 {
2265         SysTryReturn(NID_UI_CTRL, __pCancelButton, E_SYSTEM, E_SYSTEM,
2266                      "[E_SYSTEM] A system error has occurred. The cancel button instance is null.");
2267
2268         result r = E_SUCCESS;
2269
2270         r = __pCancelButton->SetPropertyPressedColor(color);
2271         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, E_SYSTEM, E_SYSTEM,
2272                      "[E_SYSTEM] A system error has occurred. Failed to set button color.");
2273
2274         __buttonColor[SEARCH_BAR_BUTTON_STATUS_PRESSED] = color.ToColor();
2275
2276         return r;
2277 }
2278
2279 Variant
2280 _SearchBar::GetPropertyButtonPressedColor(void) const
2281 {
2282         SysTryReturn(NID_UI_CTRL, __pCancelButton, Variant(Color()), E_SYSTEM,
2283                      "[E_SYSTEM] A system error has occurred. The cancel button instance is null.");
2284
2285         return Variant(__buttonColor[SEARCH_BAR_BUTTON_STATUS_PRESSED]);
2286 }
2287
2288 result
2289 _SearchBar::SetPropertyButtonDisabledTextColor(const Variant& textColor)
2290 {
2291         SysTryReturn(NID_UI_CTRL, __pCancelButton, E_SYSTEM, E_SYSTEM,
2292                      "[E_SYSTEM] A system error has occurred. The cancel button instance is null.");
2293
2294         result r = E_SUCCESS;
2295
2296         r = __pCancelButton->SetPropertyDisabledTextColor(textColor);
2297         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, E_SYSTEM, E_SYSTEM,
2298                      "[E_SYSTEM] A system error has occurred. Failed to set button text color.");
2299
2300         __buttonTextColor[SEARCH_BAR_BUTTON_STATUS_DISABLED] = textColor.ToColor();
2301
2302         return r;
2303 }
2304
2305 Variant
2306 _SearchBar::GetPropertyButtonDisabledTextColor(void) const
2307 {
2308         SysTryReturn(NID_UI_CTRL, __pCancelButton, Variant(Color()), E_SYSTEM,
2309                      "[E_SYSTEM] A system error has occurred. The cancel button instance is null.");
2310
2311         return Variant(__buttonTextColor[SEARCH_BAR_BUTTON_STATUS_DISABLED]);
2312 }
2313
2314 result
2315 _SearchBar::SetPropertyButtonHighlightedTextColor(const Variant& textColor)
2316 {
2317         SysTryReturn(NID_UI_CTRL, __pCancelButton, E_SYSTEM, E_SYSTEM,
2318                      "[E_SYSTEM]] A system error has occurred. The cancel button instance is null.");
2319
2320         result r = E_SUCCESS;
2321
2322         r = __pCancelButton->SetPropertyHighlightedTextColor(textColor);
2323         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, E_SYSTEM, E_SYSTEM,
2324                      "[E_SYSTEM] A system error has occurred. Failed to set button text color.");
2325
2326         __buttonTextColor[SEARCH_BAR_BUTTON_STATUS_HIGHLIGHTED] = textColor.ToColor();
2327
2328         return r;
2329 }
2330
2331 Variant
2332 _SearchBar::GetPropertyButtonHighlightedTextColor(void) const
2333 {
2334         SysTryReturn(NID_UI_CTRL, __pCancelButton, Variant(Color()), E_SYSTEM,
2335                      "[E_SYSTEM] A system error has occurred. The cancel button instance is null.");
2336
2337         return Variant(__buttonTextColor[SEARCH_BAR_BUTTON_STATUS_HIGHLIGHTED]);
2338 }
2339
2340 result
2341 _SearchBar::SetPropertyButtonNormalTextColor(const Variant& textColor)
2342 {
2343         SysTryReturn(NID_UI_CTRL, __pCancelButton, E_SYSTEM, E_SYSTEM,
2344                      "[E_SYSTEM] A system error has occurred. The cancel button instance is null.");
2345
2346         result r = E_SUCCESS;
2347
2348         r = __pCancelButton->SetPropertyNormalTextColor(textColor);
2349         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, E_SYSTEM, E_SYSTEM,
2350                      "[E_SYSTEM] A system error has occurred. Failed to set button text color.");
2351
2352         __buttonTextColor[SEARCH_BAR_BUTTON_STATUS_NORMAL] = textColor.ToColor();
2353
2354         return r;
2355 }
2356
2357 Variant
2358 _SearchBar::GetPropertyButtonNormalTextColor(void) const
2359 {
2360         SysTryReturn(NID_UI_CTRL, __pCancelButton, Variant(Color()), E_SYSTEM,
2361                      "[E_SYSTEM] A system error has occurred. The cancel button instance is null.");
2362
2363         return Variant(__buttonTextColor[SEARCH_BAR_BUTTON_STATUS_NORMAL]);
2364 }
2365
2366 result
2367 _SearchBar::SetPropertyButtonPressedTextColor(const Variant& textColor)
2368 {
2369         SysTryReturn(NID_UI_CTRL, __pCancelButton, E_SYSTEM, E_SYSTEM,
2370                      "[E_SYSTEM] A system error has occurred. The cancel button instance is null.");
2371
2372         result r = E_SUCCESS;
2373
2374         r = __pCancelButton->SetPropertyPressedTextColor(textColor);
2375         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, E_SYSTEM, E_SYSTEM,
2376                      "[E_SYSTEM] A system error has occurred. Failed to set button text color.");
2377
2378         __buttonTextColor[SEARCH_BAR_BUTTON_STATUS_PRESSED] = textColor.ToColor();
2379
2380         return r;
2381 }
2382
2383 Variant
2384 _SearchBar::GetPropertyButtonPressedTextColor(void) const
2385 {
2386         SysTryReturn(NID_UI_CTRL, __pCancelButton, Variant(Color()), E_SYSTEM,
2387                      "[E_SYSTEM] A system error has occurred. The cancel button instance is null.");
2388
2389         return Variant(__buttonTextColor[SEARCH_BAR_BUTTON_STATUS_PRESSED]);
2390 }
2391
2392 result
2393 _SearchBar::SetPropertySearchFieldDisabledColor(const Variant& color)
2394 {
2395         SysTryReturn(NID_UI_CTRL, __pEdit, E_SYSTEM, E_SYSTEM,
2396                      "[E_SYSTEM] A system error has occurred. The edit instance is null.");
2397
2398         result r = E_SUCCESS;
2399
2400         r = __pEdit->SetPropertyDisabledColor(color);
2401         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, E_SYSTEM, E_SYSTEM,
2402                      "[E_SYSTEM] A system error has occurred. Failed to set the edit disabled color.");
2403
2404         __color[SEARCH_FIELD_STATUS_DISABLED] = color.ToColor();
2405
2406         return r;
2407 }
2408
2409 Variant
2410 _SearchBar::GetPropertySearchFieldDisabledColor(void) const
2411 {
2412         SysTryReturn(NID_UI_CTRL, __pEdit, Variant(Color()), E_SYSTEM,
2413                      "[E_SYSTEM] A system error has occurred. The edit instance is null.");
2414
2415         return Variant(__color[SEARCH_FIELD_STATUS_DISABLED]);
2416 }
2417
2418 result
2419 _SearchBar::SetPropertySearchFieldHighlightedColor(const Variant& color)
2420 {
2421         SysTryReturn(NID_UI_CTRL, __pEdit, E_SYSTEM, E_SYSTEM,
2422                      "[E_SYSTEM] A system error has occurred. The edit instance is null.");
2423
2424         result r = E_SUCCESS;
2425
2426         r = __pEdit->SetPropertyHighlightedColor(color);
2427         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, E_SYSTEM, E_SYSTEM,
2428                      "[E_SYSTEM] A system error has occurred. Failed to set the edit highlighted color.");
2429
2430         __color[SEARCH_FIELD_STATUS_HIGHLIGHTED] = color.ToColor();
2431
2432         return r;
2433 }
2434
2435 Variant
2436 _SearchBar::GetPropertySearchFieldHighlightedColor(void) const
2437 {
2438         SysTryReturn(NID_UI_CTRL, __pEdit, Variant(Color()), E_SYSTEM,
2439                      "[E_SYSTEM] A system error has occurred. The edit instance is null.");
2440
2441         return Variant(__color[SEARCH_FIELD_STATUS_HIGHLIGHTED]);
2442 }
2443
2444 result
2445 _SearchBar::SetPropertySearchFieldNormalColor(const Variant& color)
2446 {
2447         SysTryReturn(NID_UI_CTRL, __pEdit, E_SYSTEM, E_SYSTEM,
2448                      "[E_SYSTEM] A system error has occurred. The edit instance is null.");
2449
2450         result r = E_SUCCESS;
2451
2452         r = __pEdit->SetPropertyNormalColor(color);
2453         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, E_SYSTEM, E_SYSTEM,
2454                      "[E_SYSTEM] A system error has occurred. Failed to set edit normal color.");
2455
2456         __color[SEARCH_FIELD_STATUS_NORMAL] = color.ToColor();
2457
2458         return r;
2459 }
2460
2461 Variant
2462 _SearchBar::GetPropertySearchFieldNormalColor(void) const
2463 {
2464         SysTryReturn(NID_UI_CTRL, __pEdit, Variant(Color()), E_SYSTEM,
2465                      "[E_SYSTEM] A system error has occurred. The edit instance is null.");
2466
2467         return Variant(__color[SEARCH_FIELD_STATUS_NORMAL]);
2468 }
2469
2470 result
2471 _SearchBar::SetPropertySearchFieldDisabledTextColor(const Variant& textColor)
2472 {
2473         SysTryReturn(NID_UI_CTRL, __pEdit, E_SYSTEM, E_SYSTEM,
2474                      "[E_SYSTEM] A system error has occurred. The edit instance is null.");
2475
2476         result r = E_SUCCESS;
2477
2478         r = __pEdit->SetPropertyDisabledTextColor(textColor);
2479         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, E_SYSTEM, E_SYSTEM,
2480                      "[E_SYSTEM] A system error has occurred. Failed to set edit disabled text color.");
2481
2482         __textColor[SEARCH_FIELD_STATUS_DISABLED] = textColor.ToColor();
2483
2484         return r;
2485 }
2486
2487 Variant
2488 _SearchBar::GetPropertySearchFieldDisabledTextColor(void) const
2489 {
2490         SysTryReturn(NID_UI_CTRL, __pEdit, Variant(Color()), E_SYSTEM,
2491                      "[E_SYSTEM] A system error has occurred. The edit instance is null.");
2492
2493         return Variant(__textColor[SEARCH_FIELD_STATUS_DISABLED]);
2494 }
2495
2496 result
2497 _SearchBar::SetPropertySearchFieldHighlightedTextColor(const Variant& textColor)
2498 {
2499         SysTryReturn(NID_UI_CTRL, __pEdit, E_SYSTEM, E_SYSTEM,
2500                      "[E_SYSTEM] A system error has occurred. The edit instance is null.");
2501
2502         result r = E_SUCCESS;
2503
2504         r = __pEdit->SetPropertyHighlightedTextColor(textColor);
2505         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, E_SYSTEM, E_SYSTEM,
2506                      "[E_SYSTEM] A system error has occurred. Failed to set edit highlighted text color.");
2507
2508         __textColor[SEARCH_FIELD_STATUS_HIGHLIGHTED] = textColor.ToColor();
2509
2510         return r;
2511 }
2512
2513 Variant
2514 _SearchBar::GetPropertySearchFieldHighlightedTextColor(void) const
2515 {
2516         SysTryReturn(NID_UI_CTRL, __pEdit, Variant(Color()), E_SYSTEM,
2517                      "[E_SYSTEM] A system error has occurred. The edit instance is null.");
2518
2519         return Variant(__textColor[SEARCH_FIELD_STATUS_HIGHLIGHTED]);
2520 }
2521
2522 result
2523 _SearchBar::SetPropertySearchFieldNormalTextColor(const Variant& textColor)
2524 {
2525         SysTryReturn(NID_UI_CTRL, __pEdit, E_SYSTEM, E_SYSTEM,
2526                      "[E_SYSTEM] A system error has occurred. The edit instance is null.");
2527
2528         result r = E_SUCCESS;
2529
2530         r = __pEdit->SetPropertyNormalTextColor(textColor);
2531         SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, E_SYSTEM, E_SYSTEM,
2532                      "[E_SYSTEM] A system error has occurred. Failed to set edit normal text color.");
2533
2534         __textColor[SEARCH_FIELD_STATUS_NORMAL] = textColor.ToColor();
2535
2536         return r;
2537 }
2538
2539 Variant
2540 _SearchBar::GetPropertySearchFieldNormalTextColor(void) const
2541 {
2542         SysTryReturn(NID_UI_CTRL, __pEdit, Variant(Color()), E_SYSTEM,
2543                      "[E_SYSTEM] A system error has occurred. The edit instance is null.");
2544
2545         return Variant(__textColor[SEARCH_FIELD_STATUS_NORMAL]);
2546 }
2547
2548 result
2549 _SearchBar::SetPropertyColor(const Variant& color)
2550 {
2551         __backgroundColor = color.ToColor();
2552
2553         return E_SUCCESS;
2554 }
2555
2556 Variant
2557 _SearchBar::GetPropertyColor(void) const
2558 {
2559         return Variant(__backgroundColor);
2560 }
2561
2562 result
2563 _SearchBar::SetPropertyContentAreaSize(const Variant& size)
2564 {
2565         FloatDimension contentAreaSize = size.ToFloatDimension();
2566         SysTryReturn(NID_UI_CTRL, contentAreaSize.width >= 0 && contentAreaSize.height >= 0, E_INVALID_ARG, E_INVALID_ARG,
2567                      "[E_INVALID_ARG] Invalid argument(s) is used. contentAreaSize.width = %f, contenAreaSize.height = %f",
2568                      contentAreaSize.width, contentAreaSize.height);
2569
2570         result r = E_SUCCESS;
2571
2572         // Todo
2573         FloatRectangle bounds = GetBoundsF();
2574         FloatRectangle contentAreaBounds(0.0f, 0.0f, 0.0f, 0.0f);
2575
2576         contentAreaBounds.x = 0.0f;
2577         contentAreaBounds.y = bounds.height;
2578         contentAreaBounds.width = contentAreaSize.width;
2579         contentAreaBounds.height = contentAreaSize.height;
2580
2581         __contentAreaBounds = contentAreaBounds;
2582         __isUserContainerBounds = true;
2583
2584         // set bounds
2585         if (__pContainer)
2586         {
2587                 r = __pContainer->SetBounds(__contentAreaBounds);
2588                 SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Propagating.");
2589         }
2590
2591         return r;
2592 }
2593
2594 Variant
2595 _SearchBar::GetPropertyContentAreaSize(void) const
2596 {
2597         FloatDimension contentAreaSize(__contentAreaBounds.width, __contentAreaBounds.height);
2598
2599         return Variant(contentAreaSize);
2600 }
2601
2602 result
2603 _SearchBar::CreateClippedGroupControl(void)
2604 {
2605         result r = E_SUCCESS;
2606         FloatRectangle clippedGroupControlBounds(FloatPoint(0.0f, 0.0f), GetSizeF());
2607         __pClippedGroupControl = _Control::CreateControlN();
2608         r = GetLastResult();
2609         SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "Propagating.");
2610
2611         r = AttachChild(*__pClippedGroupControl);
2612         SysTryCatch(NID_UI_CTRL, (r == E_SUCCESS), , E_SYSTEM,
2613                     "[E_SYSTEM] A system error has occurred. Failed to attach the parent of clipped control.");
2614
2615         r = __pClippedGroupControl->SetBounds(clippedGroupControlBounds);
2616         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
2617
2618         __pClippedGroupControl->SetBackgroundColor(Color(0));
2619
2620         __pClippedGroupControl->SetClipChildrenEnabled(true);
2621
2622         return r;
2623
2624 CATCH:
2625         delete __pClippedGroupControl;
2626         __pClippedGroupControl = null;
2627
2628         return r;
2629 }
2630
2631 void
2632 _SearchBar::InitializeAccessibility(void)
2633 {
2634         _AccessibilityContainer* pSBContainer = null;
2635         pSBContainer = GetAccessibilityContainer();
2636
2637         _AccessibilityContainer* pEditContainer = null;
2638         pEditContainer = __pEdit->GetAccessibilityContainer();
2639         pSBContainer->AddChildContainer(*pEditContainer);
2640
2641         _AccessibilityContainer* pButtonContainer = null;
2642         pButtonContainer = __pCancelButton->GetAccessibilityContainer();
2643
2644         if (__isUsableCancelButton)
2645         {
2646                 pSBContainer->AddChildContainer(*pButtonContainer);
2647         }
2648
2649         _AccessibilityElement* pEditElement = __pEdit->GetTextAccessibilityElement();
2650
2651         pEditElement->SetHint("Double Tap To Type Search Text");
2652         pEditElement->SetTrait("SearchBar");
2653         pEditElement->SetName("SearchField");
2654
2655         pSBContainer->Activate(false);
2656
2657         return;
2658 }
2659
2660 void
2661 _SearchBar::SetContentDimming(void)
2662 {
2663         if (__pContainer != NULL)
2664         {
2665                 if (!GetTextLength())
2666                 {
2667                         __contentColor.SetAlpha(_SEARCH_CONTENT_DIM_OPACITY);
2668                 }
2669                 else
2670                 {
2671                         __contentColor.SetAlpha(0);
2672                 }
2673                 __pContainer->SetBackgroundColor(__contentColor);
2674         }
2675         return;
2676 }
2677
2678 bool
2679 _SearchBar::IsContentAttachable(const _Control* pContent)
2680 {
2681         const _Window* pWindow = dynamic_cast <const _Window*>(pContent);
2682         const _ColorPicker* pColorPicker = dynamic_cast <const _ColorPicker*>(pContent);
2683         const _Form* pForm = dynamic_cast <const _Form*>(pContent);
2684         const _Keypad* pKeypad = dynamic_cast <const _Keypad*>(pContent);
2685         const _OverlayPanel* pOverlayPanel = dynamic_cast <const _OverlayPanel*>(pContent);
2686
2687         bool isContentAttachable = true;
2688
2689         isContentAttachable = ((pWindow == null) && (pColorPicker == null) &&
2690                                (pForm == null) && (pKeypad == null) && (pOverlayPanel == null));
2691         return isContentAttachable;
2692 }
2693
2694 result
2695 _SearchBar::ResizeCancelButton(void)
2696 {
2697         result r = E_SUCCESS;
2698
2699         float horizontalMargin = 0.0f;
2700         float buttonLeftMargin = 0.0f;
2701         float buttonRightMargin = 0.0f;
2702         float buttonMinWidth = 0.0f;
2703         float searchFieldMinWidth = 0.0f;
2704         float buttonVerticalMargin = 0.0f;
2705         float searchBarMinHeight = 0.0f;
2706         float buttonWidth = 0.0f;
2707         float buttonHeight = 0.0f;
2708
2709         FloatRectangle cancelButtonBounds;
2710         FloatRectangle searchBarBounds = GetBoundsF();
2711
2712         _ControlOrientation orientation = _ControlManager::GetInstance()->GetOrientation();
2713
2714         GET_SHAPE_CONFIG(SEARCHBAR::HORIZONTAL_MARGIN, orientation, horizontalMargin);
2715         GET_SHAPE_CONFIG(SEARCHBAR::BUTTON_LEFT_MARGIN, orientation, buttonLeftMargin);
2716         GET_SHAPE_CONFIG(SEARCHBAR::BUTTON_RIGHT_MARGIN, orientation, buttonRightMargin);
2717         GET_SHAPE_CONFIG(SEARCHBAR::BUTTON_WIDTH, orientation, buttonWidth);
2718         GET_SHAPE_CONFIG(SEARCHBAR::BUTTON_HEIGHT, orientation, buttonHeight);
2719         GET_SHAPE_CONFIG(SEARCHBAR::BUTTON_MIN_WIDTH, orientation, buttonMinWidth);
2720         GET_SHAPE_CONFIG(SEARCHBAR::SEARCH_FIELD_MIN_WIDTH, orientation, searchFieldMinWidth);
2721         GET_SHAPE_CONFIG(SEARCHBAR::VERTICAL_MARGIN, orientation, buttonVerticalMargin);
2722         GET_SHAPE_CONFIG(SEARCHBAR::MIN_HEIGHT, orientation, searchBarMinHeight);
2723
2724         cancelButtonBounds.width = buttonWidth;
2725         cancelButtonBounds.height = buttonHeight;
2726
2727         float buttonResizableSearchBarWidth = (horizontalMargin + searchFieldMinWidth +
2728                                              cancelButtonBounds.width + buttonLeftMargin + buttonRightMargin);
2729
2730         if (searchBarBounds.width < buttonResizableSearchBarWidth)
2731         {
2732                 cancelButtonBounds.width = searchBarBounds.width -(searchFieldMinWidth + buttonLeftMargin
2733                                                                    + buttonRightMargin + horizontalMargin);
2734         }
2735
2736         cancelButtonBounds.x = searchBarBounds.width - cancelButtonBounds.width - buttonRightMargin;
2737         cancelButtonBounds.y = (searchBarBounds.height - cancelButtonBounds.height)/2.0f;
2738
2739         cancelButtonBounds.y = cancelButtonBounds.y < 0.0f ? 0.0f:cancelButtonBounds.y;
2740
2741         if (cancelButtonBounds.width < buttonMinWidth)
2742         {
2743                 cancelButtonBounds.width = buttonMinWidth;
2744         }
2745
2746         cancelButtonBounds.width = (cancelButtonBounds.width > 0.0f) ? cancelButtonBounds.width : 0.0f;
2747         cancelButtonBounds.height = (cancelButtonBounds.height > 0.0f) ? cancelButtonBounds.height : 0.0f;
2748         r = __pCancelButton->SetBounds(cancelButtonBounds);
2749
2750         return r;
2751 }
2752
2753 void
2754 _SearchBar::RecalculateButtonBounds(void)
2755 {
2756         result r = E_SUCCESS;
2757
2758         float horizontalMargin = 0.0f;
2759         float verticalMargin = 0.0f;
2760         float buttonLeftMargin = 0.0f;
2761         float buttonRightMargin = 0.0f;
2762         float buttonMinWidth = 0.0f;
2763         float searchFieldMinWidth = 0.0f;
2764         float buttonVerticalMargin = 0.0f;
2765         float searchBarMinHeight = 0.0f;
2766         float buttonWidth = 0.0f;
2767         float buttonHeight = 0.0f;
2768         float cancelButtonWidth = 0.0f;
2769
2770         FloatRectangle cancelButtonBounds;
2771         FloatRectangle editBounds;
2772         FloatRectangle searchBarBounds = GetBoundsF();
2773
2774         _ControlOrientation orientation = _ControlManager::GetInstance()->GetOrientation();
2775
2776         GET_SHAPE_CONFIG(SEARCHBAR::HORIZONTAL_MARGIN, orientation, horizontalMargin);
2777         GET_SHAPE_CONFIG(SEARCHBAR::VERTICAL_MARGIN, orientation, verticalMargin);
2778         GET_SHAPE_CONFIG(SEARCHBAR::BUTTON_LEFT_MARGIN, orientation, buttonLeftMargin);
2779         GET_SHAPE_CONFIG(SEARCHBAR::BUTTON_RIGHT_MARGIN, orientation, buttonRightMargin);
2780         GET_SHAPE_CONFIG(SEARCHBAR::BUTTON_WIDTH, orientation, buttonWidth);
2781         GET_SHAPE_CONFIG(SEARCHBAR::BUTTON_HEIGHT, orientation, buttonHeight);
2782         GET_SHAPE_CONFIG(SEARCHBAR::BUTTON_MIN_WIDTH, orientation, buttonMinWidth);
2783         GET_SHAPE_CONFIG(SEARCHBAR::SEARCH_FIELD_MIN_WIDTH, orientation, searchFieldMinWidth);
2784         GET_SHAPE_CONFIG(SEARCHBAR::VERTICAL_MARGIN, orientation, buttonVerticalMargin);
2785         GET_SHAPE_CONFIG(SEARCHBAR::MIN_HEIGHT, orientation, searchBarMinHeight);
2786
2787         cancelButtonBounds.height = buttonHeight;
2788
2789         float searchFieldMinHeight = searchBarMinHeight - (verticalMargin * 2.0f);
2790         cancelButtonWidth = __pCancelButton->GetTextExtentSizeF() + __pCancelButton->GetRightTouchMarginF() + __pCancelButton->GetLeftTouchMarginF() + __pCancelButton->GetRightMarginF() + __pCancelButton->GetLeftMarginF();
2791         editBounds.x = horizontalMargin;
2792
2793         if (searchBarBounds.height < searchBarMinHeight)
2794         {
2795                 verticalMargin = (searchBarBounds.height - searchFieldMinHeight)/2.0f;
2796                 if (verticalMargin < 0.0f)
2797                 {
2798                         verticalMargin = 0.0f;
2799                 }
2800         }
2801
2802         editBounds.y = verticalMargin;
2803         editBounds.height = searchBarBounds.height - (editBounds.y * 2.0f);
2804
2805         editBounds.height = (editBounds.height > searchFieldMinHeight) ? editBounds.height : searchFieldMinHeight;
2806
2807         editBounds.width = searchBarBounds.width - cancelButtonWidth - horizontalMargin - buttonLeftMargin - buttonRightMargin;
2808
2809         if (editBounds.width < searchFieldMinWidth)
2810         {
2811                 editBounds.width = searchFieldMinWidth;
2812         }
2813
2814         cancelButtonBounds.x = editBounds.width + horizontalMargin + buttonLeftMargin;
2815         cancelButtonBounds.y = (searchBarBounds.height - cancelButtonBounds.height)/2.0f;
2816
2817         cancelButtonBounds.y = cancelButtonBounds.y < 0.0f ? 0.0f:cancelButtonBounds.y;
2818
2819         float remainingWidth = searchBarBounds.width - editBounds.width - horizontalMargin - buttonLeftMargin - buttonRightMargin;
2820
2821         if (remainingWidth < buttonMinWidth)
2822         {
2823                 cancelButtonBounds.width = buttonMinWidth;
2824         }
2825         else
2826         {
2827                 cancelButtonBounds.width = searchBarBounds.width - cancelButtonBounds.x - buttonRightMargin;
2828         }
2829
2830         cancelButtonBounds.width = (cancelButtonBounds.width > 0.0f) ? cancelButtonBounds.width : 0.0f;
2831         cancelButtonBounds.height = (cancelButtonBounds.height > 0.0f) ? cancelButtonBounds.height : 0.0f;
2832
2833         r = __pCancelButton->SetBounds(cancelButtonBounds);
2834         SysTryReturnVoidResult(NID_UI_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
2835         r = __pEdit->SetBounds(editBounds);
2836         SysTryReturnVoidResult(NID_UI_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
2837
2838         return;
2839 }
2840
2841 SearchFieldStatus
2842 _SearchBar::GetCurrentStatus(void)
2843 {
2844         SearchFieldStatus searchFieldStatus = SEARCH_FIELD_STATUS_NORMAL;
2845
2846         if (IsEnabled())
2847         {
2848                 if (__pEdit->IsFocused())
2849                 {
2850                         searchFieldStatus = SEARCH_FIELD_STATUS_HIGHLIGHTED;
2851                 }
2852         }
2853         else
2854         {
2855                 searchFieldStatus = SEARCH_FIELD_STATUS_DISABLED;
2856         }
2857
2858         return searchFieldStatus;
2859 }
2860
2861 void
2862 _SearchBar::SetEditTextFilter(IEditTextFilter* pFilter)
2863 {
2864         SysTryReturnVoidResult(NID_UI_CTRL, __pEdit, E_SYSTEM,
2865                                "[E_SYSTEM] A system error has occurred. The edit instance is null.");
2866
2867         __pEdit->SetEditTextFilter(pFilter);
2868
2869         return;
2870 }
2871
2872 void
2873 _SearchBar::SendOpaqueCommand(const String& command)
2874 {
2875         SysTryReturnVoidResult(NID_UI_CTRL, __pEdit, E_SYSTEM,
2876                                "[E_SYSTEM] A system error has occurred. The edit instance is null.");
2877
2878         __pEdit->SendOpaqueCommand(command);
2879
2880         return;
2881 }
2882
2883 void
2884 _SearchBar::SetFocusCallbackParameter(bool state)
2885 {
2886         __isFocusCallbackToBeFired = state;
2887         return;
2888 }
2889
2890 bool
2891 _SearchBar::IsFocusCallbackToBeFired(void) const
2892 {
2893         return __isFocusCallbackToBeFired;
2894 }
2895 }}} // Tizen::Ui::Controls