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:
-rw-r--r--Xamarin.PropertyEditing.Tests/MockControls/MockControl.cs48
-rw-r--r--Xamarin.PropertyEditing.Tests/MockControls/MockWpfButton.cs34
-rw-r--r--Xamarin.PropertyEditing.Tests/MockControls/MockWpfControl.cs256
-rw-r--r--Xamarin.PropertyEditing.Tests/MockEditorProvider.cs19
-rw-r--r--Xamarin.PropertyEditing.Tests/MockObjectEditor.cs14
-rw-r--r--Xamarin.PropertyEditing.Tests/MockPropertyInfo/MockEnumPropertyInfo.cs32
-rw-r--r--Xamarin.PropertyEditing.Tests/MockPropertyInfo/MockEventInfo.cs12
-rw-r--r--Xamarin.PropertyEditing.Tests/MockPropertyInfo/MockPropertyCategories.cs13
-rw-r--r--Xamarin.PropertyEditing.Tests/MockPropertyInfo/MockPropertyInfo.cs25
-rw-r--r--Xamarin.PropertyEditing.Tests/Xamarin.PropertyEditing.Tests.csproj9
-rw-r--r--Xamarin.PropertyEditing.Windows.Standalone/MainWindow.xaml4
-rw-r--r--Xamarin.PropertyEditing.Windows.Standalone/MainWindow.xaml.cs15
-rw-r--r--Xamarin.PropertyEditing.Windows.Standalone/MockedWpfControlButton.cs20
-rw-r--r--Xamarin.PropertyEditing.Windows.Standalone/Xamarin.PropertyEditing.Windows.Standalone.csproj5
-rw-r--r--Xamarin.PropertyEditing.Windows/EditorPropertySelector.cs5
-rw-r--r--Xamarin.PropertyEditing/Drawing/CommonPoint.cs4
-rw-r--r--Xamarin.PropertyEditing/Drawing/CommonSize.cs48
-rw-r--r--Xamarin.PropertyEditing/Drawing/CommonThickness.cs65
-rw-r--r--Xamarin.PropertyEditing/ViewModels/PropertiesViewModel.cs3
-rw-r--r--Xamarin.PropertyEditing/Xamarin.PropertyEditing.csproj2
20 files changed, 620 insertions, 13 deletions
diff --git a/Xamarin.PropertyEditing.Tests/MockControls/MockControl.cs b/Xamarin.PropertyEditing.Tests/MockControls/MockControl.cs
new file mode 100644
index 0000000..783d121
--- /dev/null
+++ b/Xamarin.PropertyEditing.Tests/MockControls/MockControl.cs
@@ -0,0 +1,48 @@
+using System.Collections.Generic;
+using System.Linq;
+using Cadenza.Collections;
+using Xamarin.PropertyEditing.Tests.MockPropertyInfo;
+
+namespace Xamarin.PropertyEditing.Tests.MockControls
+{
+ public class MockControl
+ {
+ private OrderedDictionary<string, IPropertyInfo> PropertyInfos { get; }
+ = new OrderedDictionary<string, IPropertyInfo> { };
+ private OrderedDictionary<string, IEventInfo> EventInfos { get; }
+ = new OrderedDictionary<string, IEventInfo> { };
+ internal IDictionary<IPropertyInfo, object> Values { get; }
+ = new Dictionary<IPropertyInfo, object> { };
+ internal IDictionary<IEventInfo, string> EventHandlers { get; }
+ = new Dictionary<IEventInfo, string> { };
+
+ public ICollection<IPropertyInfo> Properties => PropertyInfos.Values;
+ public ICollection<IEventInfo> Events => EventInfos.Values;
+
+ public void AddProperty<T>(string name, string category = "", bool canWrite = true, bool flag = false)
+ {
+ var propertyInfo = typeof (T).IsEnum
+ ? new MockEnumPropertyInfo<T> (name, category, canWrite, flag)
+ : new MockPropertyInfo<T> (name, category, canWrite);
+ PropertyInfos.Add(name, propertyInfo);
+ Values.Add (propertyInfo, default (T));
+ }
+
+ public void AddEvent(string name)
+ {
+ var eventInfo = new MockEventInfo (name);
+ EventInfos.Add (name, eventInfo);
+ EventHandlers.Add (eventInfo, "");
+ }
+
+ public void AddEvents(params string[] names)
+ {
+ foreach (var name in names) {
+ AddEvent (name);
+ }
+ }
+
+ public IPropertyInfo GetPropertyInfo (string name)
+ => PropertyInfos[name];
+ }
+}
diff --git a/Xamarin.PropertyEditing.Tests/MockControls/MockWpfButton.cs b/Xamarin.PropertyEditing.Tests/MockControls/MockWpfButton.cs
new file mode 100644
index 0000000..ad8f086
--- /dev/null
+++ b/Xamarin.PropertyEditing.Tests/MockControls/MockWpfButton.cs
@@ -0,0 +1,34 @@
+using System.Windows.Input;
+using static Xamarin.PropertyEditing.Tests.MockPropertyInfo.MockPropertyCategories;
+
+namespace Xamarin.PropertyEditing.Tests.MockControls
+{
+ public class MockWpfButton : MockWpfControl
+ {
+ public MockWpfButton() : base()
+ {
+ AddProperty<ClickMode> ("ClickMode", Behavior);
+ AddProperty<NotImplemented> ("Command", Action);
+ AddProperty<object> ("CommandParameter", Action);
+ AddProperty<NotImplemented> ("CommandTarget", Action);
+ AddProperty<object> ("Content", Content);
+ AddProperty<string> ("ContentStringFormat", Content);
+ AddProperty<NotImplemented> ("ContentTemplate", Content);
+ AddProperty<NotImplemented> ("ContentTemplateSelector", Content);
+ AddProperty<bool> ("HasContent", None, false);
+ AddProperty<bool> ("IsCancel");
+ AddProperty<bool> ("IsDefault");
+ AddProperty<bool> ("IsDefaulted", None, false);
+ AddProperty<bool> ("IsPressed", Appearance);
+
+ AddEvent ("Click");
+ }
+
+ public enum ClickMode
+ {
+ Hover,
+ Press,
+ Release
+ }
+ }
+}
diff --git a/Xamarin.PropertyEditing.Tests/MockControls/MockWpfControl.cs b/Xamarin.PropertyEditing.Tests/MockControls/MockWpfControl.cs
new file mode 100644
index 0000000..7d8c6a5
--- /dev/null
+++ b/Xamarin.PropertyEditing.Tests/MockControls/MockWpfControl.cs
@@ -0,0 +1,256 @@
+using Xamarin.PropertyEditing.Drawing;
+using static Xamarin.PropertyEditing.Tests.MockPropertyInfo.MockPropertyCategories;
+
+namespace Xamarin.PropertyEditing.Tests.MockControls
+{
+ public class MockWpfControl : MockControl
+ {
+ public MockWpfControl ()
+ {
+ #region Properties
+ // TODO: handle the currently unsupported property types
+ // Note: properties marked as obsolete are omitted.
+ AddProperty<double> ("ActualHeight", Layout, false);
+ AddProperty<double> ("ActualWidth", Layout, false);
+ AddProperty<bool> ("AllowDrop");
+ AddProperty<bool> ("AreAnyTouchesCaptured", None, false);
+ AddProperty<bool> ("AreAnyTouchesCapturedWithin", None, false);
+ AddProperty<bool> ("AreAnyTouchesDirectlyOver", None, false);
+ AddProperty<bool> ("AreAnyTouchesOver", None, false);
+ AddProperty<CommonBrush> ("BackGround", Appearance);
+ AddProperty<NotImplemented> ("BindingGroup");
+ AddProperty<NotImplemented> ("BitmapEffect");
+ AddProperty<NotImplemented> ("BitmapEffectInput");
+ AddProperty<NotImplemented> ("BorderBrush", Appearance);
+ AddProperty<CommonThickness> ("BorderThickness", Appearance);
+ AddProperty<NotImplemented> ("CacheMode");
+ AddProperty<NotImplemented> ("Clip");
+ AddProperty<bool> ("ClipToBounds");
+ AddProperty<NotImplemented> ("CommandBindings", None, false);
+ AddProperty<NotImplemented> ("ContextMenu");
+ AddProperty<NotImplemented> ("Cursor");
+ AddProperty<object> ("DataContext");
+ AddProperty<NotImplemented> ("DependencyObjectType", None, false);
+ AddProperty<CommonSize> ("DesiredSize", None, false);
+ AddProperty<NotImplemented> ("Dispatcher", None, false);
+ AddProperty<NotImplemented> ("Effect");
+ AddProperty<FlowDirection> ("FlowDirection");
+ AddProperty<bool> ("Focusable");
+ AddProperty<NotImplemented> ("FocusVisualStyle");
+ AddProperty<NotImplemented> ("FontFamily", Appearance);
+ AddProperty<double> ("FontSize", Appearance);
+ AddProperty<NotImplemented> ("FontStretch", Appearance);
+ AddProperty<NotImplemented> ("FontStyle", Appearance);
+ AddProperty<NotImplemented> ("FontWeight", Appearance);
+ AddProperty<bool> ("ForceCursor");
+ AddProperty<CommonBrush> ("Foreground", Appearance);
+ AddProperty<bool> ("HasAnimatedProperties", None, false);
+ AddProperty<double> ("Height");
+ AddProperty<HorizontalAlignment> ("HorizontalAlignment");
+ AddProperty<HorizontalAlignment> ("HorizontalContentAlignment", Layout);
+ AddProperty<NotImplemented> ("InputBindings", None, false);
+ AddProperty<NotImplemented> ("InputScope");
+ AddProperty<bool> ("IsArrangeValid", None, false);
+ AddProperty<bool> ("IsEnabled");
+ AddProperty<bool> ("IsFocused", None, false);
+ AddProperty<bool> ("IsHitTestVisible");
+ AddProperty<bool> ("IsInitialized", None, false);
+ AddProperty<bool> ("IsInputMethodEnabled", None, false);
+ AddProperty<bool> ("IsKeyboardFocused", None, false);
+ AddProperty<bool> ("IsKeyboardFocusWithin", None, false);
+ AddProperty<bool> ("IsLoaded", None, false);
+ AddProperty<bool> ("IsManipulationEnabled", Touch);
+ AddProperty<bool> ("IsMeasureValid", None, false);
+ AddProperty<bool> ("IsMouseCaptured", None, false);
+ AddProperty<bool> ("IsMouseCaptureWithin", None, false);
+ AddProperty<bool> ("IsMouseDirectlyOver", None, false);
+ AddProperty<bool> ("IsMouseOver", None, false);
+ AddProperty<bool> ("IsSealed", None, false);
+ AddProperty<bool> ("IsStylusCaptured", None, false);
+ AddProperty<bool> ("IsStylusCaptureWithin", None, false);
+ AddProperty<bool> ("IsStylusDirectlyOver", None, false);
+ AddProperty<bool> ("IsStylusOver", None, false);
+ AddProperty<bool> ("IsTabStop", Behavior);
+ AddProperty<bool> ("IsVisible", None, false);
+ AddProperty<NotImplemented> ("Language");
+ AddProperty<NotImplemented> ("LayoutTranform");
+ AddProperty<CommonThickness> ("Margin");
+ AddProperty<double> ("MaxHeight");
+ AddProperty<double> ("MaxWidth");
+ AddProperty<string> ("Name");
+ AddProperty<double> ("Opacity");
+ AddProperty<CommonBrush> ("OpacityMask");
+ AddProperty<bool> ("OverridesDefaultStyle");
+ AddProperty<CommonThickness> ("Padding", Layout);
+ AddProperty<NotImplemented> ("Parent", None, false);
+ AddProperty<CommonSize> ("RenderSize");
+ AddProperty<NotImplemented> ("RenderTransform");
+ AddProperty<CommonPoint> ("RenderTransformOrigin");
+ AddProperty<NotImplemented> ("Resources");
+ AddProperty<bool> ("SnapsToDevicePixels");
+ AddProperty<NotImplemented> ("Style");
+ AddProperty<long> ("TabIndex", Behavior); // TODO: fix int. Won't work for now. Use long.
+ AddProperty<object> ("Tag");
+ AddProperty<NotImplemented> ("Template");
+ AddProperty<NotImplemented> ("TemplatedParent");
+ AddProperty<string> ("ToolTip", Appearance);
+ AddProperty<NotImplemented> ("TouchesCaptured", None, false);
+ AddProperty<NotImplemented> ("TouchesCapturedWithin", None, false);
+ AddProperty<NotImplemented> ("TouchesDirectlyOver", None, false);
+ AddProperty<NotImplemented> ("TouchesOver", None, false);
+ AddProperty<NotImplemented> ("Triggers", None, false);
+ AddProperty<string> ("Uid");
+ AddProperty<bool> ("UseLayoutRounding");
+ AddProperty<VerticalAlignment> ("VerticalAlignment");
+ AddProperty<VerticalAlignment> ("VerticalContentAlignment", Layout);
+ AddProperty<Visibility> ("Visibility");
+ AddProperty<double> ("Width");
+ #endregion
+ #region Events
+ AddEvents (
+ "ContextMenuClosing",
+ "ContextMenuOpening",
+ "DataContextChanged",
+ "DragEnter",
+ "DragLeave",
+ "DragOver",
+ "Drop",
+ "FocusableChanged",
+ "GiveFeedback",
+ "GotFocus",
+ "GotKeyboardFocus",
+ "GotMouseCapture",
+ "GotStylusCapture",
+ "GotTouchCapture",
+ "Initialized",
+ "IsEnabledChanged",
+ "IsHitTestVisibleChanged",
+ "IsKeyboardFocusedChanged",
+ "IsKeyboardFocusWithinChanged",
+ "IsMouseCapturedChanged",
+ "IsMouseCaptureWithinChanged",
+ "IsMouseDirectlyOverChanged",
+ "IsStylusCapturedChanged",
+ "IsStylusCaptureWithinChanged",
+ "IsStylusDirectlyOverChanged",
+ "IsVisibleChanged",
+ "KeyDown",
+ "KeyUp",
+ "LayoutUpdated",
+ "Loaded",
+ "LostFocus",
+ "LostKeyboardFocus",
+ "LostMouseCapture",
+ "LostStylusCapture",
+ "LostTouchCapture",
+ "ManipulationBoundaryFeedback",
+ "ManipulationCompleted",
+ "ManipulationDelta",
+ "ManipulationInertiaStarting",
+ "ManipulationStarted",
+ "ManipulationStarting",
+ "MouseDoubleClick",
+ "MouseDown",
+ "MouseEnter",
+ "MouseLeave",
+ "MouseLeftButtonDown",
+ "MouseLeftButtonUp",
+ "MouseMove",
+ "MouseRightButtonDown",
+ "MouseRightButtonUp",
+ "MouseUp",
+ "MouseWheel",
+ "PreviewDragEnter",
+ "PreviewDragLeave",
+ "PreviewDragOver",
+ "PreviewDrop",
+ "PreviewGiveFeedback",
+ "PreviewGotKeyboardFocus",
+ "PreviewKeyDown",
+ "PreviewKeyUp",
+ "PreviewLostKeyboardFocus",
+ "PreviewMouseDoubleClick",
+ "PreviewMouseDown",
+ "PreviewMouseLeftButtonDown",
+ "PreviewMouseLeftButtonUp",
+ "PreviewMouseMove",
+ "PreviewMouseRightButtonDown",
+ "PreviewMouseRightButtonUp",
+ "PreviewMouseUp",
+ "PreviewMouseWheel",
+ "PreviewQueryContinueDrag",
+ "PreviewStylusButtonDown",
+ "PreviewStylusButtonUp",
+ "PreviewStylusDown",
+ "PreviewStylusInAirMove",
+ "PreviewStylusInRange",
+ "PreviewStylusMove",
+ "PreviewStylusOutOfRange",
+ "PreviewStylusSystemGesture",
+ "PreviewStylusUp",
+ "PreviewTextInput",
+ "PreviewTouchDown",
+ "PreviewTouchMove",
+ "PreviewTouchUp",
+ "QueryContinueDrag",
+ "QueryCursor",
+ "RequestBringIntoView",
+ "SizeChanged",
+ "SourceUpdated",
+ "StylusButtonDown",
+ "StylusButtonUp",
+ "StylusDown",
+ "StylusEnter",
+ "StylusInAirMove",
+ "StylusInRange",
+ "StylusLeave",
+ "StylusMove",
+ "StylusOutOfRange",
+ "StylusSystemGesture",
+ "StylusUp",
+ "TargetUpdated",
+ "TextInput",
+ "ToolTipClosing",
+ "ToolTipOpening",
+ "TouchDown",
+ "TouchEnter",
+ "TouchLeave",
+ "TouchMove",
+ "TouchUp",
+ "Unloaded"
+ );
+ #endregion
+ }
+
+ public class NotImplemented { }
+
+ public enum FlowDirection
+ {
+ LeftToRight,
+ RightToLeft
+ }
+
+ public enum HorizontalAlignment
+ {
+ Center,
+ Left,
+ Right,
+ Stretch
+ }
+
+ public enum VerticalAlignment
+ {
+ Bottom,
+ Center,
+ Stretch,
+ Top
+ }
+
+ public enum Visibility
+ {
+ Collapsed,
+ Hidden,
+ Visible
+ }
+ }
+}
diff --git a/Xamarin.PropertyEditing.Tests/MockEditorProvider.cs b/Xamarin.PropertyEditing.Tests/MockEditorProvider.cs
new file mode 100644
index 0000000..32bf1a0
--- /dev/null
+++ b/Xamarin.PropertyEditing.Tests/MockEditorProvider.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Threading.Tasks;
+using Xamarin.PropertyEditing.Reflection;
+using Xamarin.PropertyEditing.Tests.MockControls;
+
+namespace Xamarin.PropertyEditing.Tests
+{
+ public class MockEditorProvider
+ : IEditorProvider
+ {
+ public Task<IObjectEditor> GetObjectEditorAsync (object item)
+ {
+ var mockControl = item as MockControl;
+ if (mockControl != null)
+ return Task.FromResult<IObjectEditor> (new MockObjectEditor (mockControl));
+ return Task.FromResult<IObjectEditor> (new ReflectionObjectEditor (item));
+ }
+ }
+} \ No newline at end of file
diff --git a/Xamarin.PropertyEditing.Tests/MockObjectEditor.cs b/Xamarin.PropertyEditing.Tests/MockObjectEditor.cs
index c50a29d..682f242 100644
--- a/Xamarin.PropertyEditing.Tests/MockObjectEditor.cs
+++ b/Xamarin.PropertyEditing.Tests/MockObjectEditor.cs
@@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
+using Xamarin.PropertyEditing.Tests.MockControls;
namespace Xamarin.PropertyEditing.Tests
{
@@ -18,6 +19,15 @@ namespace Xamarin.PropertyEditing.Tests
Properties = properties.ToArray ();
}
+ public MockObjectEditor (MockControl control)
+ {
+ Properties = control.Properties.ToArray();
+ values = control.Values;
+ Events = control.Events.ToArray ();
+ events = control.EventHandlers;
+ Target = control;
+ }
+
public object Target
{
get;
@@ -132,7 +142,7 @@ namespace Xamarin.PropertyEditing.Tests
}
#pragma warning restore CS1998
- internal readonly Dictionary<IPropertyInfo, object> values = new Dictionary<IPropertyInfo, object> ();
- internal readonly Dictionary<IEventInfo, string> events = new Dictionary<IEventInfo, string> ();
+ internal readonly IDictionary<IPropertyInfo, object> values = new Dictionary<IPropertyInfo, object> ();
+ internal readonly IDictionary<IEventInfo, string> events = new Dictionary<IEventInfo, string> ();
}
} \ No newline at end of file
diff --git a/Xamarin.PropertyEditing.Tests/MockPropertyInfo/MockEnumPropertyInfo.cs b/Xamarin.PropertyEditing.Tests/MockPropertyInfo/MockEnumPropertyInfo.cs
new file mode 100644
index 0000000..bd5b5cc
--- /dev/null
+++ b/Xamarin.PropertyEditing.Tests/MockPropertyInfo/MockEnumPropertyInfo.cs
@@ -0,0 +1,32 @@
+using System;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+
+namespace Xamarin.PropertyEditing.Tests.MockPropertyInfo
+{
+ public class MockEnumPropertyInfo<T>
+ : MockPropertyInfo<T>, IHavePredefinedValues<T>
+ {
+ public MockEnumPropertyInfo (string name, string category = "", bool canWrite = true, bool flag = false)
+ : base (name, category, canWrite)
+ {
+ var names = Enum.GetNames (typeof(T));
+ var values = Enum.GetValues (typeof(T));
+
+ var predefinedValues = new Dictionary<string, T> (names.Length);
+ for (var i = 0; i < names.Length; i++) {
+ predefinedValues.Add (names[i], (T)values.GetValue (i));
+ }
+
+ PredefinedValues = predefinedValues;
+
+ IsValueCombinable = flag;
+ }
+
+ public bool IsConstrainedToPredefined => true;
+
+ public bool IsValueCombinable { get; }
+
+ public IReadOnlyDictionary<string, T> PredefinedValues { get; }
+ }
+}
diff --git a/Xamarin.PropertyEditing.Tests/MockPropertyInfo/MockEventInfo.cs b/Xamarin.PropertyEditing.Tests/MockPropertyInfo/MockEventInfo.cs
new file mode 100644
index 0000000..34617d3
--- /dev/null
+++ b/Xamarin.PropertyEditing.Tests/MockPropertyInfo/MockEventInfo.cs
@@ -0,0 +1,12 @@
+namespace Xamarin.PropertyEditing.Tests.MockPropertyInfo
+{
+ public class MockEventInfo : IEventInfo
+ {
+ public MockEventInfo(string name)
+ {
+ Name = name;
+ }
+
+ public string Name { get; }
+ }
+}
diff --git a/Xamarin.PropertyEditing.Tests/MockPropertyInfo/MockPropertyCategories.cs b/Xamarin.PropertyEditing.Tests/MockPropertyInfo/MockPropertyCategories.cs
new file mode 100644
index 0000000..2b20f1b
--- /dev/null
+++ b/Xamarin.PropertyEditing.Tests/MockPropertyInfo/MockPropertyCategories.cs
@@ -0,0 +1,13 @@
+namespace Xamarin.PropertyEditing.Tests.MockPropertyInfo
+{
+ public static class MockPropertyCategories
+ {
+ public static string None = "";
+ public static string Action = nameof (Action);
+ public static string Appearance = nameof (Appearance);
+ public static string Behavior = nameof (Behavior);
+ public static string Content = nameof (Content);
+ public static string Layout = nameof (Layout);
+ public static string Touch = nameof (Touch);
+ }
+}
diff --git a/Xamarin.PropertyEditing.Tests/MockPropertyInfo/MockPropertyInfo.cs b/Xamarin.PropertyEditing.Tests/MockPropertyInfo/MockPropertyInfo.cs
new file mode 100644
index 0000000..2bfae70
--- /dev/null
+++ b/Xamarin.PropertyEditing.Tests/MockPropertyInfo/MockPropertyInfo.cs
@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+
+namespace Xamarin.PropertyEditing.Tests.MockPropertyInfo
+{
+ public class MockPropertyInfo<T> : IPropertyInfo
+ {
+ public MockPropertyInfo (string name, string category = "", bool canWrite = true)
+ {
+ Name = name;
+ Category = category;
+ CanWrite = canWrite;
+ }
+
+ public string Name { get; }
+ public Type Type => typeof (T);
+ public string Category { get; }
+ public bool CanWrite { get; }
+ public virtual ValueSources ValueSources => ValueSources.Local;
+ static readonly PropertyVariation[] EmptyVariations = new PropertyVariation[0];
+ public virtual IReadOnlyList<PropertyVariation> Variations => EmptyVariations;
+ static readonly IAvailabilityConstraint[] EmptyConstraints = new IAvailabilityConstraint[0];
+ public virtual IReadOnlyList<IAvailabilityConstraint> AvailabilityConstraints => EmptyConstraints;
+ }
+}
diff --git a/Xamarin.PropertyEditing.Tests/Xamarin.PropertyEditing.Tests.csproj b/Xamarin.PropertyEditing.Tests/Xamarin.PropertyEditing.Tests.csproj
index 8d8782f..37b8058 100644
--- a/Xamarin.PropertyEditing.Tests/Xamarin.PropertyEditing.Tests.csproj
+++ b/Xamarin.PropertyEditing.Tests/Xamarin.PropertyEditing.Tests.csproj
@@ -59,6 +59,14 @@
<Compile Include="BoolViewModelTests.cs" />
<Compile Include="BrushPropertyViewModelTests.cs" />
<Compile Include="Helpers.cs" />
+ <Compile Include="MockControls\MockControl.cs" />
+ <Compile Include="MockControls\MockWpfButton.cs" />
+ <Compile Include="MockControls\MockWpfControl.cs" />
+ <Compile Include="MockEditorProvider.cs" />
+ <Compile Include="MockPropertyInfo\MockEventInfo.cs" />
+ <Compile Include="MockPropertyInfo\MockPropertyCategories.cs" />
+ <Compile Include="MockPropertyInfo\MockPropertyInfo.cs" />
+ <Compile Include="MockPropertyInfo\MockEnumPropertyInfo.cs" />
<Compile Include="RadialGradientBrushPropertyViewModelTests.cs" />
<Compile Include="LinearGradientBrushPropertyViewModelTests.cs" />
<Compile Include="ImageBrushPropertyViewModelTests.cs" />
@@ -91,6 +99,7 @@
<ItemGroup>
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
</ItemGroup>
+ <ItemGroup />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
diff --git a/Xamarin.PropertyEditing.Windows.Standalone/MainWindow.xaml b/Xamarin.PropertyEditing.Windows.Standalone/MainWindow.xaml
index d6c3312..53a11d9 100644
--- a/Xamarin.PropertyEditing.Windows.Standalone/MainWindow.xaml
+++ b/Xamarin.PropertyEditing.Windows.Standalone/MainWindow.xaml
@@ -18,8 +18,8 @@
<RowDefinition />
</Grid.RowDefinitions>
- <Button Grid.Row="0" Grid.Column="0" Click="Button_Click">Select me</Button>
- <Button Grid.Row="1" Grid.Column="0" Click="Button_Click">Select me 2</Button>
+ <local:MockedWpfButton Grid.Row="0" Grid.Column="0" Click="Button_Click">Select me (Mock)</local:MockedWpfButton>
+ <Button Grid.Row="1" Grid.Column="0" Click="Button_Click">Select me (WPF)</Button>
<xamarinprops:PropertyEditorPanel Name="panel" Grid.Row="0" Grid.RowSpan="2" Grid.Column="1" />
</Grid>
diff --git a/Xamarin.PropertyEditing.Windows.Standalone/MainWindow.xaml.cs b/Xamarin.PropertyEditing.Windows.Standalone/MainWindow.xaml.cs
index 29e7fe6..7037535 100644
--- a/Xamarin.PropertyEditing.Windows.Standalone/MainWindow.xaml.cs
+++ b/Xamarin.PropertyEditing.Windows.Standalone/MainWindow.xaml.cs
@@ -1,5 +1,5 @@
-using System.Windows;
-using Xamarin.PropertyEditing.Reflection;
+using System.Windows;
+using Xamarin.PropertyEditing.Tests;
namespace Xamarin.PropertyEditing.Windows.Standalone
{
@@ -11,15 +11,18 @@ namespace Xamarin.PropertyEditing.Windows.Standalone
public MainWindow ()
{
InitializeComponent ();
- this.panel.EditorProvider = new ReflectionEditorProvider();
+ this.panel.EditorProvider = new MockEditorProvider();
}
private void Button_Click (object sender, RoutedEventArgs e)
{
- if (this.panel.SelectedItems.Contains (sender))
- this.panel.SelectedItems.Remove (sender);
+ var mockedButton = sender as MockedWpfButton;
+ var inspectedObject = (mockedButton == null || mockedButton.MockedControl == null)
+ ? sender : mockedButton.MockedControl;
+ if (this.panel.SelectedItems.Contains (inspectedObject))
+ this.panel.SelectedItems.Remove (inspectedObject);
else
- this.panel.SelectedItems.Add (sender);
+ this.panel.SelectedItems.Add (inspectedObject);
}
}
}
diff --git a/Xamarin.PropertyEditing.Windows.Standalone/MockedWpfControlButton.cs b/Xamarin.PropertyEditing.Windows.Standalone/MockedWpfControlButton.cs
new file mode 100644
index 0000000..67e4312
--- /dev/null
+++ b/Xamarin.PropertyEditing.Windows.Standalone/MockedWpfControlButton.cs
@@ -0,0 +1,20 @@
+using System.Windows.Controls;
+using Xamarin.PropertyEditing.Tests.MockControls;
+
+namespace Xamarin.PropertyEditing.Windows.Standalone
+{
+ public abstract class MockedWpfControlButton<T> : Button
+ where T : MockControl
+ {
+ public MockedWpfControlButton(T mockedControl)
+ {
+ MockedControl = mockedControl;
+ }
+
+ public T MockedControl { get; }
+ }
+
+ public class MockedWpfButton: MockedWpfControlButton<MockWpfButton> {
+ public MockedWpfButton() : base(new MockWpfButton()) { }
+ }
+}
diff --git a/Xamarin.PropertyEditing.Windows.Standalone/Xamarin.PropertyEditing.Windows.Standalone.csproj b/Xamarin.PropertyEditing.Windows.Standalone/Xamarin.PropertyEditing.Windows.Standalone.csproj
index d0c469e..eaf6ab0 100644
--- a/Xamarin.PropertyEditing.Windows.Standalone/Xamarin.PropertyEditing.Windows.Standalone.csproj
+++ b/Xamarin.PropertyEditing.Windows.Standalone/Xamarin.PropertyEditing.Windows.Standalone.csproj
@@ -68,6 +68,7 @@
</Compile>
</ItemGroup>
<ItemGroup>
+ <Compile Include="MockedWpfControlButton.cs" />
<Compile Include="Properties\AssemblyInfo.cs">
<SubType>Code</SubType>
</Compile>
@@ -94,6 +95,10 @@
<None Include="App.config" />
</ItemGroup>
<ItemGroup>
+ <ProjectReference Include="..\Xamarin.PropertyEditing.Tests\Xamarin.PropertyEditing.Tests.csproj">
+ <Project>{84101d04-9ce4-4ce7-916e-21f86ee96898}</Project>
+ <Name>Xamarin.PropertyEditing.Tests</Name>
+ </ProjectReference>
<ProjectReference Include="..\Xamarin.PropertyEditing.Windows\Xamarin.PropertyEditing.Windows.csproj">
<Project>{60af04be-1b6b-411b-bcba-c95eafbd7ac0}</Project>
<Name>Xamarin.PropertyEditing.Windows</Name>
diff --git a/Xamarin.PropertyEditing.Windows/EditorPropertySelector.cs b/Xamarin.PropertyEditing.Windows/EditorPropertySelector.cs
index b507e4e..c34a50e 100644
--- a/Xamarin.PropertyEditing.Windows/EditorPropertySelector.cs
+++ b/Xamarin.PropertyEditing.Windows/EditorPropertySelector.cs
@@ -2,7 +2,7 @@
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
-using System.Windows.Data;
+using Xamarin.PropertyEditing.Drawing;
using Xamarin.PropertyEditing.ViewModels;
namespace Xamarin.PropertyEditing.Windows
@@ -101,8 +101,11 @@ namespace Xamarin.PropertyEditing.Windows
{ typeof(IntegerPropertyViewModel), typeof(NumericEditorControl) },
{ typeof(FloatingPropertyViewModel), typeof(NumericEditorControl) },
{ typeof(PropertyViewModel<Point>), typeof(PointEditorControl) },
+ { typeof(PropertyViewModel<CommonPoint>), typeof(PointEditorControl) },
{ typeof(PropertyViewModel<Size>), typeof(SizeEditorControl) },
+ { typeof(PropertyViewModel<CommonSize>), typeof(SizeEditorControl) },
{ typeof(PropertyViewModel<Thickness>), typeof(ThicknessEditorControl) },
+ { typeof(PropertyViewModel<CommonThickness>), typeof(ThicknessEditorControl) },
{ typeof(PredefinedValuesViewModel<>), typeof(EnumEditorControl) }
};
}
diff --git a/Xamarin.PropertyEditing/Drawing/CommonPoint.cs b/Xamarin.PropertyEditing/Drawing/CommonPoint.cs
index 909fa70..0c35ef0 100644
--- a/Xamarin.PropertyEditing/Drawing/CommonPoint.cs
+++ b/Xamarin.PropertyEditing/Drawing/CommonPoint.cs
@@ -18,11 +18,11 @@ namespace Xamarin.PropertyEditing.Drawing
/// <summary>
/// The horizontal coordinate of the point.
/// </summary>
- public double X { get; }
+ public double X { get; set; }
/// <summary>
/// The vertical coordinate of the point.
/// </summary>
- public double Y { get; }
+ public double Y { get; set; }
public override bool Equals (object obj)
{
diff --git a/Xamarin.PropertyEditing/Drawing/CommonSize.cs b/Xamarin.PropertyEditing/Drawing/CommonSize.cs
new file mode 100644
index 0000000..54acc64
--- /dev/null
+++ b/Xamarin.PropertyEditing/Drawing/CommonSize.cs
@@ -0,0 +1,48 @@
+using System;
+
+namespace Xamarin.PropertyEditing.Drawing
+{
+ /// <summary>
+ /// A size in two-dimensional space.
+ /// </summary>
+ public struct CommonSize : IEquatable<CommonSize>
+ {
+ public CommonSize(double width, double height)
+ {
+ Width = width;
+ Height = height;
+ }
+
+ /// <summary>
+ /// The width.
+ /// </summary>
+ public double Width { get; set; }
+ /// <summary>
+ /// The height.
+ /// </summary>
+ public double Height { get; set; }
+
+ public override bool Equals (object obj)
+ {
+ if (obj == null) return false;
+ if (!(obj is CommonSize)) return false;
+ return Equals ((CommonSize)obj);
+ }
+
+ public bool Equals (CommonSize other)
+ {
+ return Width == other.Width &&
+ Height == other.Height;
+ }
+
+ public override int GetHashCode ()
+ {
+ var hashCode = 1861411795;
+ unchecked {
+ hashCode = hashCode * -1521134295 + Width.GetHashCode ();
+ hashCode = hashCode * -1521134295 + Height.GetHashCode ();
+ }
+ return hashCode;
+ }
+ }
+}
diff --git a/Xamarin.PropertyEditing/Drawing/CommonThickness.cs b/Xamarin.PropertyEditing/Drawing/CommonThickness.cs
new file mode 100644
index 0000000..e4bdd42
--- /dev/null
+++ b/Xamarin.PropertyEditing/Drawing/CommonThickness.cs
@@ -0,0 +1,65 @@
+using System;
+
+namespace Xamarin.PropertyEditing.Drawing
+{
+ /// <summary>
+ /// A two-dimensional thickness, such as the thickness of the border of a rectangle.
+ /// </summary>
+ public struct CommonThickness : IEquatable<CommonThickness>
+ {
+ public CommonThickness(double uniformThickness)
+ : this(uniformThickness, uniformThickness, uniformThickness, uniformThickness) { }
+
+ public CommonThickness (double bottom, double left, double right, double top)
+ {
+ Bottom = bottom;
+ Left = left;
+ Right = right;
+ Top = top;
+ }
+
+ /// <summary>
+ /// The bottom thickness.
+ /// </summary>
+ public double Bottom { get; set; }
+ /// <summary>
+ /// The left thickness.
+ /// </summary>
+ public double Left { get; set; }
+ /// <summary>
+ /// The right thickness.
+ /// </summary>
+ public double Right { get; set; }
+ /// <summary>
+ /// The top thickness.
+ /// </summary>
+ public double Top { get; set; }
+
+ public override bool Equals (object obj)
+ {
+ if (obj == null) return false;
+ if (!(obj is CommonThickness)) return false;
+ return base.Equals ((CommonThickness)obj);
+ }
+
+ public bool Equals (CommonThickness other)
+ {
+ return Bottom == other.Bottom &&
+ Left == other.Left &&
+ Right == other.Right &&
+ Top == other.Top;
+ }
+
+ public override int GetHashCode ()
+ {
+ var hashCode = 466501756;
+ unchecked {
+ hashCode = hashCode * -1521134295 + Bottom.GetHashCode ();
+ hashCode = hashCode * -1521134295 + Left.GetHashCode ();
+ hashCode = hashCode * -1521134295 + Right.GetHashCode ();
+ hashCode = hashCode * -1521134295 + Top.GetHashCode ();
+ }
+ return hashCode;
+ }
+ }
+}
diff --git a/Xamarin.PropertyEditing/ViewModels/PropertiesViewModel.cs b/Xamarin.PropertyEditing/ViewModels/PropertiesViewModel.cs
index 1819e91..b38f12c 100644
--- a/Xamarin.PropertyEditing/ViewModels/PropertiesViewModel.cs
+++ b/Xamarin.PropertyEditing/ViewModels/PropertiesViewModel.cs
@@ -430,6 +430,9 @@ namespace Xamarin.PropertyEditing.ViewModels
{ typeof(Size), (p,e) => new PropertyViewModel<Size> (p, e) },
{ typeof(Rectangle), (p,e) => new PropertyViewModel<Rectangle> (p, e) },
{ typeof(CommonBrush), (p, e) => new BrushPropertyViewModel(p, e) },
+ { typeof(CommonPoint), (p,e) => new PropertyViewModel<CommonPoint> (p, e) },
+ { typeof(CommonSize), (p,e) => new PropertyViewModel<CommonSize> (p, e) },
+ { typeof(CommonThickness), (p, e) => new PropertyViewModel<CommonThickness>(p, e) },
};
}
}
diff --git a/Xamarin.PropertyEditing/Xamarin.PropertyEditing.csproj b/Xamarin.PropertyEditing/Xamarin.PropertyEditing.csproj
index 5cabafe..6189e80 100644
--- a/Xamarin.PropertyEditing/Xamarin.PropertyEditing.csproj
+++ b/Xamarin.PropertyEditing/Xamarin.PropertyEditing.csproj
@@ -54,8 +54,10 @@
<Compile Include="Drawing\CommonPoint.cs" />
<Compile Include="Drawing\CommonRadialGradientBrush.cs" />
<Compile Include="Drawing\CommonRectangle.cs" />
+ <Compile Include="Drawing\CommonSize.cs" />
<Compile Include="Drawing\CommonSolidBrush.cs" />
<Compile Include="Drawing\CommonStretch.cs" />
+ <Compile Include="Drawing\CommonThickness.cs" />
<Compile Include="Drawing\CommonTileBrush.cs" />
<Compile Include="Drawing\CommonTileMode.cs" />
<Compile Include="Drawing\CommonImageBrush.cs" />