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 )
88 DALI_ACTION_REGISTRATION( Dali::WidgetView, WidgetView, "pauseWidget", ACTION_WIDGETVIEW_PAUSE_WIDGET );
89 DALI_ACTION_REGISTRATION( Dali::WidgetView, WidgetView, "resumeWidget", ACTION_WIDGETVIEW_RESUME_WIDGET );
90 DALI_ACTION_REGISTRATION( Dali::WidgetView, WidgetView, "cancelTouchEvent", ACTION_WIDGETVIEW_CANCEL_TOUCH_EVENT );
91 DALI_ACTION_REGISTRATION( Dali::WidgetView, WidgetView, "activateFaultedWidget", ACTION_WIDGETVIEW_ACTIVATE_FAULTED_WIDGET );
93 DALI_TYPE_REGISTRATION_END()
95 struct wl_buffer* preBuffer;
97 const char* const FONT_STYLE( "fontStyle" );
98 const char* const TEXT_POINT_SIZE( "textPointSize" );
99 const char* const TEXT_COLOR( "textColor" );
101 static void OnBufferUpdated( struct tizen_remote_surface *surface, uint32_t type, struct wl_buffer *buffer,
102 int32_t img_file_fd, uint32_t img_file_size, uint32_t time, struct wl_array *keys,
103 const char *appid, const char *instance_id, const int pid, void *data)
105 Dali::WidgetView::Internal::WidgetView* widgetView = static_cast< Dali::WidgetView::Internal::WidgetView* >( data );
109 if( !widgetView->IsWidgetImageView() )
111 tizen_remote_surface_transfer_visibility( surface, TIZEN_REMOTE_SURFACE_VISIBILITY_TYPE_VISIBLE);
113 widgetView->CreateWidgetImageView();
114 widgetView->ConnectSignal( surface );
117 //get tbm surface from buffer
118 tbm_surface_h tbmSurface = static_cast< tbm_surface_h >( wl_buffer_get_user_data( buffer ) );
119 widgetView->UpdateImageSource( tbmSurface );
122 if( preBuffer != NULL && tizen_remote_surface_get_version( surface ) >= TIZEN_REMOTE_SURFACE_RELEASE_SINCE_VERSION )
124 tizen_remote_surface_release( surface, preBuffer );
129 close( img_file_fd );
132 static void OnBufferAdded( const char *appid, const char *instance_id, const int pid, void *data )
136 static void OnSurfaceRemoved( const char *appid, const char *instance_id, const int pid, void *data )
138 Dali::WidgetView::Internal::WidgetView* widgetView = static_cast< Dali::WidgetView::Internal::WidgetView* >( data );
142 widgetView->CloseRemoteSurface();
143 widgetView->RemoveWidgetImage();
147 } // unnamed namespace
149 Dali::WidgetView::WidgetView WidgetView::New( const std::string& widgetId, const std::string& contentInfo, int width, int height, float updatePeriod )
151 // Create the implementation, temporarily owned on stack
152 IntrusivePtr< WidgetView > internalWidgetView = new WidgetView( widgetId, contentInfo, width, height, updatePeriod );
154 // Pass ownership to CustomActor
155 Dali::WidgetView::WidgetView widgetView( *internalWidgetView );
157 // Second-phase init of the implementation
158 // This can only be done after the CustomActor connection has been made...
159 internalWidgetView->Initialize();
164 WidgetView::WidgetView()
165 : Control( ControlBehaviour( REQUIRES_TOUCH_EVENTS ) ),
173 mUpdatePeriod( 0.0 ),
174 mPreviewVisible( true ),
175 mLoadingTextVisible( true ),
176 mTapTextVisible( true ),
177 mPermanentDelete( false ),
178 mWatcherHandle( NULL ),
179 mRemoteSurface( NULL )
183 WidgetView::WidgetView( const std::string& widgetId, const std::string& contentInfo, int width, int height, float updatePeriod )
184 : Control( ControlBehaviour( REQUIRES_TOUCH_EVENTS ) ),
185 mWidgetId( widgetId ),
187 mContentInfo( contentInfo ),
192 mUpdatePeriod( updatePeriod ),
193 mPreviewVisible( true ),
194 mLoadingTextVisible( true ),
195 mTapTextVisible( true ),
196 mPermanentDelete( false ),
197 mWatcherHandle( NULL ),
198 mRemoteSurface( NULL )
202 WidgetView::~WidgetView()
204 if( !mWidgetId.empty() && !mInstanceId.empty() )
206 widget_instance_terminate( mInstanceId.c_str() );
208 if( mPermanentDelete )
210 widget_instance_destroy( mInstanceId.c_str() );
215 bool WidgetView::PauseWidget()
217 int ret = widget_instance_pause( mInstanceId.c_str() );
220 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::PauseWidget: Fail to pause widget(%s, %s) [%d]\n", mWidgetId.c_str(), mInstanceId.c_str(), ret );
224 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::PauseWidget: Widget is paused (%s, %s)\n", mWidgetId.c_str(), mInstanceId.c_str() );
229 bool WidgetView::ResumeWidget()
231 int ret = widget_instance_resume( mInstanceId.c_str() );
234 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::ResumeWidget: Fail to resume widget(%s, %s) [%d]\n", mWidgetId.c_str(), mInstanceId.c_str(), ret );
238 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::ResumeWidget: Widget is resumed (%s, %s)\n", mWidgetId.c_str(), mInstanceId.c_str() );
243 const std::string& WidgetView::GetWidgetId() const
248 const std::string& WidgetView::GetInstanceId() const
253 const std::string& WidgetView::GetContentInfo()
255 widget_instance_h instance;
256 char* contentInfo = NULL;
258 mContentInfo.clear();
260 if( mWidgetId.empty() || mInstanceId.empty() )
262 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetContentInfo: Widget id (%s) or instance id (%s) is invalid.\n", mWidgetId.c_str(), mInstanceId.c_str() );
266 instance = widget_instance_get_instance( mWidgetId.c_str(), mInstanceId.c_str() );
269 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetContentInfo: widget_instance_get_instance is failed. [%s]\n", mInstanceId.c_str() );
273 if( widget_instance_get_content( instance, &contentInfo ) < 0 )
275 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetContentInfo: Failed to get content of widget. [%s]\n", mInstanceId.c_str() );
279 mContentInfo = reinterpret_cast< char* >( contentInfo );
284 const std::string& WidgetView::GetTitle()
286 //ToDo: We should add some codes by considering widget_viewer_evas
289 mTitle = widget_service_get_name( mWidgetId.c_str(), NULL );
292 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetTitle: title = %s\n", mTitle.c_str() );
297 float WidgetView::GetUpdatePeriod() const
299 return mUpdatePeriod;
302 bool WidgetView::CancelTouchEvent()
306 tizen_remote_surface_transfer_touch_cancel( mRemoteSurface );
313 void WidgetView::SetPreviewVisible( bool visible )
315 if( mPreviewImage && mPreviewVisible != visible )
317 mPreviewVisible = visible;
318 mPreviewImage.SetVisible( visible );
322 bool WidgetView::IsPreviewVisible()
324 return mPreviewVisible;
327 void WidgetView::SetLoadingTextVisible( bool visible )
329 if( mStateText && mLoadingTextVisible != visible )
331 mLoadingTextVisible = visible;
335 mStateText.SetProperty( Toolkit::TextLabel::Property::TEXT, GET_LOCALE_TEXT( "IDS_ST_POP_LOADING_ING" ) );
337 mStateText.SetVisible( visible );
341 bool WidgetView::IsLoadingTextVisible()
343 return mLoadingTextVisible;
346 void WidgetView::ActivateFaultedWidget()
350 // Enable preview and loading text
351 ShowTapWidgetState( false );
352 ShowLoadingState( true );
354 // launch widget again
355 mPid = widget_instance_launch( mInstanceId.c_str(), (char *)mContentInfo.c_str(), mWidth, mHeight );
358 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::ActivateFaultedWidget: widget_instance_launch is failed. [%s]\n", mWidgetId.c_str() );
360 ShowLoadingState( false );
361 ShowTapWidgetState( true );
364 Dali::WidgetView::WidgetView handle( GetOwner() );
365 mWidgetCreationAbortedSignal.Emit( handle );
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 ShowTapWidgetState( true );
422 Dali::WidgetView::WidgetView handle( GetOwner() );
423 mWidgetDeletedSignal.Emit( handle );
425 mWidgetImageView.SetVisible( false );
426 mWidgetImageView.Reset();
428 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::RemoveWidgetImage: Widget image is removed.\n" );
431 void WidgetView::SendWidgetEvent( int event )
433 Dali::WidgetView::WidgetView handle( GetOwner() );
435 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::SendWidgetEvent: event = %d widget = %s\n", event, mWidgetId.c_str() );
440 case WIDGET_INSTANCE_EVENT_UPDATE:
441 case WIDGET_INSTANCE_EVENT_EXTRA_UPDATED:
443 mWidgetContentUpdatedSignal.Emit( handle );
446 case WIDGET_INSTANCE_EVENT_PERIOD_CHANGED:
448 mWidgetUpdatePeriodChangedSignal.Emit( handle );
451 case WIDGET_INSTANCE_EVENT_FAULT:
453 mWidgetFaultedSignal.Emit( handle );
463 bool WidgetView::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor )
465 Dali::BaseHandle handle( object );
467 bool connected( true );
468 Dali::WidgetView::WidgetView widgetView = Dali::WidgetView::WidgetView::DownCast( handle );
470 if( strcmp( signalName.c_str(), SIGNAL_WIDGET_ADDED ) == 0 )
472 widgetView.WidgetAddedSignal().Connect( tracker, functor );
474 else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_DELETED ) == 0 )
476 widgetView.WidgetDeletedSignal().Connect( tracker, functor );
478 else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_CREATION_ABORTED ) == 0 )
480 widgetView.WidgetCreationAbortedSignal().Connect( tracker, functor );
482 else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_CONTENT_UPDATED ) == 0 )
484 widgetView.WidgetContentUpdatedSignal().Connect( tracker, functor );
486 else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_UPDATE_PERIOD_CHANGED ) == 0 )
488 widgetView.WidgetUpdatePeriodChangedSignal().Connect( tracker, functor );
490 else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_FAULTED ) == 0 )
492 widgetView.WidgetFaultedSignal().Connect( tracker, functor );
496 // signalName does not match any signal
503 bool WidgetView::DoAction( BaseObject* object, const std::string& actionName, const Property::Map& attributes )
507 Dali::BaseHandle handle( object );
508 Dali::WidgetView::WidgetView widgetView = Dali::WidgetView::WidgetView::DownCast( handle );
515 WidgetView& impl = GetImplementation( widgetView );
517 if( strcmp( actionName.c_str(), ACTION_WIDGETVIEW_PAUSE_WIDGET ) == 0 )
521 else if( strcmp( actionName.c_str(), ACTION_WIDGETVIEW_RESUME_WIDGET ) == 0 )
525 else if( strcmp( actionName.c_str(), ACTION_WIDGETVIEW_CANCEL_TOUCH_EVENT ) == 0 )
527 impl.CancelTouchEvent();
529 else if( strcmp( actionName.c_str(), ACTION_WIDGETVIEW_ACTIVATE_FAULTED_WIDGET ) == 0 )
531 impl.ActivateFaultedWidget();
541 void WidgetView::SetProperty( BaseObject* object, Property::Index index, const Property::Value& value )
543 Dali::WidgetView::WidgetView widgetView = Dali::WidgetView::WidgetView::DownCast( Dali::BaseHandle( object ) );
547 WidgetView& impl = GetImplementation( widgetView );
551 case Dali::WidgetView::WidgetView::Property::PREVIEW:
555 if( value.Get( previewEnabled ) )
557 impl.SetPreviewVisible( previewEnabled );
561 case Dali::WidgetView::WidgetView::Property::LOADING_TEXT:
566 if( value.Get( textEnabled ) )
568 impl.SetLoadingTextVisible( textEnabled );
570 else if( value.Get( map ) )
572 impl.SetLoadingTextPropertyMap( map );
576 case Dali::WidgetView::WidgetView::Property::PERMANENT_DELETE:
579 if( value.Get( del ) )
581 impl.SetPermanentDelete( del );
589 Property::Value WidgetView::GetProperty( BaseObject* object, Property::Index index )
591 Property::Value value;
592 Dali::WidgetView::WidgetView widgetView = Dali::WidgetView::WidgetView::DownCast( Dali::BaseHandle( object ) );
596 WidgetView& impl = GetImplementation( widgetView );
600 case Dali::WidgetView::WidgetView::Property::WIDGET_ID:
602 value = impl.GetWidgetId();
605 case Dali::WidgetView::WidgetView::Property::INSTANCE_ID:
607 value = impl.GetInstanceId();
610 case Dali::WidgetView::WidgetView::Property::CONTENT_INFO:
612 value = impl.GetContentInfo();
615 case Dali::WidgetView::WidgetView::Property::TITLE:
617 value = impl.GetTitle();
620 case Dali::WidgetView::WidgetView::Property::UPDATE_PERIOD:
622 value = impl.GetUpdatePeriod();
625 case Dali::WidgetView::WidgetView::Property::PREVIEW:
627 value = impl.IsPreviewVisible();
630 case Dali::WidgetView::WidgetView::Property::LOADING_TEXT:
632 value = impl.IsLoadingTextVisible();
635 case Dali::WidgetView::WidgetView::Property::WIDGET_STATE_FAULTED:
637 value = impl.IsWidgetFaulted();
640 case Dali::WidgetView::WidgetView::Property::PERMANENT_DELETE:
642 value = impl.IsPermanentDelete();
651 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetAddedSignal()
653 return mWidgetAddedSignal;
656 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetDeletedSignal()
658 return mWidgetDeletedSignal;
661 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetCreationAbortedSignal()
663 return mWidgetCreationAbortedSignal;
666 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetContentUpdatedSignal()
668 return mWidgetContentUpdatedSignal;
671 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetUpdatePeriodChangedSignal()
673 return mWidgetUpdatePeriodChangedSignal;
676 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetFaultedSignal()
678 return mWidgetFaultedSignal;
681 void WidgetView::OnInitialize()
683 char* instanceId = NULL;
684 char* previewPath = NULL;
685 std::string previewImage;
686 widget_size_type_e sizeType;
687 screen_connector_toolkit_ops ops;
689 int ret = widget_instance_create( mWidgetId.c_str(), &instanceId );
690 if( ret < 0 || !instanceId )
692 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_create is failed [%s].\n", mWidgetId.c_str() );
696 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_create is called. [widget id = %s, instance id = %s]\n",
697 mWidgetId.c_str(), instanceId );
699 mInstanceId = instanceId;
702 widget_service_get_size_type( mWidth, mHeight, &sizeType );
704 previewPath = widget_service_get_preview_image_path( mWidgetId.c_str(), sizeType );
707 previewImage = previewPath;
712 previewImage = WIDGET_VIEW_RESOURCE_DEFAULT_IMG;
715 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: preview image path = %s\n", previewImage.c_str() );
718 mPreviewActor = Dali::Actor::New();
719 mPreviewActor.SetParentOrigin( ParentOrigin::CENTER );
720 mPreviewActor.SetAnchorPoint( AnchorPoint::CENTER );
721 mPreviewActor.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS );
723 mPreviewImage = Toolkit::ImageView::New( previewImage );
724 mPreviewImage.SetParentOrigin( ParentOrigin::CENTER );
725 mPreviewImage.SetAnchorPoint( AnchorPoint::CENTER );
726 mPreviewImage.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS );
728 Self().SetResizePolicy( ResizePolicy::FIXED, Dimension::ALL_DIMENSIONS );
729 Self().SetSize( mWidth, mHeight );
731 Self().Add( mPreviewActor );
732 mPreviewActor.Add( mPreviewImage );
734 mStateTextActor = Dali::Actor::New();
735 mStateTextActor.SetParentOrigin( ParentOrigin::CENTER );
736 mStateTextActor.SetAnchorPoint( AnchorPoint::CENTER );
737 mStateTextActor.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS );
740 mStateText = Toolkit::TextLabel::New( GET_LOCALE_TEXT( "IDS_ST_POP_LOADING_ING" ) );
741 mStateText.SetParentOrigin( ParentOrigin::CENTER );
742 mStateText.SetAnchorPoint( AnchorPoint::CENTER );
743 mStateText.SetProperty( Toolkit::TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
744 mStateText.SetProperty( Toolkit::TextLabel::Property::VERTICAL_ALIGNMENT, "CENTER" );
745 mStateText.SetProperty( Toolkit::TextLabel::Property::TEXT_COLOR, Dali::Color::WHITE );
746 mStateText.SetProperty( Toolkit::TextLabel::Property::FONT_STYLE, "Bold" );
747 mStateText.SetProperty( Toolkit::TextLabel::Property::POINT_SIZE, TextPixelToPointSize( DEFAULT_FONT_PIXEL_SIZE ) );
749 mPreviewActor.Add( mStateTextActor );
750 mStateTextActor.Add( mStateText );
753 mPid = widget_instance_launch( instanceId, (char *)mContentInfo.c_str(), mWidth, mHeight );
757 ShowTapWidgetState( true );
759 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_launch is failed. [%s]\n", mWidgetId.c_str() );
762 Dali::WidgetView::WidgetView handle( GetOwner() );
763 mWidgetCreationAbortedSignal.Emit( handle );
768 ops.updated_cb = OnBufferUpdated;
769 ops.removed_cb = OnSurfaceRemoved;
770 ops.added_cb = OnBufferAdded;
771 mWatcherHandle = screen_connector_toolkit_add(&ops, (char *)instanceId, SCREEN_CONNECTOR_SCREEEN_TYPE_WIDGET, this);
772 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_launch is called. [%s, mPid = %d]\n", mWidgetId.c_str(), mPid );
776 void WidgetView::OnStageConnection( int depth )
778 Control::OnStageConnection( depth );
781 void WidgetView::OnStageDisconnection()
783 Control::OnStageDisconnection();
786 void WidgetView::OnSizeSet( const Vector3& targetSize )
788 if( mWidgetImageView )
790 mWidgetImageView.SetSize( targetSize );
794 bool WidgetView::IsWidgetImageView()
796 return ( mWidgetImageView )? true: false;
799 void WidgetView::UpdateImageSource( tbm_surface_h source )
801 mImageSource->SetSource( source );
802 Dali::Stage::GetCurrent().KeepRendering( 0.0f );
805 void WidgetView::ConnectSignal( tizen_remote_surface* surface )
807 if( mWidgetImageView && surface )
809 mRemoteSurface = surface;
811 Self().TouchSignal().Connect( this, &WidgetView::OnTouch );
812 Self().WheelEventSignal().Connect( this, &WidgetView::OnWheelEvent );
817 bool WidgetView::OnTouch( Dali::Actor actor, const Dali::TouchData& event )
819 tizen_remote_surface_event_type type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_NONE;
821 if( event.GetPointCount() == 0 || mRemoteSurface == NULL )
826 switch( event.GetState( 0 ) )
828 case Dali::PointState::UP:
830 type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_UP;
833 case Dali::PointState::DOWN:
835 type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_DOWN;
838 case Dali::PointState::MOTION:
840 type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_MOVE;
851 if( type == TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_MOVE )
856 Vector2 localPos = event.GetLocalPosition( 0 );
858 tizen_remote_surface_transfer_mouse_event( mRemoteSurface,
864 wl_fixed_from_double( event.GetEllipseRadius( 0 ).x ),
865 wl_fixed_from_double( event.GetEllipseRadius( 0 ).y ),
866 wl_fixed_from_double( event.GetPressure( 0 ) ),
867 wl_fixed_from_double( event.GetAngle( 0 ).degree ),
868 TIZEN_INPUT_DEVICE_CLAS_TOUCHSCREEN,
869 TIZEN_INPUT_DEVICE_SUBCLAS_NONE,
876 bool WidgetView::OnWheelEvent( Dali::Actor actor, const Dali::WheelEvent& event )
878 if( mRemoteSurface == NULL )
882 //ToDo: We should check TIZEN_INPUT_DEVICE_CLAS_MOUSE
883 tizen_remote_surface_transfer_mouse_wheel( mRemoteSurface,
886 TIZEN_INPUT_DEVICE_CLAS_MOUSE,
887 TIZEN_INPUT_DEVICE_SUBCLAS_NONE,
894 Vector3 WidgetView::GetNaturalSize()
900 if( size.x > 0 && size.y > 0 )
902 size.z = std::min( size.x, size.y );
907 return Control::GetNaturalSize();
911 float WidgetView::GetHeightForWidth( float width )
913 if( mWidth > 0 && mHeight > 0 )
915 return GetHeightForWidthBase( width );
919 return Control::GetHeightForWidthBase( width );
923 float WidgetView::GetWidthForHeight( float height )
925 if( mWidth > 0 && mHeight > 0 )
927 return GetWidthForHeightBase( height );
931 return Control::GetWidthForHeightBase( height );
935 void WidgetView::CloseRemoteSurface()
937 screen_connector_toolkit_remove( mWatcherHandle );
938 mRemoteSurface = NULL;
941 void WidgetView::ShowLoadingState( bool show )
943 if( mPreviewImage && mPreviewVisible )
945 mPreviewImage.SetVisible( show );
948 if( mStateText && mLoadingTextVisible )
950 mStateText.SetProperty( Toolkit::TextLabel::Property::TEXT, GET_LOCALE_TEXT( "IDS_ST_POP_LOADING_ING" ) );
951 mStateText.SetVisible( show );
955 void WidgetView::ShowTapWidgetState( bool show )
957 if( mPreviewImage && mPreviewVisible )
959 mPreviewImage.SetVisible( false );
962 if( mStateText && mTapTextVisible )
964 mStateText.SetProperty( Toolkit::TextLabel::Property::TEXT, GET_LOCALE_TEXT( "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY" ) );
965 mStateText.SetVisible( show );
969 void WidgetView::SetLoadingTextPropertyMap( Property::Map map )
973 Property::Value* fontStyle = map.Find( FONT_STYLE );
976 if( fontStyle && fontStyle->Get( style ) )
978 mStateText.SetProperty( Toolkit::TextLabel::Property::FONT_STYLE, style );
981 Property::Value* textPointSize = map.Find( TEXT_POINT_SIZE );
984 if( textPointSize && textPointSize->Get( size ) )
986 mStateText.SetProperty( Toolkit::TextLabel::Property::POINT_SIZE, size );
989 Property::Value* textColor = map.Find( TEXT_COLOR );
992 if( textColor && textColor->Get( color ) )
994 mStateText.SetProperty( Toolkit::TextLabel::Property::TEXT_COLOR, color );
999 float WidgetView::TextPixelToPointSize( int pixelSize )
1001 Dali::Vector2 dpi = Dali::Stage::GetCurrent().GetDpi();
1002 float meanDpi = (dpi.height + dpi.width) / 2.0f;
1004 return (pixelSize * 72.0f) / meanDpi;
1007 } // namespace Internal
1009 } // namespace WidgetView