/// <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); }
/// <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); }
/// <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; }
/// <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; }
/// <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(); } }
/// <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); } } } }
/// <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); }
private DragTarget FindTarget(Point screenPt, PageDragEndData dragEndData) { // Nothing matches return(null); }
/// <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);
/// <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)); }
/// <summary> /// Called to cleanup when dragging has finished. /// </summary> public virtual void Quit() { _pageDragEndData = null; _dragTargets = null; }