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 #if defined(DEBUG_ENABLED)
54 Integration::Log::Filter* gWidgetViewLogging = Integration::Log::Filter::New( Debug::Verbose, false, "LOG_WIDGET_VIEW" );
59 return Dali::BaseHandle();
62 // Setup properties, signals and actions using the type-registry.
63 DALI_TYPE_REGISTRATION_BEGIN( Dali::WidgetView::WidgetView, Toolkit::Control, Create );
64 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "widgetId", BOOLEAN, WIDGET_ID )
65 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "instanceId", BOOLEAN, INSTANCE_ID )
66 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "contentInfo", BOOLEAN, CONTENT_INFO )
67 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "title", BOOLEAN, TITLE )
68 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "updatePeriod", BOOLEAN, UPDATE_PERIOD )
69 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "preview", MAP, PREVIEW )
70 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "loadingText", MAP, LOADING_TEXT )
71 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "widgetStateFaulted", BOOLEAN, WIDGET_STATE_FAULTED )
72 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "permanentDelete", BOOLEAN, PERMANENT_DELETE )
75 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetAdded", SIGNAL_WIDGET_ADDED )
76 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetDeleted", SIGNAL_WIDGET_DELETED )
77 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetCreationAborted", SIGNAL_WIDGET_CREATION_ABORTED )
78 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetContentUpdated", SIGNAL_WIDGET_CONTENT_UPDATED )
79 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetUpdatePeriodChanged", SIGNAL_WIDGET_UPDATE_PERIOD_CHANGED )
80 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetFaulted", SIGNAL_WIDGET_FAULTED )
83 DALI_ACTION_REGISTRATION( Dali::WidgetView, WidgetView, "pauseWidget", ACTION_WIDGETVIEW_PAUSE_WIDGET );
84 DALI_ACTION_REGISTRATION( Dali::WidgetView, WidgetView, "resumeWidget", ACTION_WIDGETVIEW_RESUME_WIDGET );
85 DALI_ACTION_REGISTRATION( Dali::WidgetView, WidgetView, "cancelTouchEvent", ACTION_WIDGETVIEW_CANCEL_TOUCH_EVENT );
86 DALI_ACTION_REGISTRATION( Dali::WidgetView, WidgetView, "activateFaultedWidget", ACTION_WIDGETVIEW_ACTIVATE_FAULTED_WIDGET );
88 DALI_TYPE_REGISTRATION_END()
90 struct wl_buffer* preBuffer;
92 const char* const FONT_STYLE( "fontStyle" );
93 const char* const TEXT_POINT_SIZE( "textPointSize" );
94 const char* const TEXT_COLOR( "textColor" );
96 static void OnBufferUpdated( struct tizen_remote_surface *surface, uint32_t type, struct wl_buffer *buffer,
97 int32_t img_file_fd, uint32_t img_file_size, uint32_t time, struct wl_array *keys,
98 const char *appid, const char *instance_id, const int pid, void *data)
100 Dali::WidgetView::Internal::WidgetView* widgetView = static_cast< Dali::WidgetView::Internal::WidgetView* >( data );
104 if( !widgetView->IsWidgetImageView() )
106 tizen_remote_surface_transfer_visibility( surface, TIZEN_REMOTE_SURFACE_VISIBILITY_TYPE_VISIBLE);
108 widgetView->CreateWidgetImageView();
109 widgetView->ConnectSignal( surface );
112 //get tbm surface from buffer
113 tbm_surface_h tbmSurface = static_cast< tbm_surface_h >( wl_buffer_get_user_data( buffer ) );
114 widgetView->UpdateImageSource( tbmSurface );
117 if( preBuffer != NULL && tizen_remote_surface_get_version( surface ) >= TIZEN_REMOTE_SURFACE_RELEASE_SINCE_VERSION )
119 tizen_remote_surface_release( surface, preBuffer );
124 close( img_file_fd );
127 static void OnBufferAdded( const char *appid, const char *instance_id, const int pid, void *data )
131 static void OnSurfaceRemoved( const char *appid, const char *instance_id, const int pid, void *data )
133 Dali::WidgetView::Internal::WidgetView* widgetView = static_cast< Dali::WidgetView::Internal::WidgetView* >( data );
137 widgetView->CloseRemoteSurface();
141 } // unnamed namespace
143 Dali::WidgetView::WidgetView WidgetView::New( const std::string& widgetId, const std::string& contentInfo, int width, int height, float updatePeriod )
145 // Create the implementation, temporarily owned on stack
146 IntrusivePtr< WidgetView > internalWidgetView = new WidgetView( widgetId, contentInfo, width, height, updatePeriod );
148 // Pass ownership to CustomActor
149 Dali::WidgetView::WidgetView widgetView( *internalWidgetView );
151 // Second-phase init of the implementation
152 // This can only be done after the CustomActor connection has been made...
153 internalWidgetView->Initialize();
158 WidgetView::WidgetView()
159 : Control( ControlBehaviour( REQUIRES_TOUCH_EVENTS ) ),
167 mUpdatePeriod( 0.0 ),
168 mPreviewVisible( true ),
169 mStateTextVisible( true ),
170 mPermanentDelete( false ),
171 mWatcherHandle( NULL ),
172 mRemoteSurface( NULL )
176 WidgetView::WidgetView( const std::string& widgetId, const std::string& contentInfo, int width, int height, float updatePeriod )
177 : Control( ControlBehaviour( REQUIRES_TOUCH_EVENTS ) ),
178 mWidgetId( widgetId ),
180 mContentInfo( contentInfo ),
185 mUpdatePeriod( updatePeriod ),
186 mPreviewVisible( true ),
187 mStateTextVisible( true ),
188 mPermanentDelete( false ),
189 mWatcherHandle( NULL ),
190 mRemoteSurface( NULL )
194 WidgetView::~WidgetView()
196 if( !mWidgetId.empty() && !mInstanceId.empty() )
198 widget_instance_terminate( mInstanceId.c_str() );
200 if( mPermanentDelete )
202 widget_instance_destroy( mInstanceId.c_str() );
207 bool WidgetView::PauseWidget()
209 int ret = widget_instance_pause( mInstanceId.c_str() );
212 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::PauseWidget: Fail to pause widget(%s, %s) [%d]\n", mWidgetId.c_str(), mInstanceId.c_str(), ret );
216 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::PauseWidget: Widget is paused (%s, %s)\n", mWidgetId.c_str(), mInstanceId.c_str() );
221 bool WidgetView::ResumeWidget()
223 int ret = widget_instance_resume( mInstanceId.c_str() );
226 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::ResumeWidget: Fail to resume widget(%s, %s) [%d]\n", mWidgetId.c_str(), mInstanceId.c_str(), ret );
230 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::ResumeWidget: Widget is resumed (%s, %s)\n", mWidgetId.c_str(), mInstanceId.c_str() );
235 const std::string& WidgetView::GetWidgetId() const
240 const std::string& WidgetView::GetInstanceId() const
245 const std::string& WidgetView::GetContentInfo()
247 widget_instance_h instance;
248 char* contentInfo = NULL;
250 mContentInfo.clear();
252 if( mWidgetId.empty() || mInstanceId.empty() )
254 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetContentInfo: Widget id (%s) or instance id (%s) is invalid.\n", mWidgetId.c_str(), mInstanceId.c_str() );
258 instance = widget_instance_get_instance( mWidgetId.c_str(), mInstanceId.c_str() );
261 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetContentInfo: widget_instance_get_instance is failed. [%s]\n", mInstanceId.c_str() );
265 if( widget_instance_get_content( instance, &contentInfo ) < 0 )
267 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetContentInfo: Failed to get content of widget. [%s]\n", mInstanceId.c_str() );
271 mContentInfo = reinterpret_cast< char* >( contentInfo );
276 const std::string& WidgetView::GetTitle()
278 //ToDo: We should add some codes by considering widget_viewer_evas
281 mTitle = widget_service_get_name( mWidgetId.c_str(), NULL );
284 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetTitle: title = %s\n", mTitle.c_str() );
289 float WidgetView::GetUpdatePeriod() const
291 return mUpdatePeriod;
294 bool WidgetView::CancelTouchEvent()
298 tizen_remote_surface_transfer_touch_cancel( mRemoteSurface );
305 void WidgetView::ShowPreview( bool show )
307 if( mPreviewImage && show != mPreviewVisible )
309 mPreviewVisible = show;
310 mPreviewImage.SetVisible( show );
314 bool WidgetView::IsPreviewVisible()
316 return mPreviewVisible;
319 void WidgetView::ShowStateText( bool show )
321 if( mStateText && mStateTextVisible != show )
323 mStateTextVisible = show;
324 mStateText.SetVisible( show );
328 bool WidgetView::IsStateTextVisible()
330 return mStateTextVisible;
333 void WidgetView::ActivateFaultedWidget()
337 // Esable preview and text
338 if( mPreviewVisible )
340 mPreviewImage.SetVisible( true );
343 if( mStateTextVisible )
345 mStateText.SetVisible( true );
348 // launch widget again
349 mPid = widget_instance_launch( mInstanceId.c_str(), (char *)mContentInfo.c_str(), mWidth, mHeight );
352 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::ActivateFaultedWidget: widget_instance_launch is failed. [%s]\n", mWidgetId.c_str() );
355 Dali::WidgetView::WidgetView handle( GetOwner() );
356 mWidgetCreationAbortedSignal.Emit( handle );
361 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::ActivateFaultedWidget: widget_instance_launch is called. [%s, mPid = %d]\n", mWidgetId.c_str(), mPid );
365 bool WidgetView::IsWidgetFaulted()
367 return mPid < 0 ? true : false;
370 void WidgetView::SetPermanentDelete( bool permanentDelete )
372 mPermanentDelete = permanentDelete;
375 bool WidgetView::IsPermanentDelete()
377 return mPermanentDelete;
380 void WidgetView::CreateWidgetImageView()
383 mImageSource = Dali::NativeImageSource::New( source );
384 Dali::NativeImage image = Dali::NativeImage::New( *mImageSource );
386 mWidgetImageView = Dali::Toolkit::ImageView::New( image );
388 mWidgetImageView.SetParentOrigin( ParentOrigin::CENTER );
389 mWidgetImageView.SetAnchorPoint( AnchorPoint::CENTER );
390 mWidgetImageView.SetSize( mWidth, mHeight );
392 Self().Add( mWidgetImageView );
394 //EFL app should be pre multiplied image.
395 mWidgetImageView.SetProperty( Toolkit::ImageView::Property::PRE_MULTIPLIED_ALPHA, true );
397 // Disable preview and text
398 if( mPreviewVisible )
400 mPreviewImage.SetVisible( false );
403 if( mStateTextVisible )
405 mStateText.SetVisible( false );
409 Dali::WidgetView::WidgetView handle( GetOwner() );
410 mWidgetAddedSignal.Emit( handle );
412 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::AddObjectView: ObjectView is added.\n" );
415 void WidgetView::RemoveObjectView()
417 // Enable preview and text
418 if( mPreviewVisible )
420 mPreviewImage.SetVisible( true );
423 if( mStateTextVisible )
425 mStateText.SetVisible( true );
429 Dali::WidgetView::WidgetView handle( GetOwner() );
430 mWidgetDeletedSignal.Emit( handle );
432 mWidgetImageView.Reset();
434 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::RemoveObjectView: ObjectView is removed.\n" );
437 void WidgetView::SendWidgetEvent( int event )
439 Dali::WidgetView::WidgetView handle( GetOwner() );
441 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::SendWidgetEvent: event = %d widget = %s\n", event, mWidgetId.c_str() );
446 case WIDGET_INSTANCE_EVENT_UPDATE:
447 case WIDGET_INSTANCE_EVENT_EXTRA_UPDATED:
449 mWidgetContentUpdatedSignal.Emit( handle );
452 case WIDGET_INSTANCE_EVENT_PERIOD_CHANGED:
454 mWidgetUpdatePeriodChangedSignal.Emit( handle );
457 case WIDGET_INSTANCE_EVENT_FAULT:
459 mWidgetFaultedSignal.Emit( handle );
469 bool WidgetView::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor )
471 Dali::BaseHandle handle( object );
473 bool connected( true );
474 Dali::WidgetView::WidgetView widgetView = Dali::WidgetView::WidgetView::DownCast( handle );
476 if( strcmp( signalName.c_str(), SIGNAL_WIDGET_ADDED ) == 0 )
478 widgetView.WidgetAddedSignal().Connect( tracker, functor );
480 else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_DELETED ) == 0 )
482 widgetView.WidgetDeletedSignal().Connect( tracker, functor );
484 else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_CREATION_ABORTED ) == 0 )
486 widgetView.WidgetCreationAbortedSignal().Connect( tracker, functor );
488 else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_CONTENT_UPDATED ) == 0 )
490 widgetView.WidgetContentUpdatedSignal().Connect( tracker, functor );
492 else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_UPDATE_PERIOD_CHANGED ) == 0 )
494 widgetView.WidgetUpdatePeriodChangedSignal().Connect( tracker, functor );
496 else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_FAULTED ) == 0 )
498 widgetView.WidgetFaultedSignal().Connect( tracker, functor );
502 // signalName does not match any signal
509 bool WidgetView::DoAction( BaseObject* object, const std::string& actionName, const Property::Map& attributes )
513 Dali::BaseHandle handle( object );
514 Dali::WidgetView::WidgetView widgetView = Dali::WidgetView::WidgetView::DownCast( handle );
521 WidgetView& impl = GetImplementation( widgetView );
523 if( strcmp( actionName.c_str(), ACTION_WIDGETVIEW_PAUSE_WIDGET ) == 0 )
527 else if( strcmp( actionName.c_str(), ACTION_WIDGETVIEW_RESUME_WIDGET ) == 0 )
531 else if( strcmp( actionName.c_str(), ACTION_WIDGETVIEW_CANCEL_TOUCH_EVENT ) == 0 )
533 impl.CancelTouchEvent();
535 else if( strcmp( actionName.c_str(), ACTION_WIDGETVIEW_ACTIVATE_FAULTED_WIDGET ) == 0 )
537 impl.ActivateFaultedWidget();
547 void WidgetView::SetProperty( BaseObject* object, Property::Index index, const Property::Value& value )
549 Dali::WidgetView::WidgetView widgetView = Dali::WidgetView::WidgetView::DownCast( Dali::BaseHandle( object ) );
553 WidgetView& impl = GetImplementation( widgetView );
557 case Dali::WidgetView::WidgetView::Property::PREVIEW:
561 if( value.Get( previewEnabled ) )
563 impl.ShowPreview( previewEnabled );
567 case Dali::WidgetView::WidgetView::Property::LOADING_TEXT:
572 if( value.Get( textEnabled ) )
574 impl.ShowStateText( textEnabled );
576 else if( value.Get( map ) )
578 impl.SetLoadingTextPropertyMap( map );
582 case Dali::WidgetView::WidgetView::Property::PERMANENT_DELETE:
585 if( value.Get( del ) )
587 impl.SetPermanentDelete( del );
595 Property::Value WidgetView::GetProperty( BaseObject* object, Property::Index index )
597 Property::Value value;
598 Dali::WidgetView::WidgetView widgetView = Dali::WidgetView::WidgetView::DownCast( Dali::BaseHandle( object ) );
602 WidgetView& impl = GetImplementation( widgetView );
606 case Dali::WidgetView::WidgetView::Property::WIDGET_ID:
608 value = impl.GetWidgetId();
611 case Dali::WidgetView::WidgetView::Property::INSTANCE_ID:
613 value = impl.GetInstanceId();
616 case Dali::WidgetView::WidgetView::Property::CONTENT_INFO:
618 value = impl.GetContentInfo();
621 case Dali::WidgetView::WidgetView::Property::TITLE:
623 value = impl.GetTitle();
626 case Dali::WidgetView::WidgetView::Property::UPDATE_PERIOD:
628 value = impl.GetUpdatePeriod();
631 case Dali::WidgetView::WidgetView::Property::PREVIEW:
633 value = impl.IsPreviewVisible();
636 case Dali::WidgetView::WidgetView::Property::LOADING_TEXT:
638 value = impl.IsStateTextVisible();
641 case Dali::WidgetView::WidgetView::Property::WIDGET_STATE_FAULTED:
643 value = impl.IsWidgetFaulted();
646 case Dali::WidgetView::WidgetView::Property::PERMANENT_DELETE:
648 value = impl.IsPermanentDelete();
657 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetAddedSignal()
659 return mWidgetAddedSignal;
662 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetDeletedSignal()
664 return mWidgetDeletedSignal;
667 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetCreationAbortedSignal()
669 return mWidgetCreationAbortedSignal;
672 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetContentUpdatedSignal()
674 return mWidgetContentUpdatedSignal;
677 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetUpdatePeriodChangedSignal()
679 return mWidgetUpdatePeriodChangedSignal;
682 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetFaultedSignal()
684 return mWidgetFaultedSignal;
687 void WidgetView::OnInitialize()
689 char* instanceId = NULL;
690 char* previewPath = NULL;
691 std::string previewImage;
692 widget_size_type_e sizeType;
693 screen_connector_toolkit_ops ops;
695 int ret = widget_instance_create( mWidgetId.c_str(), &instanceId );
696 if( ret < 0 || !instanceId )
698 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_create is failed [%s].\n", mWidgetId.c_str() );
702 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_create is called. [widget id = %s, instance id = %s]\n",
703 mWidgetId.c_str(), instanceId );
705 mInstanceId = instanceId;
708 widget_service_get_size_type( mWidth, mHeight, &sizeType );
710 previewPath = widget_service_get_preview_image_path( mWidgetId.c_str(), sizeType );
713 previewImage = previewPath;
718 previewImage = WIDGET_VIEW_RESOURCE_DEFAULT_IMG;
721 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: preview image path = %s\n", previewImage.c_str() );
724 mPreviewActor = Dali::Actor::New();
725 mPreviewActor.SetParentOrigin( ParentOrigin::CENTER );
726 mPreviewActor.SetAnchorPoint( AnchorPoint::CENTER );
727 mPreviewActor.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS );
729 mPreviewImage = Toolkit::ImageView::New( previewImage );
730 mPreviewImage.SetParentOrigin( ParentOrigin::CENTER );
731 mPreviewImage.SetAnchorPoint( AnchorPoint::CENTER );
732 mPreviewImage.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS );
734 Self().SetResizePolicy( ResizePolicy::FIXED, Dimension::ALL_DIMENSIONS );
735 Self().SetSize( mWidth, mHeight );
737 Self().Add( mPreviewActor );
738 mPreviewActor.Add( mPreviewImage );
740 mStateTextActor = Dali::Actor::New();
741 mStateTextActor.SetParentOrigin( ParentOrigin::CENTER );
742 mStateTextActor.SetAnchorPoint( AnchorPoint::CENTER );
743 mStateTextActor.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS );
746 // TODO: use po files
747 mStateText = Toolkit::TextLabel::New( "Loading..." );
748 mStateText.SetParentOrigin( ParentOrigin::CENTER );
749 mStateText.SetAnchorPoint( AnchorPoint::CENTER );
750 mStateText.SetProperty( Toolkit::TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
751 mStateText.SetProperty( Toolkit::TextLabel::Property::VERTICAL_ALIGNMENT, "CENTER" );
752 mStateText.SetProperty( Toolkit::TextLabel::Property::TEXT_COLOR, Dali::Color::WHITE );
753 mStateText.SetProperty( Toolkit::TextLabel::Property::FONT_STYLE, "Bold" );
755 mPreviewActor.Add( mStateTextActor );
756 mStateTextActor.Add( mStateText );
759 mPid = widget_instance_launch( instanceId, (char *)mContentInfo.c_str(), mWidth, mHeight );
762 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_launch is failed. [%s]\n", mWidgetId.c_str() );
765 Dali::WidgetView::WidgetView handle( GetOwner() );
766 mWidgetCreationAbortedSignal.Emit( handle );
771 ops.updated_cb = OnBufferUpdated;
772 ops.removed_cb = OnSurfaceRemoved;
773 ops.added_cb = OnBufferAdded;
774 mWatcherHandle = screen_connector_toolkit_add(&ops, (char *)instanceId, SCREEN_CONNECTOR_SCREEEN_TYPE_WIDGET, this);
775 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_launch is called. [%s, mPid = %d]\n", mWidgetId.c_str(), mPid );
779 void WidgetView::OnStageConnection( int depth )
781 Control::OnStageConnection( depth );
784 void WidgetView::OnStageDisconnection()
786 Control::OnStageDisconnection();
789 void WidgetView::OnSizeSet( const Vector3& targetSize )
791 if( mWidgetImageView )
793 mWidgetImageView.SetSize( targetSize );
797 bool WidgetView::IsWidgetImageView()
799 return ( mWidgetImageView )? true: false;
802 void WidgetView::UpdateImageSource( tbm_surface_h source )
804 mImageSource->SetSource( source );
805 Dali::Stage::GetCurrent().KeepRendering( 0.0f );
808 void WidgetView::ConnectSignal( tizen_remote_surface* surface )
810 if( mWidgetImageView && surface )
812 mRemoteSurface = surface;
814 Self().TouchSignal().Connect( this, &WidgetView::OnTouch );
815 Self().WheelEventSignal().Connect( this, &WidgetView::OnWheelEvent );
820 bool WidgetView::OnTouch( Dali::Actor actor, const Dali::TouchData& event )
822 tizen_remote_surface_event_type type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_NONE;
824 if( event.GetPointCount() == 0 || mRemoteSurface == NULL )
829 switch( event.GetState( 0 ) )
831 case Dali::PointState::UP:
833 type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_UP;
836 case Dali::PointState::DOWN:
838 type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_DOWN;
841 case Dali::PointState::MOTION:
843 type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_MOVE;
854 if( type == TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_MOVE )
859 Vector2 localPos = event.GetLocalPosition( 0 );
861 tizen_remote_surface_transfer_mouse_event( mRemoteSurface,
867 wl_fixed_from_double( event.GetEllipseRadius( 0 ).x ),
868 wl_fixed_from_double( event.GetEllipseRadius( 0 ).y ),
869 wl_fixed_from_double( event.GetPressure( 0 ) ),
870 wl_fixed_from_double( event.GetAngle( 0 ).degree ),
871 TIZEN_INPUT_DEVICE_CLAS_TOUCHSCREEN,
872 TIZEN_INPUT_DEVICE_SUBCLAS_NONE,
879 bool WidgetView::OnWheelEvent( Dali::Actor actor, const Dali::WheelEvent& event )
881 if( mRemoteSurface == NULL )
885 //ToDo: We should check TIZEN_INPUT_DEVICE_CLAS_MOUSE
886 tizen_remote_surface_transfer_mouse_wheel( mRemoteSurface,
889 TIZEN_INPUT_DEVICE_CLAS_MOUSE,
890 TIZEN_INPUT_DEVICE_SUBCLAS_NONE,
897 Vector3 WidgetView::GetNaturalSize()
903 if( size.x > 0 && size.y > 0 )
905 size.z = std::min( size.x, size.y );
910 return Control::GetNaturalSize();
914 float WidgetView::GetHeightForWidth( float width )
916 if( mWidth > 0 && mHeight > 0 )
918 return GetHeightForWidthBase( width );
922 return Control::GetHeightForWidthBase( width );
926 float WidgetView::GetWidthForHeight( float height )
928 if( mWidth > 0 && mHeight > 0 )
930 return GetWidthForHeightBase( height );
934 return Control::GetWidthForHeightBase( height );
938 void WidgetView::CloseRemoteSurface()
940 screen_connector_toolkit_remove( mWatcherHandle );
941 mRemoteSurface = NULL;
944 void WidgetView::SetLoadingTextPropertyMap( Property::Map map )
948 Property::Value* fontStyle = map.Find( FONT_STYLE );
951 if( fontStyle && fontStyle->Get( style ) )
953 mStateText.SetProperty( Toolkit::TextLabel::Property::FONT_STYLE, style );
956 Property::Value* textPointSize = map.Find( TEXT_POINT_SIZE );
959 if( textPointSize && textPointSize->Get( size ) )
961 mStateText.SetProperty( Toolkit::TextLabel::Property::POINT_SIZE, size );
964 Property::Value* textColor = map.Find( TEXT_COLOR );
967 if( textColor && textColor->Get( color ) )
969 mStateText.SetProperty( Toolkit::TextLabel::Property::TEXT_COLOR, color );
974 } // namespace Internal
976 } // namespace WidgetView