You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
123 lines
4.2 KiB
123 lines
4.2 KiB
/*************************************************************************************
|
|
|
|
Toolkit for WPF
|
|
|
|
Copyright (C) 2007-2025 Xceed Software Inc.
|
|
|
|
This program is provided to you under the terms of the XCEED SOFTWARE, INC.
|
|
COMMUNITY LICENSE AGREEMENT (for non-commercial use) as published at
|
|
https://github.com/xceedsoftware/wpftoolkit/blob/master/license.md
|
|
|
|
For more features, controls, and fast professional support,
|
|
pick up the Plus Edition at https://xceed.com/xceed-toolkit-plus-for-wpf/
|
|
|
|
Stay informed: follow @datagrid on Twitter or Like http://facebook.com/datagrids
|
|
|
|
***********************************************************************************/
|
|
|
|
using System;
|
|
using System.ComponentModel;
|
|
using System.ComponentModel.Design.Serialization;
|
|
using System.Globalization;
|
|
using System.Reflection;
|
|
using System.Security;
|
|
|
|
namespace Xceed.Wpf.Toolkit.Core.Input
|
|
{
|
|
public sealed class KeyModifierCollectionConverter : TypeConverter
|
|
{
|
|
#region Static Fields
|
|
|
|
private static readonly TypeConverter _keyModifierConverter = TypeDescriptor.GetConverter( typeof( KeyModifier ) );
|
|
|
|
#endregion
|
|
|
|
public override bool CanConvertFrom( ITypeDescriptorContext typeDescriptorContext, Type type )
|
|
{
|
|
return _keyModifierConverter.CanConvertFrom( typeDescriptorContext, type );
|
|
}
|
|
|
|
public override bool CanConvertTo( ITypeDescriptorContext typeDescriptorContext, Type type )
|
|
{
|
|
return ( type == typeof( InstanceDescriptor )
|
|
|| type == typeof( KeyModifierCollection )
|
|
|| type == typeof( string ) );
|
|
}
|
|
|
|
public override object ConvertFrom( ITypeDescriptorContext typeDescriptorContext,
|
|
CultureInfo cultureInfo, object value )
|
|
{
|
|
KeyModifierCollection result = new KeyModifierCollection();
|
|
string stringValue = value as string;
|
|
|
|
// convert null as None
|
|
if( value == null
|
|
|| ( stringValue != null && stringValue.Trim() == string.Empty ) )
|
|
{
|
|
result.Add( KeyModifier.None );
|
|
}
|
|
else
|
|
{
|
|
// respect the following separators: '+', ' ', '|', or ','
|
|
foreach( string token in stringValue.Split( new char[] { '+', ' ', '|', ',' },
|
|
StringSplitOptions.RemoveEmptyEntries ) )
|
|
result.Add( ( KeyModifier )_keyModifierConverter.ConvertFrom( typeDescriptorContext, cultureInfo, token ) );
|
|
|
|
// if nothing added, assume None
|
|
if( result.Count == 0 )
|
|
result.Add( KeyModifier.None );
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public override object ConvertTo( ITypeDescriptorContext typeDescriptorContext,
|
|
CultureInfo cultureInfo, object value, Type destinationType )
|
|
{
|
|
// special handling for null or an empty collection
|
|
if( value == null || ( ( KeyModifierCollection )value ).Count == 0 )
|
|
{
|
|
if( destinationType == typeof( InstanceDescriptor ) )
|
|
{
|
|
object result = null;
|
|
try
|
|
{
|
|
result = ConstructInstanceDescriptor();
|
|
}
|
|
catch( SecurityException )
|
|
{
|
|
}
|
|
return result;
|
|
}
|
|
else if( destinationType == typeof( string ) )
|
|
{
|
|
return _keyModifierConverter.ConvertTo( typeDescriptorContext,
|
|
cultureInfo, KeyModifier.None, destinationType );
|
|
}
|
|
}
|
|
|
|
// return a '+' delimited string containing the modifiers
|
|
if( destinationType == typeof( string ) )
|
|
{
|
|
string result = string.Empty;
|
|
foreach( KeyModifier modifier in ( KeyModifierCollection )value )
|
|
{
|
|
if( result != string.Empty )
|
|
result = result + '+';
|
|
|
|
result = result + _keyModifierConverter.ConvertTo( typeDescriptorContext,
|
|
cultureInfo, modifier, destinationType );
|
|
}
|
|
return result;
|
|
}
|
|
|
|
// unexpected type requested so return null
|
|
return null;
|
|
}
|
|
|
|
private static object ConstructInstanceDescriptor()
|
|
{
|
|
ConstructorInfo ci = typeof( KeyModifierCollection ).GetConstructor( new Type[] { } );
|
|
return new InstanceDescriptor( ci, new Object[] { } );
|
|
}
|
|
}
|
|
}
|
|
|