private Task ApplyFace(MapDocument document, PerspectiveCamera camera, Face face, IMapObject parent)
        {
            // Right:       use defined action
            // Alt+Right:   apply + align
            // Shift+Right: apply only
            // Ctrl+Right:  nothing...?

            var action = _rightClickAction;

            if (KeyboardState.Alt)
            {
                action = ClickAction.Apply | ClickAction.AlignToSample;
            }
            if (KeyboardState.Shift)
            {
                action = ClickAction.Apply;
            }

            var sampleFace = GetSelection(document).FirstOrDefault();

            var activeTexture = document.Map.Data.GetOne <ActiveTexture>()?.Name ?? sampleFace?.Texture.Name ?? "";

            if (String.IsNullOrWhiteSpace(activeTexture))
            {
                return(Task.CompletedTask);
            }

            var clone = (Face)face.Clone();

            bool changed = false;

            // Apply texture
            if (!String.IsNullOrWhiteSpace(activeTexture) && action.HasFlag(ClickAction.Apply))
            {
                clone.Texture.Name = activeTexture;
                changed            = true;
            }

            // Apply values
            if (camera != null && action.HasFlag(ClickAction.AlignToView))
            {
                // align to camera
                var uaxis = camera.GetRight();
                var vaxis = camera.GetUp();
                var pos   = camera.Location;
                clone.Texture.SetRotation(0);
                clone.Texture.XScale = 1;
                clone.Texture.YScale = 1;
                clone.Texture.UAxis  = uaxis;
                clone.Texture.VAxis  = vaxis;
                clone.Texture.XShift = Vector3.Dot(uaxis, pos);
                clone.Texture.YShift = Vector3.Dot(vaxis, pos);
                changed = true;
            }
            else if (sampleFace != null && action.HasFlag(ClickAction.AlignToSample))
            {
                // align to face
                clone.Texture.AlignWithTexture(clone.Plane, sampleFace.Plane, sampleFace.Texture);
                changed = true;
            }
            else if (sampleFace != null && action.HasFlag(ClickAction.Values))
            {
                // apply values
                clone.Texture.SetRotation(sampleFace.Texture.Rotation);
                clone.Texture.XScale = sampleFace.Texture.XScale;
                clone.Texture.XShift = sampleFace.Texture.XShift;
                clone.Texture.YScale = sampleFace.Texture.YScale;
                clone.Texture.YShift = sampleFace.Texture.YShift;
                changed = true;
            }

            if (!changed)
            {
                return(Task.CompletedTask);
            }

            var edit = new Transaction(
                new RemoveMapObjectData(parent.ID, face),
                new AddMapObjectData(parent.ID, clone)
                );

            return(MapDocumentOperation.Perform(document, edit));
        }