diff options
author | Eric Maupin <ermaup@microsoft.com> | 2019-02-21 01:30:04 +0300 |
---|---|---|
committer | Eric Maupin <ermaup@microsoft.com> | 2019-02-21 01:45:03 +0300 |
commit | 28eb6e12eb1b4d7ff80cbe0fd2bf0ea4012cdaa6 (patch) | |
tree | 22e498fbd07beaee32af4fb45a57eb9eaf0a8af7 | |
parent | f332e8a573ae1bd5d1c14daf46b9b859b8a6bb9b (diff) |
[Core/Win] Add ITypeInfo property editor
11 files changed, 162 insertions, 2 deletions
diff --git a/Xamarin.PropertyEditing.Tests/MockControls/MockSampleControl.cs b/Xamarin.PropertyEditing.Tests/MockControls/MockSampleControl.cs index b92fb13..7e1a8a8 100644 --- a/Xamarin.PropertyEditing.Tests/MockControls/MockSampleControl.cs +++ b/Xamarin.PropertyEditing.Tests/MockControls/MockSampleControl.cs @@ -37,6 +37,7 @@ namespace Xamarin.PropertyEditing.Tests.MockControls AddProperty<CommonThickness> ("Thickness", ReadWrite); AddProperty<object> ("Object", ReadWrite); AddProperty<IList> ("Collection", ReadWrite); + AddProperty<ITypeInfo> ("Type", ReadWrite, realType: typeof(Type).ToTypeInfo()); AddReadOnlyProperty<bool> ("ReadOnlyBoolean", ReadOnly); AddReadOnlyProperty<int> ("ReadOnlyInteger", ReadOnly); diff --git a/Xamarin.PropertyEditing.Windows/EditorPropertySelector.cs b/Xamarin.PropertyEditing.Windows/EditorPropertySelector.cs index 45994e4..57c5e59 100644 --- a/Xamarin.PropertyEditing.Windows/EditorPropertySelector.cs +++ b/Xamarin.PropertyEditing.Windows/EditorPropertySelector.cs @@ -108,6 +108,7 @@ namespace Xamarin.PropertyEditing.Windows { typeof(BrushPropertyViewModel), typeof(BrushEditorControl) }, { typeof(PropertyGroupViewModel), typeof(GroupEditorControl) }, { typeof(ObjectPropertyViewModel), typeof(ObjectEditorControl) }, + { typeof(TypePropertyViewModel), typeof(TypeEditorControl) }, { typeof(CollectionPropertyViewModel), typeof(CollectionEditor) }, { typeof(RatioViewModel), typeof(RatioEditorControl) }, }; diff --git a/Xamarin.PropertyEditing.Windows/Themes/Resources.xaml b/Xamarin.PropertyEditing.Windows/Themes/Resources.xaml index 7715277..33c9087 100644 --- a/Xamarin.PropertyEditing.Windows/Themes/Resources.xaml +++ b/Xamarin.PropertyEditing.Windows/Themes/Resources.xaml @@ -417,7 +417,25 @@ </Grid.ColumnDefinitions> <TextBlock Text="{Binding ValueType.Name,StringFormat=({0})}" Grid.Column="0" VerticalAlignment="Center" /> - <Button AutomationProperties.Name="{Binding Property.Name,Mode=OneTime,StringFormat={x:Static prop:Resources.NewInstanceForProperty}}" MinHeight="20" MinWidth="40" Grid.Column="1" HorizontalAlignment="Right" Content="{x:Static prop:Resources.New}" Command="{Binding CreateInstanceCommand}" /> + <Button AutomationProperties.Name="{Binding Property.Name,Mode=OneTime,StringFormat={x:Static prop:Resources.NewInstanceForProperty}}" MinHeight="20" MinWidth="40" Grid.Column="1" HorizontalAlignment="Right" Content="{x:Static prop:Resources.New}" Command="{Binding CreateInstanceCommand,Mode=OneTime}" /> + </Grid> + </ControlTemplate> + </Setter.Value> + </Setter> + </Style> + + <Style TargetType="local:TypeEditorControl"> + <Setter Property="Template"> + <Setter.Value> + <ControlTemplate TargetType="local:TypeEditorControl"> + <Grid> + <Grid.ColumnDefinitions> + <ColumnDefinition Width="*" /> + <ColumnDefinition Width="Auto" /> + </Grid.ColumnDefinitions> + + <TextBlock Text="{Binding Value.Name,StringFormat=({0})}" Grid.Column="0" VerticalAlignment="Center" /> + <Button AutomationProperties.Name="{Binding Property.Name,Mode=OneTime,StringFormat={x:Static prop:Resources.SelectTypeForProperty}}" MinHeight="20" MinWidth="40" Grid.Column="1" HorizontalAlignment="Right" Content="{x:Static prop:Resources.Select}" Command="{Binding SelectTypeCommand,Mode=OneTime}" /> </Grid> </ControlTemplate> </Setter.Value> diff --git a/Xamarin.PropertyEditing.Windows/TypeEditorControl.cs b/Xamarin.PropertyEditing.Windows/TypeEditorControl.cs new file mode 100644 index 0000000..4fd3575 --- /dev/null +++ b/Xamarin.PropertyEditing.Windows/TypeEditorControl.cs @@ -0,0 +1,42 @@ +using System.Threading.Tasks; +using System.Windows; +using Xamarin.PropertyEditing.ViewModels; + +namespace Xamarin.PropertyEditing.Windows +{ + internal class TypeEditorControl + : PropertyEditorControl + { + static TypeEditorControl () + { + DefaultStyleKeyProperty.OverrideMetadata (typeof (TypeEditorControl), new FrameworkPropertyMetadata (typeof (TypeEditorControl))); + } + + public TypeEditorControl () + { + DataContextChanged += OnDataContextChanged; + } + + private TypePropertyViewModel vm; + + private void OnDataContextChanged (object sender, DependencyPropertyChangedEventArgs e) + { + if (this.vm != null) + this.vm.TypeRequested -= OnTypeRequested; + + this.vm = e.NewValue as TypePropertyViewModel; + if (this.vm != null) + this.vm.TypeRequested += OnTypeRequested; + } + + private void OnTypeRequested (object sender, TypeRequestedEventArgs e) + { + var vsender = (TypePropertyViewModel)sender; + + var panel = this.FindPropertiesHost (); + + ITypeInfo type = TypeSelectorWindow.RequestType (panel, vsender.AssignableTypes); + e.SelectedType = Task.FromResult (type); + } + } +} diff --git a/Xamarin.PropertyEditing.Windows/Xamarin.PropertyEditing.Windows.csproj b/Xamarin.PropertyEditing.Windows/Xamarin.PropertyEditing.Windows.csproj index e29b504..bef6888 100644 --- a/Xamarin.PropertyEditing.Windows/Xamarin.PropertyEditing.Windows.csproj +++ b/Xamarin.PropertyEditing.Windows/Xamarin.PropertyEditing.Windows.csproj @@ -142,6 +142,7 @@ <Compile Include="ThicknessEditorControl.cs" /> <Compile Include="StringEditorControl.cs" /> <Compile Include="TreeViewItemEx.cs" /> + <Compile Include="TypeEditorControl.cs" /> <Compile Include="TypeSelectorControl.xaml.cs"> <DependentUpon>TypeSelectorControl.xaml</DependentUpon> </Compile> diff --git a/Xamarin.PropertyEditing/Properties/Resources.Designer.cs b/Xamarin.PropertyEditing/Properties/Resources.Designer.cs index 7a52edb..1249b10 100644 --- a/Xamarin.PropertyEditing/Properties/Resources.Designer.cs +++ b/Xamarin.PropertyEditing/Properties/Resources.Designer.cs @@ -1141,6 +1141,15 @@ namespace Xamarin.PropertyEditing.Properties { } /// <summary> + /// Looks up a localized string similar to Select. + /// </summary> + public static string Select { + get { + return ResourceManager.GetString("Select", resourceCulture); + } + } + + /// <summary> /// Looks up a localized string similar to Select Object. /// </summary> public static string SelectObjectTitle { @@ -1159,6 +1168,15 @@ namespace Xamarin.PropertyEditing.Properties { } /// <summary> + /// Looks up a localized string similar to Select {0} type. + /// </summary> + public static string SelectTypeForProperty { + get { + return ResourceManager.GetString("SelectTypeForProperty", resourceCulture); + } + } + + /// <summary> /// Looks up a localized string similar to Shared. /// </summary> public static string Shared { diff --git a/Xamarin.PropertyEditing/Properties/Resources.resx b/Xamarin.PropertyEditing/Properties/Resources.resx index 168c1eb..9e44bbd 100644 --- a/Xamarin.PropertyEditing/Properties/Resources.resx +++ b/Xamarin.PropertyEditing/Properties/Resources.resx @@ -570,4 +570,11 @@ <value>New {0}</value> <comment>New {PropertyName}</comment> </data> + <data name="Select" xml:space="preserve"> + <value>Select</value> + </data> + <data name="SelectTypeForProperty" xml:space="preserve"> + <value>Select {0} type</value> + <comment>Select {property} type</comment> + </data> </root>
\ No newline at end of file diff --git a/Xamarin.PropertyEditing/Reflection/ReflectionObjectEditor.cs b/Xamarin.PropertyEditing/Reflection/ReflectionObjectEditor.cs index 3ea7209..a7fbbc5 100644 --- a/Xamarin.PropertyEditing/Reflection/ReflectionObjectEditor.cs +++ b/Xamarin.PropertyEditing/Reflection/ReflectionObjectEditor.cs @@ -159,7 +159,8 @@ namespace Xamarin.PropertyEditing.Reflection } } - types = types.Where (t => realType.IsAssignableFrom (t)); + if (realType != typeof(Type)) + types = types.Where (t => realType.IsAssignableFrom (t)); return new AssignableTypesResult (types.Select (t => { string asmName = t.Assembly.GetName ().Name; diff --git a/Xamarin.PropertyEditing/ViewModels/PropertiesViewModel.cs b/Xamarin.PropertyEditing/ViewModels/PropertiesViewModel.cs index 0ee785b..7ddae70 100644 --- a/Xamarin.PropertyEditing/ViewModels/PropertiesViewModel.cs +++ b/Xamarin.PropertyEditing/ViewModels/PropertiesViewModel.cs @@ -614,6 +614,7 @@ namespace Xamarin.PropertyEditing.ViewModels { typeof(BindingSource), (tp,p,e,v) => new PropertyViewModel<BindingSource> (tp, p, e, v) }, { typeof(Resource), (tp,p,e,v) => new PropertyViewModel<Resource> (tp, p, e, v) }, { typeof(object), (tp,p,e,v) => new ObjectPropertyViewModel (tp, p, e, v) }, + { typeof(ITypeInfo), (tp,p,e,v) => new TypePropertyViewModel (tp, p, e, v) }, { typeof(CommonRatio), (tp, p, e, v) => new RatioViewModel (tp, p, e, v) }, }; } diff --git a/Xamarin.PropertyEditing/ViewModels/TypePropertyViewModel.cs b/Xamarin.PropertyEditing/ViewModels/TypePropertyViewModel.cs new file mode 100644 index 0000000..fe192d9 --- /dev/null +++ b/Xamarin.PropertyEditing/ViewModels/TypePropertyViewModel.cs @@ -0,0 +1,69 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Input; + +namespace Xamarin.PropertyEditing.ViewModels +{ + internal class TypePropertyViewModel + : PropertyViewModel<ITypeInfo> + { + public TypePropertyViewModel (TargetPlatform platform, IPropertyInfo propertyInfo, IEnumerable<IObjectEditor> editors, PropertyVariation variation = null) + : base (platform, propertyInfo, editors, variation) + { + SelectTypeCommand = new RelayCommand (SetType, () => Property.CanWrite); + } + + public event EventHandler<TypeRequestedEventArgs> TypeRequested; + + public ICommand SelectTypeCommand + { + get; + } + + public AsyncValue<IReadOnlyDictionary<IAssemblyInfo, ILookup<string, ITypeInfo>>> AssignableTypes + { + get + { + if (this.assignableTypes == null) + this.assignableTypes = new AsyncValue<IReadOnlyDictionary<IAssemblyInfo, ILookup<string, ITypeInfo>>> (GetAssignableTypesAsync ()); + + return this.assignableTypes; + } + } + + private AsyncValue<IReadOnlyDictionary<IAssemblyInfo, ILookup<string, ITypeInfo>>> assignableTypes; + + private async Task<IReadOnlyDictionary<IAssemblyInfo, ILookup<string, ITypeInfo>>> GetAssignableTypesAsync () + { + AssignableTypesResult result = await Editors.GetCommonAssignableTypes (Property, childTypes: false).ConfigureAwait (false); + return result.GetTypeTree (); + } + + private async void SetType () + { + using (await AsyncWork.RequestAsyncWork (this)) { + ITypeInfo selectedType = null; + var args = new TypeRequestedEventArgs (); + TypeRequested?.Invoke (this, args); + if (args.SelectedType == null) + return; + + try { + selectedType = await args.SelectedType; + if (selectedType == null) + return; + } catch (OperationCanceledException) { + return; + } + + await SetValueAsync (new ValueInfo<ITypeInfo> { + Value = selectedType, + Source = ValueSource.Local + }); + } + } + } +} diff --git a/Xamarin.PropertyEditing/Xamarin.PropertyEditing.csproj b/Xamarin.PropertyEditing/Xamarin.PropertyEditing.csproj index 35df7c9..b638f30 100644 --- a/Xamarin.PropertyEditing/Xamarin.PropertyEditing.csproj +++ b/Xamarin.PropertyEditing/Xamarin.PropertyEditing.csproj @@ -165,6 +165,7 @@ <Compile Include="ViewModels\RectanglePropertyViewModel.cs" /> <Compile Include="ViewModels\ThicknessPropertyViewModel.cs" /> <Compile Include="ViewModels\ObjectTreeElement.cs" /> + <Compile Include="ViewModels\TypePropertyViewModel.cs" /> <Compile Include="ViewModels\TypeSelectorViewModel.cs" /> <Compile Include="ViewModels\RatioViewModel.cs" /> <Compile Include="Drawing\CommonRatio.cs" /> |