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
- DataGridLinkButton.cs
- BuildProvidersCompiler.cs
- ArrayWithOffset.cs
- SatelliteContractVersionAttribute.cs
- Menu.cs
- UInt32Converter.cs
- Annotation.cs
- Compiler.cs
- FormView.cs
- SchemaDeclBase.cs
- CollectionChangedEventManager.cs
- PolyLineSegment.cs
- MetadataArtifactLoaderFile.cs
- ObjectReaderCompiler.cs
- Point4DValueSerializer.cs
- RawStylusActions.cs
- CorrelationManager.cs
- OpenTypeLayout.cs
- ContentElement.cs
- DbProviderServices.cs
- MemoryRecordBuffer.cs
- CodePageUtils.cs
- OpacityConverter.cs
- ListControl.cs
- ComboBoxItem.cs
- TextEffect.cs
- ViewStateException.cs
- TextTreeObjectNode.cs
- TemplatePagerField.cs
- ElementNotAvailableException.cs
- ProviderCommandInfoUtils.cs
- Attachment.cs
- DataGridToolTip.cs
- ConsumerConnectionPointCollection.cs
- ParameterCollection.cs
- ZipArchive.cs
- DefaultPerformanceCounters.cs
- WebUtil.cs
- MetricEntry.cs
- EventlogProvider.cs
- Int32Converter.cs
- IpcChannel.cs
- ListViewItem.cs
- DataSourceSerializationException.cs
- UrlMapping.cs
- DataRow.cs
- AssemblyContextControlItem.cs
- ScriptRegistrationManager.cs
- XmlException.cs
- DtdParser.cs
- XPathAncestorQuery.cs
- FormViewPagerRow.cs
- Events.cs
- DataControlField.cs
- XmlSchemaParticle.cs
- PeerPresenceInfo.cs
- CodeConditionStatement.cs
- SqlTriggerAttribute.cs
- RenderingEventArgs.cs
- ContractInferenceHelper.cs
- NeutralResourcesLanguageAttribute.cs
- RenderOptions.cs
- DbProviderManifest.cs
- Ray3DHitTestResult.cs
- Synchronization.cs
- SystemPens.cs
- DetailsViewActionList.cs
- Predicate.cs
- ToolStrip.cs
- ShaperBuffers.cs
- ObjectMemberMapping.cs
- SecurityContext.cs
- PermissionRequestEvidence.cs
- DataRowExtensions.cs
- GridItem.cs
- ComProxy.cs
- DirectoryGroupQuery.cs
- MergeLocalizationDirectives.cs
- FontStretch.cs
- Base64Stream.cs
- SSmlParser.cs
- CacheChildrenQuery.cs
- BitmapFrameDecode.cs
- KeyboardDevice.cs
- BasicHttpBindingCollectionElement.cs
- EntityDataSourceWrapperCollection.cs
- TriggerCollection.cs
- AstNode.cs
- SQLRoleProvider.cs
- PasswordBox.cs
- SerializationAttributes.cs
- OutputCacheSettingsSection.cs
- WeakEventTable.cs
- XsdDuration.cs
- _NestedMultipleAsyncResult.cs
- TypefaceCollection.cs
- LiteralControl.cs
- ExpressionLexer.cs
- DetailsViewUpdatedEventArgs.cs
- MdbDataFileEditor.cs