diff options
author | Bertrand Le Roy <beleroy@microsoft.com> | 2017-09-22 22:49:30 +0300 |
---|---|---|
committer | Bertrand Le Roy <beleroy@microsoft.com> | 2017-09-23 01:36:04 +0300 |
commit | 5f9c895e5fb274aae8be68e67386665e85e12eec (patch) | |
tree | 05210008c0a52e00b9eb5a013b3f4dc041c007e8 | |
parent | 8156470d328a3c91fc329c0523b45b551f7c6e98 (diff) |
Write mock controls that can be edited by the property panel.
Implement mock WPF mock button with properties and events.
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" /> |