Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / wpf / src / Framework / MS / Internal / documents / DocumentGridContextMenu.cs / 1305600 / DocumentGridContextMenu.cs
//---------------------------------------------------------------------------- // // File: DocumentGridContextMenu.cs // // Copyright (C) Microsoft Corporation. All rights reserved. // // Description: Context menu for DocumentGrid // //--------------------------------------------------------------------------- namespace MS.Internal.Documents { using MS.Internal; using System.Windows; using System.Windows.Controls; using System.Windows.Controls.Primitives; using System.Windows.Input; using System.Windows.Media; using System.Windows.Threading; using System.Runtime.InteropServices; using System.Security; using MS.Internal.Documents; using System.Security.Permissions; using MS.Win32; using System.Windows.Interop; // A Component of DocumentViewer supporting the default ContextMenu. internal static class DocumentGridContextMenu { //----------------------------------------------------- // // Class Internal Methods // //----------------------------------------------------- #region Class Internal Methods // Registers the event handler for DocumentGrid. ////// Critical: This code hooks up a call back to context menu opening event which has the ability to spoof copy /// TreatAsSafe: This code does not expose the callback and does not drive any input into it /// [SecurityCritical,SecurityTreatAsSafe] internal static void RegisterClassHandler() { EventManager.RegisterClassHandler(typeof(DocumentGrid), FrameworkElement.ContextMenuOpeningEvent, new ContextMenuEventHandler(OnContextMenuOpening)); EventManager.RegisterClassHandler(typeof(DocumentApplicationDocumentViewer), FrameworkElement.ContextMenuOpeningEvent, new ContextMenuEventHandler(OnDocumentViewerContextMenuOpening)); } #endregion Class Internal Methods //------------------------------------------------------ // // Private Methods // //----------------------------------------------------- #region Private Methods ////// Callback for FrameworkElement.ContextMenuOpeningEvent, when fired from DocumentViewer. This is /// here to catch the event when it is fired by the keyboard rather than the mouse. /// ////// Critical - forwards user-initiated information to OnContextMenuOpening, which is also SecurityCritical /// [SecurityCritical] private static void OnDocumentViewerContextMenuOpening(object sender, ContextMenuEventArgs e) { if (e.CursorLeft == KeyboardInvokedSentinel) { DocumentViewer dv = sender as DocumentViewer; if (dv != null && dv.ScrollViewer != null) { OnContextMenuOpening(dv.ScrollViewer.Content, e); } } } // Callback for FrameworkElement.ContextMenuOpeningEvent. // If the control is using the default ContextMenu, we initialize it // here. ////// Critical - accepts a parameter which may be used to set the userInitiated /// bit on a command, which is used for security purposes later. /// [SecurityCritical] private static void OnContextMenuOpening(object sender, ContextMenuEventArgs e) { DocumentGrid documentGrid = sender as DocumentGrid; ContextMenu contextMenu; if (documentGrid == null) { return; } // We only want to programmatically generate the menu for Mongoose if (!(documentGrid.DocumentViewerOwner is DocumentApplicationDocumentViewer)) return; // If the DocumentViewer or ScrollViewer has a ContextMenu set, the DocumentGrid menu should be ignored if (documentGrid.DocumentViewerOwner.ContextMenu != null || documentGrid.DocumentViewerOwner.ScrollViewer.ContextMenu != null) return; // Start by grabbing whatever's set to the UiScope's ContextMenu property. contextMenu = documentGrid.ContextMenu; // If someone explicitly set it null -- don't mess with it. if (documentGrid.ReadLocalValue(FrameworkElement.ContextMenuProperty) == null) return; // If it's not null, someone's overriding our default -- don't mess with it. if (contextMenu != null) return; // It's a default null, so spin up a temporary ContextMenu now. contextMenu = new ViewerContextMenu(); contextMenu.Placement = PlacementMode.RelativePoint; contextMenu.PlacementTarget = documentGrid; ((ViewerContextMenu)contextMenu).AddMenuItems(documentGrid, e.UserInitiated); Point uiScopeMouseDownPoint; if (e.CursorLeft == KeyboardInvokedSentinel) { uiScopeMouseDownPoint = new Point(.5 * documentGrid.ViewportWidth, .5 * documentGrid.ViewportHeight); } else { uiScopeMouseDownPoint = Mouse.GetPosition(documentGrid); } contextMenu.HorizontalOffset = uiScopeMouseDownPoint.X; contextMenu.VerticalOffset = uiScopeMouseDownPoint.Y; // This line raises a public event. contextMenu.IsOpen = true; e.Handled = true; } #endregion Private methods //------------------------------------------------------ // // Private Constants // //------------------------------------------------------ #region Private Constants private const double KeyboardInvokedSentinel = -1.0; // e.CursorLeft has this value when the menu is invoked with the keyboard. #endregion //----------------------------------------------------- // // Private Types // //------------------------------------------------------ #region Private Types // Default ContextMenu for TextBox and RichTextBox. private class ViewerContextMenu : ContextMenu { // Initialize the context menu. // Creates a new instance. ////// Critical - accepts a parameter which may be used to set the userInitiated /// bit on a command, which is used for security purposes later. /// Although there is a demand here to prevent non userinitiated /// code paths to be blocked this function is not TreatAsSafe because /// we want to track any new callers to this call /// [SecurityCritical] internal void AddMenuItems(DocumentGrid dg, bool userInitiated) { // create a special menu item for paste which only works for user initiated copy // within the confines of partial trust this cannot be done programmatically if (userInitiated == false) { SecurityHelper.DemandAllClipboardPermission(); } this.Name = "ViewerContextMenu"; SetMenuProperties(new EditorMenuItem(), dg, ApplicationCommands.Copy); // Copy will be marked as user initiated // build menu for XPSViewer SetMenuProperties(new MenuItem(), dg, ApplicationCommands.SelectAll); AddSeparator(); SetMenuProperties( new MenuItem(), dg, NavigationCommands.PreviousPage, SR.Get(SRID.DocumentApplicationContextMenuPreviousPageHeader), SR.Get(SRID.DocumentApplicationContextMenuPreviousPageInputGesture)); SetMenuProperties( new MenuItem(), dg, NavigationCommands.NextPage, SR.Get(SRID.DocumentApplicationContextMenuNextPageHeader), SR.Get(SRID.DocumentApplicationContextMenuNextPageInputGesture)); SetMenuProperties( new MenuItem(), dg, NavigationCommands.FirstPage, null, //menu header SR.Get(SRID.DocumentApplicationContextMenuFirstPageInputGesture)); SetMenuProperties( new MenuItem(), dg, NavigationCommands.LastPage, null, //menu header SR.Get(SRID.DocumentApplicationContextMenuLastPageInputGesture)); AddSeparator(); SetMenuProperties(new MenuItem(), dg, ApplicationCommands.Print); } private void AddSeparator() { this.Items.Add(new Separator()); } //Helper to set properties on the menu items based on the command private void SetMenuProperties(MenuItem menuItem, DocumentGrid dg, RoutedUICommand command) { SetMenuProperties(menuItem, dg, command, null, null); } private void SetMenuProperties(MenuItem menuItem, DocumentGrid dg, RoutedUICommand command, string header, string inputGestureText) { menuItem.Command = command; menuItem.CommandTarget = dg.DocumentViewerOwner; // the text editor expects the commands to come from the DocumentViewer if (header == null) { menuItem.Header = command.Text; // use default menu text for this command } else { menuItem.Header = header; } if (inputGestureText != null) { menuItem.InputGestureText = inputGestureText; } menuItem.Name = "ViewerContextMenu_" + command.Name; // does not require localization this.Items.Add(menuItem); } } // Default EditorContextMenu item base class. // Used to distinguish our items from anything an application // may have added. private class EditorMenuItem : MenuItem { internal EditorMenuItem() : base() {} ////// Critical - accepts a parameter which may be used to set the userInitiated /// bit on a command, which is used for security purposes later. /// [SecurityCritical] internal override void OnClickCore(bool userInitiated) { OnClickImpl(userInitiated); } } #endregion Private Types } } // 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
- TextSelectionProcessor.cs
- EmptyEnumerator.cs
- RouteTable.cs
- ApplicationActivator.cs
- EventNotify.cs
- RealizationDrawingContextWalker.cs
- CodeTypeReference.cs
- ThemeInfoAttribute.cs
- SqlTriggerAttribute.cs
- GlyphTypeface.cs
- UDPClient.cs
- TextUtf8RawTextWriter.cs
- XamlSerializerUtil.cs
- XmlSchemaRedefine.cs
- ListViewVirtualItemsSelectionRangeChangedEvent.cs
- FastEncoderWindow.cs
- XmlJsonReader.cs
- HealthMonitoringSection.cs
- DecoderFallback.cs
- DbConnectionPool.cs
- HitTestDrawingContextWalker.cs
- TemplateBamlTreeBuilder.cs
- FormatterServicesNoSerializableCheck.cs
- OrderByQueryOptionExpression.cs
- CommandValueSerializer.cs
- Vector.cs
- TypeContext.cs
- Imaging.cs
- DelegatedStream.cs
- SafeArrayTypeMismatchException.cs
- RowsCopiedEventArgs.cs
- SizeIndependentAnimationStorage.cs
- SchemaCollectionPreprocessor.cs
- SqlUnionizer.cs
- SamlAction.cs
- SqlUDTStorage.cs
- Invariant.cs
- Serializer.cs
- SerializationAttributes.cs
- ExceptionUtil.cs
- RequestQueryParser.cs
- Invariant.cs
- DecimalFormatter.cs
- SectionInput.cs
- JsonWriter.cs
- RenderContext.cs
- Header.cs
- ErrorTableItemStyle.cs
- RepeaterItem.cs
- ItemChangedEventArgs.cs
- TreeIterators.cs
- TrackingMemoryStream.cs
- ImpersonationContext.cs
- PersistStreamTypeWrapper.cs
- StringToken.cs
- SelectionPatternIdentifiers.cs
- FloatSumAggregationOperator.cs
- RandomNumberGenerator.cs
- UIAgentInitializationException.cs
- ZipPackage.cs
- TheQuery.cs
- CursorInteropHelper.cs
- KeyedCollection.cs
- StrokeFIndices.cs
- ThicknessAnimation.cs
- Rethrow.cs
- SQLDateTimeStorage.cs
- DecimalStorage.cs
- WindowsListView.cs
- TypedServiceChannelBuilder.cs
- ContentType.cs
- TagNameToTypeMapper.cs
- ResourceLoader.cs
- SerializationEventsCache.cs
- PathData.cs
- TcpServerChannel.cs
- Version.cs
- GlyphShapingProperties.cs
- FastPropertyAccessor.cs
- Scripts.cs
- EntityDataSourceStatementEditor.cs
- FunctionDefinition.cs
- FixedSOMTableCell.cs
- ZipArchive.cs
- SubclassTypeValidatorAttribute.cs
- MasterPageParser.cs
- StreamInfo.cs
- SiteMapNodeItemEventArgs.cs
- HtmlDocument.cs
- VisualTreeHelper.cs
- CommandTreeTypeHelper.cs
- ConcurrentStack.cs
- DrawingCollection.cs
- AutomationEventArgs.cs
- DbModificationClause.cs
- Stroke.cs
- AsymmetricKeyExchangeFormatter.cs
- WebPartMinimizeVerb.cs
- InitializerFacet.cs
- TextTreeFixupNode.cs