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 #define GET_LOCALE_TEXT(string) dgettext(PKGNAME, string)
56 #if defined(DEBUG_ENABLED)
57 Integration::Log::Filter* gWidgetViewLogging = Integration::Log::Filter::New( Debug::Verbose, false, "LOG_WIDGET_VIEW" );
62 return Dali::BaseHandle();
65 // Setup properties, signals and actions using the type-registry.
66 DALI_TYPE_REGISTRATION_BEGIN( Dali::WidgetView::WidgetView, Toolkit::Control, Create );
67 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "widgetId", BOOLEAN, WIDGET_ID )
68 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "instanceId", BOOLEAN, INSTANCE_ID )
69 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "contentInfo", BOOLEAN, CONTENT_INFO )
70 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "title", BOOLEAN, TITLE )
71 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "updatePeriod", BOOLEAN, UPDATE_PERIOD )
72 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "preview", MAP, PREVIEW )
73 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "loadingText", MAP, LOADING_TEXT )
74 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "widgetStateFaulted", BOOLEAN, WIDGET_STATE_FAULTED )
75 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "permanentDelete", BOOLEAN, PERMANENT_DELETE )
78 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetAdded", SIGNAL_WIDGET_ADDED )
79 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetDeleted", SIGNAL_WIDGET_DELETED )
80 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetCreationAborted", SIGNAL_WIDGET_CREATION_ABORTED )
81 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetContentUpdated", SIGNAL_WIDGET_CONTENT_UPDATED )
82 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetUpdatePeriodChanged", SIGNAL_WIDGET_UPDATE_PERIOD_CHANGED )
83 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetFaulted", SIGNAL_WIDGET_FAULTED )
86 DALI_ACTION_REGISTRATION( Dali::WidgetView, WidgetView, "pauseWidget", ACTION_WIDGETVIEW_PAUSE_WIDGET );
87 DALI_ACTION_REGISTRATION( Dali::WidgetView, WidgetView, "resumeWidget", ACTION_WIDGETVIEW_RESUME_WIDGET );
88 DALI_ACTION_REGISTRATION( Dali::WidgetView, WidgetView, "cancelTouchEvent", ACTION_WIDGETVIEW_CANCEL_TOUCH_EVENT );
89 DALI_ACTION_REGISTRATION( Dali::WidgetView, WidgetView, "activateFaultedWidget", ACTION_WIDGETVIEW_ACTIVATE_FAULTED_WIDGET );
91 DALI_TYPE_REGISTRATION_END()
93 struct wl_buffer* preBuffer;
95 const char* const FONT_STYLE( "fontStyle" );
96 const char* const TEXT_POINT_SIZE( "textPointSize" );
97 const char* const TEXT_COLOR( "textColor" );
99 static void OnBufferUpdated( struct tizen_remote_surface *surface, uint32_t type, struct wl_buffer *buffer,
100 int32_t img_file_fd, uint32_t img_file_size, uint32_t time, struct wl_array *keys,
101 const char *appid, const char *instance_id, const int pid, void *data)
103 Dali::WidgetView::Internal::WidgetView* widgetView = static_cast< Dali::WidgetView::Internal::WidgetView* >( data );
107 if( !widgetView->IsWidgetImageView() )
109 tizen_remote_surface_transfer_visibility( surface, TIZEN_REMOTE_SURFACE_VISIBILITY_TYPE_VISIBLE);
111 widgetView->CreateWidgetImageView();
112 widgetView->ConnectSignal( surface );
115 //get tbm surface from buffer
116 tbm_surface_h tbmSurface = static_cast< tbm_surface_h >( wl_buffer_get_user_data( buffer ) );
117 widgetView->UpdateImageSource( tbmSurface );
120 if( preBuffer != NULL && tizen_remote_surface_get_version( surface ) >= TIZEN_REMOTE_SURFACE_RELEASE_SINCE_VERSION )
122 tizen_remote_surface_release( surface, preBuffer );
127 close( img_file_fd );
130 static void OnBufferAdded( const char *appid, const char *instance_id, const int pid, void *data )
134 static void OnSurfaceRemoved( const char *appid, const char *instance_id, const int pid, void *data )
136 Dali::WidgetView::Internal::WidgetView* widgetView = static_cast< Dali::WidgetView::Internal::WidgetView* >( data );
140 widgetView->CloseRemoteSurface();
141 widgetView->RemoveWidgetImage();
145 } // unnamed namespace
147 Dali::WidgetView::WidgetView WidgetView::New( const std::string& widgetId, const std::string& contentInfo, int width, int height, float updatePeriod )
149 // Create the implementation, temporarily owned on stack
150 IntrusivePtr< WidgetView > internalWidgetView = new WidgetView( widgetId, contentInfo, width, height, updatePeriod );
152 // Pass ownership to CustomActor
153 Dali::WidgetView::WidgetView widgetView( *internalWidgetView );
155 // Second-phase init of the implementation
156 // This can only be done after the CustomActor connection has been made...
157 internalWidgetView->Initialize();
162 WidgetView::WidgetView()
163 : Control( ControlBehaviour( REQUIRES_TOUCH_EVENTS ) ),
171 mUpdatePeriod( 0.0 ),
172 mPreviewVisible( true ),
173 mLoadingTextVisible( true ),
174 mTapTextVisible( true ),
175 mPermanentDelete( false ),
176 mWatcherHandle( NULL ),
177 mRemoteSurface( NULL )
181 WidgetView::WidgetView( const std::string& widgetId, const std::string& contentInfo, int width, int height, float updatePeriod )
182 : Control( ControlBehaviour( REQUIRES_TOUCH_EVENTS ) ),
183 mWidgetId( widgetId ),
185 mContentInfo( contentInfo ),
190 mUpdatePeriod( updatePeriod ),
191 mPreviewVisible( true ),
192 mLoadingTextVisible( true ),
193 mTapTextVisible( true ),
194 mPermanentDelete( false ),
195 mWatcherHandle( NULL ),
196 mRemoteSurface( NULL )
200 WidgetView::~WidgetView()
202 if( !mWidgetId.empty() && !mInstanceId.empty() )
204 widget_instance_terminate( mInstanceId.c_str() );
206 if( mPermanentDelete )
208 widget_instance_destroy( mInstanceId.c_str() );
213 bool WidgetView::PauseWidget()
215 int ret = widget_instance_pause( mInstanceId.c_str() );
218 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::PauseWidget: Fail to pause widget(%s, %s) [%d]\n", mWidgetId.c_str(), mInstanceId.c_str(), ret );
222 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::PauseWidget: Widget is paused (%s, %s)\n", mWidgetId.c_str(), mInstanceId.c_str() );
227 bool WidgetView::ResumeWidget()
229 int ret = widget_instance_resume( mInstanceId.c_str() );
232 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::ResumeWidget: Fail to resume widget(%s, %s) [%d]\n", mWidgetId.c_str(), mInstanceId.c_str(), ret );
236 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::ResumeWidget: Widget is resumed (%s, %s)\n", mWidgetId.c_str(), mInstanceId.c_str() );
241 const std::string& WidgetView::GetWidgetId() const
246 const std::string& WidgetView::GetInstanceId() const
251 const std::string& WidgetView::GetContentInfo()
253 widget_instance_h instance;
254 char* contentInfo = NULL;
256 mContentInfo.clear();
258 if( mWidgetId.empty() || mInstanceId.empty() )
260 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetContentInfo: Widget id (%s) or instance id (%s) is invalid.\n", mWidgetId.c_str(), mInstanceId.c_str() );
264 instance = widget_instance_get_instance( mWidgetId.c_str(), mInstanceId.c_str() );
267 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetContentInfo: widget_instance_get_instance is failed. [%s]\n", mInstanceId.c_str() );
271 if( widget_instance_get_content( instance, &contentInfo ) < 0 )
273 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetContentInfo: Failed to get content of widget. [%s]\n", mInstanceId.c_str() );
277 mContentInfo = reinterpret_cast< char* >( contentInfo );
282 const std::string& WidgetView::GetTitle()
284 //ToDo: We should add some codes by considering widget_viewer_evas
287 mTitle = widget_service_get_name( mWidgetId.c_str(), NULL );
290 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetTitle: title = %s\n", mTitle.c_str() );
295 float WidgetView::GetUpdatePeriod() const
297 return mUpdatePeriod;
300 bool WidgetView::CancelTouchEvent()
304 tizen_remote_surface_transfer_touch_cancel( mRemoteSurface );
311 void WidgetView::SetPreviewVisible( bool visible )
313 if( mPreviewImage && mPreviewVisible != visible )
315 mPreviewVisible = visible;
316 mPreviewImage.SetVisible( visible );
320 bool WidgetView::IsPreviewVisible()
322 return mPreviewVisible;
325 void WidgetView::SetLoadingTextVisible( bool visible )
327 if( mStateText && mLoadingTextVisible != visible )
329 mLoadingTextVisible = visible;
333 mStateText.SetProperty( Toolkit::TextLabel::Property::TEXT, GET_LOCALE_TEXT( "IDS_ST_POP_LOADING_ING" ) );
335 mStateText.SetVisible( visible );
339 bool WidgetView::IsLoadingTextVisible()
341 return mLoadingTextVisible;
344 void WidgetView::ActivateFaultedWidget()
348 // Enable preview and loading text
349 ShowTapWidgetState( false );
350 ShowLoadingState( true );
352 // launch widget again
353 mPid = widget_instance_launch( mInstanceId.c_str(), (char *)mContentInfo.c_str(), mWidth, mHeight );
356 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::ActivateFaultedWidget: widget_instance_launch is failed. [%s]\n", mWidgetId.c_str() );
358 ShowLoadingState( false );
359 ShowTapWidgetState( true );
362 Dali::WidgetView::WidgetView handle( GetOwner() );
363 mWidgetCreationAbortedSignal.Emit( handle );
369 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::ActivateFaultedWidget: widget_instance_launch is called. [%s, mPid = %d]\n", mWidgetId.c_str(), mPid );
373 bool WidgetView::IsWidgetFaulted()
375 return mPid < 0 ? true : false;
378 void WidgetView::SetPermanentDelete( bool permanentDelete )
380 mPermanentDelete = permanentDelete;
383 bool WidgetView::IsPermanentDelete()
385 return mPermanentDelete;
388 void WidgetView::CreateWidgetImageView()
391 mImageSource = Dali::NativeImageSource::New( source );
392 Dali::NativeImage image = Dali::NativeImage::New( *mImageSource );
394 mWidgetImageView = Dali::Toolkit::ImageView::New( image );
396 mWidgetImageView.SetParentOrigin( ParentOrigin::CENTER );
397 mWidgetImageView.SetAnchorPoint( AnchorPoint::CENTER );
398 mWidgetImageView.SetSize( mWidth, mHeight );
400 Self().Add( mWidgetImageView );
402 //EFL app should be pre multiplied image.
403 mWidgetImageView.SetProperty( Toolkit::ImageView::Property::PRE_MULTIPLIED_ALPHA, true );
405 // Disable preview and text
406 ShowLoadingState( false );
409 Dali::WidgetView::WidgetView handle( GetOwner() );
410 mWidgetAddedSignal.Emit( handle );
412 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::CreateWidgetImageView: Widget image is added.\n" );
415 void WidgetView::RemoveWidgetImage()
417 ShowTapWidgetState( true );
420 Dali::WidgetView::WidgetView handle( GetOwner() );
421 mWidgetDeletedSignal.Emit( handle );
423 mWidgetImageView.SetVisible( false );
424 mWidgetImageView.Reset();
426 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::RemoveWidgetImage: Widget image is removed.\n" );
429 void WidgetView::SendWidgetEvent( int event )
431 Dali::WidgetView::WidgetView handle( GetOwner() );
433 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::SendWidgetEvent: event = %d widget = %s\n", event, mWidgetId.c_str() );
438 case WIDGET_INSTANCE_EVENT_UPDATE:
439 case WIDGET_INSTANCE_EVENT_EXTRA_UPDATED:
441 mWidgetContentUpdatedSignal.Emit( handle );
444 case WIDGET_INSTANCE_EVENT_PERIOD_CHANGED:
446 mWidgetUpdatePeriodChangedSignal.Emit( handle );
449 case WIDGET_INSTANCE_EVENT_FAULT:
451 mWidgetFaultedSignal.Emit( handle );
461 bool WidgetView::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor )
463 Dali::BaseHandle handle( object );
465 bool connected( true );
466 Dali::WidgetView::WidgetView widgetView = Dali::WidgetView::WidgetView::DownCast( handle );
468 if( strcmp( signalName.c_str(), SIGNAL_WIDGET_ADDED ) == 0 )
470 widgetView.WidgetAddedSignal().Connect( tracker, functor );
472 else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_DELETED ) == 0 )
474 widgetView.WidgetDeletedSignal().Connect( tracker, functor );
476 else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_CREATION_ABORTED ) == 0 )
478 widgetView.WidgetCreationAbortedSignal().Connect( tracker, functor );
480 else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_CONTENT_UPDATED ) == 0 )
482 widgetView.WidgetContentUpdatedSignal().Connect( tracker, functor );
484 else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_UPDATE_PERIOD_CHANGED ) == 0 )
486 widgetView.WidgetUpdatePeriodChangedSignal().Connect( tracker, functor );
488 else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_FAULTED ) == 0 )
490 widgetView.WidgetFaultedSignal().Connect( tracker, functor );
494 // signalName does not match any signal
501 bool WidgetView::DoAction( BaseObject* object, const std::string& actionName, const Property::Map& attributes )
505 Dali::BaseHandle handle( object );
506 Dali::WidgetView::WidgetView widgetView = Dali::WidgetView::WidgetView::DownCast( handle );
513 WidgetView& impl = GetImplementation( widgetView );
515 if( strcmp( actionName.c_str(), ACTION_WIDGETVIEW_PAUSE_WIDGET ) == 0 )
519 else if( strcmp( actionName.c_str(), ACTION_WIDGETVIEW_RESUME_WIDGET ) == 0 )
523 else if( strcmp( actionName.c_str(), ACTION_WIDGETVIEW_CANCEL_TOUCH_EVENT ) == 0 )
525 impl.CancelTouchEvent();
527 else if( strcmp( actionName.c_str(), ACTION_WIDGETVIEW_ACTIVATE_FAULTED_WIDGET ) == 0 )
529 impl.ActivateFaultedWidget();
539 void WidgetView::SetProperty( BaseObject* object, Property::Index index, const Property::Value& value )
541 Dali::WidgetView::WidgetView widgetView = Dali::WidgetView::WidgetView::DownCast( Dali::BaseHandle( object ) );
545 WidgetView& impl = GetImplementation( widgetView );
549 case Dali::WidgetView::WidgetView::Property::PREVIEW:
553 if( value.Get( previewEnabled ) )
555 impl.SetPreviewVisible( previewEnabled );
559 case Dali::WidgetView::WidgetView::Property::LOADING_TEXT:
564 if( value.Get( textEnabled ) )
566 impl.SetLoadingTextVisible( textEnabled );
568 else if( value.Get( map ) )
570 impl.SetLoadingTextPropertyMap( map );
574 case Dali::WidgetView::WidgetView::Property::PERMANENT_DELETE:
577 if( value.Get( del ) )
579 impl.SetPermanentDelete( del );
587 Property::Value WidgetView::GetProperty( BaseObject* object, Property::Index index )
589 Property::Value value;
590 Dali::WidgetView::WidgetView widgetView = Dali::WidgetView::WidgetView::DownCast( Dali::BaseHandle( object ) );
594 WidgetView& impl = GetImplementation( widgetView );
598 case Dali::WidgetView::WidgetView::Property::WIDGET_ID:
600 value = impl.GetWidgetId();
603 case Dali::WidgetView::WidgetView::Property::INSTANCE_ID:
605 value = impl.GetInstanceId();
608 case Dali::WidgetView::WidgetView::Property::CONTENT_INFO:
610 value = impl.GetContentInfo();
613 case Dali::WidgetView::WidgetView::Property::TITLE:
615 value = impl.GetTitle();
618 case Dali::WidgetView::WidgetView::Property::UPDATE_PERIOD:
620 value = impl.GetUpdatePeriod();
623 case Dali::WidgetView::WidgetView::Property::PREVIEW:
625 value = impl.IsPreviewVisible();
628 case Dali::WidgetView::WidgetView::Property::LOADING_TEXT:
630 value = impl.IsLoadingTextVisible();
633 case Dali::WidgetView::WidgetView::Property::WIDGET_STATE_FAULTED:
635 value = impl.IsWidgetFaulted();
638 case Dali::WidgetView::WidgetView::Property::PERMANENT_DELETE:
640 value = impl.IsPermanentDelete();
649 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetAddedSignal()
651 return mWidgetAddedSignal;
654 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetDeletedSignal()
656 return mWidgetDeletedSignal;
659 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetCreationAbortedSignal()
661 return mWidgetCreationAbortedSignal;
664 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetContentUpdatedSignal()
666 return mWidgetContentUpdatedSignal;
669 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetUpdatePeriodChangedSignal()
671 return mWidgetUpdatePeriodChangedSignal;
674 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetFaultedSignal()
676 return mWidgetFaultedSignal;
679 void WidgetView::OnInitialize()
681 char* instanceId = NULL;
682 char* previewPath = NULL;
683 std::string previewImage;
684 widget_size_type_e sizeType;
685 screen_connector_toolkit_ops ops;
687 int ret = widget_instance_create( mWidgetId.c_str(), &instanceId );
688 if( ret < 0 || !instanceId )
690 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_create is failed [%s].\n", mWidgetId.c_str() );
694 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_create is called. [widget id = %s, instance id = %s]\n",
695 mWidgetId.c_str(), instanceId );
697 mInstanceId = instanceId;
700 widget_service_get_size_type( mWidth, mHeight, &sizeType );
702 previewPath = widget_service_get_preview_image_path( mWidgetId.c_str(), sizeType );
705 previewImage = previewPath;
710 previewImage = WIDGET_VIEW_RESOURCE_DEFAULT_IMG;
713 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: preview image path = %s\n", previewImage.c_str() );
716 mPreviewActor = Dali::Actor::New();
717 mPreviewActor.SetParentOrigin( ParentOrigin::CENTER );
718 mPreviewActor.SetAnchorPoint( AnchorPoint::CENTER );
719 mPreviewActor.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS );
721 mPreviewImage = Toolkit::ImageView::New( previewImage );
722 mPreviewImage.SetParentOrigin( ParentOrigin::CENTER );
723 mPreviewImage.SetAnchorPoint( AnchorPoint::CENTER );
724 mPreviewImage.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS );
726 Self().SetResizePolicy( ResizePolicy::FIXED, Dimension::ALL_DIMENSIONS );
727 Self().SetSize( mWidth, mHeight );
729 Self().Add( mPreviewActor );
730 mPreviewActor.Add( mPreviewImage );
732 mStateTextActor = Dali::Actor::New();
733 mStateTextActor.SetParentOrigin( ParentOrigin::CENTER );
734 mStateTextActor.SetAnchorPoint( AnchorPoint::CENTER );
735 mStateTextActor.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS );
738 mStateText = Toolkit::TextLabel::New( GET_LOCALE_TEXT( "IDS_ST_POP_LOADING_ING" ) );
739 mStateText.SetParentOrigin( ParentOrigin::CENTER );
740 mStateText.SetAnchorPoint( AnchorPoint::CENTER );
741 mStateText.SetProperty( Toolkit::TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
742 mStateText.SetProperty( Toolkit::TextLabel::Property::VERTICAL_ALIGNMENT, "CENTER" );
743 mStateText.SetProperty( Toolkit::TextLabel::Property::TEXT_COLOR, Dali::Color::WHITE );
744 mStateText.SetProperty( Toolkit::TextLabel::Property::FONT_STYLE, "Bold" );
746 mPreviewActor.Add( mStateTextActor );
747 mStateTextActor.Add( mStateText );
750 mPid = widget_instance_launch( instanceId, (char *)mContentInfo.c_str(), mWidth, mHeight );
754 ShowTapWidgetState( true );
756 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_launch is failed. [%s]\n", mWidgetId.c_str() );
759 Dali::WidgetView::WidgetView handle( GetOwner() );
760 mWidgetCreationAbortedSignal.Emit( handle );
765 ops.updated_cb = OnBufferUpdated;
766 ops.removed_cb = OnSurfaceRemoved;
767 ops.added_cb = OnBufferAdded;
768 mWatcherHandle = screen_connector_toolkit_add(&ops, (char *)instanceId, SCREEN_CONNECTOR_SCREEEN_TYPE_WIDGET, this);
769 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_launch is called. [%s, mPid = %d]\n", mWidgetId.c_str(), mPid );
773 void WidgetView::OnStageConnection( int depth )
775 Control::OnStageConnection( depth );
778 void WidgetView::OnStageDisconnection()
780 Control::OnStageDisconnection();
783 void WidgetView::OnSizeSet( const Vector3& targetSize )
785 if( mWidgetImageView )
787 mWidgetImageView.SetSize( targetSize );
791 bool WidgetView::IsWidgetImageView()
793 return ( mWidgetImageView )? true: false;
796 void WidgetView::UpdateImageSource( tbm_surface_h source )
798 mImageSource->SetSource( source );
799 Dali::Stage::GetCurrent().KeepRendering( 0.0f );
802 void WidgetView::ConnectSignal( tizen_remote_surface* surface )
804 if( mWidgetImageView && surface )
806 mRemoteSurface = surface;
808 Self().TouchSignal().Connect( this, &WidgetView::OnTouch );
809 Self().WheelEventSignal().Connect( this, &WidgetView::OnWheelEvent );
814 bool WidgetView::OnTouch( Dali::Actor actor, const Dali::TouchData& event )
816 tizen_remote_surface_event_type type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_NONE;
818 if( event.GetPointCount() == 0 || mRemoteSurface == NULL )
823 switch( event.GetState( 0 ) )
825 case Dali::PointState::UP:
827 type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_UP;
830 case Dali::PointState::DOWN:
832 type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_DOWN;
835 case Dali::PointState::MOTION:
837 type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_MOVE;
848 if( type == TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_MOVE )
853 Vector2 localPos = event.GetLocalPosition( 0 );
855 tizen_remote_surface_transfer_mouse_event( mRemoteSurface,
861 wl_fixed_from_double( event.GetEllipseRadius( 0 ).x ),
862 wl_fixed_from_double( event.GetEllipseRadius( 0 ).y ),
863 wl_fixed_from_double( event.GetPressure( 0 ) ),
864 wl_fixed_from_double( event.GetAngle( 0 ).degree ),
865 TIZEN_INPUT_DEVICE_CLAS_TOUCHSCREEN,
866 TIZEN_INPUT_DEVICE_SUBCLAS_NONE,
873 bool WidgetView::OnWheelEvent( Dali::Actor actor, const Dali::WheelEvent& event )
875 if( mRemoteSurface == NULL )
879 //ToDo: We should check TIZEN_INPUT_DEVICE_CLAS_MOUSE
880 tizen_remote_surface_transfer_mouse_wheel( mRemoteSurface,
883 TIZEN_INPUT_DEVICE_CLAS_MOUSE,
884 TIZEN_INPUT_DEVICE_SUBCLAS_NONE,
891 Vector3 WidgetView::GetNaturalSize()
897 if( size.x > 0 && size.y > 0 )
899 size.z = std::min( size.x, size.y );
904 return Control::GetNaturalSize();
908 float WidgetView::GetHeightForWidth( float width )
910 if( mWidth > 0 && mHeight > 0 )
912 return GetHeightForWidthBase( width );
916 return Control::GetHeightForWidthBase( width );
920 float WidgetView::GetWidthForHeight( float height )
922 if( mWidth > 0 && mHeight > 0 )
924 return GetWidthForHeightBase( height );
928 return Control::GetWidthForHeightBase( height );
932 void WidgetView::CloseRemoteSurface()
934 screen_connector_toolkit_remove( mWatcherHandle );
935 mRemoteSurface = NULL;
938 void WidgetView::ShowLoadingState( bool show )
940 if( mPreviewImage && mPreviewVisible )
942 mPreviewImage.SetVisible( show );
945 if( mStateText && mLoadingTextVisible )
947 mStateText.SetProperty( Toolkit::TextLabel::Property::TEXT, GET_LOCALE_TEXT( "IDS_ST_POP_LOADING_ING" ) );
948 mStateText.SetVisible( show );
952 void WidgetView::ShowTapWidgetState( bool show )
954 if( mPreviewImage && mPreviewVisible )
956 mPreviewImage.SetVisible( false );
959 if( mStateText && mTapTextVisible )
961 mStateText.SetProperty( Toolkit::TextLabel::Property::TEXT, GET_LOCALE_TEXT( "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY" ) );
962 mStateText.SetVisible( show );
966 void WidgetView::SetLoadingTextPropertyMap( Property::Map map )
970 Property::Value* fontStyle = map.Find( FONT_STYLE );
973 if( fontStyle && fontStyle->Get( style ) )
975 mStateText.SetProperty( Toolkit::TextLabel::Property::FONT_STYLE, style );
978 Property::Value* textPointSize = map.Find( TEXT_POINT_SIZE );
981 if( textPointSize && textPointSize->Get( size ) )
983 mStateText.SetProperty( Toolkit::TextLabel::Property::POINT_SIZE, size );
986 Property::Value* textColor = map.Find( TEXT_COLOR );
989 if( textColor && textColor->Get( color ) )
991 mStateText.SetProperty( Toolkit::TextLabel::Property::TEXT_COLOR, color );
996 } // namespace Internal
998 } // namespace WidgetView