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::Graphics;
36 using namespace Tizen::Graphics::_Text;
37 using namespace Tizen::App;
39 namespace Tizen { namespace Ui { namespace Controls
41 _ButtonPresenter::_ButtonPresenter(void)
43 , __pButtonModel(null)
44 , __previousEnabledState(false)
45 , __touchMoveHandled(false)
47 , __showUnderlineBitmap(false)
53 , __focusPrevStatus(_BUTTON_STATUS_NORMAL)
58 _ButtonPresenter::~_ButtonPresenter(void)
62 delete __pButtonModel;
63 __pButtonModel = null;
74 _ButtonPresenter::Construct(const _Button& button)
78 __pButton = const_cast <_Button*>(&button);
79 __fontStyle = FONT_STYLE_PLAIN;
81 GET_SHAPE_CONFIG(BUTTON::DEFAULT_FONT_SIZE, __pButton->GetOrientation(), __fontSize);
83 __pFont = __pButton->GetFallbackFont();
85 SysTryReturn(NID_UI_CTRL, __pFont, r, r, "[%s] Propagating.", GetErrorMessage(r));
87 __pTextObject = new (std::nothrow) TextObject();
88 SysTryCatch(NID_UI_CTRL, __pTextObject != null, r = E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory is insufficient.");
90 __pTextObject->Construct();
103 _ButtonPresenter::Install(void)
105 result r = E_SUCCESS;
107 __pBase = __pButton->GetVisualElement();
109 _ButtonModel* pModel = new (std::nothrow) _ButtonModel();
110 SysTryReturn(NID_UI_CTRL, pModel, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory is insufficient.");
112 r = SetModel(*pModel);
113 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
115 r = pModel->Construct();
116 SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] A system error occurred.");
126 _ButtonPresenter::SetModel(const _ButtonModel& buttonModel)
128 __pButtonModel = const_cast <_ButtonModel*>(&buttonModel);
134 _ButtonPresenter::InitTextObject(void)
136 TextSimple* pSimpleText = null;
138 float leftMargin = __pButton->GetLeftMarginF();
139 float topMargin = __pButton->GetTopMarginF();
140 float rightMargin = __pButton->GetRightMarginF();
141 float bottomMargin = __pButton->GetBottomMarginF();
143 float leftTouchMargin = __pButton->GetLeftTouchMarginF();
144 float topTouchMargin = __pButton->GetTopTouchMarginF();
145 float rightTouchMargin = __pButton->GetRightTouchMarginF();
146 float bottomTouchMargin = __pButton->GetBottomTouchMarginF();
148 __pTextObject->RemoveAll(true);
150 pSimpleText = new (std::nothrow) TextSimple(const_cast<wchar_t*>(__pButton->GetText().GetPointer()), __pButton->GetText().GetLength());
151 SysTryReturn(NID_UI_CTRL, pSimpleText, E_OUT_OF_MEMORY, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory is insufficient.");
153 __pTextObject->AppendElement(*pSimpleText);
154 __pTextObject->SetWrap(TEXT_OBJECT_WRAP_TYPE_WORD);
155 __pTextObject->SetAction(TEXT_OBJECT_ACTION_TYPE_ABBREV);
156 SetTextSize(__pButton->GetTextSizeF());
157 __pTextObject->SetFont(__pFont, 0, __pTextObject->GetTextLength());
158 __pTextObject->SetAlignment(TEXT_OBJECT_ALIGNMENT_CENTER | TEXT_OBJECT_ALIGNMENT_MIDDLE);
159 __pTextObject->SetBounds(FloatRectangle(leftMargin + leftTouchMargin, topMargin + topTouchMargin,
160 __pButton->GetBoundsF().width - (leftMargin + rightMargin) - (leftTouchMargin + rightTouchMargin),
161 __pButton->GetBoundsF().height - (topMargin + bottomMargin) - (topTouchMargin + bottomTouchMargin)));
162 __pTextObject->Compose();
168 _ButtonPresenter::OnFontChanged(Font* pFont)
176 _ButtonPresenter::OnFontInfoRequested(unsigned long& style, int& size)
179 size = _CoordinateSystemUtils::ConvertToInteger(__fontSize);
185 _ButtonPresenter::OnFontInfoRequested(unsigned long& style, float& size)
194 _ButtonPresenter::SetTextSize(int size, unsigned long fontStyle)
196 float floatSize = _CoordinateSystemUtils::ConvertToFloat(size);
198 return SetTextSize(floatSize, fontStyle);
202 _ButtonPresenter::SetTextSize(float size, unsigned long fontStyle)
204 result r = E_SUCCESS;
211 bool isStrikeOut = __pFont->IsStrikeOut();
212 bool isUnderLine = __pFont->IsUnderlined();
214 if (__pFont->IsItalic())
216 fontStyle |= FONT_STYLE_ITALIC;
219 if (__pFont->IsBold())
221 fontStyle |= FONT_STYLE_BOLD;
224 __fontStyle = fontStyle;
227 __pFont = __pButton->GetFallbackFont();
230 SysTryReturnVoidResult(NID_UI_CTRL, __pFont, r, "[%s] Propagating.", GetErrorMessage(r));
232 __pFont->SetStrikeOut(isStrikeOut);
233 __pFont->SetUnderline(isUnderLine);
239 _ButtonPresenter::SetFontInfo(unsigned long style, int size)
241 float floatSize = _CoordinateSystemUtils::ConvertToFloat(size);
243 return SetFontInfo(style, floatSize);
247 _ButtonPresenter::SetFontInfo(unsigned long style, float size)
256 _ButtonPresenter::GetTextObject(void) const
258 return __pTextObject;
262 _ButtonPresenter::GetFont(void) const
268 _ButtonPresenter::Draw(void)
270 _ButtonStatus status = __pButton->GetButtonStatus();
272 Bitmap* pToolbarItemBackgroundBitmap = __pButton->GetToolbarItemBackgroundBitmap(status);
274 if (pToolbarItemBackgroundBitmap)
276 DrawToolbarItemBackground();
286 if (__showUnderlineBitmap && __pButton->GetToolbarItemBackgroundBitmap(status) == null)
288 DrawUnderlineBitmap();
295 _ButtonPresenter::DrawBackground(void)
297 Canvas* pCanvas = null;
299 Bitmap* pBackgroundBitmap = null;
300 Bitmap* pReplacementColorBackgroundBitmap = null;
301 Bitmap* pBackgroundEffectBitmap = null;
302 Bitmap* pHighlightedBackgroundBitmap = null;
303 Bitmap* pHighlightedReplacementColorBackgroundBitmap = null;
304 Color bgColor = __pButton->GetBackgroundColor();
305 String imagePath = L"";
307 float leftTouchMargin = __pButton->GetLeftTouchMarginF();
308 float topTouchMargin = __pButton->GetTopTouchMarginF();
309 float rightTouchMargin = __pButton->GetRightTouchMarginF();
310 float bottomTouchMargin = __pButton->GetBottomTouchMarginF();
312 FloatRectangle bounds(leftTouchMargin, topTouchMargin, __pButton->GetBoundsF().width - (leftTouchMargin + rightTouchMargin)
313 , __pButton->GetBoundsF().height - (topTouchMargin + bottomTouchMargin));
315 _ButtonStatus status = __pButton->GetButtonStatus();
317 if (__pButton->IsUserBackgroundBitmap(status))
319 if (status == _BUTTON_STATUS_HIGHLIGHTED)
321 pBackgroundBitmap = __pButton->GetBackgroundBitmap(_BUTTON_STATUS_NORMAL);
322 pBackgroundEffectBitmap = __pButton->GetBackgroundEffectBitmap(_BUTTON_STATUS_NORMAL);
324 pHighlightedBackgroundBitmap = __pButton->GetBackgroundBitmap(_BUTTON_STATUS_HIGHLIGHTED);
328 pBackgroundBitmap = __pButton->GetBackgroundBitmap(status);
329 pBackgroundEffectBitmap = __pButton->GetBackgroundEffectBitmap(status);
332 if (pBackgroundBitmap)
334 if (_BitmapImpl::CheckNinePatchedBitmapStrictly(*pBackgroundBitmap) == false)
336 imagePath = _BitmapImpl::GetInstance(*pBackgroundBitmap)->GetFileName();
339 if (imagePath.IsEmpty() == false && __pButton->GetText() == L""
340 && __pButton->GetBitmap(_BUTTON_STATUS_NORMAL) == null && __pButton->GetBitmap(_BUTTON_STATUS_DISABLED) == null
341 && __pButton->GetBitmap(_BUTTON_STATUS_PRESSED) == null && __pButton->GetBitmap(_BUTTON_STATUS_HIGHLIGHTED) == null)
343 __pBase->SetBackgroundColor(_Colorf(
344 (float)bgColor.GetRed() / 255, (float)bgColor.GetGreen() / 255, (float)bgColor.GetBlue() / 255, (float)bgColor.GetAlpha() / 255));
345 __pBase->SetImageSource(imagePath);
351 __pBase->SetImageSource(L"");
353 __lazyDecode = false;
355 pCanvas = __pButton->GetCanvasN();
358 SysLog(NID_UI_CTRL, "Cannot get a canvas.");
361 pCanvas->SetBackgroundColor(Color(0, 0, 0, 0));
364 if (_BitmapImpl::CheckNinePatchedBitmapStrictly(*pBackgroundBitmap))// pBackgroundBitmap is 9
366 if (pBackgroundEffectBitmap)
368 if (_BitmapImpl::CheckNinePatchedBitmapStrictly(*pBackgroundEffectBitmap)) // 9,9
370 pCanvas->DrawNinePatchedBitmap(bounds, *pBackgroundBitmap);
371 if (__pButton->IsUserBackgroundEffectBitmap(status))
373 pCanvas->DrawNinePatchedBitmap(bounds, *pBackgroundEffectBitmap);
378 pCanvas->DrawNinePatchedBitmap(bounds, *pBackgroundBitmap);
379 if (__pButton->IsUserBackgroundEffectBitmap(status))
381 pCanvas->DrawBitmap(bounds, *pBackgroundEffectBitmap, FloatRectangle(0.0f, 0.0f, pBackgroundEffectBitmap->GetWidthF(), pBackgroundEffectBitmap->GetHeightF()));
387 pCanvas->DrawNinePatchedBitmap(bounds, *pBackgroundBitmap);
390 else // pBackgroundBitmap is not 9
392 if (pBackgroundEffectBitmap)
394 if (_BitmapImpl::CheckNinePatchedBitmapStrictly(*pBackgroundEffectBitmap)) // 0, 9
396 pCanvas->DrawBitmap(bounds, *pBackgroundBitmap, FloatRectangle(0.0f, 0.0f, pBackgroundBitmap->GetWidthF(), pBackgroundBitmap->GetHeightF()));
397 if (__pButton->IsUserBackgroundEffectBitmap(status))
399 pCanvas->DrawNinePatchedBitmap(bounds, *pBackgroundEffectBitmap);
404 pCanvas->DrawBitmap(bounds, *pBackgroundBitmap, FloatRectangle(0.0f, 0.0f, pBackgroundBitmap->GetWidthF(), pBackgroundBitmap->GetHeightF()));
405 if (__pButton->IsUserBackgroundEffectBitmap(status))
407 pCanvas->DrawBitmap(bounds, *pBackgroundEffectBitmap, FloatRectangle(0.0f, 0.0f, pBackgroundEffectBitmap->GetWidthF(), pBackgroundEffectBitmap->GetHeightF()));
413 pCanvas->DrawBitmap(bounds, *pBackgroundBitmap, FloatRectangle(0.0f, 0.0f, pBackgroundBitmap->GetWidthF(), pBackgroundBitmap->GetHeightF()));
418 if (pHighlightedBackgroundBitmap)
420 if (_BitmapImpl::CheckNinePatchedBitmapStrictly(*pHighlightedBackgroundBitmap))
422 pCanvas->DrawNinePatchedBitmap(bounds, *pHighlightedBackgroundBitmap);
426 pCanvas->DrawBitmap(bounds, *pHighlightedBackgroundBitmap,
427 FloatRectangle(0.0f, 0.0f, pHighlightedBackgroundBitmap->GetWidthF(), pHighlightedBackgroundBitmap->GetHeightF()));
431 else // pBackgroundBitmap is null
433 pCanvas = __pButton->GetCanvasN();
436 SysLog(NID_UI_CTRL, "Cannot get a canvas.");
439 pCanvas->SetBackgroundColor(Color(0, 0, 0, 0));
442 if (pBackgroundEffectBitmap)
444 if (_BitmapImpl::CheckNinePatchedBitmapStrictly(*pBackgroundEffectBitmap)) // X, 9
446 if (__pButton->IsUserBackgroundEffectBitmap(status))
448 pCanvas->DrawNinePatchedBitmap(bounds, *pBackgroundEffectBitmap);
453 if (__pButton->IsUserBackgroundEffectBitmap(status))
455 pCanvas->DrawBitmap(bounds, *pBackgroundEffectBitmap,
456 FloatRectangle(0.0f, 0.0f, pBackgroundEffectBitmap->GetWidthF(), pBackgroundEffectBitmap->GetHeightF()));
462 pCanvas->FillRectangle(__pButton->GetColor(status), bounds);
466 else // nobody set bitmap (default bitmap draw) // if (__pButton->IsUserBackgroundBitmap(status))
468 pCanvas = __pButton->GetCanvasN();
471 SysLog(NID_UI_CTRL, "Cannot get a canvas.");
474 pCanvas->SetBackgroundColor(Color(0, 0, 0, 0));
477 if (status == _BUTTON_STATUS_DISABLED)
479 pBackgroundBitmap = __pButton->GetBackgroundBitmap(_BUTTON_STATUS_NORMAL);
481 if(!__pButton->IsUserBackgroundBitmap(_BUTTON_STATUS_NORMAL))
483 pBackgroundEffectBitmap = __pButton->GetBackgroundEffectBitmap(_BUTTON_STATUS_NORMAL);
486 pReplacementColorBackgroundBitmap =
487 _BitmapImpl::GetColorReplacedBitmapN(*pBackgroundBitmap, Color::GetColor(COLOR_ID_MAGENTA), __pButton->GetColor(_BUTTON_STATUS_DISABLED));
489 else if (status == _BUTTON_STATUS_HIGHLIGHTED)
491 pBackgroundBitmap = __pButton->GetBackgroundBitmap(_BUTTON_STATUS_NORMAL);
493 if(!__pButton->IsUserBackgroundBitmap(_BUTTON_STATUS_NORMAL))
495 pBackgroundEffectBitmap = __pButton->GetBackgroundEffectBitmap(_BUTTON_STATUS_NORMAL);
498 pReplacementColorBackgroundBitmap =
499 _BitmapImpl::GetColorReplacedBitmapN(*pBackgroundBitmap, Color::GetColor(COLOR_ID_MAGENTA), __pButton->GetColor(_BUTTON_STATUS_NORMAL));
501 pHighlightedBackgroundBitmap = __pButton->GetBackgroundBitmap(_BUTTON_STATUS_HIGHLIGHTED);
503 pHighlightedReplacementColorBackgroundBitmap = _BitmapImpl::GetColorReplacedBitmapN(*pHighlightedBackgroundBitmap,
504 Color::GetColor(COLOR_ID_MAGENTA), __pButton->GetColor(_BUTTON_STATUS_HIGHLIGHTED));
508 pBackgroundBitmap = __pButton->GetBackgroundBitmap(status);
509 pBackgroundEffectBitmap = __pButton->GetBackgroundEffectBitmap(status);
510 pReplacementColorBackgroundBitmap =
511 _BitmapImpl::GetColorReplacedBitmapN(*pBackgroundBitmap, Color::GetColor(COLOR_ID_MAGENTA), __pButton->GetColor(status));
514 if (pReplacementColorBackgroundBitmap)
516 if (_BitmapImpl::CheckNinePatchedBitmapStrictly(*pReplacementColorBackgroundBitmap))
518 if (pBackgroundEffectBitmap)
520 if (_BitmapImpl::CheckNinePatchedBitmapStrictly(*pBackgroundEffectBitmap))
522 pCanvas->DrawNinePatchedBitmap(bounds, *pReplacementColorBackgroundBitmap);
523 pCanvas->DrawNinePatchedBitmap(bounds, *pBackgroundEffectBitmap);
527 pCanvas->DrawNinePatchedBitmap(bounds, *pReplacementColorBackgroundBitmap);
528 pCanvas->DrawBitmap(bounds, *pBackgroundEffectBitmap,
529 FloatRectangle(0.0f, 0.0f, pBackgroundEffectBitmap->GetWidthF(), pBackgroundEffectBitmap->GetHeightF()));
534 pCanvas->DrawNinePatchedBitmap(bounds, *pReplacementColorBackgroundBitmap);
539 if (pBackgroundEffectBitmap)
541 if (_BitmapImpl::CheckNinePatchedBitmapStrictly(*pBackgroundEffectBitmap))
543 pCanvas->DrawBitmap(bounds, *pReplacementColorBackgroundBitmap,
544 FloatRectangle(0.0f, 0.0f, pReplacementColorBackgroundBitmap->GetWidthF(), pReplacementColorBackgroundBitmap->GetHeightF()));
545 pCanvas->DrawNinePatchedBitmap(bounds, *pBackgroundEffectBitmap);
549 pCanvas->DrawBitmap(bounds, *pReplacementColorBackgroundBitmap,
550 FloatRectangle(0.0f, 0.0f, pReplacementColorBackgroundBitmap->GetWidthF(), pReplacementColorBackgroundBitmap->GetHeightF()));
551 pCanvas->DrawBitmap(bounds, *pBackgroundEffectBitmap,
552 FloatRectangle(0.0f, 0.0f, pBackgroundEffectBitmap->GetWidthF(), pBackgroundEffectBitmap->GetHeightF()));
557 pCanvas->DrawBitmap(bounds, *pReplacementColorBackgroundBitmap,
558 FloatRectangle(0.0f, 0.0f, pReplacementColorBackgroundBitmap->GetWidthF(), pReplacementColorBackgroundBitmap->GetHeightF()));
564 if (pBackgroundEffectBitmap)
566 if (_BitmapImpl::CheckNinePatchedBitmapStrictly(*pBackgroundEffectBitmap))
568 pCanvas->DrawNinePatchedBitmap(bounds, *pBackgroundEffectBitmap);
572 pCanvas->DrawBitmap(bounds, *pBackgroundEffectBitmap,
573 FloatRectangle(0.0f, 0.0f, pBackgroundEffectBitmap->GetWidthF(), pBackgroundEffectBitmap->GetHeightF()));
578 if (status == _BUTTON_STATUS_DISABLED)
580 pCanvas->FillRectangle(__pButton->GetColor(_BUTTON_STATUS_NORMAL), bounds);
584 pCanvas->FillRectangle(__pButton->GetColor(status), bounds);
589 if (pHighlightedReplacementColorBackgroundBitmap)
591 if (_BitmapImpl::CheckNinePatchedBitmapStrictly(*pHighlightedReplacementColorBackgroundBitmap))
593 pCanvas->DrawNinePatchedBitmap(bounds, *pHighlightedReplacementColorBackgroundBitmap);
597 pCanvas->DrawBitmap(bounds, *pHighlightedReplacementColorBackgroundBitmap,
598 FloatRectangle(0.0f, 0.0f, pHighlightedReplacementColorBackgroundBitmap->GetWidthF(), pHighlightedReplacementColorBackgroundBitmap->GetHeightF()));
603 if (!__pButton->IsUserBackgroundBitmap(status))
605 __pButton->UnloadBackgroundBitmap(status);
608 if (!__pButton->IsUserBackgroundEffectBitmap(status))
610 __pButton->UnloadBackgroundEffectBitmap(status);
618 delete pReplacementColorBackgroundBitmap;
624 _ButtonPresenter::DrawToolbarItemBackground(void)
626 float leftTouchMargin = __pButton->GetLeftTouchMarginF();
627 float topTouchMargin = __pButton->GetTopTouchMarginF();
628 float rightTouchMargin = __pButton->GetRightTouchMarginF();
629 float bottomTouchMargin = __pButton->GetBottomTouchMarginF();
631 _ButtonStatus status = __pButton->GetButtonStatus();
632 Bitmap* pToolbarItemBackgroundBitmap = __pButton->GetToolbarItemBackgroundBitmap(status);
634 if (pToolbarItemBackgroundBitmap)
636 Canvas* pCanvas = __pButton->GetCanvasN();
640 SysLog(NID_UI_CTRL, "Cannot get a canvas.");
644 pCanvas->SetBackgroundColor(Color(0, 0, 0, 0));
647 FloatRectangle bounds(leftTouchMargin, topTouchMargin, __pButton->GetBoundsF().width - (leftTouchMargin + rightTouchMargin),
648 __pButton->GetBoundsF().height - (topTouchMargin + bottomTouchMargin));
650 if (_BitmapImpl::CheckNinePatchedBitmapStrictly(*pToolbarItemBackgroundBitmap))
652 pCanvas->DrawNinePatchedBitmap(bounds, *pToolbarItemBackgroundBitmap);
656 pCanvas->DrawBitmap(bounds, *pToolbarItemBackgroundBitmap,
657 FloatRectangle(0.0f, 0.0f, pToolbarItemBackgroundBitmap->GetWidthF(), pToolbarItemBackgroundBitmap->GetHeightF()));
667 _ButtonPresenter::DrawBitmap(void)
669 Canvas* pCanvas = null;
671 _ButtonStatus status = __pButton->GetButtonStatus();
673 Bitmap* pBitmap = __pButton->GetBitmap(status);
674 Bitmap* pNormalBitmap = __pButton->GetBitmap(_BUTTON_STATUS_NORMAL);
676 Bitmap* pEffectBitmap = __pButton->GetEffectBitmap(status);
677 Bitmap* pNormalEffectBitmap = __pButton->GetEffectBitmap(_BUTTON_STATUS_NORMAL);
679 float leftTouchMargin = __pButton->GetLeftTouchMarginF();
680 float topTouchMargin = __pButton->GetTopTouchMarginF();
681 float rightTouchMargin = __pButton->GetRightTouchMarginF();
682 float bottomTouchMargin = __pButton->GetBottomTouchMarginF();
684 FloatRectangle bounds(leftTouchMargin, topTouchMargin, __pButton->GetBoundsF().width - (leftTouchMargin + rightTouchMargin),
685 __pButton->GetBoundsF().height - (topTouchMargin + bottomTouchMargin));
689 pCanvas = __pButton->GetCanvasN();
693 SysLog(NID_UI_CTRL, "Cannot get a canvas.");
697 if (__pButton->GetSizeF().width - __pButton->GetBitmapPositionF(status).x - rightTouchMargin < pBitmap->GetWidthF()
698 || __pButton->GetSizeF().height - __pButton->GetBitmapPositionF(status).y - bottomTouchMargin < pBitmap->GetHeightF())
700 pCanvas->DrawBitmap(bounds, *pBitmap, FloatRectangle(0.0f, 0.0f, pBitmap->GetWidthF(), pBitmap->GetHeightF()));
704 pCanvas->DrawBitmap(bounds, *pEffectBitmap,
705 FloatRectangle(0.0f, 0.0f, pEffectBitmap->GetWidthF(), pEffectBitmap->GetHeightF()));
710 pCanvas->DrawBitmap(__pButton->GetBitmapPositionF(status), *pBitmap);
714 pCanvas->DrawBitmap(__pButton->GetEffectBitmapPositionF(status), *pEffectBitmap);
718 else if (pNormalBitmap)
720 pCanvas = __pButton->GetCanvasN();
724 SysLog(NID_UI_CTRL, "Cannot get a canvas.");
728 if (__pButton->GetSizeF().width - __pButton->GetBitmapPositionF(_BUTTON_STATUS_NORMAL).x - rightTouchMargin < pNormalBitmap->GetWidthF()
729 || __pButton->GetSizeF().height - __pButton->GetBitmapPositionF(_BUTTON_STATUS_NORMAL).y - bottomTouchMargin < pNormalBitmap->GetHeightF())
731 pCanvas->DrawBitmap(bounds, *pNormalBitmap, FloatRectangle(0.0f, 0.0f, pNormalBitmap->GetWidthF(), pNormalBitmap->GetHeightF()));
733 if (pNormalEffectBitmap)
735 pCanvas->DrawBitmap(bounds, *pNormalEffectBitmap, FloatRectangle(0.0f, 0.0f, pNormalEffectBitmap->GetWidthF(), pNormalEffectBitmap->GetHeightF()));
740 pCanvas->DrawBitmap(__pButton->GetBitmapPositionF(_BUTTON_STATUS_NORMAL), *pNormalBitmap);
742 if (pNormalEffectBitmap)
744 pCanvas->DrawBitmap(__pButton->GetEffectBitmapPositionF(_BUTTON_STATUS_NORMAL), *pNormalEffectBitmap);
755 _ButtonPresenter::DrawText(void)
757 //TextSimple* pSimpleText = null;
758 TextObjectAlignment horizontalAlign = TEXT_OBJECT_ALIGNMENT_CENTER;
759 TextObjectAlignment verticalAlign = TEXT_OBJECT_ALIGNMENT_MIDDLE;
761 float leftMargin = __pButton->GetLeftMarginF();
762 float topMargin = __pButton->GetTopMarginF();
763 float rightMargin = __pButton->GetRightMarginF();
764 float bottomMargin = __pButton->GetBottomMarginF();
766 float leftTouchMargin = __pButton->GetLeftTouchMarginF();
767 float topTouchMargin = __pButton->GetTopTouchMarginF();
768 float rightTouchMargin = __pButton->GetRightTouchMarginF();
769 float bottomTouchMargin = __pButton->GetBottomTouchMarginF();
771 Canvas* pCanvas = __pButton->GetCanvasN();
774 SysLog(NID_UI_CTRL, "Cannot get a canvas.");
778 switch (__pButton->GetTextHorizontalAlignment())
781 horizontalAlign = TEXT_OBJECT_ALIGNMENT_LEFT;
783 case ALIGNMENT_CENTER:
784 horizontalAlign = TEXT_OBJECT_ALIGNMENT_CENTER;
787 horizontalAlign = TEXT_OBJECT_ALIGNMENT_RIGHT;
790 switch (__pButton->GetTextVerticalAlignment())
793 verticalAlign = TEXT_OBJECT_ALIGNMENT_TOP;
795 case ALIGNMENT_MIDDLE:
796 verticalAlign = TEXT_OBJECT_ALIGNMENT_MIDDLE;
799 verticalAlign = TEXT_OBJECT_ALIGNMENT_BOTTOM;
802 //__pTextObject->RemoveAll(true);
803 //pSimpleText = new (std::nothrow) TextSimple(const_cast<wchar_t*>(__pButton->GetText().GetPointer()), __pButton->GetText().GetLength());
804 //__pTextObject->AppendElement(*pSimpleText);
806 if (__pButton->UserDefinedText())
808 __pTextObject->SetBounds(__pButton->GetUserDefinedTextAreaF());
812 __pTextObject->SetBounds(FloatRectangle(leftMargin + leftTouchMargin, topMargin + topTouchMargin,
813 __pButton->GetBoundsF().width - (leftMargin + rightMargin) - (leftTouchMargin + rightTouchMargin),
814 __pButton->GetBoundsF().height - (topMargin + bottomMargin) - (topTouchMargin + bottomTouchMargin)));
816 __pTextObject->SetAlignment(horizontalAlign | verticalAlign);
818 __pTextObject->SetFont(__pFont, 0, __pTextObject->GetTextLength());
819 __pTextObject->Compose();
821 float fontSize = 0.0f;
823 if (__pTextObject->GetTotalLineCount() >= 2)
825 fontSize = __pButton->GetMultilineTextSizeF();
826 SetTextSize(fontSize);
828 __pTextObject->SetFont(__pFont, 0, __pTextObject->GetTextLength());
829 __pTextObject->Compose();
832 __pTextObject->SetForegroundColor(__pButton->GetTextColor(__pButton->GetButtonStatus()), 0, __pTextObject->GetTextLength());
833 __pTextObject->Draw(*_CanvasImpl::GetInstance(*pCanvas));
841 _ButtonPresenter::DrawUnderlineBitmap(void)
843 float selectedBitmapMargin = 0.0f;
844 float selectedBitmapHeight = 0.0f;
845 float segmentedHeight = 0.0f;
847 float leftTouchMargin = __pButton->GetLeftTouchMarginF();
848 float rightTouchMargin = __pButton->GetRightTouchMarginF();
849 float bottomTouchMargin = __pButton->GetBottomTouchMarginF();
851 GET_SHAPE_CONFIG(HEADER::HEADER_ITEM_SELECTED_BITMAP_MARGIN, __pButton->GetOrientation(), selectedBitmapMargin);
852 GET_SHAPE_CONFIG(HEADER::HEADER_ITEM_SELECTED_BITMAP_HEIGHT, __pButton->GetOrientation(), selectedBitmapHeight);
853 GET_SHAPE_CONFIG(HEADER::SEGMENTED_ITEM_HEIGHT, __pButton->GetOrientation(), segmentedHeight);
855 Bitmap* pUnderlineBitmap = __pButton->GetUnderlineBitmap();
857 if (pUnderlineBitmap)
859 Canvas* pCanvas = __pButton->GetCanvasN();
863 SysLog(NID_UI_CTRL, "Cannot get a canvas.");
867 FloatRectangle bounds(selectedBitmapMargin + leftTouchMargin,
868 __pButton->GetBoundsF().height - bottomTouchMargin - selectedBitmapHeight,
869 __pButton->GetBoundsF().width - selectedBitmapMargin * 2 - (leftTouchMargin + rightTouchMargin), selectedBitmapHeight);
871 if (_BitmapImpl::CheckNinePatchedBitmapStrictly(*pUnderlineBitmap))
873 pCanvas->DrawNinePatchedBitmap(bounds, *pUnderlineBitmap);
877 pCanvas->DrawBitmap(bounds, *pUnderlineBitmap,
878 FloatRectangle(0.0f, 0.0f, pUnderlineBitmap->GetWidthF(), pUnderlineBitmap->GetHeightF()));
888 _ButtonPresenter::OnTouchPressed(const _Control& source, const _TouchInfo& touchinfo)
890 if (&source != __pButton)
895 if (!__pButton->IsEnabled())
900 if (__pButton->GetButtonStyle() == _BUTTON_STYLE_SEGMENT)
905 __touchMoveHandled = false;
906 //_ButtonStatus status = __pButton->GetButtonStatus();
908 //if (status != _BUTTON_STATUS_SELECTED)
910 __pButton->SetButtonStatus(_BUTTON_STATUS_PRESSED);
920 _ButtonPresenter::OnTouchReleased(const _Control& source, const _TouchInfo& touchinfo)
922 if (&source != __pButton)
927 if (!__pButton->IsEnabled())
932 if (__pButton->GetButtonStyle() == _BUTTON_STYLE_SEGMENT)
937 _ButtonStatus status = __pButton->GetButtonStatus();
939 if (status == _BUTTON_STATUS_NORMAL)
944 FloatPoint touchPoint = touchinfo.GetCurrentPosition();
946 touchPoint.x += source.GetClientBoundsF().x;
947 touchPoint.y += source.GetClientBoundsF().y;
949 FloatRectangle bounds = __pButton->GetClientBoundsF();
951 __pButton->SetButtonStatus(_BUTTON_STATUS_NORMAL);
952 __pButton->Invalidate();
954 if (bounds.Contains(touchPoint))
956 PLAY_FEEDBACK(_RESOURCE_FEEDBACK_PATTERN_TAP, __pButton);
958 __pButton->FireActionEvent();
965 _ButtonPresenter::OnTouchMoved(const _Control& source, const _TouchInfo& touchinfo)
967 if (&source != __pButton)
972 if (!__pButton->IsEnabled())
977 if (__pButton->GetButtonStyle() == _BUTTON_STYLE_SEGMENT)
982 FloatPoint touchPoint = touchinfo.GetCurrentPosition();
984 touchPoint.x += source.GetClientBoundsF().x;
985 touchPoint.y += source.GetClientBoundsF().y;
987 FloatRectangle bounds = __pButton->GetClientBoundsF();
988 bool isInButtonArea = bounds.Contains(touchPoint);
989 _ButtonStatus oldStatus = __pButton->GetButtonStatus();
991 if (isInButtonArea && (__touchMoveHandled != true))
993 __pButton->SetButtonStatus(_BUTTON_STATUS_PRESSED);
997 __pButton->SetButtonStatus(_BUTTON_STATUS_NORMAL);
1000 if (__pButton->GetButtonStatus() != oldStatus)
1002 __pButton->Invalidate();
1009 _ButtonPresenter::OnTouchCanceled(const _Control& source, const _TouchInfo& touchinfo)
1011 if (&source != __pButton)
1016 if (!__pButton->IsEnabled())
1021 if (__pButton->GetButtonStyle() == _BUTTON_STYLE_SEGMENT)
1026 __pButton->SetButtonStatus(_BUTTON_STATUS_NORMAL);
1027 __pButton->Invalidate();
1033 _ButtonPresenter::OnTouchMoveHandled(const _Control& control)
1035 if (__touchMoveHandled == false)
1037 __touchMoveHandled = true;
1038 __pButton->SetButtonStatus(_BUTTON_STATUS_NORMAL);
1039 __pButton->Invalidate();
1046 _ButtonPresenter::OnKeyPressed(const _Control& source, const _KeyInfo& keyInfo)
1052 _ButtonPresenter::OnKeyReleased(const _Control& source, const _KeyInfo& keyInfo)
1054 _KeyCode keyCode = keyInfo.GetKeyCode();
1056 if (__pButton->IsFocusModeStateEnabled() == true && keyCode == _KEY_ENTER)
1058 __pButton->SetButtonStatus(_BUTTON_STATUS_HIGHLIGHTED);
1065 _ButtonPresenter::OnAncestorEnableStateChanged(const _Control& control)
1067 if (!__pButton->IsEnabled())
1072 if (__pButton->GetButtonStatus() == _BUTTON_STATUS_PRESSED)
1074 __pButton->SetButtonStatus(_BUTTON_STATUS_NORMAL);
1075 __pButton->Invalidate();
1082 _ButtonPresenter::OnDrawFocus(void)
1084 if (__pButton->IsFocusModeStateEnabled() == false)
1086 __focusPrevStatus = __pButton->GetButtonStatus();
1087 __pButton->SetButtonStatus(_BUTTON_STATUS_HIGHLIGHTED, false);
1088 __pButton->Invalidate();
1095 _ButtonPresenter::OnChildControlFocusMoved(const _Control& control)
1101 _ButtonPresenter::IsChildControlFocusManage(void) const
1107 _ButtonPresenter::OnFocusableStateChanged(bool focusalbeState)
1113 _ButtonPresenter::OnFocusModeStateChanged(void)
1115 __pButton->SetButtonStatus(__focusPrevStatus);
1116 __pButton->Invalidate();
1122 _ButtonPresenter::OnFocusGained(const _Control& source)
1124 if (__pButton->IsFocusModeStateEnabled() == true)
1126 __focusPrevStatus = __pButton->GetButtonStatus();
1127 __pButton->SetButtonStatus(_BUTTON_STATUS_HIGHLIGHTED, false);
1128 __pButton->Invalidate();
1135 _ButtonPresenter::OnFocusLost(const _Control& source)
1137 __pButton->SetButtonStatus(__focusPrevStatus);
1138 __pButton->Invalidate();
1144 _ButtonPresenter::IsEnabledStateChanged(void)
1146 bool __currentEnabledState = __pButton->GetEnableState();
1149 if (__currentEnabledState != __previousEnabledState)
1151 __previousEnabledState = __currentEnabledState;
1159 _ButtonPresenter::OnCanvasRequestedN(const FloatRectangle& bounds)
1161 Canvas* pCanvas = null;
1163 if (__lazyDecode == true)
1165 Bitmap* pBackgroundBitmap = null;
1166 _ButtonStatus status = __pButton->GetButtonStatus();
1168 if (__pButton->IsUserBackgroundBitmap(status))
1170 if (status == _BUTTON_STATUS_HIGHLIGHTED)
1172 pBackgroundBitmap = __pButton->GetBackgroundBitmap(_BUTTON_STATUS_NORMAL);
1176 pBackgroundBitmap = __pButton->GetBackgroundBitmap(status);
1180 if (pBackgroundBitmap != null)
1182 pBackgroundBitmap->IsNinePatchedBitmap();
1187 pCanvas = __pButton->GetCanvasN();
1194 _ButtonPresenter::ShowUnderlineBitmap(bool show)
1196 __showUnderlineBitmap = show;
1201 }}} // Tizen::Ui::Controls