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
- XmlAnyElementAttribute.cs
- FeatureSupport.cs
- XmlSortKey.cs
- smtpconnection.cs
- ProxyWebPartConnectionCollection.cs
- HashRepartitionEnumerator.cs
- DataListComponentEditor.cs
- InvokeWebServiceDesigner.cs
- TextElementEnumerator.cs
- ChildrenQuery.cs
- LocalizationComments.cs
- RootProfilePropertySettingsCollection.cs
- CodeAssignStatement.cs
- DoubleLink.cs
- TypedAsyncResult.cs
- PrivacyNoticeBindingElement.cs
- Matrix.cs
- StagingAreaInputItem.cs
- ProfileProvider.cs
- KnownTypes.cs
- InternalSafeNativeMethods.cs
- Utils.cs
- Group.cs
- ControlBindingsConverter.cs
- EmptyStringExpandableObjectConverter.cs
- Baml2006ReaderSettings.cs
- ApplicationServicesHostFactory.cs
- ParseElementCollection.cs
- HttpListenerResponse.cs
- RoleGroupCollection.cs
- ConfigsHelper.cs
- ProxyFragment.cs
- RunWorkerCompletedEventArgs.cs
- OptimalTextSource.cs
- MessageQueueTransaction.cs
- EventLogTraceListener.cs
- GeometryModel3D.cs
- EventData.cs
- XamlPoint3DCollectionSerializer.cs
- DragEventArgs.cs
- AnimationException.cs
- PointConverter.cs
- DesigntimeLicenseContext.cs
- NetTcpSecurityElement.cs
- Codec.cs
- BindingExpression.cs
- IncrementalReadDecoders.cs
- TagPrefixAttribute.cs
- AddInPipelineAttributes.cs
- XmlWrappingReader.cs
- ParallelTimeline.cs
- RowsCopiedEventArgs.cs
- ObjectReaderCompiler.cs
- PropertyTab.cs
- UIElementPropertyUndoUnit.cs
- SuppressIldasmAttribute.cs
- ClientSession.cs
- WpfMemberInvoker.cs
- SR.Designer.cs
- NativeMethods.cs
- rsa.cs
- RenderContext.cs
- EditorPartChrome.cs
- ValidationResult.cs
- KeyPressEvent.cs
- ProjectionPath.cs
- ModelItemExtensions.cs
- ContainerFilterService.cs
- CommentEmitter.cs
- DescendantOverDescendantQuery.cs
- TileBrush.cs
- Helpers.cs
- FixedTextBuilder.cs
- SoapTypeAttribute.cs
- DataContractSerializerOperationFormatter.cs
- SerializationInfoEnumerator.cs
- ValueTable.cs
- EventLogPermission.cs
- DecimalSumAggregationOperator.cs
- ReadWriteSpinLock.cs
- EncryptedKey.cs
- FieldToken.cs
- SafeFileHandle.cs
- ScriptResourceHandler.cs
- InputBuffer.cs
- ToolboxSnapDragDropEventArgs.cs
- PageAsyncTask.cs
- OperandQuery.cs
- DoubleLinkList.cs
- TextElementEnumerator.cs
- CompareValidator.cs
- EntityDataSourceContextCreatedEventArgs.cs
- BamlCollectionHolder.cs
- WebPartChrome.cs
- FontStyles.cs
- MethodImplAttribute.cs
- ThousandthOfEmRealDoubles.cs
- Tablet.cs
- SQLDateTime.cs
- SocketPermission.cs