<Button Width="12" Height="12" MouseClick="onScrollBack">\r
<Image Margin="1" Path="#go.Images.Icons.updown.svg" SvgSub="up"/>\r
</Button>\r
- <Slider Name="Slider" Width="{Width}" Height="{Height}" Orientation="{Orientation}"/>\r
+ <Slider Name="Slider" Value="{Scroll}" Maximum="{MaximumScroll}" Width="{Width}" Height="{Height}" Orientation="{Orientation}"/>\r
<Button Width="12" Height="12" MouseClick="onScrollForth">\r
<Image Margin="1" Path="#go.Images.Icons.updown.svg" SvgSub="down"/>\r
</Button>\r
TextAlignment="Center" Background="AoEnglish"/>\r
</HorizontalStack>\r
</VerticalStack>\r
-\r
- <Scroller Background="DimGray" Height="350" Width="150" \r
- Margin="5" VerticalScrolling="true">\r
- <VerticalStack Name="colors" VerticalAlignment="Top" Margin="5">\r
- <ProgressBar Name="pbBar2" Width="100" Height="20" Value="50"\r
- BorderWidth="2" BorderColor="White" Foreground="BlueCrayola" Background="DarkGray"/>\r
- </VerticalStack>\r
- </Scroller>\r
-\r
+ <HorizontalStack Height="350" Width="250">\r
+ <Scroller Name="scroller1" Background="DimGray" Height="0" Width="0" \r
+ Margin="5" VerticalScrolling="true">\r
+ <VerticalStack Name="colors" VerticalAlignment="Top" Margin="1">\r
+ <ProgressBar Name="pbBar2" Width="100" Height="20" Value="50"\r
+ BorderWidth="2" BorderColor="White" Foreground="BlueCrayola" Background="DarkGray"/>\r
+ </VerticalStack>\r
+ </Scroller>\r
+ <Scrollbar Name="scrollbar1" Scroll="{../scroller1.ScrollY}" MaximumScroll="{../scroller1.MaximumScroll}"\r
+ Orientation="Vertical" Width="16" />\r
+ </HorizontalStack>\r
</HorizontalStack>\r
\r
<Slider \r
<OutputType>Exe</OutputType>
<RootNamespace>Tests</RootNamespace>
<AssemblyName>Tests</AssemblyName>
- <StartupObject>test2.GOLIBTest_Scrollbar</StartupObject>
+ <StartupObject>test.GOLIBTest_4</StartupObject>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<OutputPath>..\bin\$(configuration)</OutputPath>
<IntermediateOutputPath>obj\$(configuration)</IntermediateOutputPath>
public static void ResolveBinding(DynAttribute binding, object _source)
{
+ object srcGO = _source;
+
Type srcType = _source.GetType ();
Type dstType = binding.Source.GetType ();
MemberInfo miDst = dstType.GetMember (binding.MemberName).FirstOrDefault ();
- MemberInfo miSrc = srcType.GetMember (binding.Value).FirstOrDefault();
+ string[] bindingExp = binding.Value.Split ('/');
+ MemberInfo miSrc;
+ if (bindingExp.Length > 1){
+ int i = 0;
+ srcGO = binding.Source; //starts parsing from current GO
+ while (bindingExp [i] == "..") {
+ srcGO = (srcGO as ILayoutable).Parent as GraphicObject;
+ i++;
+ }
+ string[] bindTrg = bindingExp [i].Split ('.');
+ if (bindTrg.Length == 1)
+ srcType = srcGO.GetType ();
+ else {
+ srcGO = (srcGO as GraphicObject).FindByName (bindTrg [0]);
+ srcType = srcGO.GetType ();
+ }
+ miSrc = srcType.GetMember (bindTrg.LastOrDefault()).FirstOrDefault ();
+ }else
+ miSrc = srcType.GetMember (binding.Value).FirstOrDefault ();
+
#region initialize target with actual value
object srcVal = null;
if (miSrc == null)
- srcVal = _source;//if no member is provided for binding, source raw value is taken
+ srcVal = srcGO;//if no member is provided for binding, source raw value is taken
else {
if (miSrc.MemberType == MemberTypes.Property)
- srcVal = (miSrc as PropertyInfo).GetGetMethod ().Invoke (_source, null);
+ srcVal = (miSrc as PropertyInfo).GetGetMethod ().Invoke (srcGO, null);
else if (miSrc.MemberType == MemberTypes.Field)
- srcVal = (miSrc as FieldInfo).GetValue (_source);
+ srcVal = (miSrc as FieldInfo).GetValue (srcGO);
else
throw new Exception ("unandled source member type for binding");
}
Delegate del = dm.CreateDelegate(ei.EventHandlerType);
MethodInfo addHandler = ei.GetAddMethod ();
//Delegate del = dm.CreateDelegate(typeof(System.EventHandler));
- addHandler.Invoke(_source, new object[] {del});
+ addHandler.Invoke(srcGO, new object[] {del});
}
#region conversions
name = "ToInt32";
else if( targetType == typeof( long ) )
name = "ToInt64";
+ else if( targetType == typeof( double ) )
+ name = "ToDouble";
else if (targetType == typeof (string ) )
return typeof(object).GetMethod("ToString", Type.EmptyTypes);
else
namespace go
{
- public abstract class NumericControl : TemplatedControl
+ public abstract class NumericControl : TemplatedControl, IValueChange
{
#region CTOR
public NumericControl () : base()
\r
Orientation _orientation;\r
Slider _slider;\r
+ double _maximumScroll;\r
+ double _scroll;\r
\r
public Scrollbar() : base()\r
{\r
_slider = this.child.FindByName ("Slider") as Slider;\r
}\r
\r
+ [XmlAttributeAttribute()][DefaultValue(0.0)]\r
+ public virtual double MaximumScroll\r
+ {\r
+ get { return _maximumScroll; }\r
+ set {\r
+ if (_maximumScroll == value)\r
+ return;\r
+ _maximumScroll = value;\r
+ ValueChanged.Raise(this, new ValueChangeEventArgs ("MaximumScroll", _maximumScroll));\r
+ }\r
+ }\r
+ [XmlAttributeAttribute()][DefaultValue(0.0)]\r
+ public virtual double Scroll\r
+ {\r
+ get { return _scroll; }\r
+ set {\r
+ if (_scroll == value)\r
+ return;\r
+ _scroll = value;\r
+ registerForGraphicUpdate ();\r
+ ValueChanged.Raise(this, new ValueChangeEventArgs ("Scroll", _scroll));\r
+ }\r
+ }\r
[XmlAttributeAttribute()][DefaultValue(Orientation.Vertical)]\r
public virtual Orientation Orientation\r
{\r
}\r
public void onScrollBack (object sender, MouseButtonEventArgs e)\r
{\r
- _slider.Value -= _slider.LargeIncrement;\r
+ Scroll -= _slider.LargeIncrement;\r
}\r
public void onScrollForth (object sender, MouseButtonEventArgs e)\r
{\r
- _slider.Value += _slider.LargeIncrement;\r
+ Scroll += _slider.LargeIncrement;\r
}\r
}\r
}\r
\r
namespace go\r
{\r
- public class Scroller : Container\r
+ public class Scroller : Container, IValueChange\r
{\r
+ #region IValueChange implementation\r
+ public event EventHandler<ValueChangeEventArgs> ValueChanged;\r
+ #endregion\r
+\r
bool _verticalScrolling;\r
bool _horizontalScrolling;\r
bool _scrollbarVisible;\r
}\r
set {\r
_scrollX = value;\r
+ ValueChanged.Raise(this, new ValueChangeEventArgs("ScrollX", _scrollX));\r
}\r
}\r
\r
}\r
set {\r
_scrollY = value;\r
+ ValueChanged.Raise(this, new ValueChangeEventArgs("ScrollY", _scrollY));\r
+ }\r
+ }\r
+\r
+ [XmlIgnore]\r
+ public int MaximumScroll {\r
+ get {\r
+ return VerticalScrolling ?\r
+ Child.Slot.Height - ClientRectangle.Height :\r
+ Child.Slot.Width - ClientRectangle.Width; \r
}\r
}\r
\r
}\r
\r
#region GraphicObject Overrides\r
+ protected override void OnLayoutChanges (LayoutingType layoutType)\r
+ {\r
+ base.OnLayoutChanges (layoutType);\r
\r
+ if (_verticalScrolling) {\r
+ if (layoutType == LayoutingType.Height)\r
+ ValueChanged.Raise(this, new ValueChangeEventArgs("MaximumScroll", MaximumScroll)); \r
+ }else if (layoutType == LayoutingType.Width)\r
+ ValueChanged.Raise(this, new ValueChangeEventArgs("MaximumScroll", MaximumScroll)); \r
+ }\r
#endregion\r
\r
#region Mouse handling\r
}\r
protected override void UpdateGraphic ()\r
{\r
- computeCursorPosition();\r
+ if (Maximum > 0)\r
+ computeCursorPosition();\r
base.UpdateGraphic ();\r
}\r
\r
protected override void onDraw (Context gr)\r
{\r
base.onDraw (gr);\r
-\r
+ if (Maximum <= 0)\r
+ return;\r
Rectangle r = ClientRectangle;\r
PointD pStart;\r
PointD pEnd;\r
Rectangle r = rInList;\r
\r
if (sw.VerticalScrolling)\r
- r.Top -= sw.scrollY;\r
+ r.Top -= sw.ScrollY;\r
if (sw.HorizontalScrolling)\r
- r.Left -= sw.scrollX;\r
+ r.Left -= sw.ScrollX;\r
\r
newList.Add(r);\r
}\r
if (sw != null)\r
{\r
if (sw.VerticalScrolling) {\r
- rebasedR.Top -= sw.scrollY;\r
+ rebasedR.Top -= sw.ScrollY;\r
// if (sw.scrollY < 0)\r
// Debug.WriteLine ("..");\r
}if (sw.HorizontalScrolling)\r
- rebasedR.Left -= sw.scrollX;\r
+ rebasedR.Left -= sw.ScrollX;\r
}\r
\r
newList.Add(rebasedR);\r