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
- PresentationTraceSources.cs
- InsufficientExecutionStackException.cs
- shaperfactoryquerycacheentry.cs
- ProfileInfo.cs
- AppendHelper.cs
- ResourceDictionary.cs
- PageThemeBuildProvider.cs
- ReadOnlyCollectionBase.cs
- ProtocolsConfiguration.cs
- StringFunctions.cs
- ModifyActivitiesPropertyDescriptor.cs
- SiteMapProvider.cs
- DbgCompiler.cs
- DependencyObjectProvider.cs
- Bits.cs
- FixedHighlight.cs
- DataFormats.cs
- X509Chain.cs
- Mutex.cs
- FamilyTypefaceCollection.cs
- TrustManagerPromptUI.cs
- WinHttpWebProxyFinder.cs
- AbsoluteQuery.cs
- XmlTextWriter.cs
- ConnectionProviderAttribute.cs
- AmbiguousMatchException.cs
- DataGridViewColumnConverter.cs
- LinkedResource.cs
- RowToFieldTransformer.cs
- CryptoStream.cs
- RequestNavigateEventArgs.cs
- ParamArrayAttribute.cs
- RSAPKCS1KeyExchangeDeformatter.cs
- Publisher.cs
- DeflateEmulationStream.cs
- SliderAutomationPeer.cs
- EncodingStreamWrapper.cs
- XamlPathDataSerializer.cs
- TemplateParser.cs
- EntityTypeEmitter.cs
- DurableInstanceProvider.cs
- XmlBinaryReader.cs
- BitmapFrame.cs
- HttpRawResponse.cs
- TabPanel.cs
- SizeAnimation.cs
- QueryContext.cs
- FixedTextView.cs
- InstanceDataCollection.cs
- HelpFileFileNameEditor.cs
- IndexingContentUnit.cs
- Attributes.cs
- Asn1IntegerConverter.cs
- IdnMapping.cs
- AggregateNode.cs
- QueryAccessibilityHelpEvent.cs
- ThrowHelper.cs
- EntityDataSourceContainerNameItem.cs
- TemplatingOptionsDialog.cs
- MarkupCompilePass1.cs
- SafeHandles.cs
- Matrix.cs
- PlatformNotSupportedException.cs
- NonVisualControlAttribute.cs
- CriticalFinalizerObject.cs
- X509Extension.cs
- PolyBezierSegmentFigureLogic.cs
- UniformGrid.cs
- hresults.cs
- DataGridViewCellValidatingEventArgs.cs
- ModelTreeEnumerator.cs
- PropertyChangingEventArgs.cs
- ClaimTypes.cs
- CustomTypeDescriptor.cs
- ListChunk.cs
- DataTable.cs
- HttpClientProtocol.cs
- SaveFileDialog.cs
- SectionInformation.cs
- XmlHelper.cs
- WebEventTraceProvider.cs
- DirectoryGroupQuery.cs
- CustomPopupPlacement.cs
- Attachment.cs
- jithelpers.cs
- XPathNavigatorKeyComparer.cs
- TrackingStringDictionary.cs
- ComboBox.cs
- XmlSchemaComplexContentExtension.cs
- StateFinalizationDesigner.cs
- WebCodeGenerator.cs
- MouseEvent.cs
- SqlStatistics.cs
- SchemaTypeEmitter.cs
- ListViewHitTestInfo.cs
- XmlMembersMapping.cs
- SaveFileDialog.cs
- HelpEvent.cs
- ClrProviderManifest.cs
- ImageIndexConverter.cs