2 // Open Service Platform
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
5 // Licensed under the Flora License, Version 1.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://floralicense.org/license/
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 "FUi_UiBuilder.h"
26 #include "FUiCtrl_TextBoxImpl.h"
27 #include "FUiCtrl_PublicTextBlockEvent.h"
28 #include "FUiCtrl_PublicLinkEvent.h"
30 using namespace Tizen::Base;
31 using namespace Tizen::Base::Runtime;
32 using namespace Tizen::Base::Utility;
33 using namespace Tizen::Graphics;
34 using namespace Tizen::Ui;
36 namespace Tizen { namespace Ui { namespace Controls
39 const int TEXTBOX_LENGTH_MAX = 2048;
41 _TextBoxImpl::_TextBoxImpl(TextBox* pPublic, _Edit* pCore)
42 : _ControlImpl(pPublic, pCore)
44 , __pPublicTextBlockEvent(null)
45 , __pPublicLinkEvent(null)
46 , __autoLinkMask(LINK_TYPE_NONE)
50 _TextBoxImpl::~_TextBoxImpl(void)
52 if (__pPublicTextBlockEvent)
54 delete __pPublicTextBlockEvent;
55 __pPublicTextBlockEvent = null;
58 if (__pPublicLinkEvent)
60 delete __pPublicLinkEvent;
61 __pPublicLinkEvent = null;
66 _TextBoxImpl::CreateTextBoxImplN(TextBox* pPublic)
71 _Edit* pCore = _Edit::CreateEditN();
72 SysTryReturn(NID_UI_CTRL, pCore, null, GetLastResult(), "[%s] Propagating.", GetErrorMessage(r));
74 _TextBoxImpl* pImpl = new (std::nothrow) _TextBoxImpl(pPublic, pCore);
76 r = _ControlImpl::CheckConstruction(pCore, pImpl);
77 SysTryReturn(NID_UI_CTRL, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
80 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
91 _TextBoxImpl::GetPublicClassName(void) const
93 return "Tizen::Ui::Controls::TextBox";
97 _TextBoxImpl::GetPublic(void) const
99 return static_cast <const TextBox&>(_ControlImpl::GetPublic());
103 _TextBoxImpl::GetPublic(void)
105 return static_cast <TextBox&>(_ControlImpl::GetPublic());
109 _TextBoxImpl::GetCore(void) const
111 return static_cast <const _Edit&>(_ControlImpl::GetCore());
115 _TextBoxImpl::GetCore(void)
117 return static_cast <_Edit&>(_ControlImpl::GetCore());
121 _TextBoxImpl::Initialize(TextBoxBorder border)
123 result r = E_SUCCESS;
125 r = __pEdit->Initialize(EDIT_STYLE_VIEWER, INPUT_STYLE_OVERLAY, TEXTBOX_LENGTH_MAX);
127 if (border == TEXT_BOX_BORDER_ROUNDED)
129 __pEdit->SetBorderRoundStyleEnabled(true);
133 __pEdit->SetBorderRoundStyleEnabled(false);
141 __pEdit->SetAutoLinkMask(LINK_TYPE_URL | LINK_TYPE_EMAIL | LINK_TYPE_TEL_NUM);
151 _TextBoxImpl::Dispose(void)
153 result r = E_SUCCESS;
165 _TextBoxImpl::SetAutoLinkMask(unsigned long autoLinks)
167 __autoLinkMask = autoLinks;
169 return __pEdit->SetAutoLinkMask(autoLinks);
173 _TextBoxImpl::GetAutoLinkMask(void) const
175 return __autoLinkMask;
179 _TextBoxImpl::AddUiLinkEventListener(IUiLinkEventListener& listener)
181 if (__pPublicLinkEvent == null)
183 __pPublicLinkEvent = _PublicLinkEvent::CreateInstanceN(GetPublic());
185 if (IsFailed(GetLastResult()))
187 SysLogException(NID_UI_CTRL, E_SYSTEM, "[E_SYSTEM] System error occurred.");
188 delete __pPublicLinkEvent;
193 __pPublicLinkEvent->AddListener(listener);
194 __pEdit->AddUiLinkEventListener(*this);
200 _TextBoxImpl::RemoveUiLinkEventListener(IUiLinkEventListener& listener)
202 SysTryReturn(NID_UI_CTRL, __pPublicLinkEvent, E_SYSTEM, E_SYSTEM,
203 "[E_SYSTEM] This instance isn't constructed.")
205 __pPublicLinkEvent->RemoveListener(listener);
206 __pEdit->RemoveUiLinkEventListener(*this);
212 _TextBoxImpl::AppendCharacter(const Character& character)
214 return __pEdit->AppendCharacter(character);
218 _TextBoxImpl::AppendText(const String& text)
220 return __pEdit->AppendText(text);
224 _TextBoxImpl::Clear(void)
226 return __pEdit->ClearText();
230 _TextBoxImpl::GetLineCount(void) const
232 return __pEdit->GetTextLineCount();
236 _TextBoxImpl::GetText(void) const
238 return __pEdit->GetText();
242 _TextBoxImpl::GetText(int start, int end) const
244 return __pEdit->GetText(start, end);
248 _TextBoxImpl::GetTextLength(void) const
250 return __pEdit->GetTextLength();
254 _TextBoxImpl::InsertCharacterAt(int index, const Character& character)
256 result r = __pEdit->InsertCharacterAt(index, character);
258 if (r == E_INVALID_ARG)
267 _TextBoxImpl::InsertTextAt(int index, const String& text)
269 result r = __pEdit->InsertTextAt(index, text);
271 if (r == E_INVALID_ARG)
280 _TextBoxImpl::SetText(const String& text)
282 return __pEdit->SetText(text);
286 _TextBoxImpl::GetLineSpacing(void) const
288 return __pEdit->GetLineSpacing();
292 _TextBoxImpl::SetLineSpacing(int multiplier, int extra)
294 SysTryReturn(NID_UI_CTRL, multiplier >= 0, E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The invalid argument is given.");
295 SysTryReturn(NID_UI_CTRL, extra >= 0, E_INVALID_ARG, E_INVALID_ARG, "[E_INVALID_ARG] The invalid argument is given.");
297 return __pEdit->SetLineSpacing(DEFAULT_LINE_SPACE * multiplier + extra);
301 _TextBoxImpl::GetTextAlignment(void) const
303 return __pEdit->GetTextAlignment();
307 _TextBoxImpl::SetTextAlignment(HorizontalAlignment alignment)
309 return __pEdit->SetTextAlignment(alignment);
313 _TextBoxImpl::GetTextSize(void) const
315 return __pEdit->GetTextSize();
319 _TextBoxImpl::SetTextSize(int size)
321 return __pEdit->SetTextSize(size);
325 _TextBoxImpl::GetTextTotalHeight(void) const
327 return __pEdit->GetTextTotalHeight();
331 _TextBoxImpl::GetFontType(String& typefaceName, unsigned long& styleMask) const
333 __pEdit->GetFontType(typefaceName, styleMask);
339 _TextBoxImpl::GetTextStyle(void) const
341 return __pEdit->GetTextStyle();
345 _TextBoxImpl::SetFontType(const String& typefaceName, unsigned long styleMask)
347 return __pEdit->SetFontType(typefaceName, styleMask);
351 _TextBoxImpl::SetTextStyle(unsigned long style)
353 return __pEdit->SetTextStyle(style);
357 _TextBoxImpl::SetFont(const Font& font)
359 return __pEdit->SetFont(font);
363 _TextBoxImpl::ReleaseBlock(void)
365 return __pEdit->ReleaseTextBlock();
369 _TextBoxImpl::GetBlockRange(int& start, int& end) const
371 __pEdit->GetBlockRange(start, end);
377 _TextBoxImpl::SetBlockRange(int start, int end)
379 SysTryReturnResult(NID_UI_CTRL, (start > -1 && end > -1), E_INVALID_ARG, "[E_INVALID_ARG] The invalid argument is given.\n");
380 SysTryReturnResult(NID_UI_CTRL, (end > start), E_INVALID_ARG, "[E_INVALID_ARG] The invalid argument is given.\n");
382 int tempTextLength = 0;
383 tempTextLength = __pEdit->GetTextLength();
384 SysTryReturnResult(NID_UI_CTRL, (tempTextLength > start && tempTextLength > end), E_INVALID_ARG,
385 "[E_INVALID_ARG] The invalid argument is given.\n");
387 return __pEdit->SetBlockRange(start, end);
391 _TextBoxImpl::AddTextBlockEventListener(ITextBlockEventListener& listener)
393 if (__pPublicTextBlockEvent == null)
395 __pPublicTextBlockEvent = _PublicTextBlockEvent::CreateInstanceN(GetPublic());
397 if (IsFailed(GetLastResult()))
399 SysLogException(NID_UI_CTRL, E_SYSTEM, "[E_SYSTEM] System error occurred.");
400 delete __pPublicTextBlockEvent;
405 __pPublicTextBlockEvent->AddListener(listener);
406 __pEdit->AddTextBlockEventListener(*this);
412 _TextBoxImpl::RemoveTextBlockEventListener(ITextBlockEventListener& listener)
414 SysTryReturn(NID_UI_CTRL, __pPublicTextBlockEvent, E_SYSTEM, E_SYSTEM,
415 "[E_SYSTEM] This instance isn't constructed.")
417 __pPublicTextBlockEvent->RemoveListener(listener);
418 __pEdit->RemoveTextBlockEventListener(*this);
424 _TextBoxImpl::GetColor(TextBoxStatus status) const
426 return __pEdit->GetColor(ConvertStatus(status));
430 _TextBoxImpl::GetTextColor(TextBoxTextColor type) const
432 if (type == TEXT_BOX_TEXT_COLOR_BLOCKED)
434 return __pEdit->GetBlockTextColor();
438 return __pEdit->GetTextColor(ConvertTextColorType(type));
443 _TextBoxImpl::SetColor(TextBoxStatus status, const Color& color)
445 if (status == TEXT_BOX_STATUS_HIGHLIGHTED)
447 __pEdit->SetColor(EDIT_STATUS_PRESSED, color);
450 return __pEdit->SetColor(ConvertStatus(status), color);
454 _TextBoxImpl::SetTextColor(TextBoxTextColor type, const Color& color)
456 if (type == TEXT_BOX_TEXT_COLOR_BLOCKED)
458 return __pEdit->SetBlockTextColor(color);
462 return __pEdit->SetTextColor(ConvertTextColorType(type), color);
467 _TextBoxImpl::SetBackgroundBitmap(TextBoxStatus status, const Bitmap& bitmap)
469 if (status == TEXT_BOX_STATUS_HIGHLIGHTED)
471 __pEdit->SetBackgroundBitmap(EDIT_STATUS_PRESSED, bitmap);
474 return __pEdit->SetBackgroundBitmap(ConvertStatus(status), bitmap);
478 _TextBoxImpl::ConvertTextColorType(TextBoxTextColor type) const
480 EditTextColor editTextColorType = EDIT_TEXT_COLOR_NORMAL;
484 case TEXT_BOX_TEXT_COLOR_NORMAL:
485 editTextColorType = EDIT_TEXT_COLOR_NORMAL;
488 case TEXT_BOX_TEXT_COLOR_HIGHLIGHTED:
489 editTextColorType = EDIT_TEXT_COLOR_HIGHLIGHTED;
492 case TEXT_BOX_TEXT_COLOR_DISABLED:
493 editTextColorType = EDIT_TEXT_COLOR_DISABLED;
496 case TEXT_BOX_TEXT_COLOR_LINK:
497 editTextColorType = EDIT_TEXT_COLOR_LINK;
500 case TEXT_BOX_TEXT_COLOR_BLOCKED:
502 editTextColorType = EDIT_TEXT_COLOR_NORMAL;
506 return editTextColorType;
510 _TextBoxImpl::ConvertStatus(TextBoxStatus status) const
512 EditStatus editStatus = EDIT_STATUS_NORMAL;
516 case TEXT_BOX_STATUS_NORMAL:
517 editStatus = EDIT_STATUS_NORMAL;
520 case TEXT_BOX_STATUS_HIGHLIGHTED:
521 editStatus = EDIT_STATUS_HIGHLIGHTED;
524 case TEXT_BOX_STATUS_DISABLED:
525 editStatus = EDIT_STATUS_DISABLED;
529 editStatus = EDIT_STATUS_NORMAL;
537 _TextBoxImpl::OnBoundsChanged(const Rectangle& oldRect, const Rectangle& newRect)
543 _TextBoxImpl::OnLinkClicked(_Control& source, const String& text, LinkType linkType,
546 if (__pPublicLinkEvent != null)
548 IEventArg* pLinkEventArg = _PublicLinkEvent::CreateLinkEventArgN(text, linkType, link);
549 SysTryReturnVoidResult(NID_UI_CTRL, pLinkEventArg, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Unable to create _LinkEventArg.");
551 __pPublicLinkEvent->Fire(*pLinkEventArg);
556 _TextBoxImpl::OnTextBlockSelected(_Control& source, int start, int end)
558 if (__pPublicTextBlockEvent != null)
560 IEventArg* pTextBlockEventArg = _PublicTextBlockEvent::CreateTextBlockEventArgN(start, end);
561 SysTryReturnVoidResult(NID_UI_CTRL, pTextBlockEventArg, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Unable to create _TextBlockEventArg.");
563 __pPublicTextBlockEvent->Fire(*pTextBlockEventArg);
568 _TextBoxImpl::GetContentSize(void) const
570 return __pEdit->GetContentSizeInternal();
575 _TextBoxImpl::GetInstance(TextBox& textBox)
577 return static_cast<_TextBoxImpl*> (textBox._pControlImpl);
581 _TextBoxImpl::GetInstance(const TextBox& textBox)
583 return static_cast<const _TextBoxImpl*> (textBox._pControlImpl);
587 : public _UiBuilderControlMaker
590 _TextBoxMaker(_UiBuilder* uibuilder)
591 : _UiBuilderControlMaker(uibuilder){};
592 virtual ~_TextBoxMaker(){};
593 static _UiBuilderControlMaker* GetInstance(_UiBuilder* uibuilder)
595 _TextBoxMaker* pTextBoxMaker = new (std::nothrow) _TextBoxMaker(uibuilder);
596 return pTextBoxMaker;
600 virtual Control* Make(_UiBuilderControl* pControl)
602 result r = E_SUCCESS;
606 TextBox* pTextBox = null;
607 _UiBuilderControlLayout* pControlProperty = null;
608 HorizontalAlignment textAlignment = ALIGNMENT_LEFT;
609 TextBoxBorder textboxBorder = TEXT_BOX_BORDER_ROUNDED;
614 int lineSpacingExtra = 0;
615 int lineSpacingMultiplier = 1;
616 String elementString;
618 GetProperty(pControl, &pControlProperty);
619 if (pControlProperty == null)
624 pTextBox = new (std::nothrow) TextBox();
625 if (pTextBox == null)
630 rect = pControlProperty->GetRect();
631 if (pControl->GetElement("textboxBorder", elementString))
633 if (elementString.Equals(L"TEXT_BOX_BORDER_NONE", false))
635 textboxBorder = TEXT_BOX_BORDER_NONE;
637 else if (elementString.Equals(L"TEXT_BOX_BORDER_ROUNDED", false))
639 textboxBorder = TEXT_BOX_BORDER_ROUNDED;
641 else if (elementString.Equals(L"TEXT_BOX_BORDER_LINE", false))
643 textboxBorder = TEXT_BOX_BORDER_ROUNDED;
647 r = pTextBox->Construct(rect, textboxBorder);
653 if (pControl->GetElement("textAlignment", elementString))
655 if (elementString.Equals(L"ALIGNMENT_LEFT", false))
657 textAlignment = ALIGNMENT_LEFT;
659 else if (elementString.Equals(L"ALIGNMENT_RIGHT", false))
661 textAlignment = ALIGNMENT_RIGHT;
663 else if (elementString.Equals(L"ALIGNMENT_CENTER", false))
665 textAlignment = ALIGNMENT_CENTER;
668 r = pTextBox->SetTextAlignment(textAlignment);
671 if (pControl->GetElement("textSize", elementString))
673 Base::Integer::Parse(elementString, textSize);
674 _ICoordinateSystemTransformer* pTransform = GetTransformer();
677 textSize = pTransform->Transform(textSize);
679 r = pTextBox->SetTextSize(textSize);
682 if (pControl->GetElement("lineSpacingExtra", elementString))
684 Base::Integer::Parse(elementString, lineSpacingExtra);
686 if (pControl->GetElement("lineSpacingMultiplier", elementString))
688 Base::Integer::Parse(elementString, lineSpacingMultiplier);
689 r = pTextBox->SetLineSpacing(lineSpacingMultiplier, lineSpacingExtra);
693 if (pControl->GetElement("text", elementString))
695 r = pTextBox->SetText(elementString);
698 if (pControl->GetElement("disabledBackgroundBitmapPath", elementString))
700 Bitmap* pBackGroundBitmap = null;
701 pBackGroundBitmap = LoadBitmapN(elementString);
702 if (pBackGroundBitmap != null)
704 pTextBox->SetBackgroundBitmap(TEXT_BOX_STATUS_DISABLED, *pBackGroundBitmap);
705 delete pBackGroundBitmap;
709 if (pControl->GetElement("highlightedBackgroundBitmapPath", elementString))
711 Bitmap* pBackGroundBitmap = null;
712 pBackGroundBitmap = LoadBitmapN(elementString);
713 if (pBackGroundBitmap != null)
715 pTextBox->SetBackgroundBitmap(TEXT_BOX_STATUS_HIGHLIGHTED, *pBackGroundBitmap);
716 delete pBackGroundBitmap;
720 if (pControl->GetElement("normalBackgroundBitmapPath", elementString))
722 Bitmap* pBackGroundBitmap = null;
723 pBackGroundBitmap = LoadBitmapN(elementString);
724 if (pBackGroundBitmap != null)
726 pTextBox->SetBackgroundBitmap(TEXT_BOX_STATUS_NORMAL, *pBackGroundBitmap);
727 delete pBackGroundBitmap;
731 if (pControl->GetElement("disabledTextColor", elementString))
733 ConvertStringToColor32(elementString, opacity, color);
734 pTextBox->SetTextColor(TEXT_BOX_TEXT_COLOR_DISABLED, color);
737 if (pControl->GetElement("highlightedTextColor", elementString))
739 ConvertStringToColor32(elementString, opacity, color);
740 pTextBox->SetTextColor(TEXT_BOX_TEXT_COLOR_HIGHLIGHTED, color);
743 if (pControl->GetElement("normalTextColor", elementString))
745 ConvertStringToColor32(elementString, opacity, color);
746 pTextBox->SetTextColor(TEXT_BOX_TEXT_COLOR_NORMAL, color);
749 if (pControl->GetElement("disabledColorOpacity", elementString))
751 Base::Integer::Parse(elementString, opacity);
753 if (pControl->GetElement("disabledColor", elementString))
755 ConvertStringToColor32(elementString, opacity, color);
756 pTextBox->SetColor(TEXT_BOX_STATUS_DISABLED, color);
759 if (pControl->GetElement("highlightedColorOpacity", elementString))
761 Base::Integer::Parse(elementString, opacity);
763 if (pControl->GetElement("highlightedColor", elementString))
765 ConvertStringToColor32(elementString, opacity, color);
766 pTextBox->SetColor(TEXT_BOX_STATUS_HIGHLIGHTED, color);
769 if (pControl->GetElement("normalColorOpacity", elementString))
771 Base::Integer::Parse(elementString, opacity);
773 if (pControl->GetElement("normalColor", elementString))
775 ConvertStringToColor32(elementString, opacity, color);
776 pTextBox->SetColor(TEXT_BOX_STATUS_NORMAL, color);
783 _TextBoxRegister::_TextBoxRegister()
785 _UiBuilderControlTableManager* pUiBuilderControlTableManager = _UiBuilderControlTableManager::GetInstance();
786 pUiBuilderControlTableManager->RegisterControl(L"TextBox", _TextBoxMaker::GetInstance);
788 _TextBoxRegister::~_TextBoxRegister()
790 _UiBuilderControlTableManager* pUiBuilderControlTableManager = _UiBuilderControlTableManager::GetInstance();
791 pUiBuilderControlTableManager->UnregisterControl(L"TextBox");
793 static _TextBoxRegister TextBoxRegisterToUiBuilder;
794 }}} // Tizen::Ui::Controls