Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / WF / Common / AuthoringOM / Design / MessageFilters / ResizingMessageFilter.cs / 1305376 / ResizingMessageFilter.cs
using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Collections;
using System.Drawing;
using System.Workflow.ComponentModel;
using System.Workflow.ComponentModel.Design;
using System.Windows.Forms;
using System.Diagnostics;
namespace System.Workflow.ComponentModel.Design
{
internal sealed class ResizingMessageFilter : WorkflowDesignerMessageFilter
{
private DesignerTransaction designerTransaction;
private ActivityDesigner designerToResize = null;
private DesignerEdges designerSizingEdge = DesignerEdges.None;
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
}
protected override bool OnMouseDown(MouseEventArgs eventArgs)
{
if (eventArgs.Button == MouseButtons.Left)
{
WorkflowView workflowView = ParentView;
if (workflowView == null)
throw new InvalidOperationException(DR.GetString(DR.WorkflowViewNull));
Point clientPoint = new Point(eventArgs.X, eventArgs.Y);
Point logicalPoint = workflowView.ClientPointToLogical(clientPoint);
DesignerEdges sizingEdge = DesignerEdges.None;
ActivityDesigner designer = GetDesignerToResize(logicalPoint, out sizingEdge);
if (designer != null && sizingEdge != DesignerEdges.None && CanResizeDesigner(designer))
SetResizableDesigner(designer, sizingEdge);
}
return (this.designerToResize != null);
}
protected override bool OnMouseMove(MouseEventArgs eventArgs)
{
WorkflowView workflowView = ParentView;
if (workflowView == null)
throw new InvalidOperationException(DR.GetString(DR.WorkflowViewNull));
bool handledMessage = false;
Point clientPoint = new Point(eventArgs.X, eventArgs.Y);
Point logicalPoint = workflowView.ClientPointToLogical(clientPoint);
DesignerEdges sizingEdge = DesignerEdges.None;
if (this.designerToResize != null)
{
sizingEdge = this.designerSizingEdge;
UpdateDesignerSize(logicalPoint, this.designerToResize, this.designerSizingEdge);
handledMessage = true;
}
else if (eventArgs.Button == MouseButtons.None)
{
ActivityDesigner designer = GetDesignerToResize(logicalPoint, out sizingEdge);
if (designer != null && sizingEdge != DesignerEdges.None && CanResizeDesigner(designer))
handledMessage = true;
}
UpdateCursor(sizingEdge);
return handledMessage;
}
protected override bool OnMouseUp(MouseEventArgs eventArgs)
{
if (this.designerToResize != null && eventArgs.Button == MouseButtons.Left)
{
WorkflowView workflowView = ParentView;
if (workflowView == null)
throw new InvalidOperationException(DR.GetString(DR.WorkflowViewNull));
UpdateDesignerSize(workflowView.ClientPointToLogical(new Point(eventArgs.X, eventArgs.Y)), this.designerToResize, this.designerSizingEdge);
}
SetResizableDesigner(null, DesignerEdges.None);
return false;
}
protected override bool OnMouseLeave()
{
if (this.designerToResize != null)
SetResizableDesigner(null, DesignerEdges.None);
else
UpdateCursor(DesignerEdges.None);
return false;
}
protected override bool OnKeyDown(KeyEventArgs eventArgs)
{
if (eventArgs.KeyValue == (int)Keys.Escape && this.designerToResize != null)
{
SetResizableDesigner(null, DesignerEdges.None);
return true;
}
else
{
return false;
}
}
protected override bool OnMouseCaptureChanged()
{
if (this.designerToResize != null)
SetResizableDesigner(null, DesignerEdges.None);
return false;
}
private void UpdateCursor(DesignerEdges sizingEdge)
{
WorkflowView workflowView = ParentView;
if (workflowView == null)
throw new InvalidOperationException(DR.GetString(DR.WorkflowViewNull));
Cursor cursorToSet = workflowView.Cursor;
if (((sizingEdge & DesignerEdges.Left) > 0 && (sizingEdge & DesignerEdges.Top) > 0) ||
((sizingEdge & DesignerEdges.Right) > 0 && (sizingEdge & DesignerEdges.Bottom) > 0))
{
cursorToSet = Cursors.SizeNWSE;
}
else if (((sizingEdge & DesignerEdges.Right) > 0 && (sizingEdge & DesignerEdges.Top) > 0) ||
((sizingEdge & DesignerEdges.Left) > 0 && (sizingEdge & DesignerEdges.Bottom) > 0))
{
cursorToSet = Cursors.SizeNESW;
}
else if ((sizingEdge & DesignerEdges.Top) > 0 || (sizingEdge & DesignerEdges.Bottom) > 0)
{
cursorToSet = Cursors.SizeNS;
}
else if ((sizingEdge & DesignerEdges.Left) > 0 || (sizingEdge & DesignerEdges.Right) > 0)
{
cursorToSet = Cursors.SizeWE;
}
else if (sizingEdge == DesignerEdges.None &&
(workflowView.Cursor == Cursors.SizeNWSE || workflowView.Cursor == Cursors.SizeNESW ||
workflowView.Cursor == Cursors.SizeNS || workflowView.Cursor == Cursors.SizeWE))
{
cursorToSet = Cursors.Default;
}
if (workflowView.Cursor != cursorToSet)
workflowView.Cursor = cursorToSet;
}
private ActivityDesigner GetDesignerToResize(Point point, out DesignerEdges sizingEdge)
{
ActivityDesigner designerToResize = null;
sizingEdge = DesignerEdges.None;
ISelectionService selectionService = GetService(typeof(ISelectionService)) as ISelectionService;
if (selectionService != null)
{
ArrayList selectedComponents = new ArrayList(selectionService.GetSelectedComponents());
for (int i = 0; i < selectedComponents.Count && designerToResize == null; i++)
{
Activity activity = selectedComponents[i] as Activity;
if (activity != null)
{
ActivityDesigner potentialResizableDesigner = ActivityDesigner.GetDesigner(activity);
if (potentialResizableDesigner != null)
{
SelectionGlyph selectionGlyph = potentialResizableDesigner.Glyphs[typeof(SelectionGlyph)] as SelectionGlyph;
if (selectionGlyph != null)
{
foreach (Rectangle grabHandle in selectionGlyph.GetGrabHandles(potentialResizableDesigner))
{
if (grabHandle.Contains(point))
{
designerToResize = potentialResizableDesigner;
sizingEdge = GetSizingEdge(designerToResize, point);
break;
}
}
}
}
}
}
}
return designerToResize;
}
private DesignerEdges GetSizingEdge(ActivityDesigner designer, Point point)
{
DesignerEdges sizingEdge = DesignerEdges.None;
Size selectionSize = WorkflowTheme.CurrentTheme.AmbientTheme.SelectionSize;
Rectangle designerBounds = designer.Bounds;
if (Math.Floor(DesignerGeometryHelper.DistanceFromPointToLineSegment(point, new Point[] { new Point(designerBounds.Left, designerBounds.Top), new Point(designerBounds.Left, designerBounds.Bottom) })) <= selectionSize.Width + 1)
sizingEdge |= DesignerEdges.Left;
if (Math.Floor(DesignerGeometryHelper.DistanceFromPointToLineSegment(point, new Point[] { new Point(designerBounds.Left, designerBounds.Top), new Point(designerBounds.Right, designerBounds.Top) })) <= selectionSize.Height + 1)
sizingEdge |= DesignerEdges.Top;
if (Math.Floor(DesignerGeometryHelper.DistanceFromPointToLineSegment(point, new Point[] { new Point(designerBounds.Right, designerBounds.Top), new Point(designerBounds.Right, designerBounds.Bottom) })) <= selectionSize.Width + 1)
sizingEdge |= DesignerEdges.Right;
if (Math.Floor(DesignerGeometryHelper.DistanceFromPointToLineSegment(point, new Point[] { new Point(designerBounds.Left, designerBounds.Bottom), new Point(designerBounds.Right, designerBounds.Bottom) })) <= selectionSize.Height + 1)
sizingEdge |= DesignerEdges.Bottom;
return sizingEdge;
}
private bool CanResizeDesigner(ActivityDesigner designer)
{
if (!designer.EnableVisualResizing)
return false;
if (designer.ParentDesigner != null)
{
FreeformActivityDesigner freeFormDesigner = designer.ParentDesigner as FreeformActivityDesigner;
if (freeFormDesigner != null)
return freeFormDesigner.CanResizeContainedDesigner(designer);
else
return false;
}
return true;
}
private void SetResizableDesigner(ActivityDesigner designer, DesignerEdges sizingEdge)
{
if (this.designerToResize == designer)
return;
if (designer != null && !CanResizeDesigner(designer))
{
Debug.Assert(false);
return;
}
WorkflowView workflowView = ParentView;
if (workflowView == null)
throw new InvalidOperationException(DR.GetString(DR.WorkflowViewNull));
if (designer != null)
{
if (this.designerTransaction != null)
this.designerTransaction.Cancel();
IDesignerHost designerHost = GetService(typeof(IDesignerHost)) as IDesignerHost;
if (designerHost != null)
this.designerTransaction = designerHost.CreateTransaction(DR.GetString(DR.ResizeUndoDescription, designer.Text));
((IWorkflowDesignerMessageSink)designer).OnBeginResizing(sizingEdge);
}
else
{
if (this.designerTransaction != null)
{
this.designerTransaction.Commit();
this.designerTransaction = null;
}
((IWorkflowDesignerMessageSink)this.designerToResize).OnEndResizing();
}
this.designerToResize = designer;
this.designerSizingEdge = sizingEdge;
workflowView.Capture = (this.designerToResize != null);
UpdateCursor(this.designerSizingEdge);
}
private void UpdateDesignerSize(Point point, ActivityDesigner designerToSize, DesignerEdges sizingEdge)
{
WorkflowView workflowView = ParentView;
if (workflowView == null)
throw new InvalidOperationException(DR.GetString(DR.WorkflowViewNull));
Rectangle clipBounds = Rectangle.Empty;
if (designerToSize.ParentDesigner != null)
{
clipBounds = designerToSize.ParentDesigner.Bounds;
Size selectionSize = WorkflowTheme.CurrentTheme.AmbientTheme.SelectionSize;
clipBounds.Inflate(-2 * selectionSize.Width, -2 * selectionSize.Height);
}
Rectangle designerBounds = designerToSize.Bounds;
if ((sizingEdge & DesignerEdges.Left) > 0)
{
int x = point.X;
if (!clipBounds.IsEmpty)
x = Math.Max(x, clipBounds.X);
x = DesignerHelpers.SnapToGrid(new Point(x, 0)).X;
designerBounds.Width += (designerBounds.Left - x);
int delta = (designerBounds.Width < designerToSize.MinimumSize.Width) ? designerBounds.Width - designerToSize.MinimumSize.Width : 0;
designerBounds.X = x + delta;
}
if ((sizingEdge & DesignerEdges.Top) > 0)
{
int y = point.Y;
if (!clipBounds.IsEmpty)
y = Math.Max(y, clipBounds.Y);
y = DesignerHelpers.SnapToGrid(new Point(0, y)).Y;
designerBounds.Height += (designerBounds.Top - y);
int delta = (designerBounds.Height < designerToSize.MinimumSize.Height) ? designerBounds.Height - designerToSize.MinimumSize.Height : 0;
designerBounds.Y = y + delta;
}
if ((sizingEdge & DesignerEdges.Right) > 0)
designerBounds.Width += (point.X - designerBounds.Right);
if ((sizingEdge & DesignerEdges.Bottom) > 0)
designerBounds.Height += (point.Y - designerBounds.Bottom);
//Clip to lower bounds and upper bounds
designerBounds.Width = Math.Max(designerBounds.Width, designerToSize.MinimumSize.Width);
designerBounds.Height = Math.Max(designerBounds.Height, designerToSize.MinimumSize.Height);
if (!clipBounds.IsEmpty)
designerBounds = Rectangle.Intersect(designerBounds, clipBounds);
((IWorkflowDesignerMessageSink)designerToSize).OnResizing(sizingEdge, designerBounds);
}
}
}
// 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
- ExceptionTrace.cs
- BaseTransportHeaders.cs
- PrePrepareMethodAttribute.cs
- LicFileLicenseProvider.cs
- KeyInstance.cs
- DependsOnAttribute.cs
- DataRecord.cs
- InitializeCorrelation.cs
- AssemblyBuilder.cs
- QilInvoke.cs
- QilTernary.cs
- Internal.cs
- NameValueSectionHandler.cs
- TraceSection.cs
- SpinWait.cs
- OrderedHashRepartitionStream.cs
- SchemaEntity.cs
- Types.cs
- StrongNameKeyPair.cs
- XPathNodeIterator.cs
- SubMenuStyleCollection.cs
- DrawingBrush.cs
- QuestionEventArgs.cs
- CodeNamespaceImport.cs
- PointHitTestParameters.cs
- UnsafeMethods.cs
- XMLDiffLoader.cs
- SharedUtils.cs
- PropertyEmitterBase.cs
- DataTemplate.cs
- XmlSchemaRedefine.cs
- DoubleAnimationUsingKeyFrames.cs
- DiscoveryVersionConverter.cs
- MD5CryptoServiceProvider.cs
- TextSchema.cs
- AccessViolationException.cs
- OdbcDataReader.cs
- ClientBuildManagerCallback.cs
- OdbcDataReader.cs
- MachineSettingsSection.cs
- DependentList.cs
- SingleConverter.cs
- ErrorFormatterPage.cs
- DecoderExceptionFallback.cs
- RelationshipDetailsCollection.cs
- GenericsNotImplementedException.cs
- SerializationInfo.cs
- WeakHashtable.cs
- ImageSourceConverter.cs
- CheckedPointers.cs
- HttpUnhandledOperationInvoker.cs
- ConsumerConnectionPointCollection.cs
- SecurityKeyIdentifierClause.cs
- ItemsPresenter.cs
- ReferenceConverter.cs
- ArrayList.cs
- Header.cs
- XmlSchemaNotation.cs
- HttpHeaderCollection.cs
- ControlBindingsCollection.cs
- KeyManager.cs
- ExpressionBinding.cs
- FrugalList.cs
- HtmlLink.cs
- ByteStorage.cs
- BindingSourceDesigner.cs
- Debugger.cs
- DurationConverter.cs
- DirectoryNotFoundException.cs
- VisualTransition.cs
- GridViewDeleteEventArgs.cs
- SignatureHelper.cs
- Knowncolors.cs
- LocatorGroup.cs
- SerializableAttribute.cs
- SHA384Cng.cs
- _RequestCacheProtocol.cs
- FileDialog.cs
- LinkArea.cs
- TypedColumnHandler.cs
- ActivationArguments.cs
- StylusOverProperty.cs
- CheckBoxList.cs
- Timer.cs
- StickyNote.cs
- LinqDataSourceValidationException.cs
- SearchForVirtualItemEventArgs.cs
- SubtreeProcessor.cs
- BackStopAuthenticationModule.cs
- ComplexType.cs
- FontUnitConverter.cs
- ObjectQueryExecutionPlan.cs
- AttributeProviderAttribute.cs
- OrderedDictionaryStateHelper.cs
- SslStream.cs
- ImpersonationContext.cs
- CapabilitiesRule.cs
- KeyManager.cs
- ListCommandEventArgs.cs
- BamlReader.cs