fixed bug (TapGesture improvement)
[platform/framework/native/uifw.git] / src / ui / controls / FUiCtrl_Gallery.cpp
1 //
2 // Open Service Platform
3 // Copyright (c) 2012-2013 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 #include <FBaseString.h>
18 #include <FGrpColor.h>
19 #include "FUi_AccessibilityContainer.h"
20 #include "FUi_AccessibilityElement.h"
21 #include "FUi_AccessibilityManager.h"
22 #include "FUi_CoordinateSystemUtils.h"
23 #include "FUi_ResourceManager.h"
24 #include "FUi_TouchFlickGestureDetector.h"
25 #include "FUi_TouchTapGestureDetector.h"
26 #include "FUi_TouchPinchGestureDetector.h"
27 #include "FUiCtrl_Gallery.h"
28 #include "FUiCtrl_GalleryBitmap.h"
29 #include "FUiCtrl_GalleryPresenter.h"
30 #include "FUiCtrl_GalleryRenderer.h"
31 #include "FUiCtrl_GalleryRendererNotification.h"
32 #include "FUiCtrl_GalleryViewEventInfo.h"
33 #include "FUiCtrl_GalleryViewEvent.h"
34 #include "FUiCtrl_IGalleryCoreEventListener.h"
35 #include "FUiCtrl_IGalleryRendererNotiListener.h"
36
37 using namespace Tizen::Base;
38 using namespace Tizen::Graphics;
39 using namespace Tizen::Ui::Effects;
40
41 namespace Tizen { namespace Ui { namespace Controls {
42
43 _Gallery::_Gallery(void)
44         : __pRenderer(null)
45         , __pPresenter(null)
46         , __modelInitialized(false)
47         , __pGalleryImageElement(null)
48 {
49         _AccessibilityContainer* pContainer = GetAccessibilityContainer();
50         if (pContainer != null)
51         {
52                 pContainer->Activate(true);
53         }
54 }
55
56 _Gallery::~_Gallery(void)
57 {
58         result r = __flickGesture.RemoveGestureListener(*this);
59         if (r != E_SUCCESS)
60         {
61                 SetLastResult(r);
62                 SysAssert(false);
63         }
64
65         r = RemoveGestureDetector(__flickGesture);
66         if (r != E_SUCCESS)
67         {
68                 SetLastResult(r);
69                 SysAssert(false);
70         }
71
72         r = __oneTapGesture.RemoveGestureListener(*this);
73         if (r != E_SUCCESS)
74         {
75                 SetLastResult(r);
76                 SysAssert(false);
77         }
78
79         r = RemoveGestureDetector(__oneTapGesture);
80         if (r != E_SUCCESS)
81         {
82                 SetLastResult(r);
83                 SysAssert(false);
84         }
85
86         r = __twoTapGesture.RemoveGestureListener(*this);
87         if (r != E_SUCCESS)
88         {
89                 SetLastResult(r);
90                 SysAssert(false);
91         }
92
93         r = RemoveGestureDetector(__twoTapGesture);
94         if (r != E_SUCCESS)
95         {
96                 SetLastResult(r);
97                 SysAssert(false);
98         }
99
100         r = __pinchGesture.RemoveGestureListener(*this);
101         if (r != E_SUCCESS)
102         {
103                 SetLastResult(r);
104                 SysAssert(false);
105         }
106
107         r = RemoveGestureDetector(__pinchGesture);
108         if (r != E_SUCCESS)
109         {
110                 SetLastResult(r);
111                 SysAssert(false);
112         }
113
114         RemoveGalleryAccessibilityElements();
115
116         delete __pRenderer;
117         delete __pPresenter;
118 }
119
120 _Gallery*
121 _Gallery::CreateGalleryN(_GalleryItemProviderAdaptorImpl* pGalleryItemProviderAdaptor)
122 {
123         result r = E_SUCCESS;
124         ClearLastResult();
125
126         _Gallery* pGallery = new (std::nothrow) _Gallery();
127         SysTryCatch(NID_UI_CTRL, pGallery != null, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Failed to allocate the memory for the _Gallery.");
128
129         r = pGallery->Construct(pGalleryItemProviderAdaptor);
130         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
131
132         SetLastResult(E_SUCCESS);
133
134         return pGallery;
135
136 CATCH:
137         delete pGallery;
138
139         return null;
140 }
141
142 result
143 _Gallery::Construct(_GalleryItemProviderAdaptorImpl* pGalleryItemProviderAdaptor)
144 {
145         result r = E_SUCCESS;
146         _GalleryRenderer* pRenderer = null;
147         _GalleryPresenter* pPresenter = null;
148
149         pRenderer = _GalleryRenderer::CreateGalleryRendererN((Tizen::Ui::_Control&)*this);
150         SysTryCatch(NID_UI_CTRL, pRenderer != null, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Failed to create the _GalleryRenderer.");
151
152         pPresenter = _GalleryPresenter::CreateGalleryPresenterN((_IGalleryRenderer&)*pRenderer, pGalleryItemProviderAdaptor, this);
153         SysTryCatch(NID_UI_CTRL, pPresenter != null, r = E_SYSTEM, E_SYSTEM, "[E_SYSTEM] Failed to create the _GalleryPresenter.");
154
155         r = pRenderer->AddNotiListener(*pPresenter);
156         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
157
158         AcquireHandle();
159
160         r = __flickGesture.AddGestureListener(*this);
161         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
162
163         r = _Control::AddGestureDetector(__flickGesture);
164         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
165
166         r = __oneTapGesture.AddGestureListener(*this);
167         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
168
169         __oneTapGesture.SetTapCount(1);
170         r = _Control::AddGestureDetector(__oneTapGesture);
171         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
172
173         r = __twoTapGesture.AddGestureListener(*this);
174         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
175
176         __twoTapGesture.SetTapCount(2);
177         r = _Control::AddGestureDetector(__twoTapGesture);
178         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
179
180         __oneTapGesture.StartOnFailureOf(__twoTapGesture);
181
182         SetMultiTouchEnabled(true);
183         r = _Control::AddGestureDetector(__pinchGesture);
184         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
185
186         r = __pinchGesture.AddGestureListener(*this);
187         SysTryCatch(NID_UI_CTRL, r == E_SUCCESS, , r, "[%s] Propagating.", GetErrorMessage(r));
188
189         SetRenderer((_GalleryRenderer &)*pRenderer);
190         SetPresenter((_GalleryPresenter &)*pPresenter);
191
192         return E_SUCCESS;
193
194 CATCH:
195         delete pRenderer;
196         delete pPresenter;
197
198         return r;
199 }
200
201 // presenter access
202 result
203 _Gallery::SetTextOfEmptyGallery(const String& text)
204 {
205         return GetPresenter().SetTextOfEmptyGallery(text);
206 }
207
208 String
209 _Gallery::GetTextOfEmptyGallery(void) const
210 {
211         return GetPresenter().GetTextOfEmptyGallery();
212 }
213
214 result
215 _Gallery::SetBitmapOfEmptyGallery(const _GalleryBitmap* pBitmap)
216 {
217         return GetPresenter().SetBitmapOfEmptyGallery(pBitmap);
218 }
219
220 result
221 _Gallery::SetCoreEventListener(const _IGalleryCoreEventListener& coreEventListener)
222 {
223         return GetPresenter().SetCoreEventListener(coreEventListener);
224 }
225
226 result
227 _Gallery::RemoveCoreEventListener(const _IGalleryCoreEventListener& coreEventListener)
228 {
229         return GetPresenter().RemoveCoreEventListener(coreEventListener);
230 }
231
232 result
233 _Gallery::SetZoomingEnabled(bool enable)
234 {
235         return GetPresenter().SetZoomingEnabled(enable);
236 }
237
238 bool
239 _Gallery::IsZoomingEnabled(void) const
240 {
241         return GetPresenter().IsZoomingEnabled();
242 }
243
244 result
245 _Gallery::SetSlideShowType(_GallerySlideShowType slideShowType)
246 {
247         return GetPresenter().SetSlideShowType(slideShowType);
248 }
249
250 _GallerySlideShowType
251 _Gallery::GetSlideShowType(void) const
252 {
253         return GetPresenter().GetSlideShowType();
254 }
255
256 result
257 _Gallery::SetSlideShowAnimationDuration(int duration)
258 {
259         return GetPresenter().SetSlideShowAnimationDuration(duration);
260 }
261
262 int
263 _Gallery::GetSlideShowAnimationDuration(void) const
264 {
265         return GetPresenter().GetSlideShowAnimationDuration();
266 }
267
268 result
269 _Gallery::SetSlideShowViewDuration(int duration)
270 {
271         return GetPresenter().SetSlideShowViewDuration(duration);
272 }
273
274 int
275 _Gallery::GetSlideShowViewDuration(void) const
276 {
277         return GetPresenter().GetSlideShowViewDuration();
278 }
279
280 result
281 _Gallery::StartSlideShow(bool repeat)
282 {
283         return GetPresenter().StartSlideShow(repeat);
284 }
285
286 result
287 _Gallery::StopSlideShow(void)
288 {
289         return GetPresenter().StopSlideShow();
290 }
291
292 bool
293 _Gallery::IsSlideShowStarted(void) const
294 {
295         return GetPresenter().IsSlideShowStarted();
296 }
297
298 // model access
299 result
300 _Gallery::SetCurrentItemIndex(int itemIndex)
301 {
302         return GetPresenter().SetCurrentItem(itemIndex);
303 }
304
305 int
306 _Gallery::GetCurrentItemIndex(void) const
307 {
308         return GetPresenter().GetCurrentItemIndex();
309 }
310
311 int
312 _Gallery::GetItemCount(void) const
313 {
314         return GetPresenter().GetItemCount();
315 }
316
317 result
318 _Gallery::RequestToLoadItem(int itemIndex)
319 {
320         SysTryReturnResult(NID_UI_CTRL, __modelInitialized == true, E_INVALID_OPERATION, "Does not call to first draw.");
321         result r = GetPresenter().RequestToLoadItem(itemIndex);
322         SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "[%s] Propagation.", GetErrorMessage(r));
323
324         InitializeAccessibilityElement();
325
326         return E_SUCCESS;
327 }
328
329 result
330 _Gallery::RequestToUnloadItem(int itemIndex)
331 {
332         SysTryReturnResult(NID_UI_CTRL, __modelInitialized == true, E_INVALID_OPERATION, "Does not call to first draw.");
333         result r = GetPresenter().RequestToUnloadItem(itemIndex);
334         SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "[%s] Propagation.", GetErrorMessage(r));
335
336         InitializeAccessibilityElement();
337
338         return E_SUCCESS;
339 }
340
341 result
342 _Gallery::RequestToUnloadAllItems(void)
343 {
344         result r = GetPresenter().RequestToUnloadAllItems();
345         SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "[%s] Propagation.", GetErrorMessage(r));
346
347         InitializeAccessibilityElement();
348
349         return E_SUCCESS;
350 }
351
352 result
353 _Gallery::RequestToUpdateItem(int itemIndex)
354 {
355         SysTryReturnResult(NID_UI_CTRL, __modelInitialized == true, E_INVALID_OPERATION, "Does not call to first draw.");
356         result r = GetPresenter().RequestToUpdateItem(itemIndex);
357         SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "[%s] Propagation.", GetErrorMessage(r));
358
359         InitializeAccessibilityElement();
360
361         return E_SUCCESS;
362 }
363
364 result
365 _Gallery::RequestToUpdateAllItems(void)
366 {
367         result r = GetPresenter().RequestToUpdateAllItems();
368         SysTryReturnResult(NID_UI_CTRL, r == E_SUCCESS, r, "[%s] Propagation.", GetErrorMessage(r));
369
370         InitializeAccessibilityElement();
371
372         return E_SUCCESS;
373 }
374
375 bool
376 _Gallery::OnFlickGestureDetected(_TouchFlickGestureDetector& gesture)
377 {
378         _GalleryViewEventInfo viewEventInfo;
379         int distanceX = 0;
380         int distanceY = 0;
381         gesture.GetDistance(distanceX, distanceY);
382         Point flickPoint(distanceX, distanceY);
383
384         viewEventInfo.SetFlickPosition(flickPoint);
385         viewEventInfo.SetFlicked(true);
386         viewEventInfo.SetFlickTime(gesture.GetDuration());
387         _GalleryViewEvent viewEvent(GALLERY_VIEW_EVENT_TOUCH_FLICK, &viewEventInfo);
388         bool r = GetPresenter().PostEvent(viewEvent);
389         SysTryReturn(NID_UI_CTRL, r == true, true, GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
390
391         return true;
392 }
393
394 bool
395 _Gallery::OnFlickGestureCanceled(_TouchFlickGestureDetector& gesture)
396 {
397         return false;
398 }
399
400 bool
401 _Gallery::OnTapGestureDetected(_TouchTapGestureDetector& gesture)
402 {
403         if (gesture.GetTapCount() == 1)
404         {
405                 PLAY_FEEDBACK(_RESOURCE_FEEDBACK_PATTERN_TAP);
406         }
407         else
408         {
409                 PLAY_FEEDBACK(_RESOURCE_FEEDBACK_PATTERN_MULTI_TAP);
410                 Point pos(0, 0);
411                 Tizen::Ui::_TouchInfo touchInfo(0, _TOUCH_DOUBLE_PRESSED, pos, false, 0);
412                 _GalleryViewEventInfo viewEventInfo(touchInfo);
413                 _GalleryViewEvent viewEvent(GALLERY_VIEW_EVENT_TOUCH_DOUBLE_PRESSED, &viewEventInfo);
414
415                 bool r = GetPresenter().PostEvent(viewEvent);
416                 SysTryReturn(NID_UI_CTRL, r == true, true, GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
417         }
418
419         return true;
420 }
421
422 bool
423 _Gallery::OnTapGestureCanceled(_TouchTapGestureDetector& gesture)
424 {
425         return false;
426 }
427
428 bool
429 _Gallery::OnPinchGestureStarted(_TouchPinchGestureDetector& gesture)
430 {
431         //return OnPinchGestureChanged(gesture);
432         return true;
433 }
434
435 bool
436 _Gallery::OnPinchGestureChanged(_TouchPinchGestureDetector& gesture)
437 {
438         _GalleryViewEventInfo viewEventInfo;
439         viewEventInfo.SetPinchCenterPosition(_CoordinateSystemUtils::ConvertToFloat(gesture.GetCenterPoint()));
440         viewEventInfo.SetPinchArea(gesture.GetScale());
441         _GalleryViewEvent viewEvent(GALLERY_VIEW_EVENT_TOUCH_PINCH_ZOOM, &viewEventInfo);
442         bool r = GetPresenter().PostEvent(viewEvent);
443         SysTryReturn(NID_UI_CTRL, r == true, true, GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
444         return true;
445 }
446
447 bool
448 _Gallery::OnPinchGestureFinished(_TouchPinchGestureDetector& gesture)
449 {
450         //return OnPinchGestureChanged(gesture);
451         return true;
452 }
453
454 bool
455 _Gallery::OnPinchGestureCanceled(_TouchPinchGestureDetector& gesture)
456 {
457         return false;
458 }
459
460 // Touch Event Callbacks
461 bool
462 _Gallery::OnTouchPressed(const _Control& source, const _TouchInfo& touchinfo)
463 {
464         _GalleryViewEventInfo viewEventInfo(const_cast <_TouchInfo&>(touchinfo));
465         _GalleryViewEvent viewEvent(GALLERY_VIEW_EVENT_TOUCH_PRESSED, &viewEventInfo);
466
467         return GetPresenter().PostEvent(viewEvent);
468 }
469
470 bool
471 _Gallery::OnTouchReleased(const _Control& source, const _TouchInfo& touchinfo)
472 {
473         _GalleryViewEventInfo viewEventInfo(const_cast <_TouchInfo&>(touchinfo));
474         _GalleryViewEvent viewEvent(GALLERY_VIEW_EVENT_TOUCH_RELEASED, &viewEventInfo);
475
476         return GetPresenter().PostEvent(viewEvent);
477 }
478
479 bool
480 _Gallery::OnTouchMoved(const _Control& source, const _TouchInfo& touchinfo)
481 {
482         _GalleryViewEventInfo viewEventInfo(const_cast <_TouchInfo&>(touchinfo));
483         _GalleryViewEvent viewEvent(GALLERY_VIEW_EVENT_TOUCH_MOVED, &viewEventInfo);
484
485         bool r = GetPresenter().PostEvent(viewEvent);
486         SysTryReturn(NID_UI_CTRL, r == true, true, GetLastResult(), "[%s] Propagating.", GetErrorMessage(r));
487
488         SetLastResult(E_SUCCESS);
489
490         return true;
491 }
492
493 bool
494 _Gallery::OnTouchCanceled(const _Control& source, const _TouchInfo& touchinfo)
495 {
496         return true;
497 }
498
499 // Windowing Event Callbacks
500 void
501 _Gallery::OnDraw(void)
502 {
503         if (__modelInitialized == false)
504         {
505                 //GetPresenter().RequestToUpdateItemCount();
506                 __modelInitialized = true;
507         }
508
509         GetPresenter().OnDraw();
510 }
511
512 void
513 _Gallery::OnBoundsChanged(void)
514 {
515         _GalleryViewEventInfo viewEventInfo;
516         _GalleryViewEvent viewEvent(GALLERY_VIEW_EVENT_BOUNDS_CHANGED, &viewEventInfo);
517
518         bool r = GetPresenter().PostEvent(viewEvent);
519         SysTryReturnVoidResult(NID_UI_CTRL, r == true, GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
520         ResizeGalleryAccessibilityElement();
521 }
522
523 void
524 _Gallery::OnFontInfoRequested(unsigned long& style, int& size)
525 {
526         GetPresenter().OnFontInfoRequested(style, size);
527 }
528
529 void
530 _Gallery::OnFontChanged(Font* pFont)
531 {
532         GetPresenter().OnFontChanged();
533 }
534
535 void
536 _Gallery::SetEffect(Effect* pEffect)
537 {
538         GetRenderer().SetEffect(pEffect);
539 }
540
541 Effect*
542 _Gallery::GetEffect(void)
543 {
544         return GetRenderer().GetEffect();
545 }
546
547 result
548 _Gallery::OnAttachedToMainTree(void)
549 {
550         InitializeAccessibilityElement();
551
552         return E_SUCCESS;
553 }
554
555 void
556 _Gallery::InitializeAccessibilityElement(void)
557 {
558         if (_AccessibilityManager::IsActivated() != true)
559         {
560                 return;
561         }
562
563         if (GetItemCount() > 0)
564         {
565                 AddGalleryAccessibilityElement();
566         }
567         else
568         {
569                 RemoveGalleryAccessibilityElements();
570         }
571
572         return;
573 }
574
575 void
576 _Gallery::ResizeGalleryAccessibilityElement(void)
577 {
578         if (_AccessibilityManager::IsActivated() == true && __pGalleryImageElement != null)
579         {
580                 // TODO : need _AccessibilityElement::SetBoundsF()
581                 FloatRectangle floatRect = __pRenderer->GetCanvasImageBounds(__pPresenter->SearchCanvasIndex(GetCurrentItemIndex()));
582                 Rectangle rect(floatRect.x, floatRect.y, floatRect.width, floatRect.height);
583                 __pGalleryImageElement->SetBounds(rect);
584         }
585
586         return;
587 }
588
589 void
590 _Gallery::RemoveGalleryAccessibilityElements(void)
591 {
592         _AccessibilityContainer* pContainer = GetAccessibilityContainer();
593
594         if (pContainer != null && __pGalleryImageElement != null)
595         {
596                 result r = pContainer->RemoveElement(*__pGalleryImageElement);
597                 SysTryReturnVoidResult(NID_UI_CTRL, r == E_SUCCESS, r, "[%s] Propagating.", GetErrorMessage(r));
598                 __pGalleryImageElement = null;
599         }
600 }
601
602 void
603 _Gallery::AddGalleryAccessibilityElement(void)
604 {
605         _AccessibilityContainer* pContainer = GetAccessibilityContainer();
606         if(pContainer != null && __pGalleryImageElement == null)
607         {
608                 _AccessibilityElement* pGalleryElement = new (std::nothrow) _AccessibilityElement(true);
609                 SysTryReturnVoidResult(NID_UI_CTRL, pGalleryElement, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
610
611                 FloatRectangle floatRect = __pRenderer->GetCanvasImageBounds(__pPresenter->SearchCanvasIndex(GetCurrentItemIndex()));
612                 Rectangle rect(floatRect.x, floatRect.y, floatRect.width, floatRect.height);
613                 pGalleryElement->SetBounds(rect);
614                 pGalleryElement->SetTrait(L"Image");
615                 pGalleryElement->SetName(L"GalleryImage");
616
617                 pContainer->AddElement(*pGalleryElement);
618                 __pGalleryImageElement = pGalleryElement;
619         }
620
621         return;
622 }
623
624 }}} // Tizen::Ui::Controls