3 * Copyright (c) 2016 Samsung Electronics Co., Ltd.
5 * Licensed under the Flora License, Version 1.1 (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://floralicense.org/license/
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.
19 #include <internal/widget_view/widget_view_impl.h>
24 #include <dali/public-api/common/stage.h>
25 #include <dali/public-api/events/touch-data.h>
26 #include <dali/public-api/events/wheel-event.h>
27 #include <dali/public-api/images/native-image.h>
28 #include <dali/public-api/object/type-registry.h>
29 #include <dali/public-api/object/type-registry-helper.h>
30 #include <dali-toolkit/public-api/visuals/visual-properties.h>
31 #include <dali-toolkit/devel-api/visual-factory/visual-factory.h>
32 #include <dali/integration-api/debug.h>
34 #include <Ecore_Input.h>
35 #include <widget_service.h>
36 #include <widget_instance.h>
37 #include <tzplatform_config.h>
38 #include <wayland-extension/tizen-extension-client-protocol.h>
54 const int DEFAULT_FONT_PIXEL_SIZE = 30; // Referred platform widget viewer evas
56 #define GET_LOCALE_TEXT(string) dgettext(PKGNAME, string)
58 #if defined(DEBUG_ENABLED)
59 Integration::Log::Filter* gWidgetViewLogging = Integration::Log::Filter::New( Debug::Verbose, false, "LOG_WIDGET_VIEW" );
64 return Dali::BaseHandle();
67 // Setup properties, signals and actions using the type-registry.
68 DALI_TYPE_REGISTRATION_BEGIN( Dali::WidgetView::WidgetView, Toolkit::Control, Create );
69 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "widgetId", BOOLEAN, WIDGET_ID )
70 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "instanceId", BOOLEAN, INSTANCE_ID )
71 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "contentInfo", BOOLEAN, CONTENT_INFO )
72 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "title", BOOLEAN, TITLE )
73 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "updatePeriod", BOOLEAN, UPDATE_PERIOD )
74 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "preview", MAP, PREVIEW )
75 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "loadingText", MAP, LOADING_TEXT )
76 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "widgetStateFaulted", BOOLEAN, WIDGET_STATE_FAULTED )
77 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "permanentDelete", BOOLEAN, PERMANENT_DELETE )
80 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetAdded", SIGNAL_WIDGET_ADDED )
81 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetDeleted", SIGNAL_WIDGET_DELETED )
82 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetCreationAborted", SIGNAL_WIDGET_CREATION_ABORTED )
83 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetContentUpdated", SIGNAL_WIDGET_CONTENT_UPDATED )
84 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetUpdatePeriodChanged", SIGNAL_WIDGET_UPDATE_PERIOD_CHANGED )
85 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetFaulted", SIGNAL_WIDGET_FAULTED )
86 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetTerminated", SIGNAL_WIDGET_TERMINATED )
89 DALI_ACTION_REGISTRATION( Dali::WidgetView, WidgetView, "pauseWidget", ACTION_WIDGETVIEW_PAUSE_WIDGET );
90 DALI_ACTION_REGISTRATION( Dali::WidgetView, WidgetView, "resumeWidget", ACTION_WIDGETVIEW_RESUME_WIDGET );
91 DALI_ACTION_REGISTRATION( Dali::WidgetView, WidgetView, "cancelTouchEvent", ACTION_WIDGETVIEW_CANCEL_TOUCH_EVENT );
92 DALI_ACTION_REGISTRATION( Dali::WidgetView, WidgetView, "activateFaultedWidget", ACTION_WIDGETVIEW_ACTIVATE_FAULTED_WIDGET );
94 DALI_TYPE_REGISTRATION_END()
96 struct wl_buffer* preBuffer;
98 const char* const FONT_STYLE( "fontStyle" );
99 const char* const TEXT_POINT_SIZE( "textPointSize" );
100 const char* const TEXT_COLOR( "textColor" );
102 static void OnBufferUpdated( struct tizen_remote_surface *surface, uint32_t type, struct wl_buffer *buffer,
103 int32_t img_file_fd, uint32_t img_file_size, uint32_t time, struct wl_array *keys,
104 const char *appid, const char *instance_id, const int pid, void *data)
106 Dali::WidgetView::Internal::WidgetView* widgetView = static_cast< Dali::WidgetView::Internal::WidgetView* >( data );
110 if( !widgetView->IsWidgetImageView() )
112 tizen_remote_surface_transfer_visibility( surface, TIZEN_REMOTE_SURFACE_VISIBILITY_TYPE_VISIBLE);
114 widgetView->CreateWidgetImageView();
115 widgetView->ConnectSignal( surface );
118 //get tbm surface from buffer
119 tbm_surface_h tbmSurface = static_cast< tbm_surface_h >( wl_buffer_get_user_data( buffer ) );
120 widgetView->UpdateImageSource( tbmSurface );
123 if( preBuffer != NULL && tizen_remote_surface_get_version( surface ) >= TIZEN_REMOTE_SURFACE_RELEASE_SINCE_VERSION )
125 tizen_remote_surface_release( surface, preBuffer );
130 close( img_file_fd );
133 static void OnBufferAdded( const char *appid, const char *instance_id, const int pid, void *data )
137 static void OnSurfaceRemoved( const char *appid, const char *instance_id, const int pid, void *data )
139 Dali::WidgetView::Internal::WidgetView* widgetView = static_cast< Dali::WidgetView::Internal::WidgetView* >( data );
141 if( widgetView && !widgetView->IsWidgetFaulted() )
143 widgetView->CloseRemoteSurface();
144 widgetView->RemoveWidgetImage();
148 } // unnamed namespace
150 Dali::WidgetView::WidgetView WidgetView::New( const std::string& widgetId, const std::string& contentInfo, int width, int height, float updatePeriod )
152 // Create the implementation, temporarily owned on stack
153 IntrusivePtr< WidgetView > internalWidgetView = new WidgetView( widgetId, contentInfo, width, height, updatePeriod );
155 // Pass ownership to CustomActor
156 Dali::WidgetView::WidgetView widgetView( *internalWidgetView );
158 // Second-phase init of the implementation
159 // This can only be done after the CustomActor connection has been made...
160 internalWidgetView->Initialize();
165 WidgetView::WidgetView()
166 : Control( ControlBehaviour( REQUIRES_TOUCH_EVENTS ) ),
174 mUpdatePeriod( 0.0 ),
175 mPreviewVisible( true ),
176 mLoadingTextVisible( true ),
177 mRetryTextVisible( true ),
178 mRetryState( false ),
179 mPermanentDelete( false ),
180 mWatcherHandle( NULL ),
181 mRemoteSurface( NULL )
185 WidgetView::WidgetView( const std::string& widgetId, const std::string& contentInfo, int width, int height, float updatePeriod )
186 : Control( ControlBehaviour( REQUIRES_TOUCH_EVENTS ) ),
187 mWidgetId( widgetId ),
189 mContentInfo( contentInfo ),
194 mUpdatePeriod( updatePeriod ),
195 mPreviewVisible( true ),
196 mLoadingTextVisible( true ),
197 mRetryTextVisible( true ),
198 mRetryState( false ),
199 mPermanentDelete( false ),
200 mWatcherHandle( NULL ),
201 mRemoteSurface( NULL )
205 WidgetView::~WidgetView()
210 bool WidgetView::PauseWidget()
212 int ret = widget_instance_pause( mInstanceId.c_str() );
215 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::PauseWidget: Fail to pause widget(%s, %s) [%d]\n", mWidgetId.c_str(), mInstanceId.c_str(), ret );
219 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::PauseWidget: Widget is paused (%s, %s)\n", mWidgetId.c_str(), mInstanceId.c_str() );
224 bool WidgetView::ResumeWidget()
226 int ret = widget_instance_resume( mInstanceId.c_str() );
229 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::ResumeWidget: Fail to resume widget(%s, %s) [%d]\n", mWidgetId.c_str(), mInstanceId.c_str(), ret );
233 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::ResumeWidget: Widget is resumed (%s, %s)\n", mWidgetId.c_str(), mInstanceId.c_str() );
238 const std::string& WidgetView::GetWidgetId() const
243 const std::string& WidgetView::GetInstanceId() const
248 const std::string& WidgetView::GetContentInfo()
250 widget_instance_h instance;
251 char* contentInfo = NULL;
253 mContentInfo.clear();
255 if( mWidgetId.empty() || mInstanceId.empty() )
257 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetContentInfo: Widget id (%s) or instance id (%s) is invalid.\n", mWidgetId.c_str(), mInstanceId.c_str() );
261 instance = widget_instance_get_instance( mWidgetId.c_str(), mInstanceId.c_str() );
264 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetContentInfo: widget_instance_get_instance is failed. [%s]\n", mInstanceId.c_str() );
268 if( widget_instance_get_content( instance, &contentInfo ) < 0 )
270 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetContentInfo: Failed to get content of widget. [%s]\n", mInstanceId.c_str() );
274 mContentInfo = reinterpret_cast< char* >( contentInfo );
279 const std::string& WidgetView::GetTitle()
281 //ToDo: We should add some codes by considering widget_viewer_evas
284 mTitle = widget_service_get_name( mWidgetId.c_str(), NULL );
287 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetTitle: title = %s\n", mTitle.c_str() );
292 float WidgetView::GetUpdatePeriod() const
294 return mUpdatePeriod;
297 bool WidgetView::CancelTouchEvent()
301 tizen_remote_surface_transfer_touch_cancel( mRemoteSurface );
308 void WidgetView::SetPreviewVisible( bool visible )
310 if( mPreviewImage && mPreviewVisible != visible )
312 mPreviewVisible = visible;
313 mPreviewImage.SetVisible( visible );
317 bool WidgetView::IsPreviewVisible()
319 return mPreviewVisible;
322 void WidgetView::SetLoadingTextVisible( bool visible )
324 if( mLoadingText && mLoadingTextVisible != visible )
326 mLoadingTextVisible = visible;
330 mLoadingText.SetProperty( Toolkit::TextLabel::Property::TEXT, GET_LOCALE_TEXT( "IDS_ST_POP_LOADING_ING" ) );
332 mLoadingText.SetVisible( visible );
336 bool WidgetView::IsLoadingTextVisible()
338 return mLoadingTextVisible;
341 void WidgetView::ActivateFaultedWidget()
345 // Enable preview and loading text
346 ShowRetryState( false );
347 ShowLoadingState( true );
349 // launch widget again
350 mPid = widget_instance_launch( mInstanceId.c_str(), (char *)mContentInfo.c_str(), mWidth, mHeight );
353 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::ActivateFaultedWidget: widget_instance_launch is failed. [%s]\n", mWidgetId.c_str() );
355 ShowLoadingState( false );
356 ShowRetryState( true );
359 Dali::WidgetView::WidgetView handle( GetOwner() );
360 mWidgetCreationAbortedSignal.Emit( handle );
365 screen_connector_toolkit_ops ops;
366 ops.updated_cb = OnBufferUpdated;
367 ops.removed_cb = OnSurfaceRemoved;
368 ops.added_cb = OnBufferAdded;
369 mWatcherHandle = screen_connector_toolkit_add(&ops, (char *)mInstanceId.c_str(), SCREEN_CONNECTOR_SCREEEN_TYPE_WIDGET, this);
371 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::ActivateFaultedWidget: widget_instance_launch is called. [%s, mPid = %d]\n", mWidgetId.c_str(), mPid );
375 bool WidgetView::IsWidgetFaulted()
377 return mPid < 0 ? true : false;
380 void WidgetView::SetPermanentDelete( bool permanentDelete )
382 mPermanentDelete = permanentDelete;
385 bool WidgetView::IsPermanentDelete()
387 return mPermanentDelete;
390 void WidgetView::CreateWidgetImageView()
393 mImageSource = Dali::NativeImageSource::New( source );
394 Dali::NativeImage image = Dali::NativeImage::New( *mImageSource );
396 mWidgetImageView = Dali::Toolkit::ImageView::New( image );
398 mWidgetImageView.SetParentOrigin( ParentOrigin::CENTER );
399 mWidgetImageView.SetAnchorPoint( AnchorPoint::CENTER );
400 mWidgetImageView.SetSize( mWidth, mHeight );
402 Self().Add( mWidgetImageView );
404 //EFL app should be pre multiplied image.
405 mWidgetImageView.SetProperty( Toolkit::ImageView::Property::PRE_MULTIPLIED_ALPHA, true );
407 // Disable preview and text
408 ShowLoadingState( false );
411 Dali::WidgetView::WidgetView handle( GetOwner() );
412 mWidgetAddedSignal.Emit( handle );
414 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::CreateWidgetImageView: Widget image is added.\n" );
417 void WidgetView::RemoveWidgetImage()
419 mWidgetImageView.SetVisible( false );
420 mWidgetImageView.Reset();
422 Dali::WidgetView::WidgetView handle( GetOwner() );
423 mWidgetDeletedSignal.Emit( handle );
425 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::RemoveWidgetImage: Widget image is removed.\n" );
428 void WidgetView::TerminateWidget()
430 if( !mWidgetId.empty() && !mInstanceId.empty() )
432 widget_instance_terminate( mInstanceId.c_str() );
434 if( mPermanentDelete )
436 widget_instance_destroy( mInstanceId.c_str() );
439 Dali::WidgetView::WidgetView handle( GetOwner() );
440 mWidgetTerminatedSignal.Emit( handle );
441 mWidgetDeletedSignal.Emit( handle );
446 CloseRemoteSurface();
449 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::TerminateWidget: Widget is terminated/destroyed and deleted signal is emitted.\n" );
453 void WidgetView::SendWidgetEvent( int event )
455 Dali::WidgetView::WidgetView handle( GetOwner() );
457 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::SendWidgetEvent: event = %d widget = %s\n", event, mWidgetId.c_str() );
462 case WIDGET_INSTANCE_EVENT_UPDATE:
463 case WIDGET_INSTANCE_EVENT_EXTRA_UPDATED:
465 mWidgetContentUpdatedSignal.Emit( handle );
468 case WIDGET_INSTANCE_EVENT_PERIOD_CHANGED:
470 mWidgetUpdatePeriodChangedSignal.Emit( handle );
473 case WIDGET_INSTANCE_EVENT_FAULT:
476 ShowRetryState( true );
477 mWidgetFaultedSignal.Emit( handle );
487 bool WidgetView::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor )
489 Dali::BaseHandle handle( object );
491 bool connected( true );
492 Dali::WidgetView::WidgetView widgetView = Dali::WidgetView::WidgetView::DownCast( handle );
494 if( strcmp( signalName.c_str(), SIGNAL_WIDGET_ADDED ) == 0 )
496 widgetView.WidgetAddedSignal().Connect( tracker, functor );
498 else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_DELETED ) == 0 )
500 widgetView.WidgetDeletedSignal().Connect( tracker, functor );
502 else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_CREATION_ABORTED ) == 0 )
504 widgetView.WidgetCreationAbortedSignal().Connect( tracker, functor );
506 else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_CONTENT_UPDATED ) == 0 )
508 widgetView.WidgetContentUpdatedSignal().Connect( tracker, functor );
510 else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_UPDATE_PERIOD_CHANGED ) == 0 )
512 widgetView.WidgetUpdatePeriodChangedSignal().Connect( tracker, functor );
514 else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_FAULTED ) == 0 )
516 widgetView.WidgetFaultedSignal().Connect( tracker, functor );
520 // signalName does not match any signal
527 bool WidgetView::DoAction( BaseObject* object, const std::string& actionName, const Property::Map& attributes )
531 Dali::BaseHandle handle( object );
532 Dali::WidgetView::WidgetView widgetView = Dali::WidgetView::WidgetView::DownCast( handle );
539 WidgetView& impl = GetImplementation( widgetView );
541 if( strcmp( actionName.c_str(), ACTION_WIDGETVIEW_PAUSE_WIDGET ) == 0 )
545 else if( strcmp( actionName.c_str(), ACTION_WIDGETVIEW_RESUME_WIDGET ) == 0 )
549 else if( strcmp( actionName.c_str(), ACTION_WIDGETVIEW_CANCEL_TOUCH_EVENT ) == 0 )
551 impl.CancelTouchEvent();
553 else if( strcmp( actionName.c_str(), ACTION_WIDGETVIEW_ACTIVATE_FAULTED_WIDGET ) == 0 )
555 impl.ActivateFaultedWidget();
565 void WidgetView::SetProperty( BaseObject* object, Property::Index index, const Property::Value& value )
567 Dali::WidgetView::WidgetView widgetView = Dali::WidgetView::WidgetView::DownCast( Dali::BaseHandle( object ) );
571 WidgetView& impl = GetImplementation( widgetView );
575 case Dali::WidgetView::WidgetView::Property::PREVIEW:
579 if( value.Get( previewEnabled ) )
581 impl.SetPreviewVisible( previewEnabled );
585 case Dali::WidgetView::WidgetView::Property::LOADING_TEXT:
590 if( value.Get( textEnabled ) )
592 impl.SetLoadingTextVisible( textEnabled );
594 else if( value.Get( map ) )
596 impl.SetLoadingTextPropertyMap( map );
600 case Dali::WidgetView::WidgetView::Property::PERMANENT_DELETE:
603 if( value.Get( permanent ) )
605 impl.SetPermanentDelete( permanent );
613 Property::Value WidgetView::GetProperty( BaseObject* object, Property::Index index )
615 Property::Value value;
616 Dali::WidgetView::WidgetView widgetView = Dali::WidgetView::WidgetView::DownCast( Dali::BaseHandle( object ) );
620 WidgetView& impl = GetImplementation( widgetView );
624 case Dali::WidgetView::WidgetView::Property::WIDGET_ID:
626 value = impl.GetWidgetId();
629 case Dali::WidgetView::WidgetView::Property::INSTANCE_ID:
631 value = impl.GetInstanceId();
634 case Dali::WidgetView::WidgetView::Property::CONTENT_INFO:
636 value = impl.GetContentInfo();
639 case Dali::WidgetView::WidgetView::Property::TITLE:
641 value = impl.GetTitle();
644 case Dali::WidgetView::WidgetView::Property::UPDATE_PERIOD:
646 value = impl.GetUpdatePeriod();
649 case Dali::WidgetView::WidgetView::Property::PREVIEW:
651 value = impl.IsPreviewVisible();
654 case Dali::WidgetView::WidgetView::Property::LOADING_TEXT:
656 value = impl.IsLoadingTextVisible();
659 case Dali::WidgetView::WidgetView::Property::WIDGET_STATE_FAULTED:
661 value = impl.IsWidgetFaulted();
664 case Dali::WidgetView::WidgetView::Property::PERMANENT_DELETE:
666 value = impl.IsPermanentDelete();
675 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetAddedSignal()
677 return mWidgetAddedSignal;
680 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetDeletedSignal()
682 return mWidgetDeletedSignal;
685 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetCreationAbortedSignal()
687 return mWidgetCreationAbortedSignal;
690 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetContentUpdatedSignal()
692 return mWidgetContentUpdatedSignal;
695 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetUpdatePeriodChangedSignal()
697 return mWidgetUpdatePeriodChangedSignal;
700 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetFaultedSignal()
702 return mWidgetFaultedSignal;
705 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetTerminatedSignal()
707 return mWidgetTerminatedSignal;
710 void WidgetView::OnInitialize()
712 char* instanceId = NULL;
713 char* previewPath = NULL;
714 std::string previewImage;
715 widget_size_type_e sizeType;
716 screen_connector_toolkit_ops ops;
718 int ret = widget_instance_create( mWidgetId.c_str(), &instanceId );
719 if( ret < 0 || !instanceId )
721 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_create is failed [%s].\n", mWidgetId.c_str() );
725 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_create is called. [widget id = %s, instance id = %s]\n",
726 mWidgetId.c_str(), instanceId );
728 mInstanceId = instanceId;
731 widget_service_get_size_type( mWidth, mHeight, &sizeType );
733 previewPath = widget_service_get_preview_image_path( mWidgetId.c_str(), sizeType );
736 previewImage = previewPath;
741 previewImage = WIDGET_VIEW_RESOURCE_DEFAULT_IMG;
744 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: preview image path = %s\n", previewImage.c_str() );
747 mPreviewActor = Dali::Actor::New();
748 mPreviewActor.SetParentOrigin( ParentOrigin::CENTER );
749 mPreviewActor.SetAnchorPoint( AnchorPoint::CENTER );
750 mPreviewActor.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS );
752 mPreviewImage = Toolkit::ImageView::New( previewImage );
753 mPreviewImage.SetParentOrigin( ParentOrigin::CENTER );
754 mPreviewImage.SetAnchorPoint( AnchorPoint::CENTER );
755 mPreviewImage.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS );
757 Self().SetResizePolicy( ResizePolicy::FIXED, Dimension::ALL_DIMENSIONS );
758 Self().SetSize( mWidth, mHeight );
760 Self().Add( mPreviewActor );
761 mPreviewActor.Add( mPreviewImage );
763 mStateTextActor = Dali::Actor::New();
764 mStateTextActor.SetParentOrigin( ParentOrigin::CENTER );
765 mStateTextActor.SetAnchorPoint( AnchorPoint::CENTER );
766 mStateTextActor.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS );
769 mLoadingText = Toolkit::TextLabel::New( GET_LOCALE_TEXT( "IDS_ST_POP_LOADING_ING" ) );
770 mLoadingText.SetParentOrigin( ParentOrigin::CENTER );
771 mLoadingText.SetAnchorPoint( AnchorPoint::CENTER );
772 mLoadingText.SetProperty( Toolkit::TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
773 mLoadingText.SetProperty( Toolkit::TextLabel::Property::VERTICAL_ALIGNMENT, "CENTER" );
774 mLoadingText.SetProperty( Toolkit::TextLabel::Property::TEXT_COLOR, Dali::Color::WHITE );
775 mLoadingText.SetProperty( Toolkit::TextLabel::Property::FONT_STYLE, "Bold" );
776 mLoadingText.SetProperty( Toolkit::TextLabel::Property::POINT_SIZE, TextPixelToPointSize( DEFAULT_FONT_PIXEL_SIZE ) );
778 mPreviewActor.Add( mStateTextActor );
779 mStateTextActor.Add( mLoadingText );
782 mRetryText = Toolkit::TextLabel::New( GET_LOCALE_TEXT( "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY" ) );
783 mRetryText.SetParentOrigin( ParentOrigin::CENTER );
784 mRetryText.SetAnchorPoint( AnchorPoint::CENTER );
785 mRetryText.SetProperty( Toolkit::TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
786 mRetryText.SetProperty( Toolkit::TextLabel::Property::VERTICAL_ALIGNMENT, "CENTER" );
787 mRetryText.SetProperty( Toolkit::TextLabel::Property::TEXT_COLOR, Dali::Color::WHITE );
788 mRetryText.SetProperty( Toolkit::TextLabel::Property::FONT_STYLE, "Bold" );
789 mRetryText.SetProperty( Toolkit::TextLabel::Property::POINT_SIZE, TextPixelToPointSize( DEFAULT_FONT_PIXEL_SIZE ) );
791 mStateTextActor.Add( mRetryText );
792 mRetryText.SetVisible( false );
795 mPid = widget_instance_launch( instanceId, (char *)mContentInfo.c_str(), mWidth, mHeight );
799 ShowLoadingState( false );
800 ShowRetryState( true );
802 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_launch is failed. [%s]\n", mWidgetId.c_str() );
805 Dali::WidgetView::WidgetView handle( GetOwner() );
806 mWidgetCreationAbortedSignal.Emit( handle );
811 ops.updated_cb = OnBufferUpdated;
812 ops.removed_cb = OnSurfaceRemoved;
813 ops.added_cb = OnBufferAdded;
814 mWatcherHandle = screen_connector_toolkit_add(&ops, (char *)instanceId, SCREEN_CONNECTOR_SCREEEN_TYPE_WIDGET, this);
815 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_launch is called. [%s, mPid = %d]\n", mWidgetId.c_str(), mPid );
819 void WidgetView::OnStageConnection( int depth )
821 Control::OnStageConnection( depth );
824 void WidgetView::OnStageDisconnection()
826 Control::OnStageDisconnection();
829 void WidgetView::OnSizeSet( const Vector3& targetSize )
831 if( mWidgetImageView )
833 mWidgetImageView.SetSize( targetSize );
837 bool WidgetView::IsWidgetImageView()
839 return ( mWidgetImageView )? true: false;
842 void WidgetView::UpdateImageSource( tbm_surface_h source )
844 mImageSource->SetSource( source );
845 Dali::Stage::GetCurrent().KeepRendering( 0.0f );
848 void WidgetView::ConnectSignal( tizen_remote_surface* surface )
850 if( mWidgetImageView && surface )
852 mRemoteSurface = surface;
854 Self().TouchSignal().Connect( this, &WidgetView::OnTouch );
855 Self().WheelEventSignal().Connect( this, &WidgetView::OnWheelEvent );
860 bool WidgetView::OnTouch( Dali::Actor actor, const Dali::TouchData& event )
862 tizen_remote_surface_event_type type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_NONE;
864 if( event.GetPointCount() == 0 )
869 switch( event.GetState( 0 ) )
871 case Dali::PointState::UP:
873 type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_UP;
877 ActivateFaultedWidget();
883 case Dali::PointState::DOWN:
885 type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_DOWN;
888 case Dali::PointState::MOTION:
890 type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_MOVE;
899 if( mRemoteSurface == NULL )
906 if( type == TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_MOVE )
911 Vector2 localPos = event.GetLocalPosition( 0 );
913 tizen_remote_surface_transfer_mouse_event( mRemoteSurface,
919 wl_fixed_from_double( event.GetEllipseRadius( 0 ).x ),
920 wl_fixed_from_double( event.GetEllipseRadius( 0 ).y ),
921 wl_fixed_from_double( event.GetPressure( 0 ) ),
922 wl_fixed_from_double( event.GetAngle( 0 ).degree ),
923 TIZEN_INPUT_DEVICE_CLAS_TOUCHSCREEN,
924 TIZEN_INPUT_DEVICE_SUBCLAS_NONE,
931 bool WidgetView::OnWheelEvent( Dali::Actor actor, const Dali::WheelEvent& event )
933 if( mRemoteSurface == NULL )
937 //ToDo: We should check TIZEN_INPUT_DEVICE_CLAS_MOUSE
938 tizen_remote_surface_transfer_mouse_wheel( mRemoteSurface,
941 TIZEN_INPUT_DEVICE_CLAS_MOUSE,
942 TIZEN_INPUT_DEVICE_SUBCLAS_NONE,
949 Vector3 WidgetView::GetNaturalSize()
955 if( size.x > 0 && size.y > 0 )
957 size.z = std::min( size.x, size.y );
962 return Control::GetNaturalSize();
966 float WidgetView::GetHeightForWidth( float width )
968 if( mWidth > 0 && mHeight > 0 )
970 return GetHeightForWidthBase( width );
974 return Control::GetHeightForWidthBase( width );
978 float WidgetView::GetWidthForHeight( float height )
980 if( mWidth > 0 && mHeight > 0 )
982 return GetWidthForHeightBase( height );
986 return Control::GetWidthForHeightBase( height );
990 void WidgetView::CloseRemoteSurface()
992 if( mWatcherHandle != NULL )
994 screen_connector_toolkit_remove( mWatcherHandle );
995 mWatcherHandle = NULL;
997 mRemoteSurface = NULL;
1001 void WidgetView::ShowLoadingState( bool show )
1003 if( mPreviewImage && mPreviewVisible )
1005 mPreviewImage.SetVisible( show );
1008 if( mLoadingText && mLoadingTextVisible )
1010 mLoadingText.SetProperty( Toolkit::TextLabel::Property::TEXT, GET_LOCALE_TEXT( "IDS_ST_POP_LOADING_ING" ) );
1011 mLoadingText.SetVisible( show );
1015 void WidgetView::ShowRetryState( bool show )
1017 if( mPreviewImage && mPreviewVisible )
1019 mPreviewImage.SetVisible( false );
1022 if( mRetryText && mRetryTextVisible )
1024 mRetryText.SetProperty( Toolkit::TextLabel::Property::TEXT, GET_LOCALE_TEXT( "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY" ) );
1025 mRetryText.SetVisible( show );
1030 void WidgetView::SetLoadingTextPropertyMap( Property::Map map )
1034 Property::Value* fontStyle = map.Find( FONT_STYLE );
1037 if( fontStyle && fontStyle->Get( style ) )
1039 mLoadingText.SetProperty( Toolkit::TextLabel::Property::FONT_STYLE, style );
1042 Property::Value* textPointSize = map.Find( TEXT_POINT_SIZE );
1045 if( textPointSize && textPointSize->Get( size ) )
1047 mLoadingText.SetProperty( Toolkit::TextLabel::Property::POINT_SIZE, size );
1050 Property::Value* textColor = map.Find( TEXT_COLOR );
1053 if( textColor && textColor->Get( color ) )
1055 mLoadingText.SetProperty( Toolkit::TextLabel::Property::TEXT_COLOR, color );
1060 float WidgetView::TextPixelToPointSize( int pixelSize )
1062 Dali::Vector2 dpi = Dali::Stage::GetCurrent().GetDpi();
1063 float meanDpi = (dpi.height + dpi.width) / 2.0f;
1065 return (pixelSize * 72.0f) / meanDpi;
1068 } // namespace Internal
1070 } // namespace WidgetView