Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/xamarin/Xamarin.PropertyEditing.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Maupin <ermaup@microsoft.com>2019-02-21 01:30:04 +0300
committerEric Maupin <ermaup@microsoft.com>2019-02-21 01:45:03 +0300
commit28eb6e12eb1b4d7ff80cbe0fd2bf0ea4012cdaa6 (patch)
tree22e498fbd07beaee32af4fb45a57eb9eaf0a8af7
parentf332e8a573ae1bd5d1c14daf46b9b859b8a6bb9b (diff)
[Core/Win] Add ITypeInfo property editor
-rw-r--r--Xamarin.PropertyEditing.Tests/MockControls/MockSampleControl.cs1
-rw-r--r--Xamarin.PropertyEditing.Windows/EditorPropertySelector.cs1
-rw-r--r--Xamarin.PropertyEditing.Windows/Themes/Resources.xaml20
-rw-r--r--Xamarin.PropertyEditing.Windows/TypeEditorControl.cs42
-rw-r--r--Xamarin.PropertyEditing.Windows/Xamarin.PropertyEditing.Windows.csproj1
-rw-r--r--Xamarin.PropertyEditing/Properties/Resources.Designer.cs18
-rw-r--r--Xamarin.PropertyEditing/Properties/Resources.resx7
-rw-r--r--Xamarin.PropertyEditing/Reflection/ReflectionObjectEditor.cs3
-rw-r--r--Xamarin.PropertyEditing/ViewModels/PropertiesViewModel.cs1
-rw-r--r--Xamarin.PropertyEditing/ViewModels/TypePropertyViewModel.cs69
-rw-r--r--Xamarin.PropertyEditing/Xamarin.PropertyEditing.csproj1
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" />