using System.Drawing; using System.Windows.Forms; namespace DevComponents.DotNetBar { /// /// Summary description for DesignTimeProviderContainer. /// public class DesignTimeProviderContainer { /// /// Returns information about insertion position for an item given screen coordinates. Used internally for drag&drop support. /// /// Container item /// Screen coordinates /// Item that is being dragged /// Information about insertion position or null if item cannot be inserted to the container. public static InsertPosition GetInsertPosition(BaseItem containerItem, Point pScreen, BaseItem DragItem) { InsertPosition objInsertPos=null; Control objContainer = null; if (containerItem is PopupItem && containerItem.Expanded) objContainer = ((PopupItem)containerItem).PopupControl; else objContainer = containerItem.ContainerControl as Control; if (objContainer == null) return null; Point pClient=objContainer.PointToClient(pScreen); Rectangle thisRect=containerItem.DisplayRectangle; if (containerItem is PopupItem && containerItem.Expanded) thisRect = objContainer.DisplayRectangle; if(thisRect.Contains(pClient) || containerItem.SubItems.Count==0 && objContainer.ClientRectangle.Contains(pClient) || containerItem is ItemContainer && ((ItemContainer)containerItem).SystemContainer && objContainer.ClientRectangle.Contains(pClient)) { Rectangle r; BaseItem objItem; // Check first inside any expanded items objItem=containerItem.ExpandedItem(); if(objItem!=null) { IDesignTimeProvider provider=objItem as IDesignTimeProvider; if(provider!=null) { objInsertPos=provider.GetInsertPosition(pScreen, DragItem); if(objInsertPos!=null) return objInsertPos; } } bool dragItemPreviousItem = false; for(int i=0;i1 && containerItem.SubItems[containerItem.SubItems.Count-1].SystemItem) objInsertPos=new InsertPosition(containerItem.SubItems.Count-2,true,(IDesignTimeProvider)containerItem); else objInsertPos=new InsertPosition(containerItem.SubItems.Count-1,false,(IDesignTimeProvider)containerItem); } } else { foreach(BaseItem objItem in containerItem.SubItems) { if(objItem==DragItem) continue; IDesignTimeProvider provider=objItem as IDesignTimeProvider; if(provider!=null) { objInsertPos=provider.GetInsertPosition(pScreen, DragItem); if(objInsertPos!=null) break; } } } return objInsertPos; } private static bool CanExpand(BaseItem objItem) { return (objItem is PopupItem && (objItem.SubItems.Count > 0 || objItem.IsOnMenuBar)) || objItem is ItemContainer && ((ItemContainer)objItem).CanExpand; } /// /// Draws reversible marker to indicates item drag&drop position /// /// Container item /// Position to draw marker at /// Indicates whether the marker is drawn before the reference position public static void DrawReversibleMarker(BaseItem containerItem, int iPos, bool Before) { Control objCtrl=containerItem.ContainerControl as Control; if(objCtrl==null) return; BaseItem objItem=null; if(iPos>=0) objItem=containerItem.SubItems[iPos]; Rectangle r, rl,rr; if(objItem!=null) { if(objItem.DesignInsertMarker!=eDesignInsertPosition.None) objItem.DesignInsertMarker=eDesignInsertPosition.None; else if(Before) objItem.DesignInsertMarker=eDesignInsertPosition.Before; else objItem.DesignInsertMarker=eDesignInsertPosition.After; return; } else { Rectangle rTmp=containerItem.DisplayRectangle; rTmp.Inflate(-1,-1); r=new Rectangle(rTmp.Left+2,rTmp.Top+2,1,rTmp.Height-4); rl=new Rectangle(rTmp.Left,rTmp.Top+1,5,1); rr=new Rectangle(rTmp.Left,rTmp.Bottom-2,5,1); } //r.Location=objCtrl.PointToScreen(r.Location); //rl.Location=objCtrl.PointToScreen(rl.Location); //rr.Location=objCtrl.PointToScreen(rr.Location); //ControlPaint.DrawReversibleFrame(r,SystemColors.Control,FrameStyle.Thick); //ControlPaint.DrawReversibleFrame(rl,SystemColors.Control,FrameStyle.Thick); //ControlPaint.DrawReversibleFrame(rr,SystemColors.Control,FrameStyle.Thick); } /// /// Inserts drag&drop item at specified position. /// /// Container item. /// Item being inserted /// Insertion position /// Indicates whether item is inserted before the specified insertion position public static void InsertItemAt(BaseItem containerItem, BaseItem objItem, int iPos, bool Before) { if(containerItem.ExpandedItem()!=null) { containerItem.ExpandedItem().Expanded=false; } if(!Before) { if(iPos+1>=containerItem.SubItems.Count) { containerItem.SubItems.Add(objItem,GetAppendPosition(containerItem)); } else { containerItem.SubItems.Add(objItem,iPos+1); } } else { if(iPos>=containerItem.SubItems.Count) { containerItem.SubItems.Add(objItem, GetAppendPosition(containerItem)); } else { containerItem.SubItems.Add(objItem,iPos); } } if(containerItem.ContainerControl is Bar) ((Bar)containerItem.ContainerControl).RecalcLayout(); else if(containerItem.ContainerControl is MenuPanel) ((MenuPanel)containerItem.ContainerControl).RecalcSize(); else if(containerItem.ContainerControl is BarBaseControl) ((BarBaseControl)containerItem.ContainerControl).RecalcLayout(); else if(containerItem.ContainerControl is ItemControl) ((ItemControl)containerItem.ContainerControl).RecalcLayout(); else { containerItem.RecalcSize(); containerItem.Refresh(); } } /// /// Returns insertion index for an item taking in account any system items that are at the end of the collection. /// /// Parent item /// Returns the index at which an item should be inserted public static int GetAppendPosition(BaseItem objParent) { int iPos=-1; for(int i=objParent.SubItems.Count-1;i>=0;i--) { if(objParent.SubItems[i].SystemItem) iPos=i; else break; } return iPos; } } }