Example #1
0
        /// <summary>
        /// Process the drag pages in the context of a target navigator.
        /// </summary>
        /// <param name="target">Target navigator instance.</param>
        /// <param name="data">Dragged page data.</param>
        /// <returns>Last page to be transferred.</returns>
        protected KryptonPage ProcessDragEndData(KryptonNavigator target,
                                                 PageDragEndData data)
        {
            KryptonPage ret = null;

            // Add each source page to the target
            foreach (KryptonPage page in data.Pages)
            {
                // Only add the page if one of the allow flags is set
                if ((page.Flags & (int)AllowFlags) != 0)
                {
                    // Use event to allow decision on if the page should be dropped
                    // (or even swap the page for a different page to be dropped)
                    PageDropEventArgs e = new PageDropEventArgs(page);
                    target.OnPageDrop(e);

                    if (!e.Cancel && (e.Page != null))
                    {
                        target.Pages.Add(e.Page);
                        ret = e.Page;
                    }
                }
            }

            return(ret);
        }
Example #2
0
 /// <summary>
 /// Add a list of drag targets from the provided interface.
 /// </summary>
 /// <param name="provider">Interface reference.</param>
 /// <param name="dragEndData">Pages data being dragged.</param>
 public void AddRange(IDragTargetProvider provider, PageDragEndData dragEndData)
 {
     if (provider != null)
     {
         DragTargetList targets = provider.GenerateDragTargets(dragEndData);
         if ((targets != null) && (targets.Count > 0))
         {
             AddRange(targets);
         }
     }
 }
        /// <summary>
        /// Find the target the first matches the provided screen point.
        /// </summary>
        /// <param name="screenPt">Point in screen coordinates.</param>
        /// <param name="dragEndData">Data to be dropped at destination.</param>
        /// <returns>First target that matches; otherwise null.</returns>
        protected virtual DragTarget FindTarget(Point screenPt, PageDragEndData dragEndData)
        {
            // Ask each target in turn if they are a match for the given screen point
            foreach (DragTarget target in DragTargets)
            {
                if (target.IsMatch(screenPt, dragEndData))
                {
                    return(target);
                }
            }

            // Nothing matches
            return(null);
        }
Example #4
0
        /// <summary>
        /// Called to initialize the implementation when dragging starts.
        /// </summary>
        /// <param name="paletteDragDrop">Drawing palette.</param>
        /// <param name="renderer">Drawing renderer.</param>
        /// <param name="pageDragEndData">Drag data associated with drag operation.</param>
        /// <param name="dragTargets">List of all drag targets.</param>
        public virtual void Start(IPaletteDragDrop paletteDragDrop,
                                  IRenderer renderer,
                                  PageDragEndData pageDragEndData,
                                  DragTargetList dragTargets)
        {
            Debug.Assert(paletteDragDrop != null);
            Debug.Assert(renderer != null);
            Debug.Assert(pageDragEndData != null);
            Debug.Assert(dragTargets != null);

            _paletteDragDrop = paletteDragDrop;
            _renderer        = renderer;
            _pageDragEndData = pageDragEndData;
            _dragTargets     = dragTargets;
        }
Example #5
0
        /// <summary>
        /// Release unmanaged and optionally managed resources.
        /// </summary>
        /// <param name="disposing">Called from Dispose method.</param>
        protected virtual void Dispose(bool disposing)
        {
            // If called from explicit call to Dispose
            if (disposing)
            {
                // No need to call destructor once dispose has occured
                GC.SuppressFinalize(this);

                _pageDragEndData = null;
                _dragTargets     = null;
            }

            // Mark as disposed
            _disposed = true;
        }
Example #6
0
        /// <summary>
        /// Occurs when dragging starts.
        /// </summary>
        /// <param name="screenPt">Mouse screen point at start of drag.</param>
        /// <param name="dragEndData">Data to be dropped at destination.</param>
        /// <returns>True if dragging waas started; otherwise false.</returns>
        public virtual bool DragStart(Point screenPt, PageDragEndData dragEndData)
        {
            if (IsDisposed)
            {
                throw new InvalidOperationException("Cannot DragStart when instance have been disposed.");
            }

            if (IsDragging)
            {
                throw new InvalidOperationException("Cannot DragStart when already performing dragging operation.");
            }

            if (dragEndData == null)
            {
                throw new ArgumentNullException("Cannot provide an empty DragEndData.");
            }

            // Generate drag targets from the set of target provides
            ClearTargets();
            foreach (IDragTargetProvider provider in DragTargetProviders)
            {
                _dragTargets.AddRange(provider, dragEndData);
            }

            // We only drag if we have at least one page and one target
            _dragging = ((_dragTargets.Count > 0) && (dragEndData.Pages.Count > 0));

            // Do we really need to start dragging?
            if (_dragging)
            {
                // We cache the palette/renderer at start of drag and use the same ones for the
                // whole duration of the drag as changing drawing info during drag would be hard!
                ResolvePaletteRenderer();

                // Cache page data for duration of dragging operation
                _pageDragEndData = dragEndData;

                // Create correct drag feedback class and start it up
                ResolveDragFeedback();
                _dragFeedback.Start(_stateCommon, _dragRenderer, _pageDragEndData, _dragTargets);
            }
            else
            {
                ClearTargets();
            }

            return(_dragging);
        }
        /// <summary>
        /// Called to initialize the implementation when dragging starts.
        /// </summary>
        /// <param name="paletteDragDrop">Drawing palette.</param>
        /// <param name="renderer">Drawing renderer.</param>
        /// <param name="pageDragEndData">Drag data associated with drag operation.</param>
        /// <param name="dragTargets">List of all drag targets.</param>
        public override void Start(IPaletteDragDrop paletteDragDrop,
                                   IRenderer renderer,
                                   PageDragEndData pageDragEndData,
                                   DragTargetList dragTargets)
        {
            base.Start(paletteDragDrop, renderer, pageDragEndData, dragTargets);

            if (_solid == null)
            {
                // Create and show a window without it taking focus
                _solid = new DropSolidWindow(PaletteDragDrop, Renderer);
                _solid.SetBounds(0, 0, 1, 1, BoundsSpecified.All);
                _solid.ShowWithoutActivate();
                _solid.Refresh();
            }
        }
Example #8
0
        /// <summary>
        /// Called to initialize the implementation when dragging starts.
        /// </summary>
        /// <param name="paletteDragDrop">Drawing palette.</param>
        /// <param name="renderer">Drawing renderer.</param>
        /// <param name="pageDragEndData">Drag data associated with drag operation.</param>
        /// <param name="dragTargets">List of all drag targets.</param>
        public override void Start(IPaletteDragDrop paletteDragDrop,
                                   IRenderer renderer,
                                   PageDragEndData pageDragEndData,
                                   DragTargetList dragTargets)
        {
            base.Start(paletteDragDrop, renderer, pageDragEndData, dragTargets);

            if (_solid == null)
            {
                // Create and show a solid feedback window without it taking focus
                _solid = new DropSolidWindow(PaletteDragDrop, Renderer);
                _solid.SetBounds(0, 0, 1, 1, BoundsSpecified.All);
                _solid.ShowWithoutActivate();
                _solid.Refresh();
            }

            ClearClusters();

            // Create clusters of related drag targets
            foreach (DragTarget target in dragTargets)
            {
                // Check if the target is actually able to drop inside itself
                if (target.IsMatch(target.HotRect.Location, pageDragEndData))
                {
                    // Find the existing cluster for the targets screen rectangle
                    DockCluster cluster = FindTargetCluster(target);

                    // Is the target allowed to be added to the found cluster (if there is one found)
                    if ((cluster == null) || cluster.ExcludeCluster || ((target.Hint & DragTargetHint.ExcludeCluster) == DragTargetHint.ExcludeCluster))
                    {
                        _clusters.Add(new DockCluster(PaletteDragDrop, Renderer, target));
                    }
                    else
                    {
                        cluster.Add(target);
                    }
                }
            }
        }
Example #9
0
 /// <summary>
 /// Create the actual drop data based on the proposed data provided.
 /// </summary>
 /// <param name="dropData">Proposed drop data.</param>
 /// <returns>Actual drop data</returns>
 protected virtual PageDragEndData CreateDropData(PageDragEndData dropData)
 {
     return(dropData);
 }
Example #10
0
 private DragTarget FindTarget(Point screenPt, PageDragEndData dragEndData)
 {
     // Nothing matches
     return(null);
 }
Example #11
0
 /// <summary>
 /// Perform the drop action associated with the target.
 /// </summary>
 /// <param name="screenPt">Position in screen coordinates.</param>
 /// <param name="dragEndData">Data to be dropped at destination.</param>
 /// <returns>Drop was performed and the source can perform any removal of pages as required.</returns>
 public abstract bool PerformDrop(Point screenPt, PageDragEndData dragEndData);
Example #12
0
 /// <summary>
 /// Is this target a match for the provided screen position.
 /// </summary>
 /// <param name="screenPt">Position in screen coordinates.</param>
 /// <param name="dragEndData">Data to be dropped at destination.</param>
 /// <returns>True if a match; otherwise false.</returns>
 public virtual bool IsMatch(Point screenPt, PageDragEndData dragEndData)
 {
     // Default to matching if the mouse is inside the targets hot area
     return(HotRect.Contains(screenPt));
 }
Example #13
0
 /// <summary>
 /// Called to cleanup when dragging has finished.
 /// </summary>
 public virtual void Quit()
 {
     _pageDragEndData = null;
     _dragTargets     = null;
 }