Code:
/ DotNET / DotNET / 8.0 / untmp / WIN_WINDOWS / lh_tools_devdiv_wpf / Windows / wcp / Framework / MS / Internal / Ink / SelectionEditingBehavior.cs / 1 / SelectionEditingBehavior.cs
//---------------------------------------------------------------------------- // // File: ResizeEditingBehavior .cs // // Description: // ResizeEditingBehavior // // Authors: [....] // // Copyright (C) 2003 by Microsoft Corporation. All rights reserved. // //--------------------------------------------------------------------------- using System; using System.Diagnostics; using System.ComponentModel; using System.ComponentModel.Design; using System.Collections; using System.Collections.Generic; using System.Windows.Input; using System.Windows; using System.Windows.Controls; using System.Windows.Controls.Primitives; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Interop; using System.Windows.Navigation; using System.Windows.Media; using System.Windows.Ink; namespace MS.Internal.Ink { ////// SelectionEditingBehavior /// internal sealed class SelectionEditingBehavior : EditingBehavior { //------------------------------------------------------------------------------- // // Constructors // //------------------------------------------------------------------------------- #region Constructors ////// SelectionEditingBehavior constructor /// internal SelectionEditingBehavior(EditingCoordinator editingCoordinator, InkCanvas inkCanvas) : base(editingCoordinator, inkCanvas) { } #endregion Constructors //-------------------------------------------------------------------------------- // // Protected Methods // //------------------------------------------------------------------------------- #region Protected Methods ////// Attaching to the element, we get attached in StylusDown /// protected override void OnActivate() { _actionStarted = false; // Capture the mouse. InitializeCapture(); // Hittest for the grab handle MouseDevice mouse = Mouse.PrimaryDevice; _hitResult = InkCanvas.SelectionAdorner.SelectionHandleHitTest( mouse.GetPosition((IInputElement)(InkCanvas.SelectionAdorner))); Debug.Assert(_hitResult != InkCanvasSelectionHitResult.None); EditingCoordinator.InvalidateBehaviorCursor(this); // Get the current selection bounds. _selectionRect = InkCanvas.GetSelectionBounds( ); // Set the initial tracking position and rectangle _previousLocation = mouse.GetPosition(InkCanvas.SelectionAdorner); _previousRect = _selectionRect; // Start the feedback rubber band. InkCanvas.InkCanvasSelection.StartFeedbackAdorner(_selectionRect, _hitResult); // Add handlers to the mouse events. InkCanvas.SelectionAdorner.AddHandler(Mouse.MouseUpEvent, new MouseButtonEventHandler(OnMouseUp)); InkCanvas.SelectionAdorner.AddHandler(Mouse.MouseMoveEvent, new MouseEventHandler(OnMouseMove)); InkCanvas.SelectionAdorner.AddHandler(UIElement.LostMouseCaptureEvent, new MouseEventHandler(OnLostMouseCapture)); } ////// Called when the ResizeEditingBehavior is detached /// protected override void OnDeactivate() { // Remove the mouse event handlers. InkCanvas.SelectionAdorner.RemoveHandler(Mouse.MouseUpEvent, new MouseButtonEventHandler(OnMouseUp)); InkCanvas.SelectionAdorner.RemoveHandler(Mouse.MouseMoveEvent, new MouseEventHandler(OnMouseMove)); InkCanvas.SelectionAdorner.RemoveHandler(UIElement.LostMouseCaptureEvent, new MouseEventHandler(OnLostMouseCapture)); } protected override void OnCommit(bool commit) { // Release the inputs. ReleaseCapture(true, commit); } protected override Cursor GetCurrentCursor() { return PenCursorManager.GetSelectionCursor(_hitResult, (this.InkCanvas.FlowDirection == FlowDirection.RightToLeft)); } #endregion Protected Methods //-------------------------------------------------------------------------------- // // Private Methods // //-------------------------------------------------------------------------------- #region Private Methods ////// The handler of the MouseMove event /// /// /// private void OnMouseMove(object sender, MouseEventArgs args) { // Get the current mouse location. Point curPoint = args.GetPosition(InkCanvas.SelectionAdorner); // Check if we have a mouse movement at all. if ( !DoubleUtil.AreClose(curPoint.X, _previousLocation.X) || !DoubleUtil.AreClose(curPoint.Y, _previousLocation.Y) ) { // We won't start the move until we really see a movement. if ( !_actionStarted ) { _actionStarted = true; } // Get the new rectangle Rect newRect = ChangeFeedbackRectangle(curPoint); // Update the feedback rubber band and record the current tracking rectangle. InkCanvas.InkCanvasSelection.UpdateFeedbackAdorner(newRect); _previousRect = newRect; } } ////// The handler of the MouseUp event /// /// /// private void OnMouseUp(object sender, MouseButtonEventArgs args) { // We won't start the move until we really see a movement. if ( _actionStarted ) { _previousRect = ChangeFeedbackRectangle(args.GetPosition(InkCanvas.SelectionAdorner)); } Commit(true); } ////// InkCanvas.LostStylusCapture handler /// /// /// private void OnLostMouseCapture(object sender, MouseEventArgs args) { // If user is editing, we have to commit the current operation and reset our state. if ( EditingCoordinator.UserIsEditing ) { ReleaseCapture(false, true); } } ////// Get the new feedback rectangle based on the location /// /// private Rect ChangeFeedbackRectangle(Point newPoint) { // First check to make sure that we are not going past the zero point on // the original element in which we hit the resize handle. // If moving the left side -- don't go past the right side. if ( _hitResult == InkCanvasSelectionHitResult.TopLeft || _hitResult == InkCanvasSelectionHitResult.BottomLeft || _hitResult == InkCanvasSelectionHitResult.Left ) { if ( newPoint.X > _selectionRect.Right - MinimumHeightWidthSize ) { newPoint.X = _selectionRect.Right - MinimumHeightWidthSize; } } // If moving the right side -- don't go past the left side. if ( _hitResult == InkCanvasSelectionHitResult.TopRight || _hitResult == InkCanvasSelectionHitResult.BottomRight || _hitResult == InkCanvasSelectionHitResult.Right ) { if ( newPoint.X < _selectionRect.Left + MinimumHeightWidthSize ) { newPoint.X = _selectionRect.Left + MinimumHeightWidthSize; } } // If moving the top side -- don't go past the bottom side. if ( _hitResult == InkCanvasSelectionHitResult.TopLeft || _hitResult == InkCanvasSelectionHitResult.TopRight || _hitResult == InkCanvasSelectionHitResult.Top ) { if ( newPoint.Y > _selectionRect.Bottom - MinimumHeightWidthSize ) { newPoint.Y = _selectionRect.Bottom - MinimumHeightWidthSize; } } // If moving the bottom side -- don't go past the top side. if ( _hitResult == InkCanvasSelectionHitResult.BottomLeft || _hitResult == InkCanvasSelectionHitResult.BottomRight || _hitResult == InkCanvasSelectionHitResult.Bottom ) { if ( newPoint.Y < _selectionRect.Top + MinimumHeightWidthSize ) { newPoint.Y = _selectionRect.Top + MinimumHeightWidthSize; } } // Get the new boundary of the selection Rect newRect = CalculateRect(newPoint.X - _previousLocation.X, newPoint.Y - _previousLocation.Y); // Depends on the current grab handle, we record the tracking position accordingly. if ( _hitResult == InkCanvasSelectionHitResult.BottomRight || _hitResult == InkCanvasSelectionHitResult.BottomLeft || _hitResult == InkCanvasSelectionHitResult.TopRight || _hitResult == InkCanvasSelectionHitResult.TopLeft || _hitResult == InkCanvasSelectionHitResult.Selection ) { _previousLocation.X = newPoint.X; _previousLocation.Y = newPoint.Y; } else if ( _hitResult == InkCanvasSelectionHitResult.Left || _hitResult == InkCanvasSelectionHitResult.Right ) { _previousLocation.X = newPoint.X; } else if ( _hitResult == InkCanvasSelectionHitResult.Top || _hitResult == InkCanvasSelectionHitResult.Bottom ) { _previousLocation.Y = newPoint.Y; } return newRect; } ////// Resize a given element based on the grab handle /// /// /// private Rect CalculateRect(double x, double y) { Rect newRect = _previousRect; switch ( _hitResult ) { case InkCanvasSelectionHitResult.BottomRight: { newRect = ExtendSelectionRight(newRect, x); newRect = ExtendSelectionBottom(newRect, y); break; } case InkCanvasSelectionHitResult.Bottom: { newRect = ExtendSelectionBottom(newRect, y); break; } case InkCanvasSelectionHitResult.BottomLeft: { newRect = ExtendSelectionLeft(newRect, x); newRect = ExtendSelectionBottom(newRect, y); break; } case InkCanvasSelectionHitResult.TopRight: { newRect = ExtendSelectionTop(newRect, y); newRect = ExtendSelectionRight(newRect, x); break; } case InkCanvasSelectionHitResult.Top: { newRect = ExtendSelectionTop(newRect, y); break; } case InkCanvasSelectionHitResult.TopLeft: { newRect = ExtendSelectionTop(newRect, y); newRect = ExtendSelectionLeft(newRect, x); break; } case InkCanvasSelectionHitResult.Left: { newRect = ExtendSelectionLeft(newRect, x); break; } case InkCanvasSelectionHitResult.Right: { newRect = ExtendSelectionRight(newRect, x); break; } case InkCanvasSelectionHitResult.Selection: { // Translate the rectangle newRect.Offset(x, y); break; } default: { Debug.Assert(false); break; } } return newRect; } // ExtendSelectionLeft private static Rect ExtendSelectionLeft(Rect rect, double extendBy) { Rect newRect = rect; newRect.X += extendBy; newRect.Width -= extendBy; return newRect; } // ExtendSelectionTop private static Rect ExtendSelectionTop(Rect rect, double extendBy) { Rect newRect = rect; newRect.Y += extendBy; newRect.Height -= extendBy; return newRect; } // ExtendSelectionRight private static Rect ExtendSelectionRight(Rect rect, double extendBy) { Rect newRect = rect; newRect.Width += extendBy; return newRect; } // ExtendSelectionBottom private static Rect ExtendSelectionBottom(Rect rect, double extendBy) { Rect newRect = rect; newRect.Height += extendBy; return newRect; } ////// Capture Mouse /// private void InitializeCapture() { Debug.Assert(EditingCoordinator.UserIsEditing == false, "Unexpect UserIsEditng state." ); EditingCoordinator.UserIsEditing = true; InkCanvas.SelectionAdorner.CaptureMouse(); } ////// Release Mouse capture /// /// /// private void ReleaseCapture(bool releaseDevice, bool commit) { if ( EditingCoordinator.UserIsEditing ) { EditingCoordinator.UserIsEditing = false; if ( releaseDevice ) { InkCanvas.SelectionAdorner.ReleaseMouseCapture(); } SelfDeactivate(); // End the rubber band. If the operation is committed, we set the selection to the tracking rectangle. // Otherwise, reset the selection to the original bounds. InkCanvas.InkCanvasSelection.EndFeedbackAdorner(commit ? _previousRect : _selectionRect); } } #endregion Private Methods //------------------------------------------------------------------------------- // // Private Fields // //-------------------------------------------------------------------------------- #region Private Fields private const double MinimumHeightWidthSize = 16.0; private Point _previousLocation; private Rect _previousRect; private Rect _selectionRect; private InkCanvasSelectionHitResult _hitResult; private bool _actionStarted = false; #endregion Private Fields } } // 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
- WebSysDescriptionAttribute.cs
- WebBrowsableAttribute.cs
- DiscreteKeyFrames.cs
- List.cs
- OdbcPermission.cs
- IriParsingElement.cs
- ScriptingScriptResourceHandlerSection.cs
- BookmarkNameHelper.cs
- CallbackHandler.cs
- ReadOnlyCollection.cs
- EndpointDiscoveryBehavior.cs
- DiscoveryInnerClientAdhocCD1.cs
- ComNativeDescriptor.cs
- SequentialUshortCollection.cs
- ResolveCriteriaApril2005.cs
- CultureInfo.cs
- filewebresponse.cs
- COM2Properties.cs
- XmlNullResolver.cs
- ConfigXmlAttribute.cs
- RotationValidation.cs
- SubpageParaClient.cs
- TagMapInfo.cs
- LinkedList.cs
- PolyBezierSegment.cs
- SRGSCompiler.cs
- TypedReference.cs
- ExpressionBinding.cs
- XomlCompilerParameters.cs
- FrameworkElement.cs
- Method.cs
- EncoderReplacementFallback.cs
- InstancePersistenceContext.cs
- LogReservationCollection.cs
- Rules.cs
- DataObject.cs
- SQLStringStorage.cs
- XmlNodeChangedEventArgs.cs
- FileIOPermission.cs
- DataFormat.cs
- SelectionEditingBehavior.cs
- DesignTimeType.cs
- ConfigXmlWhitespace.cs
- ContextStaticAttribute.cs
- CryptoApi.cs
- SequentialOutput.cs
- PropertyEntry.cs
- MimeFormImporter.cs
- StorageMappingFragment.cs
- XmlCodeExporter.cs
- RtfFormatStack.cs
- QueryMatcher.cs
- HttpCacheVaryByContentEncodings.cs
- WinFormsSecurity.cs
- WebEvents.cs
- XmlAtomErrorReader.cs
- EDesignUtil.cs
- ListViewGroupItemCollection.cs
- MsmqInputSessionChannelListener.cs
- InputReportEventArgs.cs
- ProcessHostConfigUtils.cs
- WindowVisualStateTracker.cs
- StorageBasedPackageProperties.cs
- BrowserDefinitionCollection.cs
- ErrorsHelper.cs
- PatternMatchRules.cs
- EmbeddedMailObject.cs
- _TLSstream.cs
- XmlTextAttribute.cs
- MdbDataFileEditor.cs
- QilUnary.cs
- DesignTimeData.cs
- ExceptionCollection.cs
- DeflateStream.cs
- ResourceBinder.cs
- CellTreeNode.cs
- WebPartActionVerb.cs
- SafeFileMapViewHandle.cs
- DynamicRendererThreadManager.cs
- KeySpline.cs
- EntityDataSourceValidationException.cs
- SystemFonts.cs
- Assembly.cs
- SafeBuffer.cs
- IncomingWebRequestContext.cs
- WmlPageAdapter.cs
- PassportAuthentication.cs
- IsolatedStorageFilePermission.cs
- GridLengthConverter.cs
- ParallelTimeline.cs
- ScrollContentPresenter.cs
- securitycriticaldataClass.cs
- AuthenticatedStream.cs
- DebugHandleTracker.cs
- GridView.cs
- JpegBitmapDecoder.cs
- SqlServer2KCompatibilityAnnotation.cs
- CodeMemberEvent.cs
- ParagraphVisual.cs
- UmAlQuraCalendar.cs