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.
18 * @file FUiCtrl_ButtonPresenter.cpp
19 * @brief This is the implementation file for the _ButtonPresenter class.
22 #include <FBaseErrorDefine.h>
23 #include <FBaseSysLog.h>
24 #include <FGrp_TextTextSimple.h>
25 #include <FGrp_BitmapImpl.h>
26 #include <FGrp_CanvasImpl.h>
27 #include "FUi_CoordinateSystemUtils.h"
28 #include "FUi_ResourceManager.h"
29 #include "FUi_UiTouchEvent.h"
30 #include "FUiAnim_VisualElement.h"
31 #include "FUiCtrl_ButtonPresenter.h"
32 #include "FUiCtrl_ButtonModel.h"
34 using namespace Tizen::Base;
35 using namespace Tizen::Base::Runtime;
36 using namespace Tizen::Graphics;
37 using namespace Tizen::Graphics::_Text;
38 using namespace Tizen::App;
40 namespace Tizen { namespace Ui { namespace Controls
42 _ButtonPresenter::_ButtonPresenter(void)
44 , __pButtonModel(null)
45 , __previousEnabledState(false)
46 , __touchMoveHandled(false)
48 , __showUnderlineBitmap(false)
54 , __pTextSlideTimer(null)
55 , __textRect(FloatRectangle(0.0f, 0.0f, 0.0f, 0.0f))
56 , __pTabLargeSelectedBitmap(null)
61 _ButtonPresenter::~_ButtonPresenter(void)
65 delete __pButtonModel;
66 __pButtonModel = null;
75 if (__pTextSlideTimer)
77 delete __pTextSlideTimer;
78 __pTextSlideTimer = null;
81 if (__pTabLargeSelectedBitmap)
83 delete __pTabLargeSelectedBitmap;
84 __pTabLargeSelectedBitmap = null;
89 _ButtonPresenter::Construct(const _Button& button)
93 __pButton = const_cast <_Button*>(&button);
94 __fontStyle = FONT_STYLE_PLAIN;
96 GET_SHAPE_CONFIG(BUTTON::DEFAULT_FONT_SIZE, __pButton->GetOrientation(), __fontSize);
98 __pFont = __pButton->GetFallbackFont();
100 SysTryReturn(NID_UI_CTRL, __pFont, r, r, "[%s] Propagating.", GetErrorMessage(r));
102 __pTextObject = new (std::nothrow) TextObject();
103 SysTryCatch(NID_UI_CTRL, __pTextObject != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory is insufficient.");
105 __pTextObject->Construct();
111 delete __pTextObject;
112 __pTextObject = null;
118 _ButtonPresenter::Install(void)
120 result r = E_SUCCESS;
122 __pBase = __pButton->GetVisualElement();
124 _ButtonModel* pModel = new (std::nothrow) _ButtonModel();
125 SysTryReturn(NID_UI_CTRL, pModel, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory is insufficient.");
127 r = SetModel(*pModel);
128 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
130 r = pModel->Construct();
131 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
141 _ButtonPresenter::SetModel(const _ButtonModel& buttonModel)
143 __pButtonModel = const_cast <_ButtonModel*>(&buttonModel);
149 _ButtonPresenter::InitTextObject(void)
151 TextSimple* pSimpleText = null;
153 float leftMargin = __pButton->GetLeftMarginF();
154 float topMargin = __pButton->GetTopMarginF();
155 float rightMargin = __pButton->GetRightMarginF();
156 float bottomMargin = __pButton->GetBottomMarginF();
158 float leftTouchMargin = __pButton->GetLeftTouchMarginF();
159 float topTouchMargin = __pButton->GetTopTouchMarginF();
160 float rightTouchMargin = __pButton->GetRightTouchMarginF();
161 float bottomTouchMargin = __pButton->GetBottomTouchMarginF();
163 __pTextObject->RemoveAll(true);
165 pSimpleText = new (std::nothrow) TextSimple(const_cast<wchar_t*>(__pButton->GetText().GetPointer()), __pButton->GetText().GetLength());
166 SysTryReturn(NID_UI_CTRL, pSimpleText, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory is insufficient.");
168 __pTextObject->AppendElement(*pSimpleText);
169 __pTextObject->SetWrap(TEXT_OBJECT_WRAP_TYPE_WORD);
170 __pTextObject->SetAction(TEXT_OBJECT_ACTION_TYPE_ABBREV);
171 SetTextSize(__pButton->GetTextSizeF());
172 __pTextObject->SetFont(__pFont, 0, __pTextObject->GetTextLength());
173 __pTextObject->SetAlignment(TEXT_OBJECT_ALIGNMENT_CENTER | TEXT_OBJECT_ALIGNMENT_MIDDLE);
174 __pTextObject->SetBounds(FloatRectangle(leftMargin + leftTouchMargin, topMargin + topTouchMargin,
175 __pButton->GetBoundsF().width - (leftMargin + rightMargin) - (leftTouchMargin + rightTouchMargin),
176 __pButton->GetBoundsF().height - (topMargin + bottomMargin) - (topTouchMargin + bottomTouchMargin)));
177 __pTextObject->Compose();
183 _ButtonPresenter::OnFontChanged(Font* pFont)
191 _ButtonPresenter::OnFontInfoRequested(unsigned long& style, int& size)
194 size = _CoordinateSystemUtils::ConvertToInteger(__fontSize);
200 _ButtonPresenter::OnFontInfoRequested(unsigned long& style, float& size)
209 _ButtonPresenter::SetTextSize(int size, unsigned long fontStyle)
211 float floatSize = _CoordinateSystemUtils::ConvertToFloat(size);
213 return SetTextSize(floatSize, fontStyle);
217 _ButtonPresenter::SetTextSize(float size, unsigned long fontStyle)
219 result r = E_SUCCESS;
226 bool isStrikeOut = __pFont->IsStrikeOut();
227 bool isUnderLine = __pFont->IsUnderlined();
229 if (__pFont->IsItalic())
231 fontStyle |= FONT_STYLE_ITALIC;
234 if (__pFont->IsBold())
236 fontStyle |= FONT_STYLE_BOLD;
239 __fontStyle = fontStyle;
242 __pFont = __pButton->GetFallbackFont();
245 SysTryReturnVoidResult(NID_UI_CTRL, __pFont, r, "[%s] Propagating.", GetErrorMessage(r));
247 __pFont->SetStrikeOut(isStrikeOut);
248 __pFont->SetUnderline(isUnderLine);
254 _ButtonPresenter::SetFontInfo(unsigned long style, int size)
256 float floatSize = _CoordinateSystemUtils::ConvertToFloat(size);
258 return SetFontInfo(style, floatSize);
262 _ButtonPresenter::SetFontInfo(unsigned long style, float size)
271 _ButtonPresenter::GetTextObject(void) const
273 return __pTextObject;
277 _ButtonPresenter::GetFont(void) const
283 _ButtonPresenter::Draw(void)
285 _ButtonStatus status = __pButton->GetButtonStatus();
287 Bitmap* pToolbarItemBackgroundBitmap = __pButton->GetToolbarItemBackgroundBitmap(status);
289 if (pToolbarItemBackgroundBitmap)
291 DrawToolbarItemBackground();
298 DrawSubTitleEffectBitmap();
301 if (!__pButton->GetText().IsEmpty())
306 if (__showUnderlineBitmap && __pButton->GetToolbarItemBackgroundBitmap(status) == null && status != _BUTTON_STATUS_PRESSED)
308 DrawUnderlineBitmap();
315 _ButtonPresenter::DrawBackground(void)
317 Canvas* pCanvas = null;
319 Bitmap* pBackgroundBitmap = null;
320 Bitmap* pReplacementColorBackgroundBitmap = null;
321 Bitmap* pBackgroundEffectBitmap = null;
322 Bitmap* pHighlightedBackgroundBitmap = null;
323 Bitmap* pHighlightedReplacementColorBackgroundBitmap = null;
324 Color bgColor = __pButton->GetBackgroundColor();
325 String imagePath = L"";
327 float leftTouchMargin = __pButton->GetLeftTouchMarginF();
328 float topTouchMargin = __pButton->GetTopTouchMarginF();
329 float rightTouchMargin = __pButton->GetRightTouchMarginF();
330 float bottomTouchMargin = __pButton->GetBottomTouchMarginF();
332 FloatRectangle bounds(leftTouchMargin, topTouchMargin, __pButton->GetBoundsF().width - (leftTouchMargin + rightTouchMargin)
333 , __pButton->GetBoundsF().height - (topTouchMargin + bottomTouchMargin));
335 _ButtonStatus status = __pButton->GetButtonStatus();
337 if (__pButton->IsUserBackgroundBitmap(status))
339 if (status == _BUTTON_STATUS_HIGHLIGHTED)
341 pBackgroundBitmap = __pButton->GetBackgroundBitmap(_BUTTON_STATUS_NORMAL);
342 pBackgroundEffectBitmap = __pButton->GetBackgroundEffectBitmap(_BUTTON_STATUS_NORMAL);
344 pHighlightedBackgroundBitmap = __pButton->GetBackgroundBitmap(_BUTTON_STATUS_HIGHLIGHTED);
348 pBackgroundBitmap = __pButton->GetBackgroundBitmap(status);
349 pBackgroundEffectBitmap = __pButton->GetBackgroundEffectBitmap(status);
352 if (pBackgroundBitmap)
354 if (_BitmapImpl::CheckNinePatchedBitmapStrictly(*pBackgroundBitmap) == false)
356 imagePath = _BitmapImpl::GetInstance(*pBackgroundBitmap)->GetFileName();
359 if (imagePath.IsEmpty() == false && __pButton->GetText() == L""
360 && __pButton->GetBitmap(_BUTTON_STATUS_NORMAL) == null && __pButton->GetBitmap(_BUTTON_STATUS_DISABLED) == null
361 && __pButton->GetBitmap(_BUTTON_STATUS_PRESSED) == null && __pButton->GetBitmap(_BUTTON_STATUS_HIGHLIGHTED) == null)
363 __pBase->SetBackgroundColor(_Colorf(
364 (float)bgColor.GetRed() / 255, (float)bgColor.GetGreen() / 255, (float)bgColor.GetBlue() / 255, (float)bgColor.GetAlpha() / 255));
365 __pBase->SetImageSource(imagePath);
371 __pBase->SetImageSource(L"");
373 __lazyDecode = false;
375 pCanvas = __pButton->GetCanvasN();
378 SysLog(NID_UI_CTRL, "Cannot get a canvas.");
381 pCanvas->SetBackgroundColor(Color(0, 0, 0, 0));
384 if (_BitmapImpl::CheckNinePatchedBitmapStrictly(*pBackgroundBitmap))// pBackgroundBitmap is 9
386 if (pBackgroundEffectBitmap)
388 if (_BitmapImpl::CheckNinePatchedBitmapStrictly(*pBackgroundEffectBitmap)) // 9,9
390 pCanvas->DrawNinePatchedBitmap(bounds, *pBackgroundBitmap);
391 if (__pButton->IsUserBackgroundEffectBitmap(status))
393 pCanvas->DrawNinePatchedBitmap(bounds, *pBackgroundEffectBitmap);
398 pCanvas->DrawNinePatchedBitmap(bounds, *pBackgroundBitmap);
399 if (__pButton->IsUserBackgroundEffectBitmap(status))
401 pCanvas->DrawBitmap(bounds, *pBackgroundEffectBitmap, FloatRectangle(0.0f, 0.0f, pBackgroundEffectBitmap->GetWidthF(), pBackgroundEffectBitmap->GetHeightF()));
407 pCanvas->DrawNinePatchedBitmap(bounds, *pBackgroundBitmap);
410 else // pBackgroundBitmap is not 9
412 if (pBackgroundEffectBitmap)
414 if (_BitmapImpl::CheckNinePatchedBitmapStrictly(*pBackgroundEffectBitmap)) // 0, 9
416 pCanvas->DrawBitmap(bounds, *pBackgroundBitmap, FloatRectangle(0.0f, 0.0f, pBackgroundBitmap->GetWidthF(), pBackgroundBitmap->GetHeightF()));
417 if (__pButton->IsUserBackgroundEffectBitmap(status))
419 pCanvas->DrawNinePatchedBitmap(bounds, *pBackgroundEffectBitmap);
424 pCanvas->DrawBitmap(bounds, *pBackgroundBitmap, FloatRectangle(0.0f, 0.0f, pBackgroundBitmap->GetWidthF(), pBackgroundBitmap->GetHeightF()));
425 if (__pButton->IsUserBackgroundEffectBitmap(status))
427 pCanvas->DrawBitmap(bounds, *pBackgroundEffectBitmap, FloatRectangle(0.0f, 0.0f, pBackgroundEffectBitmap->GetWidthF(), pBackgroundEffectBitmap->GetHeightF()));
433 pCanvas->DrawBitmap(bounds, *pBackgroundBitmap, FloatRectangle(0.0f, 0.0f, pBackgroundBitmap->GetWidthF(), pBackgroundBitmap->GetHeightF()));
437 if (pHighlightedBackgroundBitmap)
439 if (_BitmapImpl::CheckNinePatchedBitmapStrictly(*pHighlightedBackgroundBitmap))
441 pCanvas->DrawNinePatchedBitmap(bounds, *pHighlightedBackgroundBitmap);
445 pCanvas->DrawBitmap(bounds, *pHighlightedBackgroundBitmap,
446 FloatRectangle(0.0f, 0.0f, pHighlightedBackgroundBitmap->GetWidthF(), pHighlightedBackgroundBitmap->GetHeightF()));
451 else // pBackgroundBitmap is null
453 pCanvas = __pButton->GetCanvasN();
456 SysLog(NID_UI_CTRL, "Cannot get a canvas.");
459 pCanvas->SetBackgroundColor(Color(0, 0, 0, 0));
462 if (pBackgroundEffectBitmap)
464 if (_BitmapImpl::CheckNinePatchedBitmapStrictly(*pBackgroundEffectBitmap)) // X, 9
466 if (__pButton->IsUserBackgroundEffectBitmap(status))
468 pCanvas->DrawNinePatchedBitmap(bounds, *pBackgroundEffectBitmap);
473 if (__pButton->IsUserBackgroundEffectBitmap(status))
475 pCanvas->DrawBitmap(bounds, *pBackgroundEffectBitmap,
476 FloatRectangle(0.0f, 0.0f, pBackgroundEffectBitmap->GetWidthF(), pBackgroundEffectBitmap->GetHeightF()));
482 pCanvas->FillRectangle(__pButton->GetColor(status), bounds);
486 else // nobody set bitmap (default bitmap draw) // if (__pButton->IsUserBackgroundBitmap(status))
488 __pBase->SetImageSource(L"");
490 __lazyDecode = false;
492 pCanvas = __pButton->GetCanvasN();
495 SysLog(NID_UI_CTRL, "Cannot get a canvas.");
498 pCanvas->SetBackgroundColor(Color(0, 0, 0, 0));
501 if (status == _BUTTON_STATUS_DISABLED)
503 pBackgroundBitmap = __pButton->GetBackgroundBitmap(_BUTTON_STATUS_NORMAL);
505 if(!__pButton->IsUserBackgroundBitmap(_BUTTON_STATUS_NORMAL))
507 pBackgroundEffectBitmap = __pButton->GetBackgroundEffectBitmap(_BUTTON_STATUS_NORMAL);
510 pReplacementColorBackgroundBitmap =
511 _BitmapImpl::GetColorReplacedBitmapN(*pBackgroundBitmap, Color::GetColor(COLOR_ID_MAGENTA), __pButton->GetColor(_BUTTON_STATUS_DISABLED));
513 else if (status == _BUTTON_STATUS_HIGHLIGHTED)
515 pBackgroundBitmap = __pButton->GetBackgroundBitmap(_BUTTON_STATUS_NORMAL);
517 if(!__pButton->IsUserBackgroundBitmap(_BUTTON_STATUS_NORMAL))
519 pBackgroundEffectBitmap = __pButton->GetBackgroundEffectBitmap(_BUTTON_STATUS_NORMAL);
522 pReplacementColorBackgroundBitmap =
523 _BitmapImpl::GetColorReplacedBitmapN(*pBackgroundBitmap, Color::GetColor(COLOR_ID_MAGENTA), __pButton->GetColor(_BUTTON_STATUS_NORMAL));
525 pHighlightedBackgroundBitmap = __pButton->GetBackgroundBitmap(_BUTTON_STATUS_HIGHLIGHTED);
527 pHighlightedReplacementColorBackgroundBitmap = _BitmapImpl::GetColorReplacedBitmapN(*pHighlightedBackgroundBitmap,
528 Color::GetColor(COLOR_ID_MAGENTA), __pButton->GetColor(_BUTTON_STATUS_HIGHLIGHTED));
532 pBackgroundBitmap = __pButton->GetBackgroundBitmap(status);
533 pBackgroundEffectBitmap = __pButton->GetBackgroundEffectBitmap(status);
534 pReplacementColorBackgroundBitmap =
535 _BitmapImpl::GetColorReplacedBitmapN(*pBackgroundBitmap, Color::GetColor(COLOR_ID_MAGENTA), __pButton->GetColor(status));
538 if (pReplacementColorBackgroundBitmap)
540 if (_BitmapImpl::CheckNinePatchedBitmapStrictly(*pReplacementColorBackgroundBitmap))
542 if (pBackgroundEffectBitmap)
544 if (_BitmapImpl::CheckNinePatchedBitmapStrictly(*pBackgroundEffectBitmap))
546 pCanvas->DrawNinePatchedBitmap(bounds, *pReplacementColorBackgroundBitmap);
547 pCanvas->DrawNinePatchedBitmap(bounds, *pBackgroundEffectBitmap);
551 pCanvas->DrawNinePatchedBitmap(bounds, *pReplacementColorBackgroundBitmap);
552 pCanvas->DrawBitmap(bounds, *pBackgroundEffectBitmap,
553 FloatRectangle(0.0f, 0.0f, pBackgroundEffectBitmap->GetWidthF(), pBackgroundEffectBitmap->GetHeightF()));
558 pCanvas->DrawNinePatchedBitmap(bounds, *pReplacementColorBackgroundBitmap);
563 if (pBackgroundEffectBitmap)
565 if (_BitmapImpl::CheckNinePatchedBitmapStrictly(*pBackgroundEffectBitmap))
567 pCanvas->DrawBitmap(bounds, *pReplacementColorBackgroundBitmap,
568 FloatRectangle(0.0f, 0.0f, pReplacementColorBackgroundBitmap->GetWidthF(), pReplacementColorBackgroundBitmap->GetHeightF()));
569 pCanvas->DrawNinePatchedBitmap(bounds, *pBackgroundEffectBitmap);
573 pCanvas->DrawBitmap(bounds, *pReplacementColorBackgroundBitmap,
574 FloatRectangle(0.0f, 0.0f, pReplacementColorBackgroundBitmap->GetWidthF(), pReplacementColorBackgroundBitmap->GetHeightF()));
575 pCanvas->DrawBitmap(bounds, *pBackgroundEffectBitmap,
576 FloatRectangle(0.0f, 0.0f, pBackgroundEffectBitmap->GetWidthF(), pBackgroundEffectBitmap->GetHeightF()));
581 pCanvas->DrawBitmap(bounds, *pReplacementColorBackgroundBitmap,
582 FloatRectangle(0.0f, 0.0f, pReplacementColorBackgroundBitmap->GetWidthF(), pReplacementColorBackgroundBitmap->GetHeightF()));
588 if (pBackgroundEffectBitmap)
590 if (_BitmapImpl::CheckNinePatchedBitmapStrictly(*pBackgroundEffectBitmap))
592 pCanvas->DrawNinePatchedBitmap(bounds, *pBackgroundEffectBitmap);
596 pCanvas->DrawBitmap(bounds, *pBackgroundEffectBitmap,
597 FloatRectangle(0.0f, 0.0f, pBackgroundEffectBitmap->GetWidthF(), pBackgroundEffectBitmap->GetHeightF()));
602 if (status == _BUTTON_STATUS_DISABLED)
604 pCanvas->FillRectangle(__pButton->GetColor(_BUTTON_STATUS_NORMAL), bounds);
608 pCanvas->FillRectangle(__pButton->GetColor(status), bounds);
613 if (pHighlightedReplacementColorBackgroundBitmap)
615 if (_BitmapImpl::CheckNinePatchedBitmapStrictly(*pHighlightedReplacementColorBackgroundBitmap))
617 pCanvas->DrawNinePatchedBitmap(bounds, *pHighlightedReplacementColorBackgroundBitmap);
621 pCanvas->DrawBitmap(bounds, *pHighlightedReplacementColorBackgroundBitmap,
622 FloatRectangle(0.0f, 0.0f, pHighlightedReplacementColorBackgroundBitmap->GetWidthF(), pHighlightedReplacementColorBackgroundBitmap->GetHeightF()));
627 if (!__pButton->IsUserBackgroundBitmap(status))
629 __pButton->UnloadBackgroundBitmap(status);
632 if (!__pButton->IsUserBackgroundEffectBitmap(status))
634 __pButton->UnloadBackgroundEffectBitmap(status);
642 delete pReplacementColorBackgroundBitmap;
643 delete pHighlightedReplacementColorBackgroundBitmap;
649 _ButtonPresenter::DrawToolbarItemBackground(void)
651 Canvas* pCanvas = __pButton->GetCanvasN();
655 SysLog(NID_UI_CTRL, "Cannot get a canvas.");
659 pCanvas->SetBackgroundColor(Color(0, 0, 0, 0));
662 float leftTouchMargin = __pButton->GetLeftTouchMarginF();
663 float topTouchMargin = __pButton->GetTopTouchMarginF();
664 float rightTouchMargin = __pButton->GetRightTouchMarginF();
665 float bottomTouchMargin = __pButton->GetBottomTouchMarginF();
667 _ButtonStatus status = __pButton->GetButtonStatus();
668 Bitmap* pToolbarItemBackgroundBitmap = __pButton->GetToolbarItemBackgroundBitmap(status);
670 if (pToolbarItemBackgroundBitmap)
672 FloatRectangle bounds(leftTouchMargin, topTouchMargin, __pButton->GetBoundsF().width - (leftTouchMargin + rightTouchMargin),
673 __pButton->GetBoundsF().height - (topTouchMargin + bottomTouchMargin));
675 if (_BitmapImpl::CheckNinePatchedBitmapStrictly(*pToolbarItemBackgroundBitmap))
677 pCanvas->DrawNinePatchedBitmap(bounds, *pToolbarItemBackgroundBitmap);
681 pCanvas->DrawBitmap(bounds, *pToolbarItemBackgroundBitmap,
682 FloatRectangle(0.0f, 0.0f, pToolbarItemBackgroundBitmap->GetWidthF(), pToolbarItemBackgroundBitmap->GetHeightF()));
686 if (__pTabLargeSelectedBitmap)
688 delete __pTabLargeSelectedBitmap;
689 __pTabLargeSelectedBitmap = null;
692 __pTabLargeSelectedBitmap = new (std::nothrow) Bitmap();
694 if (__pButton->UserDefinedText())
696 __pTabLargeSelectedBitmap->Construct(*pCanvas, __pButton->GetUserDefinedTextAreaF());
700 __pTabLargeSelectedBitmap->Construct(*pCanvas, __textRect);
709 _ButtonPresenter::DrawBitmap(void)
711 Canvas* pCanvas = null;
713 _ButtonStatus status = __pButton->GetButtonStatus();
715 Bitmap* pBitmap = __pButton->GetBitmap(status);
716 Bitmap* pNormalBitmap = __pButton->GetBitmap(_BUTTON_STATUS_NORMAL);
718 Bitmap* pEffectBitmap = __pButton->GetEffectBitmap(status);
719 Bitmap* pNormalEffectBitmap = __pButton->GetEffectBitmap(_BUTTON_STATUS_NORMAL);
721 float leftTouchMargin = __pButton->GetLeftTouchMarginF();
722 float topTouchMargin = __pButton->GetTopTouchMarginF();
723 float rightTouchMargin = __pButton->GetRightTouchMarginF();
724 float bottomTouchMargin = __pButton->GetBottomTouchMarginF();
726 FloatRectangle bounds(leftTouchMargin, topTouchMargin, __pButton->GetBoundsF().width - (leftTouchMargin + rightTouchMargin),
727 __pButton->GetBoundsF().height - (topTouchMargin + bottomTouchMargin));
731 pCanvas = __pButton->GetCanvasN();
735 SysLog(NID_UI_CTRL, "Cannot get a canvas.");
739 if (__pButton->GetSizeF().width - __pButton->GetBitmapPositionF(status).x - rightTouchMargin < pBitmap->GetWidthF()
740 || __pButton->GetSizeF().height - __pButton->GetBitmapPositionF(status).y - bottomTouchMargin < pBitmap->GetHeightF())
742 pCanvas->DrawBitmap(bounds, *pBitmap, FloatRectangle(0.0f, 0.0f, pBitmap->GetWidthF(), pBitmap->GetHeightF()));
746 pCanvas->DrawBitmap(bounds, *pEffectBitmap,
747 FloatRectangle(0.0f, 0.0f, pEffectBitmap->GetWidthF(), pEffectBitmap->GetHeightF()));
752 pCanvas->DrawBitmap(__pButton->GetBitmapPositionF(status), *pBitmap);
756 pCanvas->DrawBitmap(__pButton->GetEffectBitmapPositionF(status), *pEffectBitmap);
760 else if (pNormalBitmap)
762 pCanvas = __pButton->GetCanvasN();
766 SysLog(NID_UI_CTRL, "Cannot get a canvas.");
770 if (__pButton->GetSizeF().width - __pButton->GetBitmapPositionF(_BUTTON_STATUS_NORMAL).x - rightTouchMargin < pNormalBitmap->GetWidthF()
771 || __pButton->GetSizeF().height - __pButton->GetBitmapPositionF(_BUTTON_STATUS_NORMAL).y - bottomTouchMargin < pNormalBitmap->GetHeightF())
773 pCanvas->DrawBitmap(bounds, *pNormalBitmap, FloatRectangle(0.0f, 0.0f, pNormalBitmap->GetWidthF(), pNormalBitmap->GetHeightF()));
775 if (pNormalEffectBitmap)
777 pCanvas->DrawBitmap(bounds, *pNormalEffectBitmap, FloatRectangle(0.0f, 0.0f, pNormalEffectBitmap->GetWidthF(), pNormalEffectBitmap->GetHeightF()));
782 pCanvas->DrawBitmap(__pButton->GetBitmapPositionF(_BUTTON_STATUS_NORMAL), *pNormalBitmap);
784 if (pNormalEffectBitmap)
786 pCanvas->DrawBitmap(__pButton->GetEffectBitmapPositionF(_BUTTON_STATUS_NORMAL), *pNormalEffectBitmap);
797 _ButtonPresenter::DrawText(void)
799 TimerForTitleSlideInit();
800 //TextSimple* pSimpleText = null;
801 TextObjectAlignment horizontalAlign = TEXT_OBJECT_ALIGNMENT_CENTER;
802 TextObjectAlignment verticalAlign = TEXT_OBJECT_ALIGNMENT_MIDDLE;
804 float leftMargin = __pButton->GetLeftMarginF();
805 float topMargin = __pButton->GetTopMarginF();
806 float rightMargin = __pButton->GetRightMarginF();
807 float bottomMargin = __pButton->GetBottomMarginF();
809 float leftTouchMargin = __pButton->GetLeftTouchMarginF();
810 float topTouchMargin = __pButton->GetTopTouchMarginF();
811 float rightTouchMargin = __pButton->GetRightTouchMarginF();
812 float bottomTouchMargin = __pButton->GetBottomTouchMarginF();
814 Canvas* pCanvas = __pButton->GetCanvasN();
817 SysLog(NID_UI_CTRL, "Cannot get a canvas.");
821 switch (__pButton->GetTextHorizontalAlignment())
824 horizontalAlign = TEXT_OBJECT_ALIGNMENT_LEFT;
826 case ALIGNMENT_CENTER:
827 horizontalAlign = TEXT_OBJECT_ALIGNMENT_CENTER;
830 horizontalAlign = TEXT_OBJECT_ALIGNMENT_RIGHT;
833 switch (__pButton->GetTextVerticalAlignment())
836 verticalAlign = TEXT_OBJECT_ALIGNMENT_TOP;
838 case ALIGNMENT_MIDDLE:
839 verticalAlign = TEXT_OBJECT_ALIGNMENT_MIDDLE;
842 verticalAlign = TEXT_OBJECT_ALIGNMENT_BOTTOM;
845 //__pTextObject->RemoveAll(true);
846 //pSimpleText = new (std::nothrow) TextSimple(const_cast<wchar_t*>(__pButton->GetText().GetPointer()), __pButton->GetText().GetLength());
847 //__pTextObject->AppendElement(*pSimpleText);
849 __textRect = FloatRectangle(leftMargin + leftTouchMargin, topMargin + topTouchMargin,
850 __pButton->GetBoundsF().width - (leftMargin + rightMargin) - (leftTouchMargin + rightTouchMargin),
851 __pButton->GetBoundsF().height - (topMargin + bottomMargin) - (topTouchMargin + bottomTouchMargin));
853 if (__pButton->UserDefinedText())
855 __pTextObject->SetBounds(__pButton->GetUserDefinedTextAreaF());
859 __pTextObject->SetBounds(__textRect);
862 __pTextObject->SetAlignment(horizontalAlign | verticalAlign);
864 if (__pButton->GetButtonStatus() == _BUTTON_STATUS_SELECTED && __pButton->IsTabTextSlide())
866 __pTextObject->SetAction(TEXT_OBJECT_ACTION_TYPE_SLIDE_LEFT);
870 __pTextObject->SetAction(TEXT_OBJECT_ACTION_TYPE_ABBREV);
873 __pTextObject->SetFont(__pFont, 0, __pTextObject->GetTextLength());
874 __pTextObject->Compose();
876 float fontSize = 0.0f;
878 if (__pTextObject->GetTotalLineCount() >= 2)
880 fontSize = __pButton->GetMultilineTextSizeF();
881 SetTextSize(fontSize);
883 __pTextObject->SetFont(__pFont, 0, __pTextObject->GetTextLength());
884 __pTextObject->Compose();
887 __pTextObject->SetForegroundColor(__pButton->GetTextColor(__pButton->GetButtonStatus()), 0, __pTextObject->GetTextLength());
889 if (__pTextObject->IsActionOn() == true)
891 __pTextObject->DrawWithOffset(*_CanvasImpl::GetInstance(*pCanvas));
893 DrawTabTextDimBitmap();
895 TimerForTitleSlideStart();
899 __pTextObject->Draw(*_CanvasImpl::GetInstance(*pCanvas));
909 _ButtonPresenter::DrawUnderlineBitmap(void)
911 float selectedBitmapMargin = 0.0f;
912 float selectedBitmapHeight = 0.0f;
913 float segmentedHeight = 0.0f;
915 float leftTouchMargin = __pButton->GetLeftTouchMarginF();
916 float rightTouchMargin = __pButton->GetRightTouchMarginF();
917 float bottomTouchMargin = __pButton->GetBottomTouchMarginF();
919 GET_SHAPE_CONFIG(HEADER::HEADER_ITEM_SELECTED_BITMAP_MARGIN, __pButton->GetOrientation(), selectedBitmapMargin);
920 GET_SHAPE_CONFIG(HEADER::HEADER_ITEM_SELECTED_BITMAP_HEIGHT, __pButton->GetOrientation(), selectedBitmapHeight);
921 GET_SHAPE_CONFIG(HEADER::SEGMENTED_ITEM_HEIGHT, __pButton->GetOrientation(), segmentedHeight);
923 Bitmap* pUnderlineBitmap = __pButton->GetUnderlineBitmap();
925 if (pUnderlineBitmap)
927 Canvas* pCanvas = __pButton->GetCanvasN();
931 SysLog(NID_UI_CTRL, "Cannot get a canvas.");
935 FloatRectangle bounds(selectedBitmapMargin + leftTouchMargin,
936 __pButton->GetBoundsF().height - bottomTouchMargin - selectedBitmapHeight,
937 __pButton->GetBoundsF().width - selectedBitmapMargin * 2 - (leftTouchMargin + rightTouchMargin), selectedBitmapHeight);
939 if (_BitmapImpl::CheckNinePatchedBitmapStrictly(*pUnderlineBitmap))
941 pCanvas->DrawNinePatchedBitmap(bounds, *pUnderlineBitmap);
945 pCanvas->DrawBitmap(bounds, *pUnderlineBitmap,
946 FloatRectangle(0.0f, 0.0f, pUnderlineBitmap->GetWidthF(), pUnderlineBitmap->GetHeightF()));
956 _ButtonPresenter::DrawSubTitleEffectBitmap(void)
958 float leftTouchMargin = __pButton->GetLeftTouchMarginF();
959 float topTouchMargin = __pButton->GetTopTouchMarginF();
960 float rightTouchMargin = __pButton->GetRightTouchMarginF();
961 float bottomTouchMargin = __pButton->GetBottomTouchMarginF();
963 Bitmap* pSubTitleEffectBitmap = __pButton->GetSubTitleEffectBitmap();
965 if (pSubTitleEffectBitmap)
967 Canvas* pCanvas = __pButton->GetCanvasN();
971 SysLog(NID_UI_CTRL, "Cannot get a canvas.");
975 FloatRectangle bounds(leftTouchMargin, topTouchMargin,
976 __pButton->GetBoundsF().width - (leftTouchMargin + rightTouchMargin), __pButton->GetBoundsF().height - (topTouchMargin + bottomTouchMargin));
978 if (_BitmapImpl::CheckNinePatchedBitmapStrictly(*pSubTitleEffectBitmap))
980 pCanvas->DrawNinePatchedBitmap(bounds, *pSubTitleEffectBitmap);
984 pCanvas->DrawBitmap(bounds, *pSubTitleEffectBitmap,
985 FloatRectangle(0.0f, 0.0f, pSubTitleEffectBitmap->GetWidthF(), pSubTitleEffectBitmap->GetHeightF()));
995 _ButtonPresenter::OnTouchPressed(const _Control& source, const _TouchInfo& touchinfo)
997 if (&source != __pButton)
1002 if (!__pButton->IsEnabled())
1007 if (__pButton->GetButtonStyle() == _BUTTON_STYLE_SEGMENT)
1012 __touchMoveHandled = false;
1013 //_ButtonStatus status = __pButton->GetButtonStatus();
1015 //if (status != _BUTTON_STATUS_SELECTED)
1017 __pButton->SetButtonStatus(_BUTTON_STATUS_PRESSED);
1027 _ButtonPresenter::OnTouchReleased(const _Control& source, const _TouchInfo& touchinfo)
1029 if (&source != __pButton)
1034 if (!__pButton->IsEnabled())
1039 if (__pButton->GetButtonStyle() == _BUTTON_STYLE_SEGMENT)
1044 _ButtonStatus status = __pButton->GetButtonStatus();
1046 if (status == _BUTTON_STATUS_NORMAL)
1051 FloatPoint touchPoint = touchinfo.GetCurrentPosition();
1053 touchPoint.x += source.GetClientBoundsF().x;
1054 touchPoint.y += source.GetClientBoundsF().y;
1056 FloatRectangle bounds = __pButton->GetClientBoundsF();
1058 __pButton->SetButtonStatus(_BUTTON_STATUS_NORMAL);
1059 __pButton->Invalidate();
1061 if (bounds.Contains(touchPoint))
1063 PLAY_FEEDBACK(_RESOURCE_FEEDBACK_PATTERN_TAP, __pButton);
1065 __pButton->FireActionEvent();
1072 _ButtonPresenter::OnTouchMoved(const _Control& source, const _TouchInfo& touchinfo)
1074 if (&source != __pButton)
1079 if (!__pButton->IsEnabled())
1084 if (__pButton->GetButtonStyle() == _BUTTON_STYLE_SEGMENT)
1089 FloatPoint touchPoint = touchinfo.GetCurrentPosition();
1091 touchPoint.x += source.GetClientBoundsF().x;
1092 touchPoint.y += source.GetClientBoundsF().y;
1094 FloatRectangle bounds = __pButton->GetClientBoundsF();
1095 bool isInButtonArea = bounds.Contains(touchPoint);
1096 _ButtonStatus oldStatus = __pButton->GetButtonStatus();
1098 if (isInButtonArea && (__touchMoveHandled != true))
1100 __pButton->SetButtonStatus(_BUTTON_STATUS_PRESSED);
1104 __pButton->SetButtonStatus(_BUTTON_STATUS_NORMAL);
1107 if (__pButton->GetButtonStatus() != oldStatus)
1109 __pButton->Invalidate();
1116 _ButtonPresenter::OnTouchCanceled(const _Control& source, const _TouchInfo& touchinfo)
1118 if (&source != __pButton)
1123 if (!__pButton->IsEnabled())
1128 if (__pButton->GetButtonStyle() == _BUTTON_STYLE_SEGMENT)
1133 __pButton->SetButtonStatus(_BUTTON_STATUS_NORMAL);
1134 __pButton->Invalidate();
1140 _ButtonPresenter::OnTouchMoveHandled(const _Control& control)
1142 if (__touchMoveHandled == false)
1144 __touchMoveHandled = true;
1145 __pButton->SetButtonStatus(_BUTTON_STATUS_NORMAL);
1146 __pButton->Invalidate();
1153 _ButtonPresenter::OnKeyPressed(const _Control& source, const _KeyInfo& keyInfo)
1155 _KeyCode keyCode = keyInfo.GetKeyCode();
1157 if (__pButton->IsFocusModeStateEnabled() == true && keyCode == _KEY_ENTER)
1159 if (__pButton->GetButtonStatus() != _BUTTON_STATUS_DISABLED)
1161 __pButton->SetButtonStatus(_BUTTON_STATUS_PRESSED);
1172 _ButtonPresenter::OnKeyReleased(const _Control& source, const _KeyInfo& keyInfo)
1174 _KeyCode keyCode = keyInfo.GetKeyCode();
1176 if (__pButton->IsFocusModeStateEnabled() == true && keyCode == _KEY_ENTER)
1178 if (__pButton->GetButtonStatus() != _BUTTON_STATUS_DISABLED)
1180 __pButton->SetButtonStatus(_BUTTON_STATUS_NORMAL);
1181 __pButton->Invalidate();
1183 __pButton->SetButtonStatus(_BUTTON_STATUS_HIGHLIGHTED);
1191 _ButtonPresenter::OnAncestorEnableStateChanged(const _Control& control)
1193 if (__pButton->GetButtonStatus() == _BUTTON_STATUS_SELECTED)
1198 if (__pButton->GetEnableState())
1200 __pButton->SetButtonStatus(_BUTTON_STATUS_NORMAL);
1201 __pButton->Invalidate();
1205 __pButton->SetButtonStatus(_BUTTON_STATUS_DISABLED);
1206 __pButton->Invalidate();
1213 _ButtonPresenter::OnDrawFocus(void)
1215 if (__pButton->GetButtonStatus() != _BUTTON_STATUS_DISABLED)
1217 __pButton->SetButtonStatus(_BUTTON_STATUS_HIGHLIGHTED, false);
1218 __pButton->Invalidate();
1225 _ButtonPresenter::OnChildControlFocusMoved(const _Control& control)
1231 _ButtonPresenter::IsChildControlFocusManage(void) const
1237 _ButtonPresenter::OnFocusableStateChanged(bool focusalbeState)
1243 _ButtonPresenter::OnFocusModeStateChanged(void)
1245 if (__pButton->GetButtonStatus() != _BUTTON_STATUS_DISABLED)
1247 __pButton->SetButtonStatus(_BUTTON_STATUS_NORMAL);
1248 __pButton->Invalidate();
1255 _ButtonPresenter::OnFocusGained(const _Control& source)
1257 if (__pButton->IsFocusModeStateEnabled() == true)
1259 if (__pButton->GetButtonStatus() != _BUTTON_STATUS_DISABLED)
1261 __pButton->SetButtonStatus(_BUTTON_STATUS_HIGHLIGHTED, false);
1262 __pButton->Invalidate();
1270 _ButtonPresenter::OnFocusLost(const _Control& source)
1272 if (__pButton->GetButtonStatus() != _BUTTON_STATUS_DISABLED)
1274 __pButton->SetButtonStatus(_BUTTON_STATUS_NORMAL);
1275 __pButton->Invalidate();
1282 _ButtonPresenter::IsEnabledStateChanged(void)
1284 bool __currentEnabledState = __pButton->GetEnableState();
1287 if (__currentEnabledState != __previousEnabledState)
1289 __previousEnabledState = __currentEnabledState;
1297 _ButtonPresenter::OnCanvasRequestedN(const FloatRectangle& bounds)
1299 Canvas* pCanvas = null;
1301 if (__lazyDecode == true)
1303 Bitmap* pBackgroundBitmap = null;
1304 _ButtonStatus status = __pButton->GetButtonStatus();
1306 if (__pButton->IsUserBackgroundBitmap(status))
1308 if (status == _BUTTON_STATUS_HIGHLIGHTED)
1310 pBackgroundBitmap = __pButton->GetBackgroundBitmap(_BUTTON_STATUS_NORMAL);
1314 pBackgroundBitmap = __pButton->GetBackgroundBitmap(status);
1318 if (pBackgroundBitmap != null)
1320 if (pBackgroundBitmap->IsNinePatchedBitmap()) // just decode // fix prevent CHECKED_RETURN
1326 __lazyDecode = false;
1330 pCanvas = __pButton->GetCanvasN();
1337 _ButtonPresenter::ShowUnderlineBitmap(bool show)
1339 __showUnderlineBitmap = show;
1345 _ButtonPresenter::OnTimerExpired(Timer& timer)
1347 Timer* onTimer = &timer;
1349 if (onTimer == __pTextSlideTimer)
1351 TimerForTitleSlideTimeout();
1358 _ButtonPresenter::TimerForTitleSlideInit(void)
1360 result r = E_SUCCESS;
1362 if (__pTextSlideTimer != null)
1364 delete __pTextSlideTimer;
1365 __pTextSlideTimer = null;
1372 _ButtonPresenter::TimerForTitleSlideStart(void)
1374 result r = E_SUCCESS;
1376 if (__pTextSlideTimer == null)
1378 __pTextSlideTimer = new (std::nothrow) Timer();
1379 if (__pTextSlideTimer == null)
1381 r = E_OUT_OF_MEMORY;
1385 r = __pTextSlideTimer->Construct(*this);
1389 delete __pTextSlideTimer;
1394 r = __pTextSlideTimer->Start(100);
1406 _ButtonPresenter::TimerForTitleSlideTimeout(void)
1408 Canvas* pCanvas = __pButton->GetCanvasN();
1409 SysTryReturnResult(NID_UI_CTRL, pCanvas, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] pCanvas is invalid!");
1411 pCanvas->SetBackgroundColor(Color(0, 0, 0, 0));
1413 if (__pButton->UserDefinedText())
1415 pCanvas->Clear(__pButton->GetUserDefinedTextAreaF());
1417 if (__pTabLargeSelectedBitmap)
1419 pCanvas->DrawBitmap(CoordinateSystem::AlignToDevice(__pButton->GetUserDefinedTextAreaF()), *__pTabLargeSelectedBitmap);
1424 pCanvas->Clear(__textRect);
1426 if (__pTabLargeSelectedBitmap)
1428 pCanvas->DrawBitmap(CoordinateSystem::AlignToDevice(__textRect), *__pTabLargeSelectedBitmap);
1432 if (__pTextObject->IsChanged())
1434 if (!__pButton->GetText().IsEmpty())
1440 if (__pTextObject->IsActionOn() == true)
1442 __pTextObject->DrawWithOffset(*_CanvasImpl::GetInstance(*pCanvas));
1444 DrawTabTextDimBitmap();
1446 if (__pTextObject->GetRepeatCount() < 3)
1448 TimerForTitleSlideStart();
1453 __pTextObject->Draw(*_CanvasImpl::GetInstance(*pCanvas));
1462 _ButtonPresenter::DrawTabTextDimBitmap(void)
1464 _ButtonStatus status = __pButton->GetButtonStatus();
1465 Bitmap* pToolbarItemBackgroundBitmap = __pButton->GetToolbarItemBackgroundBitmap(status);
1467 if (pToolbarItemBackgroundBitmap)
1472 float textDimWidth = 0.0f;
1473 float textDimHeight = 0.0f;
1475 GET_SHAPE_CONFIG(HEADER::TAB_TEXT_DIM_WIDTH, __pButton->GetOrientation(), textDimWidth);
1476 GET_SHAPE_CONFIG(HEADER::TAB_LARGE_TEXT_HEIGHT, __pButton->GetOrientation(), textDimHeight);
1478 Bitmap* pTabTextDimLeftBitmap = __pButton->GetTabTextDimLeftBitmap();
1480 if (pTabTextDimLeftBitmap)
1482 Canvas* pCanvas = __pButton->GetCanvasN();
1483 FloatRectangle bounds = FloatRectangle(0.0f, 0.0f, 0.0f, 0.0f);
1485 if (pCanvas == null)
1487 SysLog(NID_UI_CTRL, "Cannot get a canvas.");
1491 if (__pButton->UserDefinedText() && (__pButton->GetBitmap(_BUTTON_STATUS_NORMAL) || __pButton->GetBitmap(_BUTTON_STATUS_DISABLED)
1492 || __pButton->GetBitmap(_BUTTON_STATUS_PRESSED) || __pButton->GetBitmap(_BUTTON_STATUS_HIGHLIGHTED)))
1494 bounds.x = __pButton->GetUserDefinedTextAreaF().x;
1495 bounds.y = __pButton->GetUserDefinedTextAreaF().y;
1496 bounds.width = textDimWidth;
1497 bounds.height = textDimHeight;
1502 bounds.y = (__pButton->GetSizeF().height - textDimHeight) / 2.0f;
1503 bounds.width = textDimWidth;
1504 bounds.height = textDimHeight;
1507 if (_BitmapImpl::CheckNinePatchedBitmapStrictly(*pTabTextDimLeftBitmap))
1509 pCanvas->DrawNinePatchedBitmap(bounds, *pTabTextDimLeftBitmap);
1513 pCanvas->DrawBitmap(bounds, *pTabTextDimLeftBitmap,
1514 FloatRectangle(0.0f, 0.0f, pTabTextDimLeftBitmap->GetWidthF(), pTabTextDimLeftBitmap->GetHeightF()));
1520 Bitmap* pTabTextDimRightBitmap = __pButton->GetTabTextDimRightBitmap();
1522 if (pTabTextDimRightBitmap)
1524 Canvas* pCanvas = __pButton->GetCanvasN();
1525 FloatRectangle bounds = FloatRectangle(0.0f, 0.0f, 0.0f, 0.0f);
1527 if (pCanvas == null)
1529 SysLog(NID_UI_CTRL, "Cannot get a canvas.");
1533 if (__pButton->UserDefinedText() && (__pButton->GetBitmap(_BUTTON_STATUS_NORMAL) || __pButton->GetBitmap(_BUTTON_STATUS_DISABLED)
1534 || __pButton->GetBitmap(_BUTTON_STATUS_PRESSED) || __pButton->GetBitmap(_BUTTON_STATUS_HIGHLIGHTED)))
1536 bounds.x = __pButton->GetSizeF().width - textDimWidth;
1537 bounds.y = __pButton->GetUserDefinedTextAreaF().y;
1538 bounds.width = textDimWidth;
1539 bounds.height = textDimHeight;
1543 bounds.x = __pButton->GetSizeF().width - textDimWidth;
1544 bounds.y = (__pButton->GetSizeF().height - textDimHeight) / 2.0f;
1545 bounds.width = textDimWidth;
1546 bounds.height = textDimHeight;
1549 if (_BitmapImpl::CheckNinePatchedBitmapStrictly(*pTabTextDimRightBitmap))
1551 pCanvas->DrawNinePatchedBitmap(bounds, *pTabTextDimRightBitmap);
1555 pCanvas->DrawBitmap(bounds, *pTabTextDimRightBitmap,
1556 FloatRectangle(0.0f, 0.0f, pTabTextDimRightBitmap->GetWidthF(), pTabTextDimRightBitmap->GetHeightF()));
1565 }}} // Tizen::Ui::Controls