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>
53 const char* const STATE_MESSAGE_LOADING = "loading";
54 const char* const STATE_MESSAGE_RETRY = "Unable to load data. Tap to retry";
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, STATE_MESSAGE_LOADING );
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 // TODO: use po files
739 mStateText = Toolkit::TextLabel::New( STATE_MESSAGE_LOADING );
740 mStateText.SetParentOrigin( ParentOrigin::CENTER );
741 mStateText.SetAnchorPoint( AnchorPoint::CENTER );
742 mStateText.SetProperty( Toolkit::TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
743 mStateText.SetProperty( Toolkit::TextLabel::Property::VERTICAL_ALIGNMENT, "CENTER" );
744 mStateText.SetProperty( Toolkit::TextLabel::Property::TEXT_COLOR, Dali::Color::WHITE );
745 mStateText.SetProperty( Toolkit::TextLabel::Property::FONT_STYLE, "Bold" );
747 mPreviewActor.Add( mStateTextActor );
748 mStateTextActor.Add( mStateText );
751 mPid = widget_instance_launch( instanceId, (char *)mContentInfo.c_str(), mWidth, mHeight );
755 ShowTapWidgetState( true );
757 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_launch is failed. [%s]\n", mWidgetId.c_str() );
760 Dali::WidgetView::WidgetView handle( GetOwner() );
761 mWidgetCreationAbortedSignal.Emit( handle );
766 ops.updated_cb = OnBufferUpdated;
767 ops.removed_cb = OnSurfaceRemoved;
768 ops.added_cb = OnBufferAdded;
769 mWatcherHandle = screen_connector_toolkit_add(&ops, (char *)instanceId, SCREEN_CONNECTOR_SCREEEN_TYPE_WIDGET, this);
770 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_launch is called. [%s, mPid = %d]\n", mWidgetId.c_str(), mPid );
774 void WidgetView::OnStageConnection( int depth )
776 Control::OnStageConnection( depth );
779 void WidgetView::OnStageDisconnection()
781 Control::OnStageDisconnection();
784 void WidgetView::OnSizeSet( const Vector3& targetSize )
786 if( mWidgetImageView )
788 mWidgetImageView.SetSize( targetSize );
792 bool WidgetView::IsWidgetImageView()
794 return ( mWidgetImageView )? true: false;
797 void WidgetView::UpdateImageSource( tbm_surface_h source )
799 mImageSource->SetSource( source );
800 Dali::Stage::GetCurrent().KeepRendering( 0.0f );
803 void WidgetView::ConnectSignal( tizen_remote_surface* surface )
805 if( mWidgetImageView && surface )
807 mRemoteSurface = surface;
809 Self().TouchSignal().Connect( this, &WidgetView::OnTouch );
810 Self().WheelEventSignal().Connect( this, &WidgetView::OnWheelEvent );
815 bool WidgetView::OnTouch( Dali::Actor actor, const Dali::TouchData& event )
817 tizen_remote_surface_event_type type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_NONE;
819 if( event.GetPointCount() == 0 || mRemoteSurface == NULL )
824 switch( event.GetState( 0 ) )
826 case Dali::PointState::UP:
828 type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_UP;
831 case Dali::PointState::DOWN:
833 type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_DOWN;
836 case Dali::PointState::MOTION:
838 type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_MOVE;
849 if( type == TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_MOVE )
854 Vector2 localPos = event.GetLocalPosition( 0 );
856 tizen_remote_surface_transfer_mouse_event( mRemoteSurface,
862 wl_fixed_from_double( event.GetEllipseRadius( 0 ).x ),
863 wl_fixed_from_double( event.GetEllipseRadius( 0 ).y ),
864 wl_fixed_from_double( event.GetPressure( 0 ) ),
865 wl_fixed_from_double( event.GetAngle( 0 ).degree ),
866 TIZEN_INPUT_DEVICE_CLAS_TOUCHSCREEN,
867 TIZEN_INPUT_DEVICE_SUBCLAS_NONE,
874 bool WidgetView::OnWheelEvent( Dali::Actor actor, const Dali::WheelEvent& event )
876 if( mRemoteSurface == NULL )
880 //ToDo: We should check TIZEN_INPUT_DEVICE_CLAS_MOUSE
881 tizen_remote_surface_transfer_mouse_wheel( mRemoteSurface,
884 TIZEN_INPUT_DEVICE_CLAS_MOUSE,
885 TIZEN_INPUT_DEVICE_SUBCLAS_NONE,
892 Vector3 WidgetView::GetNaturalSize()
898 if( size.x > 0 && size.y > 0 )
900 size.z = std::min( size.x, size.y );
905 return Control::GetNaturalSize();
909 float WidgetView::GetHeightForWidth( float width )
911 if( mWidth > 0 && mHeight > 0 )
913 return GetHeightForWidthBase( width );
917 return Control::GetHeightForWidthBase( width );
921 float WidgetView::GetWidthForHeight( float height )
923 if( mWidth > 0 && mHeight > 0 )
925 return GetWidthForHeightBase( height );
929 return Control::GetWidthForHeightBase( height );
933 void WidgetView::CloseRemoteSurface()
935 screen_connector_toolkit_remove( mWatcherHandle );
936 mRemoteSurface = NULL;
939 void WidgetView::ShowLoadingState( bool show )
941 if( mPreviewImage && mPreviewVisible )
943 mPreviewImage.SetVisible( show );
946 if( mStateText && mLoadingTextVisible )
948 mStateText.SetProperty( Toolkit::TextLabel::Property::TEXT, STATE_MESSAGE_LOADING );
949 mStateText.SetVisible( show );
953 void WidgetView::ShowTapWidgetState( bool show )
955 if( mPreviewImage && mPreviewVisible )
957 mPreviewImage.SetVisible( false );
960 if( mStateText && mTapTextVisible )
962 mStateText.SetProperty( Toolkit::TextLabel::Property::TEXT, STATE_MESSAGE_RETRY );
963 mStateText.SetVisible( show );
967 void WidgetView::SetLoadingTextPropertyMap( Property::Map map )
971 Property::Value* fontStyle = map.Find( FONT_STYLE );
974 if( fontStyle && fontStyle->Get( style ) )
976 mStateText.SetProperty( Toolkit::TextLabel::Property::FONT_STYLE, style );
979 Property::Value* textPointSize = map.Find( TEXT_POINT_SIZE );
982 if( textPointSize && textPointSize->Get( size ) )
984 mStateText.SetProperty( Toolkit::TextLabel::Property::POINT_SIZE, size );
987 Property::Value* textColor = map.Find( TEXT_COLOR );
990 if( textColor && textColor->Get( color ) )
992 mStateText.SetProperty( Toolkit::TextLabel::Property::TEXT_COLOR, color );
997 } // namespace Internal
999 } // namespace WidgetView