FReply STransformHandle::OnMouseButtonDown(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent)
{
	if ( MouseEvent.GetEffectingButton() == EKeys::LeftMouseButton )
	{
		Action = ComputeActionAtLocation(MyGeometry, MouseEvent);

		FWidgetReference SelectedWidget = Designer->GetSelectedWidget();
		UWidget* Preview = SelectedWidget.GetPreview();
		UWidget* Template = SelectedWidget.GetTemplate();

		if ( UCanvasPanelSlot* Slot = Cast<UCanvasPanelSlot>(Preview->Slot) )
		{
			StartingOffsets = Slot->GetOffsets();
		}

		MouseDownPosition = MouseEvent.GetScreenSpacePosition();

		ScopedTransaction = new FScopedTransaction(LOCTEXT("ResizeWidget", "Resize Widget"));
		Template->Modify();

		return FReply::Handled().CaptureMouse(SharedThis(this));
	}

	return FReply::Unhandled();
}
EVisibility STransformHandle::GetHandleVisibility() const
{
	ETransformMode::Type TransformMode = Designer->GetTransformMode();

	// Only show the handles for visible elements in the designer.
	FWidgetReference SelectedWidget = Designer->GetSelectedWidget();
	if ( SelectedWidget.IsValid() )
	{
		if ( !SelectedWidget.GetTemplate()->bHiddenInDesigner )
		{
			switch ( TransformMode )
			{
			case ETransformMode::Layout:
			{
				if ( UPanelSlot* TemplateSlot = SelectedWidget.GetTemplate()->Slot )
				{
					if ( CanResize(TemplateSlot, DragDirection) )
					{
						return EVisibility::Visible;
					}
				}
				break;
			}
			case ETransformMode::Render:
				return EVisibility::Visible;
			}
		}
	}

	return EVisibility::Collapsed;
}
FReply STransformHandle::OnMouseMove(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent)
{
	if ( Action != ETransformAction::None )
	{
		FWidgetReference SelectedWidget = Designer->GetSelectedWidget();

		UWidget* Template = SelectedWidget.GetTemplate();
		UWidget* Preview = SelectedWidget.GetPreview();

		{
			FVector2D Delta = MouseEvent.GetScreenSpacePosition() - MouseDownPosition;
			FVector2D TranslateAmount = Delta * ( 1.0f / Designer->GetPreviewScale() );

			Resize(Cast<UCanvasPanelSlot>(Preview->Slot), DragDirection, TranslateAmount);
			Resize(Cast<UCanvasPanelSlot>(Template->Slot), DragDirection, TranslateAmount);
		}

		ETransformMode::Type TransformMode = Designer->GetTransformMode();
		if ( TransformMode == ETransformMode::Render )
		{
			FWidgetTransform PreviewRenderTransform = Preview->RenderTransform;

			static const FName RenderTransformName(TEXT("RenderTransform"));

			FObjectEditorUtils::SetPropertyValue<UWidget, FWidgetTransform>(Preview, RenderTransformName, PreviewRenderTransform);
			FObjectEditorUtils::SetPropertyValue<UWidget, FWidgetTransform>(Template, RenderTransformName, PreviewRenderTransform);
		}
	}

	return FReply::Unhandled();
}
// Callback for clicking a menu entry for a navigations rule.
void FWidgetNavigationCustomization::HandleNavMenuEntryClicked(TWeakPtr<IPropertyHandle> PropertyHandle, EUINavigation Nav, EUINavigationRule Rule)
{
	TArray<UObject*> OuterObjects;
	TSharedPtr<IPropertyHandle> PropertyHandlePtr = PropertyHandle.Pin();
	PropertyHandlePtr->GetOuterObjects(OuterObjects);

	const FScopedTransaction Transaction(LOCTEXT("InitializeNavigation", "Edit Widget Navigation"));

	for (UObject* OuterObject : OuterObjects)
	{
		if (UWidget* Widget = Cast<UWidget>(OuterObject))
		{
			FWidgetReference WidgetReference = Editor.Pin()->GetReferenceFromPreview(Widget);

			SetNav(WidgetReference.GetPreview(), Nav, Rule, TOptional<FName>());
			SetNav(WidgetReference.GetTemplate(), Nav, Rule, TOptional<FName>());
		}
	}
}
bool FWidgetBlueprintEditor::CanPasteWidgets()
{
	TSet<FWidgetReference> Widgets = GetSelectedWidgets();
	if ( Widgets.Num() == 1 )
	{
		FWidgetReference Target = *Widgets.CreateIterator();
		const bool bIsPanel = Cast<UPanelWidget>(Target.GetTemplate()) != nullptr;
		return bIsPanel;
	}
	else if ( Widgets.Num() == 0 )
	{
		if ( GetWidgetBlueprintObj()->WidgetTree->RootWidget == nullptr )
		{
			return true;
		}
	}

	return false;
}
void FWidgetNavigationCustomization::OnCommitExplictWidgetText(const FText& ItemFText, ETextCommit::Type CommitInfo, TWeakPtr<IPropertyHandle> PropertyHandle, EUINavigation Nav)
{
	TArray<UObject*> OuterObjects;
	TSharedPtr<IPropertyHandle> PropertyHandlePtr = PropertyHandle.Pin();
	PropertyHandlePtr->GetOuterObjects(OuterObjects);

	const FScopedTransaction Transaction(LOCTEXT("InitializeNavigation", "Edit Widget Navigation"));

	FName GotoWidgetName = FName(*ItemFText.ToString());

	for ( UObject* OuterObject : OuterObjects )
	{
		if ( UWidget* Widget = Cast<UWidget>(OuterObject) )
		{
			FWidgetReference WidgetReference = Editor.Pin()->GetReferenceFromPreview(Widget);

			SetNav(WidgetReference.GetPreview(), Nav, TOptional<EUINavigationRule>(), GotoWidgetName);
			SetNav(WidgetReference.GetTemplate(), Nav, TOptional<EUINavigationRule>(), GotoWidgetName);
		}
	}
}