// // ScrollingObject.cs // // Author: // Jean-Philippe Bruyère // // Copyright (c) 2013-2017 Jean-Philippe Bruyère // // 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.Xml.Serialization; using System.ComponentModel; using System.Collections; using Cairo; namespace Crow { public class ScrollingObject : GraphicObject { #region CTOR public ScrollingObject ():base() { } #endregion int scrollX, scrollY, maxScrollX, maxScrollY, mouseWheelSpeed; /// /// if true, key stroke are handled in derrived class /// protected bool KeyEventsOverrides = false; /// Horizontal Scrolling Position [XmlAttributeAttribute][DefaultValue(0)] public virtual int ScrollX { get { return scrollX; } set { if (scrollX == value) return; int newS = value; if (newS < 0) newS = 0; else if (newS > maxScrollX) newS = maxScrollX; if (newS == scrollX) return; scrollX = value; NotifyValueChanged ("ScrollX", scrollX); RegisterForGraphicUpdate (); } } /// Vertical Scrolling Position [XmlAttributeAttribute][DefaultValue(0)] public virtual int ScrollY { get { return scrollY; } set { if (scrollY == value) return; int newS = value; if (newS < 0) newS = 0; else if (newS > maxScrollY) newS = maxScrollY; if (newS == scrollY) return; scrollY = value; NotifyValueChanged ("ScrollY", scrollY); RegisterForGraphicUpdate (); } } /// Horizontal Scrolling maximum value [XmlAttributeAttribute][DefaultValue(0)] public virtual int MaxScrollX { get { return maxScrollX; } set { if (maxScrollX == value) return; maxScrollX = value; if (scrollX > maxScrollX) ScrollX = maxScrollX; NotifyValueChanged ("MaxScrollX", maxScrollX); RegisterForGraphicUpdate (); } } /// Vertical Scrolling maximum value [XmlAttributeAttribute][DefaultValue(0)] public virtual int MaxScrollY { get { return maxScrollY; } set { if (maxScrollY == value) return; maxScrollY = value; if (scrollY > maxScrollY) ScrollY = maxScrollY; NotifyValueChanged ("MaxScrollY", maxScrollY); RegisterForGraphicUpdate (); } } /// Mouse Wheel Scrolling multiplier [XmlAttributeAttribute][DefaultValue(1)] public virtual int MouseWheelSpeed { get { return mouseWheelSpeed; } set { if (mouseWheelSpeed == value) return; mouseWheelSpeed = value; NotifyValueChanged ("MouseWheelSpeed", mouseWheelSpeed); } } /// Process scrolling vertically, or if shift is down, vertically public override void onMouseWheel (object sender, MouseWheelEventArgs e) { base.onMouseWheel (sender, e); if (CurrentInterface.Keyboard.IsKeyDown (Key.ShiftLeft)) ScrollX += e.Delta * MouseWheelSpeed; else ScrollY -= e.Delta * MouseWheelSpeed; } /// Process scrolling with arrow keys, home and end keys. public override void onKeyDown (object sender, KeyboardKeyEventArgs e) { base.onKeyDown (sender, e); if (KeyEventsOverrides) return; switch (e.Key) { case Key.Up: ScrollY--; break; case Key.Down: ScrollY++; break; case Key.Left: ScrollX--; break; case Key.Right: ScrollX++; break; case Key.Home: ScrollX = 0; ScrollY = 0; break; case Key.End: ScrollX = MaxScrollX; ScrollY = MaxScrollY; break; } } } }