diff options
author | Lluis Sanchez <lluis@xamarin.com> | 2014-02-24 18:12:30 +0400 |
---|---|---|
committer | Lluis Sanchez <lluis@xamarin.com> | 2014-02-24 18:12:30 +0400 |
commit | fe71a6ff33b733fa9cf15372d28c58d273ecd35d (patch) | |
tree | 148692e8842f6a2a370388fcfd6678bfdf1b09bb /Xwt.WPF | |
parent | b3ea01d61cdc57939cc865c8e5e6d9953c13f5dc (diff) |
[WPF] Implement new CellView api
Diffstat (limited to 'Xwt.WPF')
-rw-r--r-- | Xwt.WPF/Xwt.WPF.csproj | 2 | ||||
-rw-r--r-- | Xwt.WPF/Xwt.WPFBackend.CellViews/CanvasCellViewBackend.cs | 119 | ||||
-rw-r--r-- | Xwt.WPF/Xwt.WPFBackend.CellViews/CanvasCellViewPanel.cs | 108 | ||||
-rw-r--r-- | Xwt.WPF/Xwt.WPFBackend.CellViews/CellViewBackend.cs | 83 | ||||
-rw-r--r-- | Xwt.WPF/Xwt.WPFBackend.Utilities/CellUtil.cs | 35 | ||||
-rw-r--r-- | Xwt.WPF/Xwt.WPFBackend/ComboBoxBackend.cs | 4 | ||||
-rw-r--r-- | Xwt.WPF/Xwt.WPFBackend/ListBoxBackend.cs | 2 | ||||
-rw-r--r-- | Xwt.WPF/Xwt.WPFBackend/ListViewBackend.cs | 21 | ||||
-rw-r--r-- | Xwt.WPF/Xwt.WPFBackend/ScrollAdjustmentBackend.cs | 2 | ||||
-rw-r--r-- | Xwt.WPF/Xwt.WPFBackend/TreeViewBackend.cs | 2 |
10 files changed, 248 insertions, 130 deletions
diff --git a/Xwt.WPF/Xwt.WPF.csproj b/Xwt.WPF/Xwt.WPF.csproj index 65ee2694..eba086da 100644 --- a/Xwt.WPF/Xwt.WPF.csproj +++ b/Xwt.WPF/Xwt.WPF.csproj @@ -49,6 +49,8 @@ <ItemGroup>
<Compile Include="AssemblyInfo.cs" />
<Compile Include="Xwt.WPFBackend.CellViews\CanvasCellViewBackend.cs" />
+ <Compile Include="Xwt.WPFBackend.CellViews\CanvasCellViewPanel.cs" />
+ <Compile Include="Xwt.WPFBackend.CellViews\CellViewBackend.cs" />
<Compile Include="Xwt.WPFBackend.Interop\NativeStockIcon.cs" />
<Compile Include="Xwt.WPFBackend.Utilities\CellUtil.cs" />
<Compile Include="Xwt.WPFBackend.Utilities\ImageToImageSourceConverter.cs" />
diff --git a/Xwt.WPF/Xwt.WPFBackend.CellViews/CanvasCellViewBackend.cs b/Xwt.WPF/Xwt.WPFBackend.CellViews/CanvasCellViewBackend.cs index 536c3f4d..149ff202 100644 --- a/Xwt.WPF/Xwt.WPFBackend.CellViews/CanvasCellViewBackend.cs +++ b/Xwt.WPF/Xwt.WPFBackend.CellViews/CanvasCellViewBackend.cs @@ -1,115 +1,16 @@ -// -// CanvasCellViewBackend.cs -// -// Author: -// David Karlaš <david.karlas@gmail.com> -// -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -using System; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; using System.Windows; using Xwt.Backends; namespace Xwt.WPFBackend { - class CanvasCellViewBackend : CustomPanel, ICellDataSource - { - public CanvasCellViewBackend() - { - DataContextChanged += OnDataChanged; - } - - void OnDataChanged(object sender, DependencyPropertyChangedEventArgs e) - { - if (e.OldValue != null && e.OldValue is ValuesContainer) - ((ValuesContainer)e.OldValue).PropertyChanged -= CanvasCellRenderer_PropertyChanged; - - if (e.NewValue is ValuesContainer) - { - ((ValuesContainer)DataContext).PropertyChanged += CanvasCellRenderer_PropertyChanged; - } - } - - void CanvasCellRenderer_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) - { - InvalidateMeasure(); - InvalidateVisual(); - } - - public event DependencyPropertyChangedEventHandler CellViewChanged; - - public static readonly DependencyProperty CellViewProperty = - DependencyProperty.Register("CellView", typeof(CanvasCellView), - typeof(CanvasCellViewBackend), new FrameworkPropertyMetadata(new PropertyChangedCallback(OnCellViewChanged))); - - public ICanvasCellViewFrontend CellView - { - get { return (ICanvasCellViewFrontend)GetValue (CellViewProperty); } - set { SetValue(CellViewProperty, value); } - } - - public static void OnCellViewChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) - { - var sl = sender as CanvasCellViewBackend; - if (sl != null) - sl.RaiseCellViewChangedEvent(e); - } - - private void RaiseCellViewChangedEvent(DependencyPropertyChangedEventArgs e) - { - if (this.CellViewChanged != null) - this.CellViewChanged(this, e); - } - - protected override void OnRender(System.Windows.Media.DrawingContext dc) - { - base.OnRender(dc); - CellView.Initialize(this); - CellView.ApplicationContext.InvokeUserCode (delegate - { - DrawingContext ctx = new DrawingContext(dc, 1); - CellView.Draw (ctx, new Rectangle (this.RenderTransform.Value.OffsetX, this.RenderTransform.Value.OffsetY, this.RenderSize.Width, this.RenderSize.Height)); - }); - } - - protected override System.Windows.Size MeasureOverride(System.Windows.Size constraint) - { - var size = new System.Windows.Size(); - CellView.Initialize (this); - CellView.ApplicationContext.InvokeUserCode (delegate - { - var s = CellView.GetRequiredSize (); - size = new System.Windows.Size(s.Width, s.Height); - }); - if (size.Width > constraint.Width) - size.Width = constraint.Width; - if (size.Height > constraint.Height) - size.Height = constraint.Height; - return size; - } - - public object GetValue(IDataField field) - { - if (DataContext == null) - return null; - return ((ValuesContainer)DataContext)[field.Index]; - } - } + class CanvasCellViewBackend: CellViewBackend, ICanvasCellViewBackend + { + public void QueueDraw() + { + } + } } - diff --git a/Xwt.WPF/Xwt.WPFBackend.CellViews/CanvasCellViewPanel.cs b/Xwt.WPF/Xwt.WPFBackend.CellViews/CanvasCellViewPanel.cs new file mode 100644 index 00000000..cdbe7904 --- /dev/null +++ b/Xwt.WPF/Xwt.WPFBackend.CellViews/CanvasCellViewPanel.cs @@ -0,0 +1,108 @@ +// +// CanvasCellViewBackend.cs +// +// Author: +// David Karlaš <david.karlas@gmail.com> +// +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +using System; +using System.Windows; +using Xwt.Backends; + +namespace Xwt.WPFBackend +{ + class CanvasCellViewPanel : CustomPanel + { + public CanvasCellViewPanel() + { + DataContextChanged += OnDataChanged; + } + + void OnDataChanged(object sender, DependencyPropertyChangedEventArgs e) + { + if (e.OldValue != null && e.OldValue is ValuesContainer) + ((ValuesContainer)e.OldValue).PropertyChanged -= CanvasCellRenderer_PropertyChanged; + + if (e.NewValue is ValuesContainer) + { + ((ValuesContainer)DataContext).PropertyChanged += CanvasCellRenderer_PropertyChanged; + } + } + + void CanvasCellRenderer_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) + { + InvalidateMeasure(); + InvalidateVisual(); + } + + public event DependencyPropertyChangedEventHandler CellViewChanged; + + public static readonly DependencyProperty CellViewBackendProperty = + DependencyProperty.Register("CellViewBackend", typeof(CellViewBackend), + typeof(CanvasCellViewPanel), new FrameworkPropertyMetadata(new PropertyChangedCallback(OnCellViewChanged))); + + public CellViewBackend CellViewBackend + { + get { return (CellViewBackend)GetValue(CellViewBackendProperty); } + set { SetValue(CellViewBackendProperty, value); } + } + + public static void OnCellViewChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) + { + var sl = sender as CanvasCellViewPanel; + if (sl != null) + sl.RaiseCellViewChangedEvent(e); + } + + private void RaiseCellViewChangedEvent(DependencyPropertyChangedEventArgs e) + { + if (this.CellViewChanged != null) + this.CellViewChanged(this, e); + } + + protected override void OnRender(System.Windows.Media.DrawingContext dc) + { + base.OnRender(dc); + CellViewBackend.Load (this); + CellViewBackend.ApplicationContext.InvokeUserCode(delegate + { + DrawingContext ctx = new DrawingContext(dc, 1); + ((ICanvasCellViewFrontend)CellViewBackend.CellView).Draw(ctx, new Rectangle(this.RenderTransform.Value.OffsetX, this.RenderTransform.Value.OffsetY, this.RenderSize.Width, this.RenderSize.Height)); + }); + } + + protected override System.Windows.Size MeasureOverride(System.Windows.Size constraint) + { + var size = new System.Windows.Size(); + CellViewBackend.Load(this); + CellViewBackend.ApplicationContext.InvokeUserCode(delegate + { + var s = ((ICanvasCellViewFrontend)CellViewBackend.CellView).GetRequiredSize(); + size = new System.Windows.Size(s.Width, s.Height); + }); + if (size.Width > constraint.Width) + size.Width = constraint.Width; + if (size.Height > constraint.Height) + size.Height = constraint.Height; + return size; + } + } +} + diff --git a/Xwt.WPF/Xwt.WPFBackend.CellViews/CellViewBackend.cs b/Xwt.WPF/Xwt.WPFBackend.CellViews/CellViewBackend.cs new file mode 100644 index 00000000..2d37b501 --- /dev/null +++ b/Xwt.WPF/Xwt.WPFBackend.CellViews/CellViewBackend.cs @@ -0,0 +1,83 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows; +using Xwt.Backends; + +namespace Xwt.WPFBackend +{ + class CellViewBackend : ICellViewBackend, ICellDataSource + { + FrameworkElement currentElement; + + public CellViewBackend() + { + } + + public void Initialize(CellView cellView, FrameworkElementFactory factory) + { + CellView = cellView; + } + + public void Load (FrameworkElement elem) + { + currentElement = elem; + CellFrontend.Load(this); + } + + public CellView CellView { get; set; } + + public ApplicationContext ApplicationContext { get; set; } + + public ICellViewFrontend CellFrontend + { + get { return CellView; } + } + + public Rectangle CellBounds + { + get { + return new Rectangle(0, 0, currentElement.ActualWidth, currentElement.ActualHeight); + } + } + + public Rectangle BackgroundBounds + { + get + { + return new Rectangle(0, 0, currentElement.ActualWidth, currentElement.ActualHeight); + } + } + + public bool Selected + { + get { return false; } + } + + public bool HasFocus + { + get { return false; } + } + + public void InitializeBackend(object frontend, ApplicationContext context) + { + ApplicationContext = context; + } + + public void EnableEvent(object eventId) + { + } + + public void DisableEvent(object eventId) + { + } + + public object GetValue(IDataField field) + { + if (currentElement.DataContext == null) + return null; + return ((ValuesContainer)currentElement.DataContext)[field.Index]; + } + } +} diff --git a/Xwt.WPF/Xwt.WPFBackend.Utilities/CellUtil.cs b/Xwt.WPF/Xwt.WPFBackend.Utilities/CellUtil.cs index ffee6747..6fcb40df 100644 --- a/Xwt.WPF/Xwt.WPFBackend.Utilities/CellUtil.cs +++ b/Xwt.WPF/Xwt.WPFBackend.Utilities/CellUtil.cs @@ -28,6 +28,7 @@ using System; using System.Windows; using System.Windows.Controls; using System.Windows.Data; +using Xwt.Backends; using SWC = System.Windows.Controls; using SWM = System.Windows.Media; @@ -35,24 +36,25 @@ namespace Xwt.WPFBackend.Utilities { public static class CellUtil { - internal static FrameworkElementFactory CreateBoundColumnTemplate (CellViewCollection views, string dataPath = ".") + internal static FrameworkElementFactory CreateBoundColumnTemplate (Widget parent, CellViewCollection views, string dataPath = ".") { if (views.Count == 1) - return CreateBoundCellRenderer (views [0], dataPath); + return CreateBoundCellRenderer(parent, views[0], dataPath); FrameworkElementFactory container = new FrameworkElementFactory (typeof (StackPanel)); - container.SetValue (StackPanel.OrientationProperty, Orientation.Horizontal); + container.SetValue (StackPanel.OrientationProperty, System.Windows.Controls.Orientation.Horizontal); foreach (CellView view in views) { - container.AppendChild (CreateBoundCellRenderer (view, dataPath)); + container.AppendChild(CreateBoundCellRenderer(parent, view, dataPath)); } return container; } private static readonly Thickness CellMargins = new Thickness (2); - internal static FrameworkElementFactory CreateBoundCellRenderer (CellView view, string dataPath = ".") + internal static FrameworkElementFactory CreateBoundCellRenderer (Widget parent, CellView view, string dataPath = ".") { + ICellViewFrontend fr = view; TextCellView textView = view as TextCellView; if (textView != null) { // if it's an editable textcontrol, use a TextBox, if not use a TextBlock. Reason for this is that @@ -91,6 +93,9 @@ namespace Xwt.WPFBackend.Utilities } } + var cb = new CellViewBackend(); + cb.Initialize(view, factory); + fr.AttachBackend(parent, cb); return factory; } @@ -106,18 +111,23 @@ namespace Xwt.WPFBackend.Utilities factory.SetBinding (ImageBox.ImageSourceProperty, binding); } - return factory; + var cb = new CellViewBackend(); + cb.Initialize(view, factory); + fr.AttachBackend(parent, cb); + return factory; } CanvasCellView canvasView = view as CanvasCellView; if (canvasView != null) { - FrameworkElementFactory factory = new FrameworkElementFactory(typeof(CanvasCellViewBackend)); + var cb = new CanvasCellViewBackend(); + FrameworkElementFactory factory = new FrameworkElementFactory(typeof(CanvasCellViewPanel)); factory.SetValue(FrameworkElement.MarginProperty, CellMargins); + factory.SetValue(CanvasCellViewPanel.CellViewBackendProperty, cb); - factory.SetValue(CanvasCellViewBackend.CellViewProperty, view); - - return factory; + cb.Initialize(view, factory); + fr.AttachBackend(parent, cb); + return factory; } CheckBoxCellView cellView = view as CheckBoxCellView; @@ -140,7 +150,10 @@ namespace Xwt.WPFBackend.Utilities factory.SetBinding(SWC.CheckBox.IsCheckedProperty, new Binding(dataPath + "[" + cellView.ActiveField.Index + "]")); } - return factory; + var cb = new CellViewBackend(); + cb.Initialize(view, factory); + fr.AttachBackend(parent, cb); + return factory; } throw new NotImplementedException (); diff --git a/Xwt.WPF/Xwt.WPFBackend/ComboBoxBackend.cs b/Xwt.WPF/Xwt.WPFBackend/ComboBoxBackend.cs index 0921c8f7..9b0e6c90 100644 --- a/Xwt.WPF/Xwt.WPFBackend/ComboBoxBackend.cs +++ b/Xwt.WPF/Xwt.WPFBackend/ComboBoxBackend.cs @@ -144,12 +144,12 @@ namespace Xwt.WPFBackend spFactory.SetValue (StackPanel.OrientationProperty, WindowsOrientation.Horizontal); foreach (var view in views) { - spFactory.AppendChild (CellUtil.CreateBoundCellRenderer (view)); + spFactory.AppendChild(CellUtil.CreateBoundCellRenderer(Frontend, view)); } root = spFactory; } else { - root = CellUtil.CreateBoundCellRenderer (views [0]); + root = CellUtil.CreateBoundCellRenderer(Frontend, views[0]); } template.VisualTree = root; diff --git a/Xwt.WPF/Xwt.WPFBackend/ListBoxBackend.cs b/Xwt.WPF/Xwt.WPFBackend/ListBoxBackend.cs index 39135966..f02647d6 100644 --- a/Xwt.WPF/Xwt.WPFBackend/ListBoxBackend.cs +++ b/Xwt.WPF/Xwt.WPFBackend/ListBoxBackend.cs @@ -77,7 +77,7 @@ namespace Xwt.WPFBackend public void SetViews (CellViewCollection views) { ListBox.DisplayMemberPath = null; - ListBox.ItemTemplate = new DataTemplate { VisualTree = CellUtil.CreateBoundColumnTemplate (views) }; + ListBox.ItemTemplate = new DataTemplate { VisualTree = CellUtil.CreateBoundColumnTemplate(Frontend, views) }; } public void SetSource (IListDataSource source, IBackend sourceBackend) diff --git a/Xwt.WPF/Xwt.WPFBackend/ListViewBackend.cs b/Xwt.WPF/Xwt.WPFBackend/ListViewBackend.cs index 9a4b3973..ef7dbd41 100644 --- a/Xwt.WPF/Xwt.WPFBackend/ListViewBackend.cs +++ b/Xwt.WPF/Xwt.WPFBackend/ListViewBackend.cs @@ -116,9 +116,9 @@ namespace Xwt.WPFBackend public object AddColumn (ListViewColumn col) { var column = new GridViewColumn (); - column.CellTemplate = new DataTemplate { VisualTree = CellUtil.CreateBoundColumnTemplate (col.Views) }; + column.CellTemplate = new DataTemplate { VisualTree = CellUtil.CreateBoundColumnTemplate (Frontend, col.Views) }; if (col.HeaderView != null) - column.HeaderTemplate = new DataTemplate { VisualTree = CellUtil.CreateBoundCellRenderer (col.HeaderView) }; + column.HeaderTemplate = new DataTemplate { VisualTree = CellUtil.CreateBoundCellRenderer (Frontend, col.HeaderView) }; else column.Header = col.Title; @@ -135,9 +135,9 @@ namespace Xwt.WPFBackend public void UpdateColumn (ListViewColumn col, object handle, ListViewColumnChange change) { var column = (GridViewColumn) handle; - column.CellTemplate = new DataTemplate { VisualTree = CellUtil.CreateBoundColumnTemplate (col.Views) }; + column.CellTemplate = new DataTemplate { VisualTree = CellUtil.CreateBoundColumnTemplate(Frontend, col.Views) }; if (col.HeaderView != null) - column.HeaderTemplate = new DataTemplate { VisualTree = CellUtil.CreateBoundCellRenderer (col.HeaderView) }; + column.HeaderTemplate = new DataTemplate { VisualTree = CellUtil.CreateBoundCellRenderer(Frontend, col.HeaderView) }; else column.Header = col.Title; } @@ -234,5 +234,16 @@ namespace Xwt.WPFBackend } private static readonly Setter HideHeadersSetter = new Setter (UIElement.VisibilityProperty, Visibility.Collapsed); - } + + + public int GetRowAtPosition(Point p) + { + throw new NotImplementedException(); + } + + public Rectangle GetCellBounds(int row, CellView cell, bool includeMargin) + { + throw new NotImplementedException(); + } + } } diff --git a/Xwt.WPF/Xwt.WPFBackend/ScrollAdjustmentBackend.cs b/Xwt.WPF/Xwt.WPFBackend/ScrollAdjustmentBackend.cs index 12a7ae5a..b337a796 100644 --- a/Xwt.WPF/Xwt.WPFBackend/ScrollAdjustmentBackend.cs +++ b/Xwt.WPF/Xwt.WPFBackend/ScrollAdjustmentBackend.cs @@ -61,7 +61,7 @@ namespace Xwt.WPFBackend public void Initialize(IScrollAdjustmentEventSink eventSink) { - eventSink = eventSink; + this.eventSink = eventSink; } public void Initialize (IScrollControlEventSink eventSink) diff --git a/Xwt.WPF/Xwt.WPFBackend/TreeViewBackend.cs b/Xwt.WPF/Xwt.WPFBackend/TreeViewBackend.cs index b8a56c08..c1f4aff6 100644 --- a/Xwt.WPF/Xwt.WPFBackend/TreeViewBackend.cs +++ b/Xwt.WPF/Xwt.WPFBackend/TreeViewBackend.cs @@ -205,7 +205,7 @@ namespace Xwt.WPFBackend break; case ListViewColumnChange.Cells: - var cellTemplate = CellUtil.CreateBoundColumnTemplate (column.Views); + var cellTemplate = CellUtil.CreateBoundColumnTemplate(Frontend, column.Views); col.CellTemplate = new DataTemplate { VisualTree = cellTemplate }; |