Code:
/ DotNET / DotNET / 8.0 / untmp / WIN_WINDOWS / lh_tools_devdiv_wpf / Windows / wcp / Framework / System / Windows / Documents / TextEditorLists.cs / 1 / TextEditorLists.cs
//----------------------------------------------------------------------------
//
// File: TextEditorLists.cs
//
// Copyright (C) Microsoft Corporation. All rights reserved.
//
// Description: A Component of TextEditor supporting list editing commands.
//
//---------------------------------------------------------------------------
namespace System.Windows.Documents
{
using MS.Internal;
using System.Globalization;
using System.Threading;
using System.ComponentModel;
using System.Text;
using System.Collections; // ArrayList
using System.Runtime.InteropServices;
using System.Windows.Threading;
using System.Windows.Input;
using System.Windows.Controls; // ScrollChangedEventArgs
using System.Windows.Controls.Primitives; // CharacterCasing, TextBoxBase
using System.Windows.Media;
using System.Windows.Markup;
using MS.Utility;
using MS.Win32;
using MS.Internal.Documents;
using MS.Internal.Commands; // CommandHelpers
///
/// Text editing service for controls.
///
internal static class TextEditorLists
{
//-----------------------------------------------------
//
// Class Internal Methods
//
//-----------------------------------------------------
#region Class Internal Methods
// Registers all text editing command handlers for a given control type
internal static void _RegisterClassHandlers(Type controlType, bool registerEventListeners)
{
CommandHelpers.RegisterCommandHandler(controlType, EditingCommands.RemoveListMarkers , new ExecutedRoutedEventHandler(OnListCommand) , new CanExecuteRoutedEventHandler(OnQueryStatusNYI), KeyGesture.CreateFromResourceStrings(SR.Get(SRID.KeyRemoveListMarkers), SR.Get(SRID.KeyRemoveListMarkersDisplayString)) );
CommandHelpers.RegisterCommandHandler(controlType, EditingCommands.ToggleBullets , new ExecutedRoutedEventHandler(OnListCommand) , new CanExecuteRoutedEventHandler(OnQueryStatusNYI), KeyGesture.CreateFromResourceStrings(SR.Get(SRID.KeyToggleBullets), SR.Get(SRID.KeyToggleBulletsDisplayString)) );
CommandHelpers.RegisterCommandHandler(controlType, EditingCommands.ToggleNumbering , new ExecutedRoutedEventHandler(OnListCommand) , new CanExecuteRoutedEventHandler(OnQueryStatusNYI), KeyGesture.CreateFromResourceStrings(SR.Get(SRID.KeyToggleNumbering), SR.Get(SRID.KeyToggleNumberingDisplayString)) );
CommandHelpers.RegisterCommandHandler(controlType, EditingCommands.IncreaseIndentation , new ExecutedRoutedEventHandler(OnListCommand) , new CanExecuteRoutedEventHandler(OnQueryStatusTab), KeyGesture.CreateFromResourceStrings(SR.Get(SRID.KeyIncreaseIndentation), SR.Get(SRID.KeyIncreaseIndentationDisplayString)) );
CommandHelpers.RegisterCommandHandler(controlType, EditingCommands.DecreaseIndentation , new ExecutedRoutedEventHandler(OnListCommand) , new CanExecuteRoutedEventHandler(OnQueryStatusTab), KeyGesture.CreateFromResourceStrings(SR.Get(SRID.KeyDecreaseIndentation), SR.Get(SRID.KeyDecreaseIndentationDisplayString)) );
}
// Decreases the indent level of the Block at selection start.
internal static void DecreaseIndentation(TextEditor This)
{
TextSelection thisSelection = (TextSelection)This.Selection;
ListItem parentListItem = TextPointerBase.GetListItem(thisSelection.Start);
ListItem immediateListItem = TextPointerBase.GetImmediateListItem(thisSelection.Start);
DecreaseIndentation(thisSelection, parentListItem, immediateListItem);
}
#endregion Class Internal Methods
//------------------------------------------------------
//
// Class Internal Properties
//
//-----------------------------------------------------
//------------------------------------------------------
//
// Private Methods
//
//------------------------------------------------------
#region Private Methods
private static TextEditor IsEnabledNotReadOnlyIsTextSegment(object sender)
{
TextEditor This = TextEditor._GetTextEditor(sender);
if (This != null && This._IsEnabled && !This.IsReadOnly && !This.Selection.IsTableCellRange)
{
return This;
}
return null;
}
///
/// Increase/DcreaseIndentation command QueryStatus handler
///
private static void OnQueryStatusTab(object sender, CanExecuteRoutedEventArgs args)
{
TextEditor This = IsEnabledNotReadOnlyIsTextSegment(sender);
if (This != null && This.AcceptsTab)
{
//
args.CanExecute= true;
}
}
///
/// StartInputCorrection command QueryStatus handler
///
private static void OnQueryStatusNYI(object target, CanExecuteRoutedEventArgs args)
{
TextEditor This = TextEditor._GetTextEditor(target);
if (This == null)
{
return;
}
args.CanExecute = true;
}
// Common handler for all list editing commands
private static void OnListCommand(object target, ExecutedRoutedEventArgs args)
{
TextEditor This = TextEditor._GetTextEditor(target);
if (This == null || !This._IsEnabled || This.IsReadOnly || !This.AcceptsRichContent || !(This.Selection is TextSelection))
{
return;
}
TextEditorTyping._FlushPendingInputItems(This);
if (!TextRangeEditLists.IsListOperationApplicable((TextSelection)This.Selection))
{
return;
}
using (This.Selection.DeclareChangeBlock())
{
TextSelection thisSelection = (TextSelection)This.Selection;
ListItem parentListItem = TextPointerBase.GetListItem(thisSelection.Start);
ListItem immediateListItem = TextPointerBase.GetImmediateListItem(thisSelection.Start);
List list = parentListItem == null ? null : (List)parentListItem.Parent;
// Forget previously suggested horizontal position
TextEditorSelection._ClearSuggestedX(This);
// Execute the command
if (args.Command == EditingCommands.ToggleBullets)
{
ToggleBullets(thisSelection, parentListItem, immediateListItem, list);
}
else if (args.Command == EditingCommands.ToggleNumbering)
{
ToggleNumbering(thisSelection, parentListItem, immediateListItem, list);
}
else if (args.Command == EditingCommands.RemoveListMarkers)
{
TextRangeEditLists.ConvertListItemsToParagraphs(thisSelection);
}
else if (args.Command == EditingCommands.IncreaseIndentation)
{
IncreaseIndentation(thisSelection, parentListItem, immediateListItem);
}
else if (args.Command == EditingCommands.DecreaseIndentation)
{
DecreaseIndentation(thisSelection, parentListItem, immediateListItem);
}
else
{
Invariant.Assert(false);
}
}
}
private static void ToggleBullets(TextSelection thisSelection, ListItem parentListItem, ListItem immediateListItem, List list)
{
if (immediateListItem != null && HasBulletMarker(list))
{
if (list.Parent is ListItem)
{
TextRangeEditLists.UnindentListItems(thisSelection);
TextRangeEditLists.ConvertListItemsToParagraphs(thisSelection);
}
else
{
TextRangeEditLists.UnindentListItems(thisSelection);
}
}
else if (immediateListItem != null)
{
list.MarkerStyle = TextMarkerStyle.Disc;
}
else if (parentListItem != null)
{
TextRangeEditLists.ConvertParagraphsToListItems(thisSelection, TextMarkerStyle.Disc);
TextRangeEditLists.IndentListItems(thisSelection);
}
else
{
TextRangeEditLists.ConvertParagraphsToListItems(thisSelection, TextMarkerStyle.Disc);
}
}
private static void ToggleNumbering(TextSelection thisSelection, ListItem parentListItem, ListItem immediateListItem, List list)
{
if (immediateListItem != null && HasNumericMarker(list))
{
if (list.Parent is ListItem)
{
TextRangeEditLists.UnindentListItems(thisSelection);
TextRangeEditLists.ConvertListItemsToParagraphs(thisSelection);
}
else
{
TextRangeEditLists.UnindentListItems(thisSelection);
}
}
else if (immediateListItem != null)
{
list.MarkerStyle = TextMarkerStyle.Decimal;
}
else if (parentListItem != null)
{
TextRangeEditLists.ConvertParagraphsToListItems(thisSelection, TextMarkerStyle.Decimal);
TextRangeEditLists.IndentListItems(thisSelection);
}
else
{
TextRangeEditLists.ConvertParagraphsToListItems(thisSelection, TextMarkerStyle.Decimal);
}
}
private static void IncreaseIndentation(TextSelection thisSelection, ListItem parentListItem, ListItem immediateListItem)
{
if (immediateListItem != null)
{
TextRangeEditLists.IndentListItems(thisSelection);
}
else if (parentListItem != null)
{
TextRangeEditLists.ConvertParagraphsToListItems(thisSelection, TextMarkerStyle.Decimal);
TextRangeEditLists.IndentListItems(thisSelection);
}
else
{
if (thisSelection.IsEmpty)
{
// When selection is empty, handle indentation based on current TextIndent property of the paragraph.
Block paragraphOrBlockUIContainer = thisSelection.Start.ParagraphOrBlockUIContainer;
if (paragraphOrBlockUIContainer is BlockUIContainer)
{
// Increment BlockUIContainer's leading margin.
TextRangeEdit.IncrementParagraphLeadingMargin(thisSelection, /*increment:*/20, PropertyValueAction.IncreaseByAbsoluteValue);
}
else
{
// Create implicit paragraph if at a potential paragraph position, such as empty FlowDocument, TableCell.
CreateImplicitParagraphIfNeededAndUpdateSelection(thisSelection);
Paragraph paragraph = thisSelection.Start.Paragraph;
Invariant.Assert(paragraph != null, "EnsureInsertionPosition must guarantee a position in text content");
if (paragraph.TextIndent < 0)
{
// Reset text indent to 0.
TextRangeEdit.SetParagraphProperty(thisSelection.Start, thisSelection.End, Paragraph.TextIndentProperty, 0.0, PropertyValueAction.SetValue);
}
else if (paragraph.TextIndent < 20)
{
// Reset text indent to 20.
TextRangeEdit.SetParagraphProperty(thisSelection.Start, thisSelection.End, Paragraph.TextIndentProperty, 20.0, PropertyValueAction.SetValue);
}
else
{
// Increment paragraph leading margin.
TextRangeEdit.IncrementParagraphLeadingMargin(thisSelection, /*increment:*/20, PropertyValueAction.IncreaseByAbsoluteValue);
}
}
}
else
{
// For non-empty selection, always increment paragraph margin.
TextRangeEdit.IncrementParagraphLeadingMargin(thisSelection, /*increment:*/20, PropertyValueAction.IncreaseByAbsoluteValue);
}
}
}
private static void DecreaseIndentation(TextSelection thisSelection, ListItem parentListItem, ListItem immediateListItem)
{
if (immediateListItem != null)
{
TextRangeEditLists.UnindentListItems(thisSelection);
}
else if (parentListItem != null)
{
TextRangeEditLists.ConvertParagraphsToListItems(thisSelection, TextMarkerStyle.Disc);
TextRangeEditLists.UnindentListItems(thisSelection);
}
else
{
if (thisSelection.IsEmpty)
{
// When selection is empty, handle indentation based on current TextIndent property of the paragraph.
Block paragraphOrBlockUIContainer = thisSelection.Start.ParagraphOrBlockUIContainer;
if (paragraphOrBlockUIContainer is BlockUIContainer)
{
// Decrement BlockUIContainer's leading margin.
TextRangeEdit.IncrementParagraphLeadingMargin(thisSelection, /*increment:*/20, PropertyValueAction.DecreaseByAbsoluteValue);
}
else
{
// Create implicit paragraph if at a potential paragraph position, such as empty FlowDocument, TableCell.
CreateImplicitParagraphIfNeededAndUpdateSelection(thisSelection);
Paragraph paragraph = thisSelection.Start.Paragraph;
Invariant.Assert(paragraph != null, "EnsureInsertionPosition must guarantee a position in text content");
// When selection is empty, handle indentation based on current TextIndent property of the paragraph.
if (paragraph.TextIndent > 20)
{
// Reset text indent to 20.
TextRangeEdit.SetParagraphProperty(thisSelection.Start, thisSelection.End, Paragraph.TextIndentProperty, 20.0, PropertyValueAction.SetValue);
}
else if (paragraph.TextIndent > 0)
{
// Reset text indent to 0.
TextRangeEdit.SetParagraphProperty(thisSelection.Start, thisSelection.End, Paragraph.TextIndentProperty, 0.0, PropertyValueAction.SetValue);
}
else
{
// Decrement paragraph leading margin.
TextRangeEdit.IncrementParagraphLeadingMargin(thisSelection, /*increment:*/20, PropertyValueAction.DecreaseByAbsoluteValue);
}
}
}
else
{
// For non-empty selection, always decrement paragraph margin.
TextRangeEdit.IncrementParagraphLeadingMargin(thisSelection, /*increment:*/20, PropertyValueAction.DecreaseByAbsoluteValue);
}
}
}
private static void CreateImplicitParagraphIfNeededAndUpdateSelection(TextSelection thisSelection)
{
// Create implicit paragraph if we are at a potential paragraph position, such as empty FlowDocument, TableCell.
TextPointer position = thisSelection.Start;
if (TextPointerBase.IsAtPotentialParagraphPosition(position))
{
position = TextRangeEditTables.EnsureInsertionPosition(position);
thisSelection.Select(position, position);
}
}
private static bool HasBulletMarker(List list)
{
if (list == null)
{
return false;
}
TextMarkerStyle markerStyle = list.MarkerStyle;
return TextMarkerStyle.Disc <= markerStyle && markerStyle <= TextMarkerStyle.Box;
}
private static bool HasNumericMarker(List list)
{
if (list == null)
{
return false;
}
TextMarkerStyle markerStyle = list.MarkerStyle;
return TextMarkerStyle.LowerRoman <= markerStyle && markerStyle <= TextMarkerStyle.Decimal;
}
#endregion Private methods
}
}
// 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
- UIElementParaClient.cs
- TimelineGroup.cs
- XmlSerializationWriter.cs
- __TransparentProxy.cs
- RelatedView.cs
- TextSerializer.cs
- NTAccount.cs
- KeyValuePair.cs
- GetPageNumberCompletedEventArgs.cs
- MeasureData.cs
- xdrvalidator.cs
- XsdBuilder.cs
- TagMapInfo.cs
- AssemblyAttributes.cs
- MessagePropertyFilter.cs
- MissingSatelliteAssemblyException.cs
- VirtualPathProvider.cs
- ActivationArguments.cs
- PropertyEmitter.cs
- XmlAutoDetectWriter.cs
- Rectangle.cs
- WeakEventManager.cs
- TimeSpanValidatorAttribute.cs
- Renderer.cs
- ButtonChrome.cs
- CollectionChangedEventManager.cs
- InvokeProviderWrapper.cs
- ManualResetEvent.cs
- ReferenceAssemblyAttribute.cs
- FileDialog.cs
- DataControlHelper.cs
- ExceptionHandlersDesigner.cs
- BypassElementCollection.cs
- DataError.cs
- TreeNodeCollection.cs
- EDesignUtil.cs
- brushes.cs
- EventLogPermissionAttribute.cs
- SelectedDatesCollection.cs
- HttpClientCertificate.cs
- PenThread.cs
- SuppressMessageAttribute.cs
- BasePropertyDescriptor.cs
- IsolatedStorageFileStream.cs
- WindowHideOrCloseTracker.cs
- Exceptions.cs
- MultipleViewPattern.cs
- OleDbConnection.cs
- ConnectionManagementSection.cs
- Axis.cs
- SafeLibraryHandle.cs
- ImageButton.cs
- UdpDiscoveryEndpointElement.cs
- oledbmetadatacollectionnames.cs
- QueryFunctions.cs
- ButtonPopupAdapter.cs
- ListViewDeleteEventArgs.cs
- AsyncPostBackTrigger.cs
- Convert.cs
- WebPartExportVerb.cs
- Membership.cs
- WebPartMinimizeVerb.cs
- DynamicDataManager.cs
- SettingsPropertyWrongTypeException.cs
- Calendar.cs
- ContentValidator.cs
- GraphicsContainer.cs
- ByeOperationAsyncResult.cs
- DataControlFieldsEditor.cs
- XmlSchemaIdentityConstraint.cs
- BaseTemplateBuildProvider.cs
- ApplicationInfo.cs
- SharedHttpTransportManager.cs
- FixedPageProcessor.cs
- SqlWebEventProvider.cs
- HandlerFactoryCache.cs
- SelectionGlyphBase.cs
- ReaderContextStackData.cs
- ProfileSection.cs
- BreakRecordTable.cs
- ComponentDesigner.cs
- ObjectDataSourceSelectingEventArgs.cs
- XsdBuilder.cs
- LambdaCompiler.Address.cs
- SafeCertificateStore.cs
- RuleElement.cs
- DataGrid.cs
- ObjectStateFormatter.cs
- WebPartZoneCollection.cs
- QilDataSource.cs
- LiteralControl.cs
- TagMapCollection.cs
- GeometryHitTestResult.cs
- FontUnitConverter.cs
- WebPartMinimizeVerb.cs
- ByteAnimation.cs
- BaseParaClient.cs
- EditCommandColumn.cs
- EndPoint.cs
- Rules.cs