Code:
/ FX-1434 / FX-1434 / 1.0 / untmp / whidbey / REDBITS / ndp / fx / src / Designer / WinForms / System / WinForms / Design / Behavior / ToolStripPanelSelectionBehavior.cs / 1 / ToolStripPanelSelectionBehavior.cs
namespace System.Windows.Forms.Design.Behavior {
using System;
using System.Collections;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Design;
using System.Diagnostics;
using System.Drawing;
using System.Windows.Forms.Design;
using System.Drawing.Design;
///
///
///
///
internal sealed class ToolStripPanelSelectionBehavior : Behavior {
private ToolStripPanel relatedControl; //our related control
private IServiceProvider serviceProvider; //used for starting a drag/drop
private BehaviorService behaviorService; //ptr to where we start our drag/drop operation
private const int defaultBounds = 25;
///
///
///
internal ToolStripPanelSelectionBehavior(ToolStripPanel containerControl, IServiceProvider serviceProvider) {
this.behaviorService = (BehaviorService)serviceProvider.GetService(typeof(BehaviorService));
if (behaviorService == null) {
Debug.Fail("Could not get the BehaviorService from ContainerSelectroBehavior!");
return;
}
this.relatedControl = containerControl;
this.serviceProvider = serviceProvider;
}
private static bool DragComponentContainsToolStrip(DropSourceBehavior.BehaviorDataObject data)
{
bool containsTool = false;
if (data != null) {
ArrayList dragComps = new ArrayList(data.DragComponents);
foreach(Component dragComp in dragComps)
{
ToolStrip tool = dragComp as ToolStrip;
if (tool != null)
{
containsTool = true;
break;
}
}
}
return containsTool;
}
private void ExpandPanel(bool setSelection)
{
//Change the padding to "dynamically" increase the bounds..
switch (relatedControl.Dock)
{
case DockStyle.Top:
relatedControl.Padding = new Padding (0, 0, 0, defaultBounds);
break;
case DockStyle.Left:
relatedControl.Padding = new Padding (0, 0, defaultBounds, 0);
break;
case DockStyle.Right:
relatedControl.Padding = new Padding (defaultBounds, 0, 0, 0);
break;
case DockStyle.Bottom:
relatedControl.Padding = new Padding (0, defaultBounds, 0, 0);
break;
}
if (setSelection) {
//select our component
ISelectionService selSvc = (ISelectionService)serviceProvider.GetService(typeof(ISelectionService));
if (selSvc != null) {
selSvc.SetSelectedComponents(new object[] {relatedControl}, SelectionTypes.Replace);
}
}
}
///
///
/// Simply clear the initial drag point, so we can start again
/// on the next mouse down.
///
public override bool OnMouseDown(Glyph g, MouseButtons button, Point mouseLoc) {
ToolStripPanelSelectionGlyph selectionGlyph = g as ToolStripPanelSelectionGlyph;
if (button == MouseButtons.Left && selectionGlyph != null) {
if (!selectionGlyph.IsExpanded)
{
ExpandPanel(true);
// Invalidate
Rectangle oldBounds = selectionGlyph.Bounds;
selectionGlyph.IsExpanded = true;
behaviorService.Invalidate(oldBounds);
behaviorService.Invalidate(selectionGlyph.Bounds);
}
else {
//Change the padding to "dynamically" increase the bounds..
relatedControl.Padding = new Padding(0);
// Invalidate
Rectangle oldBounds = selectionGlyph.Bounds;
selectionGlyph.IsExpanded = false;
behaviorService.Invalidate(oldBounds);
behaviorService.Invalidate(selectionGlyph.Bounds);
//select our parent...
ISelectionService selSvc = (ISelectionService)serviceProvider.GetService(typeof(ISelectionService));
Component curSel = selSvc.PrimarySelection as Component;
if (curSel != relatedControl.Parent)
{
if (selSvc != null) {
selSvc.SetSelectedComponents(new object[] {relatedControl.Parent}, SelectionTypes.Replace);
}
}
else
{
Control parent = relatedControl.Parent;
parent.PerformLayout();
SelectionManager selMgr = (SelectionManager)serviceProvider.GetService(typeof(SelectionManager));
selMgr.Refresh();
Point loc = behaviorService.ControlToAdornerWindow(parent);
Rectangle translatedBounds = new Rectangle(loc, parent.Size);
behaviorService.Invalidate(translatedBounds);
}
}
}
return false;
}
///
/// Reparent the toolStripcontrol
///
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes")]
private void ReParentControls(ArrayList controls, bool copy)
{
IDesignerHost host = serviceProvider.GetService(typeof(IDesignerHost)) as IDesignerHost;
if (host != null)
{
if (controls.Count > 0)
{
string transDesc;
if (controls.Count == 1 && controls[0] is ToolStrip) {
string name = TypeDescriptor.GetComponentName(controls[0]);
if (name == null || name.Length == 0) {
name = controls[0].GetType().Name;
}
transDesc = SR.GetString(copy ? SR.BehaviorServiceCopyControl : SR.BehaviorServiceMoveControl, name);
}
else {
transDesc = SR.GetString(copy ? SR.BehaviorServiceCopyControls : SR.BehaviorServiceMoveControls, controls.Count);
}
// create a transaction so this happens as an atomic unit.
DesignerTransaction changeParent = host.CreateTransaction(transDesc);
try
{
ArrayList temp = null;
ISelectionService selSvc = (ISelectionService)serviceProvider.GetService(typeof(ISelectionService));
if (copy) {
temp = new ArrayList();
selSvc = (ISelectionService)serviceProvider.GetService(typeof(ISelectionService));
}
for (int i = 0; i < controls.Count; i++)
{
Control c = controls[i] as Control;
if (!(c is ToolStrip))
{
continue;
}
if (copy) {
temp.Clear();
temp.Add(c);
//if we are copying, then well, make a copy of the control
temp = DesignerUtils.CopyDragObjects(temp, serviceProvider) as ArrayList;
if (temp != null) {
c = temp[0] as Control;
c.Visible = true;
}
}
Control newParent = relatedControl;
IComponentChangeService changeSvc = serviceProvider.GetService(typeof(IComponentChangeService)) as IComponentChangeService;
PropertyDescriptor controlsProp = TypeDescriptor.GetProperties(newParent)["Controls"];
Control oldParent = c.Parent;
if (oldParent != null && !copy) {
if (changeSvc != null) {
changeSvc.OnComponentChanging(oldParent, controlsProp);
}
//remove control from the old parent
oldParent.Controls.Remove(c);
}
if (changeSvc != null) {
changeSvc.OnComponentChanging(newParent, controlsProp);
}
//finally add & relocate the control with the new parent
newParent.Controls.Add(c);
//fire our comp changed events
if (changeSvc != null && oldParent != null && !copy) {
changeSvc.OnComponentChanged(oldParent, controlsProp, null, null);
}
// fire comp changed on the newParent
if (changeSvc != null) {
changeSvc.OnComponentChanged(newParent, controlsProp, null, null);
}
if (selSvc != null) {
selSvc.SetSelectedComponents(new object[] {c}, i == 0 ? SelectionTypes.Primary | SelectionTypes.Replace : SelectionTypes.Add);
}
}
}
catch {
if (changeParent != null)
{
changeParent.Cancel();
changeParent = null;
}
}
finally {
if (changeParent != null)
{
changeParent.Commit();
changeParent = null;
}
}
}
}
}
///
///
/// Simply clear the initial drag point, so we can start again
/// on the next mouse down.
///
public override void OnDragDrop(Glyph g, DragEventArgs e)
{
ToolStripPanelSelectionGlyph selectionGlyph = g as ToolStripPanelSelectionGlyph;
// Expand the glyph only if ToolStrip is dragged around
bool expandPanel = false;
ArrayList dragComps = null;
DropSourceBehavior.BehaviorDataObject data = e.Data as DropSourceBehavior.BehaviorDataObject;
if (data != null) {
dragComps = new ArrayList(data.DragComponents);
foreach(Component dragComp in dragComps)
{
ToolStrip tool = dragComp as ToolStrip;
if (tool != null && tool.Parent != relatedControl)
{
expandPanel = true;
break;
}
}
if (expandPanel)
{
Control root = relatedControl.Parent;
if (root != null)
{
try
{
root.SuspendLayout();
ExpandPanel(false);
// Invalidate
Rectangle oldBounds = selectionGlyph.Bounds;
selectionGlyph.IsExpanded = true;
behaviorService.Invalidate(oldBounds);
behaviorService.Invalidate(selectionGlyph.Bounds);
//change Parent
ReParentControls(dragComps, e.Effect == DragDropEffects.Copy);
}
finally
{
root.ResumeLayout(true);
}
}
}
data.CleanupDrag();
}
else if (e.Data is DataObject && dragComps == null)
{
IToolboxService tbxService = (IToolboxService)serviceProvider.GetService(typeof(IToolboxService));
IDesignerHost host = serviceProvider.GetService(typeof(IDesignerHost)) as IDesignerHost;
if (tbxService != null && host != null)
{
ToolboxItem item = tbxService.DeserializeToolboxItem(e.Data, host);
if (item.GetType(host) == typeof(ToolStrip)
|| item.GetType(host) == typeof(MenuStrip)
|| item.GetType(host) == typeof(StatusStrip))
{
ToolStripPanelDesigner panelDesigner = host.GetDesigner(relatedControl) as ToolStripPanelDesigner;
if (panelDesigner != null)
{
OleDragDropHandler ddh = panelDesigner.GetOleDragHandler();
if (ddh != null)
{
ddh.CreateTool(item, relatedControl, 0, 0, 0, 0, false, false);
}
}
}
}
}
}
///
/// OnDragEnter can be overridden so that a Behavior can specify its own
/// Drag/Drop rules.
///
public override void OnDragEnter(Glyph g, DragEventArgs e)
{
e.Effect = DragComponentContainsToolStrip(e.Data as DropSourceBehavior.BehaviorDataObject) ? (Control.ModifierKeys == Keys.Control) ? DragDropEffects.Copy : DragDropEffects.Move : DragDropEffects.None;
}
///
/// OnDragEnter can be overridden so that a Behavior can specify its own
/// Drag/Drop rules.
///
public override void OnDragOver(Glyph g, DragEventArgs e)
{
e.Effect =DragComponentContainsToolStrip(e.Data as DropSourceBehavior.BehaviorDataObject) ? (Control.ModifierKeys == Keys.Control) ? DragDropEffects.Copy : DragDropEffects.Move : DragDropEffects.None ;
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- SchemaInfo.cs
- ErrorProvider.cs
- DateTimeConverter.cs
- HttpRequestCacheValidator.cs
- EmptyQuery.cs
- SectionInput.cs
- UMPAttributes.cs
- DefaultProxySection.cs
- SqlConnectionPoolProviderInfo.cs
- PersistChildrenAttribute.cs
- CloudCollection.cs
- WizardStepBase.cs
- NumericUpDownAcceleration.cs
- RepeaterItem.cs
- RecordsAffectedEventArgs.cs
- TemplateKey.cs
- RequestCache.cs
- EditorPart.cs
- EditCommandColumn.cs
- CollectionViewGroupInternal.cs
- SoapFault.cs
- EventHandlingScope.cs
- SmiEventSink_Default.cs
- ServiceModelSecurityTokenRequirement.cs
- ReferentialConstraintRoleElement.cs
- X509Utils.cs
- DeferredElementTreeState.cs
- OracleCommandSet.cs
- StateItem.cs
- StrokeSerializer.cs
- XmlMessageFormatter.cs
- ItemMap.cs
- HttpBindingExtension.cs
- CodeBlockBuilder.cs
- TextBoxView.cs
- CustomAttributeFormatException.cs
- ApplicationSecurityManager.cs
- EditorBrowsableAttribute.cs
- MetadataProperty.cs
- XmlMtomReader.cs
- MultilineStringConverter.cs
- BitHelper.cs
- Tokenizer.cs
- TextAnchor.cs
- IriParsingElement.cs
- ToolTipAutomationPeer.cs
- Select.cs
- ICspAsymmetricAlgorithm.cs
- HiddenField.cs
- EntityDataSourceSelectedEventArgs.cs
- Interfaces.cs
- GlyphTypeface.cs
- EntityException.cs
- SqlDataSourceCommandParser.cs
- EntityModelSchemaGenerator.cs
- PersistenceTask.cs
- ChannelOptions.cs
- RepeatButton.cs
- AppDomainResourcePerfCounters.cs
- DataGridHelper.cs
- LingerOption.cs
- BaseCAMarshaler.cs
- SQLByte.cs
- TemplateControlBuildProvider.cs
- CharacterBufferReference.cs
- BuildManagerHost.cs
- CompletedAsyncResult.cs
- SQLRoleProvider.cs
- FlatButtonAppearance.cs
- WindowsIPAddress.cs
- SafeCryptContextHandle.cs
- Funcletizer.cs
- LayoutInformation.cs
- unsafenativemethodsother.cs
- ImageCreator.cs
- StylusTouchDevice.cs
- Baml2006KnownTypes.cs
- DesignerView.Commands.cs
- DocumentOrderQuery.cs
- DateTimePicker.cs
- HitTestDrawingContextWalker.cs
- RunInstallerAttribute.cs
- CompiledScopeCriteria.cs
- ActivityBindForm.cs
- ConfigXmlElement.cs
- Privilege.cs
- WindowsIdentity.cs
- DrawingVisualDrawingContext.cs
- XXXInfos.cs
- CollectionTypeElement.cs
- SessionPageStateSection.cs
- HMAC.cs
- ControlAdapter.cs
- HtmlDocument.cs
- KeysConverter.cs
- DataObjectMethodAttribute.cs
- PropertyGrid.cs
- COMException.cs
- SymbolEqualComparer.cs
- XmlSerializerFactory.cs