public override void OnDragEnter(Glyph g, DragEventArgs e) { ToolStripItemGlyph glyph = g as ToolStripItemGlyph; ToolStripItem item = glyph.Item; ToolStripItemDataObject data = e.Data as ToolStripItemDataObject; if (data != null) { if (data.Owner == item.Owner) { this.PaintInsertionMark(item); ToolStripDesigner.dragItem = item; e.Effect = DragDropEffects.Move; } else { e.Effect = DragDropEffects.None; } } else { e.Effect = DragDropEffects.None; } }
// OLE DragDrop virtual methods /// <summary> /// OnDragDrop can be overridden so that a Behavior can specify its own Drag/Drop rules. /// </summary> public override void OnDragDrop(Glyph g, DragEventArgs e) { ToolStripItem currentDropItem = ToolStripDesigner.s_dragItem; // Ensure that the list item index is contained in the data. if (e.Data is ToolStripItemDataObject && currentDropItem != null) { ToolStripItemDataObject data = (ToolStripItemDataObject)e.Data; // Get the PrimarySelection before the Drag operation... ToolStripItem selectedItem = data.PrimarySelection; IDesignerHost designerHost = (IDesignerHost)currentDropItem.Site.GetService(typeof(IDesignerHost)); Debug.Assert(designerHost != null, "Invalid DesignerHost"); //Do DragDrop only if currentDropItem has changed. if (currentDropItem != selectedItem && designerHost != null) { ArrayList components = data.DragComponents; ToolStrip parentToolStrip = currentDropItem.GetCurrentParent() as ToolStrip; int primaryIndex = -1; string transDesc; bool copy = (e.Effect == DragDropEffects.Copy); if (components.Count == 1) { string name = TypeDescriptor.GetComponentName(components[0]); if (name == null || name.Length == 0) { name = components[0].GetType().Name; } transDesc = string.Format(copy ? SR.BehaviorServiceCopyControl : SR.BehaviorServiceMoveControl, name); } else { transDesc = string.Format(copy ? SR.BehaviorServiceCopyControls : SR.BehaviorServiceMoveControls, components.Count); } DesignerTransaction designerTransaction = designerHost.CreateTransaction(transDesc); try { IComponentChangeService changeSvc = (IComponentChangeService)currentDropItem.Site.GetService(typeof(IComponentChangeService)); if (changeSvc != null) { if (parentToolStrip is ToolStripDropDown dropDown) { ToolStripItem ownerItem = dropDown.OwnerItem; changeSvc.OnComponentChanging(ownerItem, TypeDescriptor.GetProperties(ownerItem)["DropDownItems"]); } else { changeSvc.OnComponentChanging(parentToolStrip, TypeDescriptor.GetProperties(parentToolStrip)["Items"]); } } // If we are copying, then we want to make a copy of the components we are dragging if (copy) { // Remember the primary selection if we had one if (selectedItem != null) { primaryIndex = components.IndexOf(selectedItem); } ToolStripKeyboardHandlingService keyboardHandlingService = GetKeyBoardHandlingService(selectedItem); if (keyboardHandlingService != null) { keyboardHandlingService.CopyInProgress = true; } components = DesignerUtils.CopyDragObjects(components, currentDropItem.Site) as ArrayList; if (keyboardHandlingService != null) { keyboardHandlingService.CopyInProgress = false; } if (primaryIndex != -1) { selectedItem = components[primaryIndex] as ToolStripItem; } } if (e.Effect == DragDropEffects.Move || copy) { ISelectionService selSvc = GetSelectionService(currentDropItem); if (selSvc != null) { // Insert the item. if (parentToolStrip is ToolStripOverflow) { parentToolStrip = (((ToolStripOverflow)parentToolStrip).OwnerItem).Owner; } int indexOfItemUnderMouseToDrop = parentToolStrip.Items.IndexOf(ToolStripDesigner.s_dragItem); if (indexOfItemUnderMouseToDrop != -1) { int indexOfPrimarySelection = 0; if (selectedItem != null) { indexOfPrimarySelection = parentToolStrip.Items.IndexOf(selectedItem); } if (indexOfPrimarySelection != -1 && indexOfItemUnderMouseToDrop > indexOfPrimarySelection) { indexOfItemUnderMouseToDrop--; } foreach (ToolStripItem item in components) { parentToolStrip.Items.Insert(indexOfItemUnderMouseToDrop, item); } } selSvc.SetSelectedComponents(new IComponent[] { selectedItem }, SelectionTypes.Primary | SelectionTypes.Replace); } } if (changeSvc != null) { ToolStripDropDown dropDown = parentToolStrip as ToolStripDropDown; if (dropDown != null) { ToolStripItem ownerItem = dropDown.OwnerItem; changeSvc.OnComponentChanged(ownerItem, TypeDescriptor.GetProperties(ownerItem)["DropDownItems"], null, null); } else { changeSvc.OnComponentChanged(parentToolStrip, TypeDescriptor.GetProperties(parentToolStrip)["Items"], null, null); } //fire extra changing/changed events. if (copy) { if (dropDown != null) { ToolStripItem ownerItem = dropDown.OwnerItem; changeSvc.OnComponentChanging(ownerItem, TypeDescriptor.GetProperties(ownerItem)["DropDownItems"]); changeSvc.OnComponentChanged(ownerItem, TypeDescriptor.GetProperties(ownerItem)["DropDownItems"], null, null); } else { changeSvc.OnComponentChanging(parentToolStrip, TypeDescriptor.GetProperties(parentToolStrip)["Items"]); changeSvc.OnComponentChanged(parentToolStrip, TypeDescriptor.GetProperties(parentToolStrip)["Items"], null, null); } } } //If Parent is DropDown... we have to manage the Glyphs .... foreach (ToolStripItem item in components) { if (item is ToolStripDropDownItem) { if (designerHost.GetDesigner(item) is ToolStripMenuItemDesigner itemDesigner) { itemDesigner.InitializeDropDown(); } } if (item.GetCurrentParent() is ToolStripDropDown dropDown && !(dropDown is ToolStripOverflow)) { if (dropDown.OwnerItem is ToolStripDropDownItem ownerItem) { if (designerHost.GetDesigner(ownerItem) is ToolStripMenuItemDesigner ownerDesigner) { ownerDesigner.InitializeBodyGlyphsForItems(false, ownerItem); ownerDesigner.InitializeBodyGlyphsForItems(true, ownerItem); } } } } // Refresh on SelectionManager... BehaviorService bSvc = GetBehaviorService(currentDropItem); if (bSvc != null) { bSvc.SyncSelection(); } } catch (Exception ex) { if (designerTransaction != null) { designerTransaction.Cancel(); designerTransaction = null; } if (ClientUtils.IsCriticalException(ex)) { throw; } } finally { if (designerTransaction != null) { designerTransaction.Commit(); designerTransaction = null; } } } } }
/// <summary> /// When any MouseMove message enters the BehaviorService's AdornerWindow (mousemove, ncmousemove) it is first passed here, to the top-most Behavior in the BehaviorStack. Returning 'true' from this function signifies that the Message was 'handled' by the Behavior and should not continue to be processed. /// </summary> public override bool OnMouseMove(Glyph g, MouseButtons button, Point mouseLoc) { bool retVal = false; ToolStripItemGlyph glyph = g as ToolStripItemGlyph; ToolStripItem glyphItem = glyph.Item; ISelectionService selSvc = GetSelectionService(glyphItem); if (selSvc == null || glyphItem.Site == null || MouseHandlerPresent(glyphItem)) { return(false); } if (!selSvc.GetComponentSelected(glyphItem)) { PaintInsertionMark(glyphItem); retVal = false; } if (button == MouseButtons.Left && glyph != null && glyph.ItemDesigner != null && !glyph.ItemDesigner.IsEditorActive) { Rectangle dragBox = Rectangle.Empty; IDesignerHost designerHost = (IDesignerHost)glyphItem.Site.GetService(typeof(IDesignerHost)); Debug.Assert(designerHost != null, "Invalid DesignerHost"); if (glyphItem.Placement == ToolStripItemPlacement.Overflow || (glyphItem.Placement == ToolStripItemPlacement.Main && !(glyphItem.IsOnDropDown))) { ToolStripItemDesigner itemDesigner = glyph.ItemDesigner; ToolStrip parentToolStrip = itemDesigner.GetMainToolStrip(); if (designerHost.GetDesigner(parentToolStrip) is ToolStripDesigner parentDesigner) { dragBox = parentDesigner.DragBoxFromMouseDown; } } else if (glyphItem.IsOnDropDown) { //Get the OwnerItem's Designer and set the value... if (glyphItem.Owner is ToolStripDropDown parentDropDown) { ToolStripItem ownerItem = parentDropDown.OwnerItem; if (designerHost.GetDesigner(ownerItem) is ToolStripItemDesigner ownerItemDesigner) { dragBox = ownerItemDesigner.dragBoxFromMouseDown; } } } // If the mouse moves outside the rectangle, start the drag. if (dragBox != Rectangle.Empty && !dragBox.Contains(mouseLoc.X, mouseLoc.Y)) { if (_timer != null) { _timer.Enabled = false; _timer.Tick -= new System.EventHandler(OnDoubleClickTimerTick); _timer.Dispose(); _timer = null; } // Proceed with the drag and drop, passing in the list item. try { ArrayList dragItems = new ArrayList(); ICollection selComps = selSvc.GetSelectedComponents(); //create our list of controls-to-drag foreach (IComponent comp in selComps) { if (comp is ToolStripItem item) { dragItems.Add(item); } } //Start Drag-Drop only if ToolStripItem is the primary Selection if (selSvc.PrimarySelection is ToolStripItem selectedItem) { ToolStrip owner = selectedItem.Owner; ToolStripItemDataObject data = new ToolStripItemDataObject(dragItems, selectedItem, owner); DropSource.QueryContinueDrag += new QueryContinueDragEventHandler(QueryContinueDrag); if (glyphItem is ToolStripDropDownItem ddItem) { if (designerHost.GetDesigner(ddItem) is ToolStripMenuItemDesigner itemDesigner) { itemDesigner.InitializeBodyGlyphsForItems(false, ddItem); ddItem.HideDropDown(); } } else if (glyphItem.IsOnDropDown && !glyphItem.IsOnOverflow) { ToolStripDropDown dropDown = glyphItem.GetCurrentParent() as ToolStripDropDown; ToolStripDropDownItem ownerItem = dropDown.OwnerItem as ToolStripDropDownItem; selSvc.SetSelectedComponents(new IComponent[] { ownerItem }, SelectionTypes.Replace); } DropSource.DoDragDrop(data, DragDropEffects.All); } } finally { DropSource.QueryContinueDrag -= new QueryContinueDragEventHandler(QueryContinueDrag); //Reset all Drag-Variables SetParentDesignerValuesForDragDrop(glyphItem, false, Point.Empty); ToolStripDesigner.s_dragItem = null; _dropSource = null; } retVal = false; } } return(retVal); }
public override bool OnMouseMove(Glyph g, MouseButtons button, Point mouseLoc) { bool flag = false; ToolStripItemGlyph glyph = g as ToolStripItemGlyph; ToolStripItem item = glyph.Item; ISelectionService selectionService = this.GetSelectionService(item); if (((selectionService != null) && (item.Site != null)) && !this.MouseHandlerPresent(item)) { if (!selectionService.GetComponentSelected(item)) { this.PaintInsertionMark(item); flag = false; } if (((button != MouseButtons.Left) || (glyph == null)) || ((glyph.ItemDesigner == null) || glyph.ItemDesigner.IsEditorActive)) { return(flag); } Rectangle empty = Rectangle.Empty; IDesignerHost service = (IDesignerHost)item.Site.GetService(typeof(IDesignerHost)); if ((item.Placement == ToolStripItemPlacement.Overflow) || ((item.Placement == ToolStripItemPlacement.Main) && !item.IsOnDropDown)) { ToolStrip mainToolStrip = glyph.ItemDesigner.GetMainToolStrip(); ToolStripDesigner designer = service.GetDesigner(mainToolStrip) as ToolStripDesigner; if (designer != null) { empty = designer.DragBoxFromMouseDown; } } else if (item.IsOnDropDown) { ToolStripDropDown owner = item.Owner as ToolStripDropDown; if (owner != null) { ToolStripItem ownerItem = owner.OwnerItem; ToolStripItemDesigner designer3 = service.GetDesigner(ownerItem) as ToolStripItemDesigner; if (designer3 != null) { empty = designer3.dragBoxFromMouseDown; } } } if (!(empty != Rectangle.Empty) || empty.Contains(mouseLoc.X, mouseLoc.Y)) { return(flag); } if (this._timer != null) { this._timer.Enabled = false; this._timer.Tick -= new EventHandler(this.OnDoubleClickTimerTick); this._timer.Dispose(); this._timer = null; } try { ArrayList dragComponents = new ArrayList(); foreach (IComponent component in selectionService.GetSelectedComponents()) { ToolStripItem item3 = component as ToolStripItem; if (item3 != null) { dragComponents.Add(item3); } } ToolStripItem primarySelection = selectionService.PrimarySelection as ToolStripItem; if (primarySelection != null) { ToolStrip strip2 = primarySelection.Owner; ToolStripItemDataObject data = new ToolStripItemDataObject(dragComponents, primarySelection, strip2); this.DropSource.QueryContinueDrag += new QueryContinueDragEventHandler(this.QueryContinueDrag); ToolStripDropDownItem item5 = item as ToolStripDropDownItem; if (item5 != null) { ToolStripMenuItemDesigner designer4 = service.GetDesigner(item5) as ToolStripMenuItemDesigner; if (designer4 != null) { designer4.InitializeBodyGlyphsForItems(false, item5); item5.HideDropDown(); } } else if (item.IsOnDropDown && !item.IsOnOverflow) { ToolStripDropDown currentParent = item.GetCurrentParent() as ToolStripDropDown; ToolStripDropDownItem item6 = currentParent.OwnerItem as ToolStripDropDownItem; selectionService.SetSelectedComponents(new IComponent[] { item6 }, SelectionTypes.Replace); } this.DropSource.DoDragDrop(data, DragDropEffects.Move | DragDropEffects.Copy | DragDropEffects.Scroll); } } finally { this.DropSource.QueryContinueDrag -= new QueryContinueDragEventHandler(this.QueryContinueDrag); this.SetParentDesignerValuesForDragDrop(item, false, Point.Empty); ToolStripDesigner.dragItem = null; this.dropSource = null; } } return(false); }
public override void OnDragDrop(Glyph g, DragEventArgs e) { ToolStripItem dragItem = ToolStripDesigner.dragItem; if ((e.Data is ToolStripItemDataObject) && (dragItem != null)) { ToolStripItemDataObject data = (ToolStripItemDataObject)e.Data; ToolStripItem primarySelection = data.PrimarySelection; IDesignerHost host = (IDesignerHost)dragItem.Site.GetService(typeof(IDesignerHost)); if ((dragItem != primarySelection) && (host != null)) { string str; ArrayList dragComponents = data.DragComponents; ToolStrip currentParent = dragItem.GetCurrentParent(); int index = -1; bool flag = e.Effect == DragDropEffects.Copy; if (dragComponents.Count == 1) { string componentName = TypeDescriptor.GetComponentName(dragComponents[0]); if ((componentName == null) || (componentName.Length == 0)) { componentName = dragComponents[0].GetType().Name; } str = System.Design.SR.GetString(flag ? "BehaviorServiceCopyControl" : "BehaviorServiceMoveControl", new object[] { componentName }); } else { str = System.Design.SR.GetString(flag ? "BehaviorServiceCopyControls" : "BehaviorServiceMoveControls", new object[] { dragComponents.Count }); } DesignerTransaction transaction = host.CreateTransaction(str); try { IComponentChangeService service = (IComponentChangeService)dragItem.Site.GetService(typeof(IComponentChangeService)); if (service != null) { ToolStripDropDown down = currentParent as ToolStripDropDown; if (down != null) { ToolStripItem ownerItem = down.OwnerItem; service.OnComponentChanging(ownerItem, TypeDescriptor.GetProperties(ownerItem)["DropDownItems"]); } else { service.OnComponentChanging(currentParent, TypeDescriptor.GetProperties(currentParent)["Items"]); } } if (flag) { if (primarySelection != null) { index = dragComponents.IndexOf(primarySelection); } ToolStripKeyboardHandlingService keyBoardHandlingService = this.GetKeyBoardHandlingService(primarySelection); if (keyBoardHandlingService != null) { keyBoardHandlingService.CopyInProgress = true; } dragComponents = DesignerUtils.CopyDragObjects(dragComponents, dragItem.Site) as ArrayList; if (keyBoardHandlingService != null) { keyBoardHandlingService.CopyInProgress = false; } if (index != -1) { primarySelection = dragComponents[index] as ToolStripItem; } } if ((e.Effect == DragDropEffects.Move) || flag) { ISelectionService selectionService = this.GetSelectionService(dragItem); if (selectionService != null) { if (currentParent is ToolStripOverflow) { currentParent = ((ToolStripOverflow)currentParent).OwnerItem.Owner; } int num2 = currentParent.Items.IndexOf(ToolStripDesigner.dragItem); if (num2 != -1) { int num3 = 0; if (primarySelection != null) { num3 = currentParent.Items.IndexOf(primarySelection); } if ((num3 != -1) && (num2 > num3)) { num2--; } foreach (ToolStripItem item4 in dragComponents) { currentParent.Items.Insert(num2, item4); } } selectionService.SetSelectedComponents(new IComponent[] { primarySelection }, SelectionTypes.Click | SelectionTypes.Replace); } } if (service != null) { ToolStripDropDown down2 = currentParent as ToolStripDropDown; if (down2 != null) { ToolStripItem component = down2.OwnerItem; service.OnComponentChanged(component, TypeDescriptor.GetProperties(component)["DropDownItems"], null, null); } else { service.OnComponentChanged(currentParent, TypeDescriptor.GetProperties(currentParent)["Items"], null, null); } if (flag) { if (down2 != null) { ToolStripItem item6 = down2.OwnerItem; service.OnComponentChanging(item6, TypeDescriptor.GetProperties(item6)["DropDownItems"]); service.OnComponentChanged(item6, TypeDescriptor.GetProperties(item6)["DropDownItems"], null, null); } else { service.OnComponentChanging(currentParent, TypeDescriptor.GetProperties(currentParent)["Items"]); service.OnComponentChanged(currentParent, TypeDescriptor.GetProperties(currentParent)["Items"], null, null); } } } foreach (ToolStripItem item7 in dragComponents) { if (item7 is ToolStripDropDownItem) { ToolStripMenuItemDesigner designer = host.GetDesigner(item7) as ToolStripMenuItemDesigner; if (designer != null) { designer.InitializeDropDown(); } } ToolStripDropDown down3 = item7.GetCurrentParent() as ToolStripDropDown; if ((down3 != null) && !(down3 is ToolStripOverflow)) { ToolStripDropDownItem item8 = down3.OwnerItem as ToolStripDropDownItem; if (item8 != null) { ToolStripMenuItemDesigner designer2 = host.GetDesigner(item8) as ToolStripMenuItemDesigner; if (designer2 != null) { designer2.InitializeBodyGlyphsForItems(false, item8); designer2.InitializeBodyGlyphsForItems(true, item8); } } } } BehaviorService behaviorService = this.GetBehaviorService(dragItem); if (behaviorService != null) { behaviorService.SyncSelection(); } } catch (Exception exception) { if (transaction != null) { transaction.Cancel(); transaction = null; } if (System.Windows.Forms.ClientUtils.IsCriticalException(exception)) { throw; } } finally { if (transaction != null) { transaction.Commit(); transaction = null; } } } } }
public override bool OnMouseMove(Glyph g, MouseButtons button, Point mouseLoc) { bool flag = false; ToolStripItemGlyph glyph = g as ToolStripItemGlyph; ToolStripItem item = glyph.Item; ISelectionService selectionService = this.GetSelectionService(item); if (((selectionService != null) && (item.Site != null)) && !this.MouseHandlerPresent(item)) { if (!selectionService.GetComponentSelected(item)) { this.PaintInsertionMark(item); flag = false; } if (((button != MouseButtons.Left) || (glyph == null)) || ((glyph.ItemDesigner == null) || glyph.ItemDesigner.IsEditorActive)) { return flag; } Rectangle empty = Rectangle.Empty; IDesignerHost service = (IDesignerHost) item.Site.GetService(typeof(IDesignerHost)); if ((item.Placement == ToolStripItemPlacement.Overflow) || ((item.Placement == ToolStripItemPlacement.Main) && !item.IsOnDropDown)) { ToolStrip mainToolStrip = glyph.ItemDesigner.GetMainToolStrip(); ToolStripDesigner designer = service.GetDesigner(mainToolStrip) as ToolStripDesigner; if (designer != null) { empty = designer.DragBoxFromMouseDown; } } else if (item.IsOnDropDown) { ToolStripDropDown owner = item.Owner as ToolStripDropDown; if (owner != null) { ToolStripItem ownerItem = owner.OwnerItem; ToolStripItemDesigner designer3 = service.GetDesigner(ownerItem) as ToolStripItemDesigner; if (designer3 != null) { empty = designer3.dragBoxFromMouseDown; } } } if (!(empty != Rectangle.Empty) || empty.Contains(mouseLoc.X, mouseLoc.Y)) { return flag; } if (this._timer != null) { this._timer.Enabled = false; this._timer.Tick -= new EventHandler(this.OnDoubleClickTimerTick); this._timer.Dispose(); this._timer = null; } try { ArrayList dragComponents = new ArrayList(); foreach (IComponent component in selectionService.GetSelectedComponents()) { ToolStripItem item3 = component as ToolStripItem; if (item3 != null) { dragComponents.Add(item3); } } ToolStripItem primarySelection = selectionService.PrimarySelection as ToolStripItem; if (primarySelection != null) { ToolStrip strip2 = primarySelection.Owner; ToolStripItemDataObject data = new ToolStripItemDataObject(dragComponents, primarySelection, strip2); this.DropSource.QueryContinueDrag += new QueryContinueDragEventHandler(this.QueryContinueDrag); ToolStripDropDownItem item5 = item as ToolStripDropDownItem; if (item5 != null) { ToolStripMenuItemDesigner designer4 = service.GetDesigner(item5) as ToolStripMenuItemDesigner; if (designer4 != null) { designer4.InitializeBodyGlyphsForItems(false, item5); item5.HideDropDown(); } } else if (item.IsOnDropDown && !item.IsOnOverflow) { ToolStripDropDown currentParent = item.GetCurrentParent() as ToolStripDropDown; ToolStripDropDownItem item6 = currentParent.OwnerItem as ToolStripDropDownItem; selectionService.SetSelectedComponents(new IComponent[] { item6 }, SelectionTypes.Replace); } this.DropSource.DoDragDrop(data, DragDropEffects.Move | DragDropEffects.Copy | DragDropEffects.Scroll); } } finally { this.DropSource.QueryContinueDrag -= new QueryContinueDragEventHandler(this.QueryContinueDrag); this.SetParentDesignerValuesForDragDrop(item, false, Point.Empty); ToolStripDesigner.dragItem = null; this.dropSource = null; } } return false; }