2 // Open Service Platform
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0/
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
19 * @file FUiCtrl_TextBoxImpl.cpp
20 * @brief This is the implementation file for _TextBoxImpl class.
24 #include <FBaseSysLog.h>
25 #include <FBase_LocalizedNumParser.h>
26 #include <FUiAccessibilityContainer.h>
27 #include <FUiAccessibilityElement.h>
28 #include "FUi_CoordinateSystemUtils.h"
29 #include "FUi_UiBuilder.h"
30 #include "FUiCtrl_TextBoxImpl.h"
31 #include "FUiCtrl_PublicTextBlockEvent.h"
32 #include "FUiCtrl_PublicLinkEvent.h"
33 #include "FUi_CoordinateSystemUtils.h"
35 using namespace Tizen::Base;
36 using namespace Tizen::Base::Runtime;
37 using namespace Tizen::Base::Utility;
38 using namespace Tizen::Graphics;
39 using namespace Tizen::Ui;
41 namespace Tizen { namespace Ui { namespace Controls
44 const int TEXTBOX_LENGTH_MAX = 2048;
46 _TextBoxImpl::_TextBoxImpl(TextBox* pPublic, _Edit* pCore)
47 : _ControlImpl(pPublic, pCore)
49 , __pPublicTextBlockEvent(null)
50 , __pPublicLinkEvent(null)
51 , __autoLinkMask(LINK_TYPE_NONE)
55 _TextBoxImpl::~_TextBoxImpl(void)
57 if (__pPublicTextBlockEvent)
59 delete __pPublicTextBlockEvent;
60 __pPublicTextBlockEvent = null;
63 if (__pPublicLinkEvent)
65 delete __pPublicLinkEvent;
66 __pPublicLinkEvent = null;
71 _TextBoxImpl::CreateTextBoxImplN(TextBox* pPublic)
76 _Edit* pCore = _Edit::CreateEditN();
77 SysTryReturn(NID_UI_CTRL, pCore, null, GetLastResult(), "[%s] Propagating.", GetErrorMessage(r));
79 _TextBoxImpl* pImpl = new (std::nothrow) _TextBoxImpl(pPublic, pCore);
81 r = _ControlImpl::CheckConstruction(pCore, pImpl);
82 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
85 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
96 _TextBoxImpl::GetPublicClassName(void) const
98 return "Tizen::Ui::Controls::TextBox";
102 _TextBoxImpl::GetPublic(void) const
104 return static_cast <const TextBox&>(_ControlImpl::GetPublic());
108 _TextBoxImpl::GetPublic(void)
110 return static_cast <TextBox&>(_ControlImpl::GetPublic());
114 _TextBoxImpl::GetCore(void) const
116 return static_cast <const _Edit&>(_ControlImpl::GetCore());
120 _TextBoxImpl::GetCore(void)
122 return static_cast <_Edit&>(_ControlImpl::GetCore());
126 _TextBoxImpl::Initialize(TextBoxBorder border)
128 result r = E_SUCCESS;
130 r = __pEdit->Initialize(EDIT_STYLE_VIEWER, INPUT_STYLE_OVERLAY, TEXTBOX_LENGTH_MAX);
132 if (border == TEXT_BOX_BORDER_ROUNDED)
134 __pEdit->SetBorderRoundStyleEnabled(true);
138 __pEdit->SetBorderRoundStyleEnabled(false);
146 __pEdit->SetAutoLinkMask(LINK_TYPE_URL | LINK_TYPE_EMAIL | LINK_TYPE_TEL_NUM);
156 _TextBoxImpl::Dispose(void)
158 result r = E_SUCCESS;
170 _TextBoxImpl::SetAutoLinkMask(unsigned long autoLinks)
172 __autoLinkMask = autoLinks;
174 return __pEdit->SetAutoLinkMask(autoLinks);
178 _TextBoxImpl::GetAutoLinkMask(void) const
180 return __autoLinkMask;
184 _TextBoxImpl::AddUiLinkEventListener(IUiLinkEventListener& listener)
186 if (__pPublicLinkEvent == null)
188 __pPublicLinkEvent = _PublicLinkEvent::CreateInstanceN(GetPublic());
190 if (IsFailed(GetLastResult()))
192 SysLogException(NID_UI_CTRL, E_SYSTEM, "[E_SYSTEM] System error occurred.");
193 delete __pPublicLinkEvent;
198 __pPublicLinkEvent->AddListener(listener);
199 __pEdit->AddUiLinkEventListener(*this);
205 _TextBoxImpl::RemoveUiLinkEventListener(IUiLinkEventListener& listener)
207 SysTryReturn(NID_UI_CTRL, __pPublicLinkEvent, E_SYSTEM, E_SYSTEM,
208 "[E_SYSTEM] This instance isn't constructed.")
210 __pPublicLinkEvent->RemoveListener(listener);
211 __pEdit->RemoveUiLinkEventListener(*this);
217 _TextBoxImpl::AppendCharacter(const Character& character)
219 return __pEdit->AppendCharacter(character);
223 _TextBoxImpl::AppendText(const String& text)
225 return __pEdit->AppendText(text);
229 _TextBoxImpl::Clear(void)
231 return __pEdit->ClearText();
235 _TextBoxImpl::GetLineCount(void) const
237 return __pEdit->GetTextLineCount();
241 _TextBoxImpl::GetText(void) const
243 return __pEdit->GetText();
247 _TextBoxImpl::GetText(int start, int end) const
249 return __pEdit->GetText(start, end);
253 _TextBoxImpl::GetTextLength(void) const
255 return __pEdit->GetTextLength();
259 _TextBoxImpl::InsertCharacterAt(int index, const Character& character)
261 result r = __pEdit->InsertCharacterAt(index, character);
263 if (r == E_INVALID_ARG)
272 _TextBoxImpl::InsertTextAt(int index, const String& text)
274 result r = __pEdit->InsertTextAt(index, text);
276 if (r == E_INVALID_ARG)
285 _TextBoxImpl::SetText(const String& text)
287 return __pEdit->SetText(text);
291 _TextBoxImpl::GetLineSpacing(void) const
293 return _CoordinateSystemUtils::ConvertToInteger(GetLineSpacingF());
297 _TextBoxImpl::GetLineSpacingF(void) const
299 return __pEdit->GetLineSpacingF();
303 _TextBoxImpl::SetLineSpacing(int multiplier, int extra)
305 return SetLineSpacing(multiplier, _CoordinateSystemUtils::ConvertToFloat(extra));
309 _TextBoxImpl::SetLineSpacing(int multiplier, float extra)
311 SysTryReturn(NID_UI_CTRL, multiplier >= 0, E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The invalid argument is given.");
312 SysTryReturn(NID_UI_CTRL, extra >= 0.0f, E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The invalid argument is given.");
314 return __pEdit->SetLineSpacing(DEFAULT_LINE_SPACE * multiplier + extra);
318 _TextBoxImpl::GetTextAlignment(void) const
320 return __pEdit->GetTextAlignment();
324 _TextBoxImpl::SetTextAlignment(HorizontalAlignment alignment)
326 return __pEdit->SetTextAlignment(alignment);
330 _TextBoxImpl::GetTextSize(void) const
332 return _CoordinateSystemUtils::ConvertToInteger(GetTextSizeF());
336 _TextBoxImpl::GetTextSizeF(void) const
338 return __pEdit->GetTextSizeF();
342 _TextBoxImpl::SetTextSize(int size)
344 return __pEdit->SetTextSize(_CoordinateSystemUtils::ConvertToFloat(size));
348 _TextBoxImpl::SetTextSize(float size)
350 return __pEdit->SetTextSize(size);
354 _TextBoxImpl::GetTextTotalHeight(void) const
356 return _CoordinateSystemUtils::ConvertToInteger(GetTextTotalHeightF());
360 _TextBoxImpl::GetTextTotalHeightF(void) const
362 return __pEdit->GetTextTotalHeightF();
366 _TextBoxImpl::GetFontType(String& typefaceName, unsigned long& styleMask) const
368 __pEdit->GetFontType(typefaceName, styleMask);
374 _TextBoxImpl::GetTextStyle(void) const
376 return __pEdit->GetTextStyle();
380 _TextBoxImpl::SetFontType(const String& typefaceName, unsigned long styleMask)
382 return __pEdit->SetFontType(typefaceName, styleMask);
386 _TextBoxImpl::SetTextStyle(unsigned long style)
388 return __pEdit->SetTextStyle(style);
392 _TextBoxImpl::SetFont(const Font& font)
394 return __pEdit->SetFont(font);
398 _TextBoxImpl::ReleaseBlock(void)
400 return __pEdit->ReleaseTextBlock();
404 _TextBoxImpl::GetBlockRange(int& start, int& end) const
406 __pEdit->GetBlockRange(start, end);
412 _TextBoxImpl::SetBlockRange(int start, int end)
414 SysTryReturnResult(NID_UI_CTRL, (start > -1 && end > -1), E_INVALID_ARG, "[E_INVALID_ARG] The invalid argument is given.\n");
415 SysTryReturnResult(NID_UI_CTRL, (end > start), E_INVALID_ARG, "[E_INVALID_ARG] The invalid argument is given.\n");
417 int tempTextLength = 0;
418 tempTextLength = __pEdit->GetTextLength();
419 SysTryReturnResult(NID_UI_CTRL, (tempTextLength > start && tempTextLength > end), E_INVALID_ARG,
420 "[E_INVALID_ARG] The invalid argument is given.\n");
422 return __pEdit->SetBlockRange(start, end);
426 _TextBoxImpl::AddTextBlockEventListener(ITextBlockEventListener& listener)
428 if (__pPublicTextBlockEvent == null)
430 __pPublicTextBlockEvent = _PublicTextBlockEvent::CreateInstanceN(GetPublic());
432 if (IsFailed(GetLastResult()))
434 SysLogException(NID_UI_CTRL, E_SYSTEM, "[E_SYSTEM] System error occurred.");
435 delete __pPublicTextBlockEvent;
440 __pPublicTextBlockEvent->AddListener(listener);
441 __pEdit->AddTextBlockEventListener(*this);
447 _TextBoxImpl::RemoveTextBlockEventListener(ITextBlockEventListener& listener)
449 SysTryReturn(NID_UI_CTRL, __pPublicTextBlockEvent, E_SYSTEM, E_SYSTEM,
450 "[E_SYSTEM] This instance isn't constructed.")
452 __pPublicTextBlockEvent->RemoveListener(listener);
453 __pEdit->RemoveTextBlockEventListener(*this);
459 _TextBoxImpl::GetColor(TextBoxStatus status) const
461 return __pEdit->GetColor(ConvertStatus(status));
465 _TextBoxImpl::GetTextColor(TextBoxTextColor type) const
467 if (type == TEXT_BOX_TEXT_COLOR_BLOCKED)
469 return __pEdit->GetBlockTextColor();
473 return __pEdit->GetTextColor(ConvertTextColorType(type));
478 _TextBoxImpl::SetColor(TextBoxStatus status, const Color& color)
480 if (status == TEXT_BOX_STATUS_HIGHLIGHTED)
482 __pEdit->SetColor(EDIT_STATUS_PRESSED, color);
485 return __pEdit->SetColor(ConvertStatus(status), color);
489 _TextBoxImpl::SetTextColor(TextBoxTextColor type, const Color& color)
491 if (type == TEXT_BOX_TEXT_COLOR_BLOCKED)
493 return __pEdit->SetBlockTextColor(color);
497 return __pEdit->SetTextColor(ConvertTextColorType(type), color);
502 _TextBoxImpl::SetBackgroundBitmap(TextBoxStatus status, const Bitmap& bitmap)
504 if (status == TEXT_BOX_STATUS_HIGHLIGHTED)
506 __pEdit->SetBackgroundBitmap(EDIT_STATUS_PRESSED, bitmap);
509 return __pEdit->SetBackgroundBitmap(ConvertStatus(status), bitmap);
513 _TextBoxImpl::ConvertTextColorType(TextBoxTextColor type) const
515 EditTextColor editTextColorType = EDIT_TEXT_COLOR_NORMAL;
519 case TEXT_BOX_TEXT_COLOR_NORMAL:
520 editTextColorType = EDIT_TEXT_COLOR_NORMAL;
523 case TEXT_BOX_TEXT_COLOR_HIGHLIGHTED:
524 editTextColorType = EDIT_TEXT_COLOR_HIGHLIGHTED;
527 case TEXT_BOX_TEXT_COLOR_DISABLED:
528 editTextColorType = EDIT_TEXT_COLOR_DISABLED;
531 case TEXT_BOX_TEXT_COLOR_LINK:
532 editTextColorType = EDIT_TEXT_COLOR_LINK;
535 case TEXT_BOX_TEXT_COLOR_BLOCKED:
537 editTextColorType = EDIT_TEXT_COLOR_NORMAL;
541 return editTextColorType;
545 _TextBoxImpl::ConvertStatus(TextBoxStatus status) const
547 EditStatus editStatus = EDIT_STATUS_NORMAL;
551 case TEXT_BOX_STATUS_NORMAL:
552 editStatus = EDIT_STATUS_NORMAL;
555 case TEXT_BOX_STATUS_HIGHLIGHTED:
556 editStatus = EDIT_STATUS_HIGHLIGHTED;
559 case TEXT_BOX_STATUS_DISABLED:
560 editStatus = EDIT_STATUS_DISABLED;
564 editStatus = EDIT_STATUS_NORMAL;
572 _TextBoxImpl::OnBoundsChanged(const Rectangle& oldRect, const Rectangle& newRect)
578 _TextBoxImpl::OnBoundsChanged(const FloatRectangle& oldRect, const FloatRectangle& newRect)
584 _TextBoxImpl::OnLinkClicked(_Control& source, const String& text, LinkType linkType,
587 if (__pPublicLinkEvent != null)
589 IEventArg* pLinkEventArg = _PublicLinkEvent::CreateLinkEventArgN(text, linkType, link);
590 SysTryReturnVoidResult(NID_UI_CTRL, pLinkEventArg, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Unable to create _LinkEventArg.");
592 __pPublicLinkEvent->Fire(*pLinkEventArg);
597 _TextBoxImpl::OnTextBlockSelected(_Control& source, int start, int end)
599 if (__pPublicTextBlockEvent != null)
601 IEventArg* pTextBlockEventArg = _PublicTextBlockEvent::CreateTextBlockEventArgN(start, end);
602 SysTryReturnVoidResult(NID_UI_CTRL, pTextBlockEventArg, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Unable to create _TextBlockEventArg.");
604 __pPublicTextBlockEvent->Fire(*pTextBlockEventArg);
609 _TextBoxImpl::GetContentSizeF(bool horizontalMode, bool verticalMode) const
611 return __pEdit->GetContentSizeInternalF(horizontalMode, verticalMode);
615 _TextBoxImpl::GetInstance(TextBox& textBox)
617 return static_cast<_TextBoxImpl*> (textBox._pControlImpl);
621 _TextBoxImpl::GetInstance(const TextBox& textBox)
623 return static_cast<const _TextBoxImpl*> (textBox._pControlImpl);
627 : public _UiBuilderControlMaker
630 _TextBoxMaker(_UiBuilder* uibuilder)
631 : _UiBuilderControlMaker(uibuilder){};
632 virtual ~_TextBoxMaker(){};
633 static _UiBuilderControlMaker* GetInstance(_UiBuilder* uibuilder)
635 _TextBoxMaker* pTextBoxMaker = new (std::nothrow) _TextBoxMaker(uibuilder);
636 return pTextBoxMaker;
640 virtual Control* Make(_UiBuilderControl* pControl)
642 result r = E_SUCCESS;
646 TextBox* pTextBox = null;
647 _UiBuilderControlLayout* pControlProperty = null;
648 HorizontalAlignment textAlignment = ALIGNMENT_LEFT;
649 TextBoxBorder textboxBorder = TEXT_BOX_BORDER_ROUNDED;
653 float textSize = 0.0f;
654 float lineSpacingExtra = 0.0f;
655 int lineSpacingMultiplier = 1;
656 String elementString;
658 GetProperty(pControl, &pControlProperty);
659 if (pControlProperty == null)
664 pTextBox = new (std::nothrow) TextBox();
665 if (pTextBox == null)
670 rect = pControlProperty->GetRectF();
671 if (pControl->GetElement("textboxBorder", elementString))
673 if (elementString.Equals(L"TEXT_BOX_BORDER_NONE", false))
675 textboxBorder = TEXT_BOX_BORDER_NONE;
677 else if (elementString.Equals(L"TEXT_BOX_BORDER_ROUNDED", false))
679 textboxBorder = TEXT_BOX_BORDER_ROUNDED;
681 else if (elementString.Equals(L"TEXT_BOX_BORDER_LINE", false))
683 textboxBorder = TEXT_BOX_BORDER_ROUNDED;
687 r = pTextBox->Construct(rect, textboxBorder);
693 if (pControl->GetElement("textAlignment", elementString))
695 if (elementString.Equals(L"ALIGNMENT_LEFT", false))
697 textAlignment = ALIGNMENT_LEFT;
699 else if (elementString.Equals(L"ALIGNMENT_RIGHT", false))
701 textAlignment = ALIGNMENT_RIGHT;
703 else if (elementString.Equals(L"ALIGNMENT_CENTER", false))
705 textAlignment = ALIGNMENT_CENTER;
708 r = pTextBox->SetTextAlignment(textAlignment);
711 if (pControl->GetElement("textSize", elementString))
713 textSize = _LocalizedNumParser::ToDouble(elementString, "C");
714 _ICoordinateSystemTransformer* pTransform = GetTransformer();
717 textSize = pTransform->Transform(textSize);
719 r = pTextBox->SetTextSize(textSize);
722 if (pControl->GetElement("lineSpacingExtra", elementString))
724 lineSpacingExtra =_LocalizedNumParser::ToDouble(elementString, "C");
725 if (pControl->GetElement("lineSpacingMultiplier", elementString))
727 Base::Integer::Parse(elementString, lineSpacingMultiplier);
728 r = pTextBox->SetLineSpacing(lineSpacingMultiplier, lineSpacingExtra);
732 if (pControl->GetElement("text", elementString))
734 r = pTextBox->SetText(elementString);
737 if (pControl->GetElement("disabledBackgroundBitmapPath", elementString))
739 Bitmap* pBackGroundBitmap = null;
740 pBackGroundBitmap = LoadBitmapN(elementString);
741 if (pBackGroundBitmap != null)
743 pTextBox->SetBackgroundBitmap(TEXT_BOX_STATUS_DISABLED, *pBackGroundBitmap);
744 delete pBackGroundBitmap;
748 if (pControl->GetElement("highlightedBackgroundBitmapPath", elementString))
750 Bitmap* pBackGroundBitmap = null;
751 pBackGroundBitmap = LoadBitmapN(elementString);
752 if (pBackGroundBitmap != null)
754 pTextBox->SetBackgroundBitmap(TEXT_BOX_STATUS_HIGHLIGHTED, *pBackGroundBitmap);
755 delete pBackGroundBitmap;
759 if (pControl->GetElement("normalBackgroundBitmapPath", elementString))
761 Bitmap* pBackGroundBitmap = null;
762 pBackGroundBitmap = LoadBitmapN(elementString);
763 if (pBackGroundBitmap != null)
765 pTextBox->SetBackgroundBitmap(TEXT_BOX_STATUS_NORMAL, *pBackGroundBitmap);
766 delete pBackGroundBitmap;
770 if (pControl->GetElement("disabledTextColor", elementString))
772 ConvertStringToColor32(elementString, opacity, color);
773 pTextBox->SetTextColor(TEXT_BOX_TEXT_COLOR_DISABLED, color);
776 if (pControl->GetElement("highlightedTextColor", elementString))
778 ConvertStringToColor32(elementString, opacity, color);
779 pTextBox->SetTextColor(TEXT_BOX_TEXT_COLOR_HIGHLIGHTED, color);
782 if (pControl->GetElement("normalTextColor", elementString))
784 ConvertStringToColor32(elementString, opacity, color);
785 pTextBox->SetTextColor(TEXT_BOX_TEXT_COLOR_NORMAL, color);
788 if (pControl->GetElement("disabledColorOpacity", elementString))
790 Base::Integer::Parse(elementString, opacity);
792 if (pControl->GetElement("disabledColor", elementString))
794 ConvertStringToColor32(elementString, opacity, color);
795 pTextBox->SetColor(TEXT_BOX_STATUS_DISABLED, color);
798 if (pControl->GetElement("highlightedColorOpacity", elementString))
800 Base::Integer::Parse(elementString, opacity);
802 if (pControl->GetElement("highlightedColor", elementString))
804 ConvertStringToColor32(elementString, opacity, color);
805 pTextBox->SetColor(TEXT_BOX_STATUS_HIGHLIGHTED, color);
808 if (pControl->GetElement("normalColorOpacity", elementString))
810 Base::Integer::Parse(elementString, opacity);
812 if (pControl->GetElement("normalColor", elementString))
814 ConvertStringToColor32(elementString, opacity, color);
815 pTextBox->SetColor(TEXT_BOX_STATUS_NORMAL, color);
818 if (pControl->GetElement(L"accessibilityHint", elementString))
820 AccessibilityContainer* pContainer = pTextBox->GetAccessibilityContainer();
823 AccessibilityElement* pElement = pContainer->GetElement(L"EditText");
826 pElement->SetHint(elementString);
835 _TextBoxRegister::_TextBoxRegister()
837 _UiBuilderControlTableManager* pUiBuilderControlTableManager = _UiBuilderControlTableManager::GetInstance();
838 pUiBuilderControlTableManager->RegisterControl(L"TextBox", _TextBoxMaker::GetInstance);
840 _TextBoxRegister::~_TextBoxRegister()
842 _UiBuilderControlTableManager* pUiBuilderControlTableManager = _UiBuilderControlTableManager::GetInstance();
843 pUiBuilderControlTableManager->UnregisterControl(L"TextBox");
845 static _TextBoxRegister TextBoxRegisterToUiBuilder;
846 }}} // Tizen::Ui::Controls