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

github.com/mono/xwt.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLluis Sanchez Gual <lluis@xamarin.com>2014-02-19 22:16:23 +0400
committerLluis Sanchez Gual <lluis@xamarin.com>2014-02-19 22:16:23 +0400
commit2fb9b0ad97837a640379e39494b2a12437cd45a5 (patch)
tree83aee064ded7956896fb98a7225ef0bd2bf5b33d /Xwt.WPF
parent659fd666489b32587c5845aec1574cb3146f6f7a (diff)
parentea3ca3beffac204cfe7509af5a5498996a274f96 (diff)
Merge branch 'new-scroll-properties'
Diffstat (limited to 'Xwt.WPF')
-rw-r--r--Xwt.WPF/Xwt.WPF.csproj1
-rw-r--r--Xwt.WPF/Xwt.WPFBackend/ListBoxBackend.cs20
-rw-r--r--Xwt.WPF/Xwt.WPFBackend/ListViewBackend.cs24
-rw-r--r--Xwt.WPF/Xwt.WPFBackend/ScrollAdjustmentBackend.cs56
-rw-r--r--Xwt.WPF/Xwt.WPFBackend/ScrollControlBackend.cs106
-rw-r--r--Xwt.WPF/Xwt.WPFBackend/ScrollViewBackend.cs20
-rw-r--r--Xwt.WPF/Xwt.WPFBackend/TreeViewBackend.cs20
7 files changed, 232 insertions, 15 deletions
diff --git a/Xwt.WPF/Xwt.WPF.csproj b/Xwt.WPF/Xwt.WPF.csproj
index a6005d52..3d9fdddc 100644
--- a/Xwt.WPF/Xwt.WPF.csproj
+++ b/Xwt.WPF/Xwt.WPF.csproj
@@ -145,6 +145,7 @@
<Compile Include="Xwt.WPFBackend\WindowsSpinButton.xaml.cs" />
<Compile Include="Xwt.WPFBackend\WpfKeyboardHandler.cs" />
<Compile Include="Xwt.WPFBackend\WebViewBackend.cs" />
+ <Compile Include="Xwt.WPFBackend\ScrollControlBackend.cs" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<ItemGroup>
diff --git a/Xwt.WPF/Xwt.WPFBackend/ListBoxBackend.cs b/Xwt.WPF/Xwt.WPFBackend/ListBoxBackend.cs
index f5dc6cbc..39135966 100644
--- a/Xwt.WPF/Xwt.WPFBackend/ListBoxBackend.cs
+++ b/Xwt.WPF/Xwt.WPFBackend/ListBoxBackend.cs
@@ -42,6 +42,16 @@ namespace Xwt.WPFBackend
ListBox.DisplayMemberPath = ".[0]";
}
+ public ScrollViewer ScrollViewer {
+ get {
+ Decorator border = System.Windows.Media.VisualTreeHelper.GetChild(ListBox, 0) as Decorator;
+ if (border != null)
+ return border.Child as ScrollViewer;
+ else
+ return null;
+ }
+ }
+
public ScrollPolicy VerticalScrollPolicy
{
get { return ScrollViewer.GetVerticalScrollBarVisibility (ListBox).ToXwtScrollPolicy(); }
@@ -54,6 +64,16 @@ namespace Xwt.WPFBackend
set { ScrollViewer.SetVerticalScrollBarVisibility (ListBox, value.ToWpfScrollBarVisibility ()); }
}
+ public IScrollControlBackend CreateVerticalScrollControl()
+ {
+ return new ScrollControlBackend(ScrollViewer, true);
+ }
+
+ public IScrollControlBackend CreateHorizontalScrollControl()
+ {
+ return new ScrollControlBackend(ScrollViewer, false);
+ }
+
public void SetViews (CellViewCollection views)
{
ListBox.DisplayMemberPath = null;
diff --git a/Xwt.WPF/Xwt.WPFBackend/ListViewBackend.cs b/Xwt.WPF/Xwt.WPFBackend/ListViewBackend.cs
index 9a271d0a..9a4b3973 100644
--- a/Xwt.WPF/Xwt.WPFBackend/ListViewBackend.cs
+++ b/Xwt.WPF/Xwt.WPFBackend/ListViewBackend.cs
@@ -43,7 +43,17 @@ namespace Xwt.WPFBackend
{
ListView = new ExListView();
ListView.View = this.view;
- }
+ }
+
+ public ScrollViewer ScrollViewer {
+ get {
+ Decorator border = System.Windows.Media.VisualTreeHelper.GetChild(ListView, 0) as Decorator;
+ if (border != null)
+ return border.Child as ScrollViewer;
+ else
+ return null;
+ }
+ }
public ScrollPolicy VerticalScrollPolicy {
get { return ScrollViewer.GetVerticalScrollBarVisibility (this.ListView).ToXwtScrollPolicy (); }
@@ -55,7 +65,17 @@ namespace Xwt.WPFBackend
set { ScrollViewer.SetHorizontalScrollBarVisibility (ListView, value.ToWpfScrollBarVisibility ()); }
}
- private bool borderVisible = true;
+ public IScrollControlBackend CreateVerticalScrollControl()
+ {
+ return new ScrollControlBackend(ScrollViewer, true);
+ }
+
+ public IScrollControlBackend CreateHorizontalScrollControl()
+ {
+ return new ScrollControlBackend(ScrollViewer, false);
+ }
+
+ private bool borderVisible = true;
public bool BorderVisible
{
get { return this.borderVisible; }
diff --git a/Xwt.WPF/Xwt.WPFBackend/ScrollAdjustmentBackend.cs b/Xwt.WPF/Xwt.WPFBackend/ScrollAdjustmentBackend.cs
index 034aa936..12a7ae5a 100644
--- a/Xwt.WPF/Xwt.WPFBackend/ScrollAdjustmentBackend.cs
+++ b/Xwt.WPF/Xwt.WPFBackend/ScrollAdjustmentBackend.cs
@@ -31,7 +31,7 @@ using System.Windows.Controls;
namespace Xwt.WPFBackend
{
internal class ScrollAdjustmentBackend
- : Backend, IScrollAdjustmentBackend
+ : Backend, IScrollAdjustmentBackend, IScrollControlBackend
{
double scrollValue;
double lowerValue;
@@ -39,28 +39,68 @@ namespace Xwt.WPFBackend
double pageIncrement;
double stepIncrement;
double pageSize;
+ bool isVertical;
+ IScrollAdjustmentEventSink eventSink;
+ IScrollControlEventSink controlEventSink;
public CustomScrollViewPort TargetViewport { get; set; }
- public void Initialize (IScrollAdjustmentEventSink eventSink)
+ public ScrollViewer TargetScrollViewer { get; set; }
+
+ public ScrollAdjustmentBackend()
+ {
+ }
+
+ public ScrollAdjustmentBackend (ScrollViewer s, bool isVertical)
+ {
+ TargetScrollViewer = s;
+ this.isVertical = isVertical;
+ scrollValue = 0;
+ lowerValue = 0;
+ }
+
+ public void Initialize(IScrollAdjustmentEventSink eventSink)
{
- EventSink = eventSink;
+ eventSink = eventSink;
+ }
+
+ public void Initialize (IScrollControlEventSink eventSink)
+ {
+ controlEventSink = eventSink;
}
public void SetOffset (double offset)
{
// The offset is relative to 0, it has to be converted to the lower/upper value range
scrollValue = LowerValue + offset;
- Context.InvokeUserCode (EventSink.OnValueChanged);
+ Context.InvokeUserCode (delegate {
+ if (eventSink != null)
+ eventSink.OnValueChanged ();
+ if (controlEventSink != null)
+ controlEventSink.OnValueChanged ();
+ });
}
public double Value
{
get { return scrollValue; }
set {
+ scrollValue = value;
+
// Provide the value to the viewport, which will update
// the ScrollView. The viewport expects an offset starting at 0.
- TargetViewport.SetOffset (this, value - LowerValue);
+ if (TargetViewport != null)
+ TargetViewport.SetOffset(this, value - LowerValue);
+
+ if (upperValue == lowerValue)
+ return;
+
+ var off = (value - lowerValue) / (upperValue - lowerValue);
+
+ if (isVertical)
+ TargetScrollViewer.ScrollToVerticalOffset(TargetScrollViewer.ExtentHeight * off);
+ else
+ TargetScrollViewer.ScrollToVerticalOffset(TargetScrollViewer.ExtentWidth * off);
}
}
@@ -114,11 +154,5 @@ namespace Xwt.WPFBackend
if (TargetViewport != null)
TargetViewport.UpdateCustomExtent ();
}
-
- internal IScrollAdjustmentEventSink EventSink
- {
- get;
- private set;
- }
}
} \ No newline at end of file
diff --git a/Xwt.WPF/Xwt.WPFBackend/ScrollControlBackend.cs b/Xwt.WPF/Xwt.WPFBackend/ScrollControlBackend.cs
new file mode 100644
index 00000000..3c0808ba
--- /dev/null
+++ b/Xwt.WPF/Xwt.WPFBackend/ScrollControlBackend.cs
@@ -0,0 +1,106 @@
+//
+// ScrollControlBackend.cs
+//
+// Author:
+// lluis <>
+//
+// Copyright (c) 2014 lluis
+//
+// 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 Xwt.Backends;
+using System.Windows.Controls;
+
+namespace Xwt.WPFBackend
+{
+ public class ScrollControlBackend: Backend, IScrollControlBackend
+ {
+ double scrollValue;
+ bool isVertical;
+ ScrollViewer targetScrollViewer;
+
+ public ScrollControlBackend()
+ {
+ }
+
+ public ScrollControlBackend (ScrollViewer s, bool isVertical)
+ {
+ targetScrollViewer = s;
+ this.isVertical = isVertical;
+ scrollValue = Value;
+ targetScrollViewer.ScrollChanged += HandleScrollChanged;
+ }
+
+ void HandleScrollChanged (object sender, ScrollChangedEventArgs e)
+ {
+ if (Value != scrollValue) {
+ scrollValue = Value;
+ Context.InvokeUserCode (EventSink.OnValueChanged);
+ }
+ }
+
+ public void Initialize(IScrollControlEventSink eventSink)
+ {
+ EventSink = eventSink;
+ }
+
+ public double Value
+ {
+ get { return isVertical ? targetScrollViewer.VerticalOffset : targetScrollViewer.HorizontalOffset; }
+ set {
+ if (isVertical)
+ targetScrollViewer.ScrollToVerticalOffset(value);
+ else
+ targetScrollViewer.ScrollToVerticalOffset(value);
+ }
+ }
+
+ public double LowerValue
+ {
+ get { return 0; }
+ }
+
+ public double UpperValue
+ {
+ get { return isVertical ? targetScrollViewer.ScrollableHeight : targetScrollViewer.ScrollableWidth; }
+ }
+
+ public double PageIncrement
+ {
+ get { return PageSize; }
+ }
+
+ public double StepIncrement
+ {
+ get { return 1; }
+ }
+
+ public double PageSize
+ {
+ get { return isVertical ? targetScrollViewer.ViewportWidth : targetScrollViewer.ViewportHeight; }
+ }
+
+ internal IScrollControlEventSink EventSink
+ {
+ get;
+ private set;
+ }
+ }
+}
+
diff --git a/Xwt.WPF/Xwt.WPFBackend/ScrollViewBackend.cs b/Xwt.WPF/Xwt.WPFBackend/ScrollViewBackend.cs
index 0a762768..da33c6df 100644
--- a/Xwt.WPF/Xwt.WPFBackend/ScrollViewBackend.cs
+++ b/Xwt.WPF/Xwt.WPFBackend/ScrollViewBackend.cs
@@ -51,6 +51,22 @@ namespace Xwt.WPFBackend
set { ScrollViewer.HorizontalScrollBarVisibility = GetScrollVisibility (value); }
}
+ IScrollControlBackend vscrollControl;
+ public IScrollControlBackend CreateVerticalScrollControl()
+ {
+ if (vscrollControl == null)
+ vscrollControl = new ScrollControlBackend(ScrollViewer, true);
+ return vscrollControl;
+ }
+
+ IScrollControlBackend hscrollControl;
+ public IScrollControlBackend CreateHorizontalScrollControl()
+ {
+ if (hscrollControl == null)
+ hscrollControl = new ScrollControlBackend(ScrollViewer, false);
+ return hscrollControl;
+ }
+
protected override double DefaultNaturalHeight
{
get
@@ -103,8 +119,8 @@ namespace Xwt.WPFBackend
var widget = (WidgetBackend)child;
if (widget.EventSink.SupportsCustomScrolling ()) {
- vbackend = new ScrollAdjustmentBackend ();
- hbackend = new ScrollAdjustmentBackend ();
+ vscrollControl = vbackend = new ScrollAdjustmentBackend ();
+ hscrollControl = hbackend = new ScrollAdjustmentBackend ();
}
ScrollViewer.Content = new CustomScrollViewPort (widget.NativeWidget, vbackend, hbackend);
ScrollViewer.CanContentScroll = true;
diff --git a/Xwt.WPF/Xwt.WPFBackend/TreeViewBackend.cs b/Xwt.WPF/Xwt.WPFBackend/TreeViewBackend.cs
index 0d49c535..b8a56c08 100644
--- a/Xwt.WPF/Xwt.WPFBackend/TreeViewBackend.cs
+++ b/Xwt.WPF/Xwt.WPFBackend/TreeViewBackend.cs
@@ -59,6 +59,16 @@ namespace Xwt.WPFBackend
Tree.SetValue (VirtualizingStackPanel.IsVirtualizingProperty, true);
}
+ public ScrollViewer ScrollViewer {
+ get {
+ Decorator border = System.Windows.Media.VisualTreeHelper.GetChild(Tree, 0) as Decorator;
+ if (border != null)
+ return border.Child as ScrollViewer;
+ else
+ return null;
+ }
+ }
+
public TreePosition CurrentEventRow { get; set; }
public ScrollPolicy VerticalScrollPolicy {
@@ -71,6 +81,16 @@ namespace Xwt.WPFBackend
set { ScrollViewer.SetHorizontalScrollBarVisibility (Tree, value.ToWpfScrollBarVisibility ()); }
}
+ public IScrollControlBackend CreateVerticalScrollControl()
+ {
+ return new ScrollControlBackend(ScrollViewer, true);
+ }
+
+ public IScrollControlBackend CreateHorizontalScrollControl()
+ {
+ return new ScrollControlBackend(ScrollViewer, false);
+ }
+
public TreePosition[] SelectedRows {
get { return Tree.SelectedItems.Cast<TreePosition> ().ToArray (); }
}