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