public static Rectangle PositionRelativeTo(IFormAdapter window, StickDir direction, Rectangle size) { Rectangle newPosition = size; if (direction == StickDir.None) { //nothing more newPosition = size; } // Stuck to side from top to bottom if (direction == (StickDir.Left | StickDir.Top | StickDir.Bottom | StickDir.VerticalInside) || direction == (StickDir.Right | StickDir.Top | StickDir.Bottom | StickDir.VerticalInside)) { newPosition.Height = window.Bounds.Height; } // Stuck to side from left to right if (direction == (StickDir.Top | StickDir.Left | StickDir.Right | StickDir.HorizontalInside) || direction == (StickDir.Bottom | StickDir.Left | StickDir.Right | StickDir.HorizontalInside)) { newPosition.Width = window.Bounds.Width; } // Stuck to left from inside if ((direction & (StickDir.Left | StickDir.HorizontalInside)) == (StickDir.Left | StickDir.HorizontalInside)) { newPosition.X = window.Bounds.X; } // Stuck to right from inside else if ((direction & (StickDir.Right | StickDir.HorizontalInside)) == (StickDir.Right | StickDir.HorizontalInside)) { newPosition.X = window.Bounds.X + (window.Bounds.Width - size.Width); } // Stuck to left from outside else if ((direction & StickDir.Left) == StickDir.Left) { newPosition.X = window.Bounds.X - size.Width; } // Stuck to right from outside else if ((direction & StickDir.Right) == StickDir.Right) { newPosition.X = window.Bounds.X + window.Bounds.Width; } // Stuck to top from inside if ((direction & (StickDir.Top | StickDir.VerticalInside)) == (StickDir.Top | StickDir.VerticalInside)) { newPosition.Y = window.Bounds.Y; } // Stuck to bottom from inside else if ((direction & (StickDir.Bottom | StickDir.VerticalInside)) == (StickDir.Bottom | StickDir.VerticalInside)) { newPosition.Y = window.Bounds.Y + (window.Bounds.Height - size.Height); } // Stuck to top from outside else if ((direction & StickDir.Top) == StickDir.Top) { newPosition.Y = window.Bounds.Y - size.Height; } // Stuck to bottom from outside else if ((direction & StickDir.Bottom) == StickDir.Bottom) { newPosition.Y = window.Bounds.Y + window.Bounds.Height; } return(newPosition); }
public static Rectangle PositionRelativeTo(IFormAdapter window, StickDir direction, Rectangle size) { Rectangle newPosition = size; if (direction == StickDir.None) { //nothing more newPosition = size; } // Stuck to side from top to bottom if (direction == (StickDir.Left | StickDir.Top | StickDir.Bottom | StickDir.VerticalInside) || direction == (StickDir.Right | StickDir.Top | StickDir.Bottom | StickDir.VerticalInside)) { newPosition.Height = window.Bounds.Height; } // Stuck to side from left to right if (direction == (StickDir.Top | StickDir.Left | StickDir.Right | StickDir.HorizontalInside) || direction == (StickDir.Bottom | StickDir.Left | StickDir.Right | StickDir.HorizontalInside)) { newPosition.Width = window.Bounds.Width; } // Stuck to left from inside if ((direction & (StickDir.Left | StickDir.HorizontalInside)) == (StickDir.Left | StickDir.HorizontalInside)) { newPosition.X = window.Bounds.X; } // Stuck to right from inside else if ((direction & (StickDir.Right | StickDir.HorizontalInside)) == (StickDir.Right | StickDir.HorizontalInside)) { newPosition.X = window.Bounds.X + (window.Bounds.Width - size.Width); } // Stuck to left from outside else if ((direction & StickDir.Left) == StickDir.Left) { newPosition.X = window.Bounds.X - size.Width; } // Stuck to right from outside else if ((direction & StickDir.Right) == StickDir.Right) { newPosition.X = window.Bounds.X + window.Bounds.Width; } // Stuck to top from inside if ((direction & (StickDir.Top | StickDir.VerticalInside)) == (StickDir.Top | StickDir.VerticalInside)) { newPosition.Y = window.Bounds.Y; } // Stuck to bottom from inside else if ((direction & (StickDir.Bottom | StickDir.VerticalInside)) == (StickDir.Bottom | StickDir.VerticalInside)) { newPosition.Y = window.Bounds.Y + (window.Bounds.Height - size.Height); } // Stuck to top from outside else if ((direction & StickDir.Top) == StickDir.Top) { newPosition.Y = window.Bounds.Y - size.Height; } // Stuck to bottom from outside else if ((direction & StickDir.Bottom) == StickDir.Bottom) { newPosition.Y = window.Bounds.Y + window.Bounds.Height; } return newPosition; }
/// <summary> /// /// </summary> /// <param name="bInsideStick">Allow snapping on the inside (eg: window to screen)</param> public StickDir IsStuckTo(IFormAdapter window, bool bInsideStick) { int fullStickGap = 2; if (window == this.originalForm) { return(StickDir.None); } Rectangle fromRect = originalForm.Bounds; Rectangle toRect = window.Bounds; StickDir result = StickDir.None; if (fromRect.Bottom >= (toRect.Top - stickGap) && fromRect.Top <= (toRect.Bottom + stickGap)) { if (bInsideStick) { if (fromRect.Left <= toRect.Left + fullStickGap && fromRect.Left >= toRect.Left - fullStickGap) { // stuck on left result = result | StickDir.HorizontalInside | StickDir.Left; } if (fromRect.Right <= toRect.Right + fullStickGap && fromRect.Right >= toRect.Right - fullStickGap) { // stuck on right result = result | StickDir.HorizontalInside | StickDir.Right; } } if (fromRect.Left + fromRect.Width <= toRect.Left + fullStickGap && fromRect.Left + fromRect.Width >= toRect.Left - fullStickGap) { // right 2 left result = result | StickDir.Left; } if (toRect.Left + toRect.Width <= fromRect.Left + fullStickGap && toRect.Left + toRect.Width >= fromRect.Left - fullStickGap) { // left 2 right result = result | StickDir.Right; } } if (fromRect.Right >= (toRect.Left - stickGap) && fromRect.Left <= (toRect.Right + stickGap)) { if (bInsideStick) { if (fromRect.Top <= toRect.Top + fullStickGap && fromRect.Top >= toRect.Top - fullStickGap) { // stuck on top result = result | StickDir.VerticalInside | StickDir.Top; } if (fromRect.Bottom <= toRect.Bottom + fullStickGap && fromRect.Bottom >= toRect.Bottom - fullStickGap) { // stuck on bottom result = result | StickDir.VerticalInside | StickDir.Bottom; } } if (fromRect.Top + fromRect.Height <= toRect.Top + fullStickGap && fromRect.Top + fromRect.Height >= toRect.Top - fullStickGap) { // top 2 bottom if ((result & StickDir.Top) != StickDir.Top) { result = result | StickDir.Top; } } if (toRect.Top + toRect.Height <= fromRect.Top + fullStickGap && toRect.Top + toRect.Height >= fromRect.Top - fullStickGap) { // bottom 2 windows if ((result & StickDir.Bottom) != StickDir.Bottom) { result = result | StickDir.Bottom; } } } return(result); }