3 * Copyright (c) 2016 Samsung Electronics Co., Ltd.
5 * Licensed under the Flora License, Version 1.1 (the License);
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://floralicense.org/license/
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an AS IS BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
19 #include <internal/widget_view/widget_view_impl.h>
24 #include <dali/public-api/common/stage.h>
25 #include <dali/public-api/events/touch-data.h>
26 #include <dali/public-api/events/wheel-event.h>
27 #include <dali/public-api/images/native-image.h>
28 #include <dali/public-api/object/type-registry.h>
29 #include <dali/public-api/object/type-registry-helper.h>
30 #include <dali-toolkit/public-api/visuals/visual-properties.h>
31 #include <dali-toolkit/devel-api/visual-factory/visual-factory.h>
32 #include <dali/integration-api/debug.h>
34 #include <Ecore_Input.h>
35 #include <widget_service.h>
36 #include <widget_instance.h>
37 #include <tzplatform_config.h>
38 #include <wayland-extension/tizen-extension-client-protocol.h>
54 const int DEFAULT_FONT_PIXEL_SIZE = 30; // Referred platform widget viewer evas
56 #define GET_LOCALE_TEXT(string) dgettext(PKGNAME, string)
58 #if defined(DEBUG_ENABLED)
59 Integration::Log::Filter* gWidgetViewLogging = Integration::Log::Filter::New( Debug::Verbose, false, "LOG_WIDGET_VIEW" );
64 return Dali::BaseHandle();
67 // Setup properties, signals and actions using the type-registry.
68 DALI_TYPE_REGISTRATION_BEGIN( Dali::WidgetView::WidgetView, Toolkit::Control, Create );
69 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "widgetId", BOOLEAN, WIDGET_ID )
70 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "instanceId", BOOLEAN, INSTANCE_ID )
71 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "contentInfo", BOOLEAN, CONTENT_INFO )
72 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "title", BOOLEAN, TITLE )
73 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "updatePeriod", BOOLEAN, UPDATE_PERIOD )
74 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "preview", MAP, PREVIEW )
75 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "loadingText", MAP, LOADING_TEXT )
76 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "widgetStateFaulted", BOOLEAN, WIDGET_STATE_FAULTED )
77 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "permanentDelete", BOOLEAN, PERMANENT_DELETE )
80 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetAdded", SIGNAL_WIDGET_ADDED )
81 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetDeleted", SIGNAL_WIDGET_DELETED )
82 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetCreationAborted", SIGNAL_WIDGET_CREATION_ABORTED )
83 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetContentUpdated", SIGNAL_WIDGET_CONTENT_UPDATED )
84 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetUpdatePeriodChanged", SIGNAL_WIDGET_UPDATE_PERIOD_CHANGED )
85 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetFaulted", SIGNAL_WIDGET_FAULTED )
86 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetTerminated", SIGNAL_WIDGET_TERMINATED )
89 DALI_ACTION_REGISTRATION( Dali::WidgetView, WidgetView, "pauseWidget", ACTION_WIDGETVIEW_PAUSE_WIDGET );
90 DALI_ACTION_REGISTRATION( Dali::WidgetView, WidgetView, "resumeWidget", ACTION_WIDGETVIEW_RESUME_WIDGET );
91 DALI_ACTION_REGISTRATION( Dali::WidgetView, WidgetView, "cancelTouchEvent", ACTION_WIDGETVIEW_CANCEL_TOUCH_EVENT );
92 DALI_ACTION_REGISTRATION( Dali::WidgetView, WidgetView, "activateFaultedWidget", ACTION_WIDGETVIEW_ACTIVATE_FAULTED_WIDGET );
94 DALI_TYPE_REGISTRATION_END()
96 struct wl_buffer* preBuffer;
98 const char* const FONT_STYLE( "fontStyle" );
99 const char* const TEXT_POINT_SIZE( "textPointSize" );
100 const char* const TEXT_COLOR( "textColor" );
102 static void OnBufferUpdated( struct tizen_remote_surface *surface, uint32_t type, struct wl_buffer *buffer,
103 int32_t img_file_fd, uint32_t img_file_size, uint32_t time, struct wl_array *keys,
104 const char *appid, const char *instance_id, const int pid, void *data)
106 Dali::WidgetView::Internal::WidgetView* widgetView = static_cast< Dali::WidgetView::Internal::WidgetView* >( data );
110 if( !widgetView->IsWidgetImageView() )
112 tizen_remote_surface_transfer_visibility( surface, TIZEN_REMOTE_SURFACE_VISIBILITY_TYPE_VISIBLE);
114 widgetView->CreateWidgetImageView();
115 widgetView->ConnectSignal( surface );
118 //get tbm surface from buffer
119 tbm_surface_h tbmSurface = static_cast< tbm_surface_h >( wl_buffer_get_user_data( buffer ) );
120 widgetView->UpdateImageSource( tbmSurface );
123 if( preBuffer != NULL && tizen_remote_surface_get_version( surface ) >= TIZEN_REMOTE_SURFACE_RELEASE_SINCE_VERSION )
125 tizen_remote_surface_release( surface, preBuffer );
130 close( img_file_fd );
133 static void OnBufferAdded( const char *appid, const char *instance_id, const int pid, void *data )
137 static void OnSurfaceRemoved( const char *appid, const char *instance_id, const int pid, void *data )
139 Dali::WidgetView::Internal::WidgetView* widgetView = static_cast< Dali::WidgetView::Internal::WidgetView* >( data );
141 if( widgetView && !widgetView->GetInstanceId().empty() )
143 widgetView->CloseRemoteSurface();
144 widgetView->RemoveWidgetImage();
148 } // unnamed namespace
150 Dali::WidgetView::WidgetView WidgetView::New( const std::string& widgetId, const std::string& contentInfo, int width, int height, float updatePeriod )
152 // Create the implementation, temporarily owned on stack
153 IntrusivePtr< WidgetView > internalWidgetView = new WidgetView( widgetId, contentInfo, width, height, updatePeriod );
155 // Pass ownership to CustomActor
156 Dali::WidgetView::WidgetView widgetView( *internalWidgetView );
158 // Second-phase init of the implementation
159 // This can only be done after the CustomActor connection has been made...
160 internalWidgetView->Initialize();
165 WidgetView::WidgetView()
166 : Control( ControlBehaviour( REQUIRES_TOUCH_EVENTS ) ),
174 mUpdatePeriod( 0.0 ),
175 mPreviewVisible( true ),
176 mLoadingTextVisible( true ),
177 mTapTextVisible( true ),
178 mPermanentDelete( false ),
179 mWatcherHandle( NULL ),
180 mRemoteSurface( NULL )
184 WidgetView::WidgetView( const std::string& widgetId, const std::string& contentInfo, int width, int height, float updatePeriod )
185 : Control( ControlBehaviour( REQUIRES_TOUCH_EVENTS ) ),
186 mWidgetId( widgetId ),
188 mContentInfo( contentInfo ),
193 mUpdatePeriod( updatePeriod ),
194 mPreviewVisible( true ),
195 mLoadingTextVisible( true ),
196 mTapTextVisible( true ),
197 mPermanentDelete( false ),
198 mWatcherHandle( NULL ),
199 mRemoteSurface( NULL )
203 WidgetView::~WidgetView()
208 bool WidgetView::PauseWidget()
210 int ret = widget_instance_pause( mInstanceId.c_str() );
213 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::PauseWidget: Fail to pause widget(%s, %s) [%d]\n", mWidgetId.c_str(), mInstanceId.c_str(), ret );
217 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::PauseWidget: Widget is paused (%s, %s)\n", mWidgetId.c_str(), mInstanceId.c_str() );
222 bool WidgetView::ResumeWidget()
224 int ret = widget_instance_resume( mInstanceId.c_str() );
227 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::ResumeWidget: Fail to resume widget(%s, %s) [%d]\n", mWidgetId.c_str(), mInstanceId.c_str(), ret );
231 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::ResumeWidget: Widget is resumed (%s, %s)\n", mWidgetId.c_str(), mInstanceId.c_str() );
236 const std::string& WidgetView::GetWidgetId() const
241 const std::string& WidgetView::GetInstanceId() const
246 const std::string& WidgetView::GetContentInfo()
248 widget_instance_h instance;
249 char* contentInfo = NULL;
251 mContentInfo.clear();
253 if( mWidgetId.empty() || mInstanceId.empty() )
255 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetContentInfo: Widget id (%s) or instance id (%s) is invalid.\n", mWidgetId.c_str(), mInstanceId.c_str() );
259 instance = widget_instance_get_instance( mWidgetId.c_str(), mInstanceId.c_str() );
262 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetContentInfo: widget_instance_get_instance is failed. [%s]\n", mInstanceId.c_str() );
266 if( widget_instance_get_content( instance, &contentInfo ) < 0 )
268 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetContentInfo: Failed to get content of widget. [%s]\n", mInstanceId.c_str() );
272 mContentInfo = reinterpret_cast< char* >( contentInfo );
277 const std::string& WidgetView::GetTitle()
279 //ToDo: We should add some codes by considering widget_viewer_evas
282 mTitle = widget_service_get_name( mWidgetId.c_str(), NULL );
285 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetTitle: title = %s\n", mTitle.c_str() );
290 float WidgetView::GetUpdatePeriod() const
292 return mUpdatePeriod;
295 bool WidgetView::CancelTouchEvent()
299 tizen_remote_surface_transfer_touch_cancel( mRemoteSurface );
306 void WidgetView::SetPreviewVisible( bool visible )
308 if( mPreviewImage && mPreviewVisible != visible )
310 mPreviewVisible = visible;
311 mPreviewImage.SetVisible( visible );
315 bool WidgetView::IsPreviewVisible()
317 return mPreviewVisible;
320 void WidgetView::SetLoadingTextVisible( bool visible )
322 if( mStateText && mLoadingTextVisible != visible )
324 mLoadingTextVisible = visible;
328 mStateText.SetProperty( Toolkit::TextLabel::Property::TEXT, GET_LOCALE_TEXT( "IDS_ST_POP_LOADING_ING" ) );
330 mStateText.SetVisible( visible );
334 bool WidgetView::IsLoadingTextVisible()
336 return mLoadingTextVisible;
339 void WidgetView::ActivateFaultedWidget()
343 // Enable preview and loading text
344 ShowTapWidgetState( false );
345 ShowLoadingState( true );
347 // launch widget again
348 mPid = widget_instance_launch( mInstanceId.c_str(), (char *)mContentInfo.c_str(), mWidth, mHeight );
351 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::ActivateFaultedWidget: widget_instance_launch is failed. [%s]\n", mWidgetId.c_str() );
353 ShowLoadingState( false );
354 ShowTapWidgetState( true );
357 Dali::WidgetView::WidgetView handle( GetOwner() );
358 mWidgetCreationAbortedSignal.Emit( handle );
363 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::ActivateFaultedWidget: widget_instance_launch is called. [%s, mPid = %d]\n", mWidgetId.c_str(), mPid );
367 bool WidgetView::IsWidgetFaulted()
369 return mPid < 0 ? true : false;
372 void WidgetView::SetPermanentDelete( bool permanentDelete )
374 mPermanentDelete = permanentDelete;
377 bool WidgetView::IsPermanentDelete()
379 return mPermanentDelete;
382 void WidgetView::CreateWidgetImageView()
385 mImageSource = Dali::NativeImageSource::New( source );
386 Dali::NativeImage image = Dali::NativeImage::New( *mImageSource );
388 mWidgetImageView = Dali::Toolkit::ImageView::New( image );
390 mWidgetImageView.SetParentOrigin( ParentOrigin::CENTER );
391 mWidgetImageView.SetAnchorPoint( AnchorPoint::CENTER );
392 mWidgetImageView.SetSize( mWidth, mHeight );
394 Self().Add( mWidgetImageView );
396 //EFL app should be pre multiplied image.
397 mWidgetImageView.SetProperty( Toolkit::ImageView::Property::PRE_MULTIPLIED_ALPHA, true );
399 // Disable preview and text
400 ShowLoadingState( false );
403 Dali::WidgetView::WidgetView handle( GetOwner() );
404 mWidgetAddedSignal.Emit( handle );
406 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::CreateWidgetImageView: Widget image is added.\n" );
409 void WidgetView::RemoveWidgetImage()
411 mWidgetImageView.SetVisible( false );
412 mWidgetImageView.Reset();
414 Dali::WidgetView::WidgetView handle( GetOwner() );
415 mWidgetDeletedSignal.Emit( handle );
417 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::RemoveWidgetImage: Widget image is removed.\n" );
420 void WidgetView::TerminateWidget()
422 if( !mWidgetId.empty() && !mInstanceId.empty() )
424 widget_instance_terminate( mInstanceId.c_str() );
426 if( mPermanentDelete )
428 widget_instance_destroy( mInstanceId.c_str() );
431 Dali::WidgetView::WidgetView handle( GetOwner() );
432 mWidgetTerminatedSignal.Emit( handle );
433 mWidgetDeletedSignal.Emit( handle );
438 CloseRemoteSurface();
441 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::TerminateWidget: Widget is terminated/destroyed and deleted signal is emitted.\n" );
445 void WidgetView::SendWidgetEvent( int event )
447 Dali::WidgetView::WidgetView handle( GetOwner() );
449 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::SendWidgetEvent: event = %d widget = %s\n", event, mWidgetId.c_str() );
454 case WIDGET_INSTANCE_EVENT_UPDATE:
455 case WIDGET_INSTANCE_EVENT_EXTRA_UPDATED:
457 mWidgetContentUpdatedSignal.Emit( handle );
460 case WIDGET_INSTANCE_EVENT_PERIOD_CHANGED:
462 mWidgetUpdatePeriodChangedSignal.Emit( handle );
465 case WIDGET_INSTANCE_EVENT_FAULT:
467 mWidgetFaultedSignal.Emit( handle );
477 bool WidgetView::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor )
479 Dali::BaseHandle handle( object );
481 bool connected( true );
482 Dali::WidgetView::WidgetView widgetView = Dali::WidgetView::WidgetView::DownCast( handle );
484 if( strcmp( signalName.c_str(), SIGNAL_WIDGET_ADDED ) == 0 )
486 widgetView.WidgetAddedSignal().Connect( tracker, functor );
488 else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_DELETED ) == 0 )
490 widgetView.WidgetDeletedSignal().Connect( tracker, functor );
492 else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_CREATION_ABORTED ) == 0 )
494 widgetView.WidgetCreationAbortedSignal().Connect( tracker, functor );
496 else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_CONTENT_UPDATED ) == 0 )
498 widgetView.WidgetContentUpdatedSignal().Connect( tracker, functor );
500 else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_UPDATE_PERIOD_CHANGED ) == 0 )
502 widgetView.WidgetUpdatePeriodChangedSignal().Connect( tracker, functor );
504 else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_FAULTED ) == 0 )
506 widgetView.WidgetFaultedSignal().Connect( tracker, functor );
510 // signalName does not match any signal
517 bool WidgetView::DoAction( BaseObject* object, const std::string& actionName, const Property::Map& attributes )
521 Dali::BaseHandle handle( object );
522 Dali::WidgetView::WidgetView widgetView = Dali::WidgetView::WidgetView::DownCast( handle );
529 WidgetView& impl = GetImplementation( widgetView );
531 if( strcmp( actionName.c_str(), ACTION_WIDGETVIEW_PAUSE_WIDGET ) == 0 )
535 else if( strcmp( actionName.c_str(), ACTION_WIDGETVIEW_RESUME_WIDGET ) == 0 )
539 else if( strcmp( actionName.c_str(), ACTION_WIDGETVIEW_CANCEL_TOUCH_EVENT ) == 0 )
541 impl.CancelTouchEvent();
543 else if( strcmp( actionName.c_str(), ACTION_WIDGETVIEW_ACTIVATE_FAULTED_WIDGET ) == 0 )
545 impl.ActivateFaultedWidget();
555 void WidgetView::SetProperty( BaseObject* object, Property::Index index, const Property::Value& value )
557 Dali::WidgetView::WidgetView widgetView = Dali::WidgetView::WidgetView::DownCast( Dali::BaseHandle( object ) );
561 WidgetView& impl = GetImplementation( widgetView );
565 case Dali::WidgetView::WidgetView::Property::PREVIEW:
569 if( value.Get( previewEnabled ) )
571 impl.SetPreviewVisible( previewEnabled );
575 case Dali::WidgetView::WidgetView::Property::LOADING_TEXT:
580 if( value.Get( textEnabled ) )
582 impl.SetLoadingTextVisible( textEnabled );
584 else if( value.Get( map ) )
586 impl.SetLoadingTextPropertyMap( map );
590 case Dali::WidgetView::WidgetView::Property::PERMANENT_DELETE:
593 if( value.Get( permanent ) )
595 impl.SetPermanentDelete( permanent );
603 Property::Value WidgetView::GetProperty( BaseObject* object, Property::Index index )
605 Property::Value value;
606 Dali::WidgetView::WidgetView widgetView = Dali::WidgetView::WidgetView::DownCast( Dali::BaseHandle( object ) );
610 WidgetView& impl = GetImplementation( widgetView );
614 case Dali::WidgetView::WidgetView::Property::WIDGET_ID:
616 value = impl.GetWidgetId();
619 case Dali::WidgetView::WidgetView::Property::INSTANCE_ID:
621 value = impl.GetInstanceId();
624 case Dali::WidgetView::WidgetView::Property::CONTENT_INFO:
626 value = impl.GetContentInfo();
629 case Dali::WidgetView::WidgetView::Property::TITLE:
631 value = impl.GetTitle();
634 case Dali::WidgetView::WidgetView::Property::UPDATE_PERIOD:
636 value = impl.GetUpdatePeriod();
639 case Dali::WidgetView::WidgetView::Property::PREVIEW:
641 value = impl.IsPreviewVisible();
644 case Dali::WidgetView::WidgetView::Property::LOADING_TEXT:
646 value = impl.IsLoadingTextVisible();
649 case Dali::WidgetView::WidgetView::Property::WIDGET_STATE_FAULTED:
651 value = impl.IsWidgetFaulted();
654 case Dali::WidgetView::WidgetView::Property::PERMANENT_DELETE:
656 value = impl.IsPermanentDelete();
665 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetAddedSignal()
667 return mWidgetAddedSignal;
670 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetDeletedSignal()
672 return mWidgetDeletedSignal;
675 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetCreationAbortedSignal()
677 return mWidgetCreationAbortedSignal;
680 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetContentUpdatedSignal()
682 return mWidgetContentUpdatedSignal;
685 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetUpdatePeriodChangedSignal()
687 return mWidgetUpdatePeriodChangedSignal;
690 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetFaultedSignal()
692 return mWidgetFaultedSignal;
695 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetTerminatedSignal()
697 return mWidgetTerminatedSignal;
700 void WidgetView::OnInitialize()
702 char* instanceId = NULL;
703 char* previewPath = NULL;
704 std::string previewImage;
705 widget_size_type_e sizeType;
706 screen_connector_toolkit_ops ops;
708 int ret = widget_instance_create( mWidgetId.c_str(), &instanceId );
709 if( ret < 0 || !instanceId )
711 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_create is failed [%s].\n", mWidgetId.c_str() );
715 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_create is called. [widget id = %s, instance id = %s]\n",
716 mWidgetId.c_str(), instanceId );
718 mInstanceId = instanceId;
721 widget_service_get_size_type( mWidth, mHeight, &sizeType );
723 previewPath = widget_service_get_preview_image_path( mWidgetId.c_str(), sizeType );
726 previewImage = previewPath;
731 previewImage = WIDGET_VIEW_RESOURCE_DEFAULT_IMG;
734 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: preview image path = %s\n", previewImage.c_str() );
737 mPreviewActor = Dali::Actor::New();
738 mPreviewActor.SetParentOrigin( ParentOrigin::CENTER );
739 mPreviewActor.SetAnchorPoint( AnchorPoint::CENTER );
740 mPreviewActor.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS );
742 mPreviewImage = Toolkit::ImageView::New( previewImage );
743 mPreviewImage.SetParentOrigin( ParentOrigin::CENTER );
744 mPreviewImage.SetAnchorPoint( AnchorPoint::CENTER );
745 mPreviewImage.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS );
747 Self().SetResizePolicy( ResizePolicy::FIXED, Dimension::ALL_DIMENSIONS );
748 Self().SetSize( mWidth, mHeight );
750 Self().Add( mPreviewActor );
751 mPreviewActor.Add( mPreviewImage );
753 mStateTextActor = Dali::Actor::New();
754 mStateTextActor.SetParentOrigin( ParentOrigin::CENTER );
755 mStateTextActor.SetAnchorPoint( AnchorPoint::CENTER );
756 mStateTextActor.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS );
759 mStateText = Toolkit::TextLabel::New( GET_LOCALE_TEXT( "IDS_ST_POP_LOADING_ING" ) );
760 mStateText.SetParentOrigin( ParentOrigin::CENTER );
761 mStateText.SetAnchorPoint( AnchorPoint::CENTER );
762 mStateText.SetProperty( Toolkit::TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
763 mStateText.SetProperty( Toolkit::TextLabel::Property::VERTICAL_ALIGNMENT, "CENTER" );
764 mStateText.SetProperty( Toolkit::TextLabel::Property::TEXT_COLOR, Dali::Color::WHITE );
765 mStateText.SetProperty( Toolkit::TextLabel::Property::FONT_STYLE, "Bold" );
766 mStateText.SetProperty( Toolkit::TextLabel::Property::POINT_SIZE, TextPixelToPointSize( DEFAULT_FONT_PIXEL_SIZE ) );
768 mPreviewActor.Add( mStateTextActor );
769 mStateTextActor.Add( mStateText );
772 mPid = widget_instance_launch( instanceId, (char *)mContentInfo.c_str(), mWidth, mHeight );
776 ShowTapWidgetState( true );
778 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_launch is failed. [%s]\n", mWidgetId.c_str() );
781 Dali::WidgetView::WidgetView handle( GetOwner() );
782 mWidgetCreationAbortedSignal.Emit( handle );
787 ops.updated_cb = OnBufferUpdated;
788 ops.removed_cb = OnSurfaceRemoved;
789 ops.added_cb = OnBufferAdded;
790 mWatcherHandle = screen_connector_toolkit_add(&ops, (char *)instanceId, SCREEN_CONNECTOR_SCREEEN_TYPE_WIDGET, this);
791 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_launch is called. [%s, mPid = %d]\n", mWidgetId.c_str(), mPid );
795 void WidgetView::OnStageConnection( int depth )
797 Control::OnStageConnection( depth );
800 void WidgetView::OnStageDisconnection()
802 Control::OnStageDisconnection();
805 void WidgetView::OnSizeSet( const Vector3& targetSize )
807 if( mWidgetImageView )
809 mWidgetImageView.SetSize( targetSize );
813 bool WidgetView::IsWidgetImageView()
815 return ( mWidgetImageView )? true: false;
818 void WidgetView::UpdateImageSource( tbm_surface_h source )
820 mImageSource->SetSource( source );
821 Dali::Stage::GetCurrent().KeepRendering( 0.0f );
824 void WidgetView::ConnectSignal( tizen_remote_surface* surface )
826 if( mWidgetImageView && surface )
828 mRemoteSurface = surface;
830 Self().TouchSignal().Connect( this, &WidgetView::OnTouch );
831 Self().WheelEventSignal().Connect( this, &WidgetView::OnWheelEvent );
836 bool WidgetView::OnTouch( Dali::Actor actor, const Dali::TouchData& event )
838 tizen_remote_surface_event_type type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_NONE;
840 if( event.GetPointCount() == 0 || mRemoteSurface == NULL )
845 switch( event.GetState( 0 ) )
847 case Dali::PointState::UP:
849 type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_UP;
852 case Dali::PointState::DOWN:
854 type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_DOWN;
857 case Dali::PointState::MOTION:
859 type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_MOVE;
870 if( type == TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_MOVE )
875 Vector2 localPos = event.GetLocalPosition( 0 );
877 tizen_remote_surface_transfer_mouse_event( mRemoteSurface,
883 wl_fixed_from_double( event.GetEllipseRadius( 0 ).x ),
884 wl_fixed_from_double( event.GetEllipseRadius( 0 ).y ),
885 wl_fixed_from_double( event.GetPressure( 0 ) ),
886 wl_fixed_from_double( event.GetAngle( 0 ).degree ),
887 TIZEN_INPUT_DEVICE_CLAS_TOUCHSCREEN,
888 TIZEN_INPUT_DEVICE_SUBCLAS_NONE,
895 bool WidgetView::OnWheelEvent( Dali::Actor actor, const Dali::WheelEvent& event )
897 if( mRemoteSurface == NULL )
901 //ToDo: We should check TIZEN_INPUT_DEVICE_CLAS_MOUSE
902 tizen_remote_surface_transfer_mouse_wheel( mRemoteSurface,
905 TIZEN_INPUT_DEVICE_CLAS_MOUSE,
906 TIZEN_INPUT_DEVICE_SUBCLAS_NONE,
913 Vector3 WidgetView::GetNaturalSize()
919 if( size.x > 0 && size.y > 0 )
921 size.z = std::min( size.x, size.y );
926 return Control::GetNaturalSize();
930 float WidgetView::GetHeightForWidth( float width )
932 if( mWidth > 0 && mHeight > 0 )
934 return GetHeightForWidthBase( width );
938 return Control::GetHeightForWidthBase( width );
942 float WidgetView::GetWidthForHeight( float height )
944 if( mWidth > 0 && mHeight > 0 )
946 return GetWidthForHeightBase( height );
950 return Control::GetWidthForHeightBase( height );
954 void WidgetView::CloseRemoteSurface()
956 screen_connector_toolkit_remove( mWatcherHandle );
957 mRemoteSurface = NULL;
960 void WidgetView::ShowLoadingState( bool show )
962 if( mPreviewImage && mPreviewVisible )
964 mPreviewImage.SetVisible( show );
967 if( mStateText && mLoadingTextVisible )
969 mStateText.SetProperty( Toolkit::TextLabel::Property::TEXT, GET_LOCALE_TEXT( "IDS_ST_POP_LOADING_ING" ) );
970 mStateText.SetVisible( show );
974 void WidgetView::ShowTapWidgetState( bool show )
976 if( mPreviewImage && mPreviewVisible )
978 mPreviewImage.SetVisible( false );
981 if( mStateText && mTapTextVisible )
983 mStateText.SetProperty( Toolkit::TextLabel::Property::TEXT, GET_LOCALE_TEXT( "IDS_HS_BODY_UNABLE_TO_LOAD_DATA_TAP_TO_RETRY" ) );
984 mStateText.SetVisible( show );
988 void WidgetView::SetLoadingTextPropertyMap( Property::Map map )
992 Property::Value* fontStyle = map.Find( FONT_STYLE );
995 if( fontStyle && fontStyle->Get( style ) )
997 mStateText.SetProperty( Toolkit::TextLabel::Property::FONT_STYLE, style );
1000 Property::Value* textPointSize = map.Find( TEXT_POINT_SIZE );
1003 if( textPointSize && textPointSize->Get( size ) )
1005 mStateText.SetProperty( Toolkit::TextLabel::Property::POINT_SIZE, size );
1008 Property::Value* textColor = map.Find( TEXT_COLOR );
1011 if( textColor && textColor->Get( color ) )
1013 mStateText.SetProperty( Toolkit::TextLabel::Property::TEXT_COLOR, color );
1018 float WidgetView::TextPixelToPointSize( int pixelSize )
1020 Dali::Vector2 dpi = Dali::Stage::GetCurrent().GetDpi();
1021 float meanDpi = (dpi.height + dpi.width) / 2.0f;
1023 return (pixelSize * 72.0f) / meanDpi;
1026 } // namespace Internal
1028 } // namespace WidgetView