Exemple #1
0
        public bool OnDrag(AView v, DragEvent e)
        {
            DataPackage          package        = null;
            CustomLocalStateData localStateData = (e.LocalState as CustomLocalStateData) ?? _currentCustomLocalStateData ?? new CustomLocalStateData();

            _currentCustomLocalStateData = localStateData;

            // TODO MAUI FIX FOR COMPAT
            //IVisualElementRenderer dragSourceRenderer = localStateData?.SourceNativeView as IVisualElementRenderer;
            package = localStateData?.DataPackage;
            var dragSourceElement = _currentCustomLocalStateData?.SourceElement;            // ?? dragSourceRenderer?.Element;

            if (package == null)
            {
                package = new DataPackage();
                _currentCustomLocalStateData.DataPackage = package;
            }

            switch (e.Action)
            {
            case DragAction.Ended:
            {
                _currentCustomLocalStateData = null;
                if (dragSourceElement is View vSource)
                {
                    HandleDropCompleted(vSource);
                }
            }
            break;

            case DragAction.Started:
                break;

            case DragAction.Location:
                HandleDragOver(package);
                break;

            case DragAction.Drop:
            {
                HandleDrop(e, _currentCustomLocalStateData);
                break;
            }

            case DragAction.Entered:
                HandleDragOver(package);
                break;

            case DragAction.Exited:
                HandleDragLeave(package);
                break;
            }

            return(true);
        }
        protected override void Dispose(bool disposing)
        {
            if (_isDisposed)
            {
                return;
            }

            _isDisposed = true;

            if (disposing)
            {
                _currentCustomLocalStateData = null;
                var control = GetControl();
                if (control.IsAlive())
                {
                    control.SetOnDragListener(null);
                }
            }

            base.Dispose(disposing);
        }
        public void OnLongPress(MotionEvent e)
        {
            if (!HasAnyDragGestures())
            {
                return;
            }

            SendEventArgs <DragGestureRecognizer>(rec =>
            {
                if (!rec.CanDrag)
                {
                    return;
                }

                var element  = GetView();
                var renderer = AppCompat.Platform.GetRenderer(element);
                var v        = renderer.View;

                if (v.Handle == IntPtr.Zero)
                {
                    return;
                }

                var args = rec.SendDragStarting(element);

                if (args.Cancel)
                {
                    return;
                }

                CustomLocalStateData customLocalStateData = new CustomLocalStateData();
                customLocalStateData.DataPackage          = args.Data;

                //_dragSource[element] = args.Data;
                string clipDescription  = FastRenderers.AutomationPropertiesProvider.ConcatenateNameAndHelpText(element) ?? String.Empty;
                ClipData.Item item      = null;
                List <string> mimeTypes = new List <string>();

                if (!args.Handled)
                {
                    if (args.Data.Image != null)
                    {
                        mimeTypes.Add("image/jpeg");
                        item = ConvertToClipDataItem(args.Data.Image, mimeTypes);
                    }
                    else
                    {
                        string text = clipDescription ?? args.Data.Text;
                        if (Uri.TryCreate(text, UriKind.Absolute, out _))
                        {
                            item = new ClipData.Item(AUri.Parse(text));
                            mimeTypes.Add(ClipDescription.MimetypeTextUrilist);
                        }
                        else
                        {
                            item = new ClipData.Item(text);
                            mimeTypes.Add(ClipDescription.MimetypeTextPlain);
                        }
                    }
                }

                var dataPackage        = args.Data;
                ClipData.Item userItem = null;
                if (dataPackage.Image != null)
                {
                    userItem = ConvertToClipDataItem(dataPackage.Image, mimeTypes);
                }

                if (dataPackage.Text != null)
                {
                    userItem = new ClipData.Item(dataPackage.Text);
                }

                if (item == null)
                {
                    item     = userItem;
                    userItem = null;
                }

                ClipData data = new ClipData(clipDescription, mimeTypes.ToArray(), item);

                if (userItem != null)
                {
                    data.AddItem(userItem);
                }

                var dragShadowBuilder = new AView.DragShadowBuilder(v);

                customLocalStateData.SourceNativeView = v;
                customLocalStateData.SourceElement    = renderer?.Element;

                if (Forms.IsNougatOrNewer)
                {
                    v.StartDragAndDrop(data, dragShadowBuilder, customLocalStateData, (int)ADragFlags.Global | (int)ADragFlags.GlobalUriRead);
                }
                else
#pragma warning disable CS0618 // Type or member is obsolete
                {
                    v.StartDrag(data, dragShadowBuilder, customLocalStateData, (int)ADragFlags.Global | (int)ADragFlags.GlobalUriRead);
                }
#pragma warning restore CS0618 // Type or member is obsolete
            });
        }
        void HandleDrop(DragEvent e, CustomLocalStateData customLocalStateData)
        {
            if (customLocalStateData.AcceptedOperation == DataPackageOperation.None)
            {
                return;
            }

            var datapackage = customLocalStateData.DataPackage;

            if (e.LocalState == null)
            {
                string text = String.Empty;
                if (e.ClipData?.ItemCount > 0)
                {
                    var clipData = e.ClipData.GetItemAt(0);
                    var control  = GetControl();

                    if (control?.Context != null)
                    {
                        text = clipData.CoerceToText(control?.Context);
                    }
                    else
                    {
                        text = clipData.Text;
                    }
                }
                else
                {
                    text = e.ClipDescription?.Label;
                }

                if (String.IsNullOrWhiteSpace(datapackage.Text))
                {
                    datapackage.Text = text;
                }

                if (datapackage.Image == null)
                {
                    datapackage.Image = text;
                }
            }

            var args = new DropEventArgs(datapackage?.View);

            SendEventArgs <DropGestureRecognizer>(async rec =>
            {
                if (!rec.AllowDrop)
                {
                    return;
                }

                try
                {
                    await rec.SendDrop(args);
                }
                catch (Exception exc)
                {
                    Internals.Log.Warning(nameof(DropGestureRecognizer), $"{exc}");
                }
            });
        }