Fix for issue about popup
[framework/osp/web.git] / src / controls / FWebCtrl_WebPopup.cpp
1 //
2 // Open Service Platform
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
4 //
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
8 //
9 //     http://www.apache.org/licenses/LICENSE-2.0
10 //
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
16 //
17
18 /**
19  * @file                FWebCtrl_WebPopup.cpp
20  * @brief               The file contains the definition of _WebPopup class.
21  */
22 #include <FBaseColIList.h>
23 #include <FBaseSysLog.h>
24 #include <FUiCtrlButton.h>
25 #include <FUiCtrlPanel.h>
26 #include <FUiVerticalBoxLayout.h>
27 #include <FUi_ResourceManager.h>
28 #include "FWebCtrl_WebManager.h"
29 #include "FWebCtrl_WebPopup.h"
30
31
32 using namespace Tizen::Base;
33 using namespace Tizen::Base::Collection;
34 using namespace Tizen::Graphics;
35 using namespace Tizen::Io;
36 using namespace Tizen::Ui;
37 using namespace Tizen::Ui::Controls;
38
39
40 namespace Tizen { namespace Web { namespace Controls
41 {
42
43 std::unique_ptr<_WebPopupData> _WebPopup::__pWebPopupData(null);
44
45 _WebPopup::_WebPopup(void)
46         : __isModal(false)
47         , __modal(0)
48 {
49 }
50
51
52 _WebPopup::~_WebPopup(void)
53 {
54         if (IsModalPopup())
55         {
56                 HidePopup();
57         }
58         __pWebPopupData.reset();
59 }
60
61
62 result
63 _WebPopup::Construct(bool hasTitle, const Dimension& popupDim)
64 {
65         VerticalBoxLayout layout;
66
67         Dimension dim(popupDim);
68         dim.height += __pWebPopupData->bottomMargin;
69
70         if (hasTitle)
71         {
72                 dim.height += __pWebPopupData->titleHeight;
73         }
74
75         result r = layout.Construct(VERTICAL_DIRECTION_DOWNWARD);
76         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
77
78         r = Popup::Construct(layout, layout, hasTitle, dim);
79         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
80
81         return E_SUCCESS;
82 }
83
84
85 void
86 _WebPopup::OnActionPerformed(const Control& source, int actionId)
87 {
88         switch (actionId)
89         {
90         case ID_BUTTON_COMMON_CLOSE:
91                 HidePopup();
92                 break;
93         default:
94                 SysAssertf(false, "unknown action ID used");
95                 break;
96         }
97
98         delete this;
99 }
100
101
102 result
103 _WebPopup::ShowPopup(void)
104 {
105         result r = E_SUCCESS;
106
107         r = SetShowState(true);
108         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
109
110         r = Show();
111         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
112
113         return E_SUCCESS;
114 }
115
116
117 result
118 _WebPopup::HidePopup(int modalResult)
119 {
120         result r = E_SUCCESS;
121
122         r = SetShowState(false);
123         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
124
125         if (__isModal)
126         {
127                 _WebManager* pWebManager = _WebManager::GetInstance();
128                 pWebManager->RemoveActivePopup(this);
129
130                 __modal = modalResult;
131                 __isModal = false;
132
133                 return EndModal(__modal);
134         }
135
136         return E_SUCCESS;
137 }
138
139
140 result
141 _WebPopup::ShowAndWait(int& modalResult)
142 {
143         _WebManager* pWebManager = _WebManager::GetInstance();
144         pWebManager->SetActivePopup(this);
145
146         __isModal = true;
147
148         return DoModal(modalResult);
149 }
150
151
152 Panel*
153 _WebPopup::CreateAndAddPanel(void)
154 {
155         std::unique_ptr<Panel> pPanel(new (std::nothrow) Panel());
156         SysTryReturn(NID_WEB_CTRL, pPanel.get(), null, E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
157
158         Rectangle panelRect(0, 0, __pWebPopupData->popupDim.width, __pWebPopupData->btnDim.height);
159
160         result r = pPanel->Construct(panelRect);
161         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
162
163         r = AddControl(*pPanel);
164         SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, null, r, "[%s] Propagating.", GetErrorMessage(r));
165
166         return pPanel.release();
167 }
168
169
170 result
171 _WebPopup::CreateAndAddButtons(const IList& buttonIds, const IList& buttonTitles, Panel* pPanel)
172 {
173         SysTryReturnResult(NID_WEB_CTRL, pPanel, E_INVALID_ARG, "[%s] Panel Pointer is null.", GetErrorMessage(E_INVALID_ARG));
174
175         _WebPopup* pParent = dynamic_cast<_WebPopup*>(pPanel->GetParent());
176         SysTryReturnResult(NID_WEB_CTRL, pParent == this, E_INVALID_ARG, "[E_INVALID_ARG] Panel not attached to popup.");
177
178         int idCount = buttonIds.GetCount();
179         int titleCount = buttonTitles.GetCount();
180         SysTryReturnResult(NID_WEB_CTRL, idCount > 0 && titleCount > 0 && idCount == titleCount, E_INVALID_DATA, "[E_INVALID_DATA] mismatch in count of Ids and Ttitles.");
181
182         int buttonMargin = __pWebPopupData->spacePad/2;
183         int buttonWidth = (__pWebPopupData->popupDim.width - buttonMargin*(idCount+1)) / idCount;
184
185         result r = E_SUCCESS;
186         for (int i = 0; i < idCount; i++)
187         {
188                 const Integer* pButtonId = static_cast<const Integer*>(buttonIds.GetAt(i));
189                 const String* pButtonTitle = static_cast<const String*>(buttonTitles.GetAt(i));
190                 SysTryReturn(NID_WEB_CTRL, pButtonId && pButtonTitle, r = GetLastResult(), r, "[%s] Propagating.", GetErrorMessage(r));
191
192                 //Create button
193                 std::unique_ptr<Button> pButton(new (std::nothrow) Button());
194                 SysTryReturnResult(NID_WEB_CTRL, pButton.get(), E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory Allocation failed.");
195
196                 r = pButton->Construct(Rectangle((buttonMargin*(i+1))+(buttonWidth*i), 0, buttonWidth, __pWebPopupData->btnDim.height), *pButtonTitle);
197                 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
198
199                 pButton->SetActionId(pButtonId->ToInt());
200
201                 //Add button to panel
202                 r = pPanel->AddControl(*pButton);
203                 SysTryReturn(NID_WEB_CTRL, r == E_SUCCESS, r, r, "[%s] Propagating.", GetErrorMessage(r));
204
205                 pButton->AddActionEventListener(*this);
206                 pButton.release();
207         }
208
209         return r;
210 }
211
212
213 bool
214 _WebPopup::IsModalPopup(void)
215 {
216         return __isModal;
217 }
218
219
220 _WebPopupData*
221 _WebPopup::GetPopupData(bool refresh)
222 {
223         if (!refresh && __pWebPopupData.get())
224         {
225                 return __pWebPopupData.get();
226         }
227
228         __pWebPopupData.reset();
229
230         __pWebPopupData = std::unique_ptr<_WebPopupData> (new (std::nothrow) _WebPopupData());
231         SysTryReturn(NID_WEB_CTRL, __pWebPopupData.get(), null, E_OUT_OF_MEMORY, "[%s] Memory Allocation failed.", GetErrorMessage(E_OUT_OF_MEMORY));
232
233         _ControlOrientation orientation = _CONTROL_ORIENTATION_PORTRAIT;
234
235         GET_SHAPE_CONFIG(MESSAGEBOX::DEFAULT_WIDTH, orientation, __pWebPopupData->popupDim.width);
236         GET_SHAPE_CONFIG(MESSAGEBOX::MAX_HEIGHT, orientation, __pWebPopupData->popupDim.height);
237         GET_SHAPE_CONFIG(POPUP::SIDE_BORDER, orientation, __pWebPopupData->sideMargin);
238         GET_SHAPE_CONFIG(POPUP::BOTTOM_BORDER, orientation, __pWebPopupData->bottomMargin);
239         GET_SHAPE_CONFIG(POPUP::TITLE_HEIGHT, orientation, __pWebPopupData->titleHeight);
240
241         GET_SHAPE_CONFIG(MESSAGEBOX::BUTTON_HEIGHT, orientation, __pWebPopupData->btnDim.height);
242         GET_SHAPE_CONFIG(MESSAGEBOX::BUTTON_SIDE_MARGIN_02, orientation, __pWebPopupData->spacePad);
243
244         GET_SHAPE_CONFIG(LABEL::TEXT_FONT_SIZE, orientation, __pWebPopupData->labelFontSize);
245         GET_DIMENSION_CONFIG(CHECKBUTTON::MIN_DIMENSION, orientation, __pWebPopupData->checkDim);
246
247         GET_DIMENSION_CONFIG(EDIT::MIN_SIZE, orientation, __pWebPopupData->editDim);
248
249         __pWebPopupData->labelDim.width = __pWebPopupData->popupDim.width - 2*__pWebPopupData->sideMargin;
250         __pWebPopupData->labelDim.height = 3*__pWebPopupData->labelFontSize;
251
252         return __pWebPopupData.get();
253 }
254
255
256 result
257 _WebPopup::OnTerminating(void)
258 {
259         return E_SUCCESS;
260 }
261
262
263 }}} // Tizen::Web::Controls