]> O.S.I.I.S - jp/crow.git/commitdiff
reapply patch from other branch for mouse simplification mouseSimplificationTests
authorJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Sun, 4 Aug 2019 15:29:48 +0000 (17:29 +0200)
committerJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Sun, 4 Aug 2019 15:29:48 +0000 (17:29 +0200)
Crow/Templates/MenuItem.template
Crow/Templates/Popper.template
Crow/src/ExtensionsMethods.cs
Crow/src/GraphicObjects/MenuItem.cs
Crow/src/GraphicObjects/TemplatedGroup.cs
Crow/src/GraphicObjects/TreeView.cs
Crow/src/GraphicObjects/Widget.cs
Crow/src/Interface.cs
CrowIDE/DefaultTemplateOverrides/MenuItem.template

index d33216615f466a8a01ed8609afc8dc96c0ab49df..ae31c8622c9f5e5631c56dc52c8c00c58e75b1ba 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0"?>
 <HorizontalStack>
 <Popper Font="{./Font}" Caption="{./Caption}"  Background="{./Background}" PopDirection="{./PopDirection}"
-       Foreground = "{./Foreground}" CanPop="{./HasChildren}" MouseClick="./onMI_Click"
+       Foreground = "{./Foreground}" CanPop="{./HasChildren}"
        IsPopped="{²./IsOpened}" PopWidth="{./PopWidth}" PopHeight="{./PopHeight}">
        <Template>
                <CheckBox IsChecked="{²./IsPopped}" Caption="{./Caption}" Background="{./Background}" Foreground="{./Foreground}">
index 47c6034c5acd7dfbb5a48ccf6c6074f7aa468240..6b9bef9f3331403ba80b0e4ffcf55b126d3bd214 100755 (executable)
@@ -1,7 +1,7 @@
 <?xml version="1.0"?>
 <CheckBox Caption="{./Caption}" IsChecked="{²./IsPopped}" Foreground="{./Foreground}" Background="{./Background}">
        <Template>
-               <Border Style="ControlBorder" Foreground="{./Foreground}" Background="{./Background}">
+               <Border Style="ControlBorder" Foreground="{./Foreground}" Background="{./Background}" ForwardMouseEvents="true">
                        <HorizontalStack Spacing="1">
                                <Image Style="Icon" Margin="1" Width="9" Height="9"     
                                        MouseEnter="{Background=White}" MouseLeave="{Background=Transparent}"
index ecbc8a7234449f04f7bc74c5f5ded99feef57014..ac0aafd0a45e2c089fbf00e80e094c7f8f3c0a8a 100644 (file)
@@ -190,17 +190,11 @@ namespace Crow
                }
                public static void Raise(this EventHandler handler, object sender, EventArgs e)
                {
-                       if(handler != null)
-                       {
-                               handler(sender, e);
-                       }
+                       handler?.Invoke (sender, e);
                }
                public static void Raise<T>(this EventHandler<T> handler, object sender, T e)
                {
-                       if(handler != null)
-                       {
-                               handler(sender, e);
-                       }
+                       handler?.Invoke (sender, e);
                }
                public static byte[] GetBytes(this string str)
                {
index 7ad9f758986aed3459bf7927e907887ba3c5587a..5cfce44f89bf22ae567ec8887616a05f2a9dcad3 100644 (file)
@@ -141,15 +141,6 @@ namespace Crow
                                mName = "IsEnabled";
                        NotifyValueChanged (mName, e.NewValue);
                }
-               void onMI_Click (object sender, MouseButtonEventArgs e)
-               {
-                       if (command != null) {
-                               command.Execute ();
-                               closeMenu ();
-                       }
-                       if(!IsOpened)
-                               (LogicalParent as Menu).AutomaticOpening = false;
-               }
                protected virtual void onOpen (object sender, EventArgs e){
                        Open.Raise (this, null);
                }
@@ -176,7 +167,18 @@ namespace Crow
                                IsOpened = false;
                        base.onMouseLeave (this, e);
                }
+               public override void onMouseClick (object sender, MouseButtonEventArgs e)
+               {
+                       if (command != null) {
+                               command.Execute ();
+                               closeMenu ();
+                       }
+                       if (hasClick)
+                               base.onMouseClick (sender, e);
 
+                       if (!IsOpened)
+                               (LogicalParent as Menu).AutomaticOpening = false;
+               }
                void closeMenu () {
                        MenuItem tmp = LogicalParent as MenuItem;
                        while (tmp != null) {
index daaedeb40144cfd3e51dd4abb20dfca804ab7272..8b9e15b8675e77fa47993f07cdef38b1380de277 100644 (file)
@@ -455,7 +455,7 @@ namespace Crow
                                page.AddChild (g);
 //                             if (isPaged)
                                g.LogicalParent = this;
-                               g.MouseDown += itemClick;
+                               g.MouseClick += itemClick;
                        }
 
                        if (iTemp.Expand != null && g is Expandable) {
index 9ee8d2c5a7e605bd55a513b02be79b710be3dc7f..af86ab7d9be1f7a1da43a96c7fc69d58a7fc65ab 100644 (file)
@@ -65,8 +65,8 @@ namespace Crow
                internal override void itemClick (object sender, MouseButtonEventArgs e)
                {
                        Widget tmp = sender as Widget;
-                       if (!tmp.HasFocus)
-                               return;
+                       //if (!tmp.HasFocus)
+                       //      return;
                        /*if (selectedItemContainer != null) {
                                selectedItemContainer.Foreground = Color.Transparent;
                                selectedItemContainer.Background = Color.Transparent;
index ea076f827f2fcdcbcd9e1c14a1593d4bedab8422..43310d2d13996904f311397f0952d30ecf3728f4 100644 (file)
@@ -282,20 +282,21 @@ namespace Crow
                Font font = "sans, 10";
                protected Measure width, height;
                int left, top;
-               double cornerRadius = 0;
-               int margin = 0;
-               bool focusable = false;
-               bool hasFocus = false;
-               bool isActive = false;
-               //bool isHover = false;
+               double cornerRadius;
+               int margin;
+               bool focusable ;
+               bool hasFocus;
+               bool isActive;
+               bool isHover;
                bool mouseRepeat;
+               bool forwardMouseEvents;
                protected bool isVisible = true;
                bool isEnabled = true;
                VerticalAlignment verticalAlignment = VerticalAlignment.Center;
                HorizontalAlignment horizontalAlignment = HorizontalAlignment.Center;
                Size maximumSize = "0,0";
                Size minimumSize = "0,0";
-               bool cacheEnabled = false;
+               bool cacheEnabled;
                bool clipToClientRect = true;
                Type dataSourceType;
                protected object dataSource;
@@ -440,7 +441,7 @@ namespace Crow
                /// <summary>Occurs when this object loose focus</summary>
                public event EventHandler Unfocused;
                /// <summary>Occurs when mouse is over</summary>
-               //public event EventHandler Hover;
+               public event EventHandler Hover;
                /// <summary>Occurs when this control is no longer the Hover one</summary>
                //public event EventHandler UnHover;
                /// <summary>Occurs when this object loose focus</summary>
@@ -472,6 +473,9 @@ namespace Crow
                public event EventHandler<DataSourceChangeEventArgs> LogicalParentChanged;
                #endregion
 
+               internal bool hasDoubleClick => MouseDoubleClick != null;
+               internal bool hasClick => MouseClick != null;
+
                #region public properties
                /// <summary>Random value placeholder</summary>
                [DesignCategory ("Divers")]
@@ -748,7 +752,7 @@ namespace Crow
                /// <summary>
                /// true if this control has the pointer hover
                /// </summary>
-               /*[XmlIgnore]public virtual bool IsHover {
+               [XmlIgnore]public virtual bool IsHover {
                        get { return isHover; }
                        set {
                                if (value == isHover)
@@ -757,13 +761,11 @@ namespace Crow
                                isHover = value;
 
                                if (isHover)
-                                       onHover (this, null);
-                               else
-                                       onUnHover (this, null);
+                                       Hover.Raise (this, null);
 
                                NotifyValueChanged ("IsHover", isHover);
                        }
-               }*/
+               }
                /// <summary>
                /// true if holding mouse button down should trigger multiple click events
                /// </summary>
@@ -777,6 +779,19 @@ namespace Crow
                                NotifyValueChanged ("MouseRepeat", mouseRepeat);
                        }
                }
+               /// <summary>
+               /// forward mouse events even if an handle is bound
+               /// </summary>
+               [DesignCategory ("Behaviour")][DefaultValue (false)]
+               public bool ForwardMouseEvents {
+                       get { return forwardMouseEvents; }
+                       set {
+                               if (forwardMouseEvents == value)
+                                       return;
+                               forwardMouseEvents = value;
+                               NotifyValueChanged ("ForwardMouseEvents", forwardMouseEvents);
+                       }
+               }
                bool clearBackground = false;
                /// <summary>
                /// background fill of the control, maybe solid color, gradient, image, or svg
@@ -1665,8 +1680,9 @@ namespace Crow
                        else if (LastPaintedSlot.Width != Slot.Width || LastPaintedSlot.Height != Slot.Height)
                                bmp.SetSize (Slot.Width, Slot.Height);*/
                        bmp?.Dispose ();
+                       //bmp = IFace.surf.CreateSimilar (Content.ColorAlpha, Slot.Width, Slot.Height);
                        bmp = new ImageSurface(Format.Argb32, Slot.Width, Slot.Height);
-                       
+
                        using (Context gr = new Context (bmp)) {
                                gr.Antialias = Interface.Antialias;
                                onDraw (gr);
@@ -1803,20 +1819,19 @@ namespace Crow
                        //to let other control behind have mouse entering
                        if (isDragged)
                                return;
-                       
-                       //bubble event to the top
-                       Widget p = focusParent;
-                       if (p != null)
-                               p.onMouseMove(sender,e);
 
-                       MouseMove.Raise (this, e);
+                       if (MouseMove == null)
+                               focusParent?.onMouseMove (sender, e);
+                       else
+                               MouseMove.Invoke (this, e);
+
                }
                public virtual void onMouseDown(object sender, MouseButtonEventArgs e){
-                       #if DEBUG_FOCUS
+#if DEBUG_FOCUS
                        Debug.WriteLine("MOUSE DOWN => " + this.ToString());
-                       #endif
+#endif
 
-                       if (focusable && !Interface.FocusOnHover) {
+                       /*if (focusable && !Interface.FocusOnHover) {
                                BubblingMouseButtonEventArg be = e as BubblingMouseButtonEventArg;
                                if (be.Focused == null) {
                                        be.Focused = this;
@@ -1824,20 +1839,18 @@ namespace Crow
                                        if (e.Button == MouseButton.Right && contextCommands != null)
                                                IFace.ShowContextMenu (this);                                   
                                }
-                       }
-                       //bubble event to the top
-                       Widget p = focusParent;
-                       if (p != null)
-                               p.onMouseDown(sender,e);
-
-                       MouseDown.Raise (this, e);
+                       }*/
+                       if (MouseDown != null)
+                               MouseDown.Invoke (this, e);
+                       if (MouseDown == null || forwardMouseEvents)
+                               focusParent?.onMouseDown (sender, e);
                }
                public virtual void onMouseUp(object sender, MouseButtonEventArgs e){
-                       #if DEBUG_FOCUS
+#if DEBUG_FOCUS
                        Debug.WriteLine("MOUSE UP => " + this.ToString());
-                       #endif
+#endif
 
-                       if (IFace.DragAndDropOperation != null){
+                       /*if (IFace.DragAndDropOperation != null){
                                if (IFace.DragAndDropOperation.DragSource == this) {
                                        if (IFace.DragAndDropOperation.DropTarget != null)
                                                onDrop (this, IFace.DragAndDropOperation);
@@ -1845,50 +1858,38 @@ namespace Crow
                                                onEndDrag (this, IFace.DragAndDropOperation);
                                        IFace.DragAndDropOperation = null;
                                }
-                       }
+                       }*/
 
-                       //bubble event to the top
-                       Widget p = focusParent;
-                       if (p != null)
-                               p.onMouseUp(sender,e);
+                       if (MouseUp != null)
+                               MouseUp.Invoke (this, e);
+                       if (MouseUp == null || forwardMouseEvents)
+                               focusParent?.onMouseUp (sender, e);
 
-                       MouseUp.Raise (this, e);
                }
                public virtual void onMouseClick(object sender, MouseButtonEventArgs e){
 #if DEBUG_FOCUS
                        Debug.WriteLine("CLICK => " + this.ToString());
 #endif
-            if (MouseClick != null)
-            {
-                MouseClick.Raise(this, e);
-                return;
-            }
-                       Widget p = focusParent;
-                       if (p != null)
-                               p.onMouseClick(sender,e);                       
+                       if (MouseClick != null)
+                               MouseClick.Invoke (this, e);
+                       if (MouseClick == null || forwardMouseEvents)
+                               focusParent?.onMouseClick (sender, e);
                }
                public virtual void onMouseDoubleClick(object sender, MouseButtonEventArgs e){
 #if DEBUG_FOCUS
                        Debug.WriteLine("DOUBLE CLICK => " + this.ToString());
 #endif
-            if (MouseDoubleClick != null)
-            {
-                MouseDoubleClick.Raise(this, e);
-                return;
-            }
-            Widget p = focusParent;
-                       if (p != null)
-                               p.onMouseDoubleClick(sender,e);                 
+                       if (MouseDoubleClick != null)
+                               MouseDoubleClick.Invoke (this, e);
+                       if (MouseDoubleClick == null || forwardMouseEvents)
+                               focusParent?.onMouseDoubleClick (sender, e);
                }
                public virtual void onMouseWheel(object sender, MouseWheelEventArgs e){
-            if (MouseWheelChanged != null)
-            {
-                MouseWheelChanged.Raise(this, e);
-                return;
-            }
-            Widget p = focusParent;
-                       if (p != null)
-                               p.onMouseWheel(sender,e);
+                       if (MouseWheelChanged != null)
+                               MouseWheelChanged.Invoke (this, e);
+                       if (MouseWheelChanged == null || forwardMouseEvents)
+                               focusParent?.onMouseWheel (sender, e);
+
                }
                public virtual void onMouseEnter(object sender, MouseMoveEventArgs e)
                {
@@ -1925,8 +1926,6 @@ namespace Crow
                #endregion
 
                protected virtual void onFocused(object sender, EventArgs e){
-                       if (IFace.FocusedWidget != this)
-                               IFace.FocusedWidget = this;
                        #if DEBUG_FOCUS
                        Debug.WriteLine("Focused => " + this.ToString());
                        #endif
@@ -1938,6 +1937,7 @@ namespace Crow
                        #endif
                        Unfocused.Raise (this, e);
                }
+
                public virtual void onEnable(object sender, EventArgs e){
                        Enabled.Raise (this, e);
                }
@@ -1945,13 +1945,6 @@ namespace Crow
                        Disabled.Raise (this, e);
                }
                protected virtual void onParentChanged(object sender, DataSourceChangeEventArgs e) {
-//                     if (e.NewDataSource != null) {
-//                             if (width == Measure.Inherit)
-//                                     RegisterForLayouting (LayoutingType.Width);
-//                             if (height == Measure.Inherit)
-//                                     RegisterForLayouting (LayoutingType.Height);
-//                     }
-                       
                        ParentChanged.Raise (this, e);
                        if (logicalParent == null)
                                LogicalParentChanged.Raise (this, e);
index d4376a4dc20e641fe379725e414ce6dc80f93e8b..93d9564508f5901eaafd9cb164cbe903ac076a86 100644 (file)
@@ -135,6 +135,11 @@ namespace Crow
                        t.Start ();
                }
                public void Run () {
+                       //load default main.crow if present
+                       try {
+                               Load ("#main.crow").DataSource = this;
+                       } catch { }
+
                        while (running) {
                                ProcessEvents ();
                                Thread.Sleep(1);
@@ -222,8 +227,33 @@ namespace Crow
                }
                #endregion
 
-               public void ProcessEvents() {
+               public void ProcessEvents ()
+               {
+
+                       if (armedClick != null) {
+                               if (lastClickTime.ElapsedMilliseconds > DoubleClick) {
+                                       //cancel double click and 
+                                       armedClick.onMouseClick (armedClick, armedClickEventArgs);
+                                       armedClick = null;
+                               }
+                       }
+
+                       Widget w = _hoverWidget;  //previous hover widget 
+
                        backend.ProcessEvents ();
+
+                       if (!FocusOnHover || (w == _hoverWidget))
+                               return;
+
+                       w = _hoverWidget;
+                       while (w != null) {
+                               if (w.Focusable) {
+                                       FocusedWidget = _hoverWidget;
+                                       break;
+                               }
+                               w = w.focusParent;
+                       }
+
                }
                public void Init () {
                        CultureInfo.DefaultThreadCurrentCulture = System.Globalization.CultureInfo.InvariantCulture;
@@ -246,13 +276,13 @@ namespace Crow
                /// </summary>
                public static string CrowConfigRoot;
                /// <summary>If true, mouse focus is given when mouse is over control</summary>
-               public static bool FocusOnHover = false;
+               public static bool FocusOnHover = true;
                /// <summary> Threshold to catch borders for sizing </summary>
                public static int BorderThreshold = 5;
                /// <summary> delay before tooltip appear </summary>
                public static int ToolTipDelay = 500;
                /// <summary>Double click threshold in milisecond</summary>
-               public static int DoubleClick = 250;//max duration between two mouse_down evt for a dbl clk in milisec.
+               public static int DoubleClick = 240;//max duration between two mouse_down evt for a dbl clk in milisec.
                /// <summary> Time to wait in millisecond before starting repeat loop</summary>
                public static int DeviceRepeatDelay = 700;
                /// <summary> Time interval in millisecond between device event repeat</summary>
@@ -281,21 +311,10 @@ namespace Crow
                /// the ref of this one will be stored in GraphicObject.currentInterface
                /// </summary>
                protected static Interface CurrentInterface;
-               internal Stopwatch clickTimer = new Stopwatch();
-               Widget armedClickSender = null;
-               MouseButtonEventArgs armedClickEvtArgs = null;
-//             internal GraphicObject EligibleForDoubleClick {
-//                     get { return eligibleForDoubleClick; }
-//                     set {
-//                             eligibleForDoubleClick = value;
-//                             clickTimer.Restart ();
-//                     }
-//             }
-               internal void armeClick (Widget sender, MouseButtonEventArgs e){
-                       armedClickSender = sender;
-                       armedClickEvtArgs = e;
-                       clickTimer.Restart ();
-               }
+
+               Stopwatch lastClickTime = new Stopwatch ();
+               Widget armedClick;//store widget with double click on first click
+               MouseButtonEventArgs armedClickEventArgs;
                #endregion
 
                #region Events
@@ -325,7 +344,7 @@ namespace Crow
                /// <summary>resulting bitmap limited to last redrawn part</summary>
                public byte[] dirtyBmp;
                /// <summary>True when host has to repaint Interface</summary>
-               public bool IsDirty = false;
+               public bool IsDirty;
                /// <summary>Coordinate of the dirty bmp on the original bmp</summary>
                public Rectangle DirtyRect;
                /// <summary>Locked for each layouting operation</summary>
@@ -618,8 +637,8 @@ namespace Crow
                                if (_hoverWidget == value)
                                        return;
 
-                               //if (_hoverWidget != null)
-                               //      _hoverWidget.IsHover = false;
+                               if (_hoverWidget != null)
+                                       _hoverWidget.IsHover = false;
 
                                _hoverWidget = value;
 
@@ -684,22 +703,6 @@ namespace Crow
                /// Result: the Interface bitmap is drawn in memory (byte[] bmp) and a dirtyRect and bitmap are available
                /// </summary>
                public void Update(){
-                       if (armedClickSender != null && clickTimer.ElapsedMilliseconds >= Interface.DoubleClick) {
-                               armedClickSender.onMouseClick (armedClickSender, armedClickEvtArgs);                            
-                               armedClickSender = null;
-                       }
-
-                       if (mouseRepeatCount > 0) {
-                               int mc = mouseRepeatCount;
-                               mouseRepeatCount -= mc;
-                               if (_focusedWidget != null) {
-                                       mouseRepeatTriggeredAtLeastOnce = true;
-                                       for (int i = 0; i < mc; i++) {
-                                               _focusedWidget.onMouseDown (this, new BubblingMouseButtonEventArg(Mouse.X, Mouse.Y, MouseButton.Left, true));
-                                       }
-                               }
-                       }
-
                        CrowThread[] tmpThreads;
                        lock (CrowThreads) {
                                tmpThreads = new CrowThread[CrowThreads.Count];
@@ -708,6 +711,16 @@ namespace Crow
                        for (int i = 0; i < tmpThreads.Length; i++)
                                tmpThreads [i].CheckState ();
 
+                       if (mouseRepeatTimer.ElapsedMilliseconds > 0) {
+                               if (_hoverWidget != null && _hoverWidget.MouseRepeat) {
+                                       int repeatCount = (int)mouseRepeatTimer.ElapsedMilliseconds / DeviceRepeatInterval - mouseRepeatCount;
+                                       for (int i = 0; i < repeatCount; i++)
+                                               _hoverWidget.onMouseDown (_hoverWidget, lastMouseDownEvent);
+                                       mouseRepeatCount += repeatCount;
+                               }
+                       } else if (lastMouseDown.ElapsedMilliseconds > DeviceRepeatDelay)
+                               mouseRepeatTimer.Start ();
+
                        if (!Monitor.TryEnter (UpdateMutex))
                                return;
 
@@ -1002,6 +1015,9 @@ namespace Crow
                XCursor cursor = XCursor.Default;
 
                public MouseState Mouse;
+               Stopwatch lastMouseDown = new Stopwatch (), mouseRepeatTimer = new Stopwatch ();
+               int mouseRepeatCount;
+               MouseButtonEventArgs lastMouseDownEvent;
 
                public XCursor MouseCursor {
                        set {
@@ -1016,10 +1032,6 @@ namespace Crow
                /// <returns>true if mouse is in the interface</returns>
                public virtual bool ProcessMouseMove(int x, int y)
                {
-                       /*if (armedClickSender != null) {
-                               //armedClickSender.onMouseClick (armedClickSender, armedClickEvtArgs);
-                               armedClickSender = null;
-                       }*/
                        int deltaX = x - Mouse.X;
                        int deltaY = y - Mouse.Y;
                        Mouse.X = x;
@@ -1027,20 +1039,25 @@ namespace Crow
                        MouseMoveEventArgs e = new MouseMoveEventArgs (x, y, deltaX, deltaY);
                        e.Mouse = Mouse;
 
+                       if (armedClick != null) {
+                               armedClick.onMouseClick (armedClick, armedClickEventArgs);
+                               armedClick = null;
+                       }
+
                        if (ActiveWidget != null && DragAndDropOperation == null) {
                                //TODO, ensure object is still in the graphic tree
                                //send move evt even if mouse move outside bounds
-                               ActiveWidget.onMouseMove (this, e);
+                               _activeWidget.onMouseMove (this, e);
                                return true;
                        }
 
                        if (DragAndDropOperation != null)//drag source cant have hover event, so move has to be handle here
                                DragAndDropOperation.DragSource.onMouseMove (this, e);                  
 
-                       if (HoverWidget != null) {
+                       if (_hoverWidget != null) {
                                resetTooltip ();
                                //check topmost graphicobject first
-                               Widget tmp = HoverWidget;
+                               Widget tmp = _hoverWidget;
                                Widget topc = null;
                                while (tmp is Widget) {
                                        topc = tmp;
@@ -1052,13 +1069,13 @@ namespace Crow
                                        while (i < idxhw) {
                                                if (!GraphicTree [i].isPopup) {
                                                        if (GraphicTree [i].MouseIsIn (e.Position)) {
-                                                               while (HoverWidget != null) {
-                                                                       HoverWidget.onMouseLeave (HoverWidget, e);
-                                                                       HoverWidget = HoverWidget.focusParent;
+                                                               while (_hoverWidget != null) {
+                                                                       _hoverWidget.onMouseLeave (_hoverWidget, e);
+                                                                       HoverWidget = _hoverWidget.focusParent;
                                                                }
 
                                                                GraphicTree [i].checkHoverWidget (e);
-                                                               HoverWidget.onMouseMove (this, e);
+                                                               _hoverWidget.onMouseMove (this, e);
                                                                return true;
                                                        }
                                                }
@@ -1066,23 +1083,22 @@ namespace Crow
                                        }
                                }
 
-                               if (HoverWidget.MouseIsIn (e.Position)) {
-                                       HoverWidget.checkHoverWidget (e);
-                                       HoverWidget.onMouseMove (this, e);
+                               if (_hoverWidget.MouseIsIn (e.Position)) {
+                                       _hoverWidget.checkHoverWidget (e);
+                                       _hoverWidget.onMouseMove (this, e);
                                        return true;
-                               } else {
-                                       HoverWidget.onMouseLeave (HoverWidget, e);
-                                       //seek upward from last focused graph obj's
-                                       while (HoverWidget.focusParent != null) {
-                                               HoverWidget = HoverWidget.focusParent;
-                                               if (HoverWidget.MouseIsIn (e.Position)) {
-                                                       HoverWidget.checkHoverWidget (e);
-                                                       HoverWidget.onMouseMove (this, e);
-                                                       return true;
-                                               } else
-                                                       HoverWidget.onMouseLeave (HoverWidget, e);
+                               } 
+                               _hoverWidget.onMouseLeave (_hoverWidget, e);
+                               //seek upward from last focused graph obj's
+                               while (_hoverWidget.focusParent != null) {
+                                       HoverWidget = _hoverWidget.focusParent;
+                                       if (_hoverWidget.MouseIsIn (e.Position)) {
+                                               _hoverWidget.checkHoverWidget (e);
+                                               _hoverWidget.onMouseMove (_hoverWidget, e);
+                                               return true;
                                        }
-                               }
+                                       _hoverWidget.onMouseLeave (_hoverWidget, e);
+                               }                               
                        }
 
                        //top level graphic obj's parsing
@@ -1093,7 +1109,7 @@ namespace Crow
                                                g.checkHoverWidget (e);
                                                if (g is Window)
                                                        PutOnTop (g);
-                                               HoverWidget.onMouseMove (this, e);
+                                               _hoverWidget.onMouseMove (_hoverWidget, e);
                                                return true;
                                        }
                                }
@@ -1109,26 +1125,45 @@ namespace Crow
                public bool ProcessMouseButtonUp(Crow.MouseButton button)
                {
                        Mouse.DisableBit ((int)button);
+
+                       lastMouseDown.Reset ();
+                       mouseRepeatTimer.Reset ();
+
                        MouseButtonEventArgs e = new MouseButtonEventArgs (button) { Mouse = Mouse };
                        if (_activeWidget == null)
                                return false;
 
-                       if (mouseRepeatThread != null) {
-                               mouseRepeatOn = false;
-                               mouseRepeatThread.Cancel();
+                       _activeWidget.onMouseUp (_activeWidget, e);
+
+                       if (armedClick != null) {
+                               if (lastClickTime.ElapsedMilliseconds <= DoubleClick) {
+                                       armedClick.onMouseDoubleClick (armedClick, armedClickEventArgs);
+                                       ActiveWidget = null;
+                               } else
+                                       armedClick.onMouseClick (armedClick, armedClickEventArgs);
+                               armedClick = null;
                        }
-                       if (!mouseRepeatTriggeredAtLeastOnce) {
-                               if (_activeWidget.MouseIsIn (e.Position))
-                                       armeClick (_activeWidget, e);                           
+
+                       Widget target = _activeWidget;
+                       while (target != null) {
+                               if (target.hasDoubleClick) {
+                                       armedClick = _activeWidget;
+                                       armedClickEventArgs = e;
+                                       lastClickTime.Restart ();
+                                       break;
+                               }
+                               if (target.hasClick) {
+                                       _activeWidget.onMouseClick (_activeWidget, e);
+                                       break;
+                               }
+                               target = target.focusParent;
                        }
-                       mouseRepeatTriggeredAtLeastOnce = false;
-                       _activeWidget.onMouseUp (_activeWidget, e);
 
-//                     GraphicObject lastActive = _activeWidget;
+                       //                      GraphicObject lastActive = _activeWidget;
                        ActiveWidget = null;
-//                     if (!lastActive.MouseIsIn (Mouse.Position)) {
-//                             ProcessMouseMove (Mouse.X, Mouse.Y);
-//                     }
+                       //                      if (!lastActive.MouseIsIn (Mouse.Position)) {
+                       //                              ProcessMouseMove (Mouse.X, Mouse.Y);
+                       //                      }
                        return true;
                }
                /// <summary>
@@ -1139,7 +1174,10 @@ namespace Crow
                public bool ProcessMouseButtonDown(Crow.MouseButton button)
                {
                        Mouse.EnableBit ((int)button);
-                       MouseButtonEventArgs e = new MouseButtonEventArgs (button) { Mouse = Mouse };
+                       lastMouseDown.Start ();
+                       mouseRepeatCount = 0;
+
+                       lastMouseDownEvent = new MouseButtonEventArgs (button) { Mouse = Mouse };
 
                        if (HoverWidget == null)
                                return false;
@@ -1152,29 +1190,13 @@ namespace Crow
                                        break;
                                }
                        }
-                       if (hoverFocused == armedClickSender) {
-                               if (clickTimer.ElapsedMilliseconds < Interface.DoubleClick) {
-                                       armedClickSender.onMouseDoubleClick (armedClickSender, e);
-                                       armedClickSender = null;
-                                       return true;
-                               }
-                                       
-                       }
-                       if (armedClickSender!=null)
-                               armedClickSender.onMouseClick (armedClickSender, armedClickEvtArgs);                            
-                       armedClickSender = null;
-
-                       HoverWidget.onMouseDown(HoverWidget,new BubblingMouseButtonEventArg(e));
 
-                       if (FocusedWidget == null)
-                               return true;
+                       _hoverWidget.onMouseDown (_hoverWidget, lastMouseDownEvent);
 
-                       ActiveWidget = FocusedWidget;
+                       /*if (_focusedWidget == null)
+                               return true;*/
 
-                       if (!FocusedWidget.MouseRepeat)
-                               return true;
-                       mouseRepeatThread = new CrowThread (FocusedWidget, mouseRepeatThreadFunc);                      
-                       mouseRepeatThread.Start ();
+                       ActiveWidget = _hoverWidget;
                        return true;
                }
                /// <summary>
@@ -1285,21 +1307,10 @@ namespace Crow
                #endregion
 
                #region Device Repeat Events
-               volatile bool mouseRepeatOn, keyboardRepeatOn, mouseRepeatTriggeredAtLeastOnce = false;
-               volatile int mouseRepeatCount, keyboardRepeatCount;
-               CrowThread mouseRepeatThread, keyboardRepeatThread;
+               volatile bool keyboardRepeatOn;
+               volatile int keyboardRepeatCount;
                KeyEventArgs lastKeyDownEvt;
-               void mouseRepeatThreadFunc()
-               {
-                       mouseRepeatOn = true;
-                       mouseRepeatTriggeredAtLeastOnce = false;
-                       Thread.Sleep (Interface.DeviceRepeatDelay);
-                       while (mouseRepeatOn&!mouseRepeatThread.cancelRequested) {
-                               mouseRepeatCount++;
-                               Thread.Sleep (Interface.DeviceRepeatInterval);
-                       }
-                       mouseRepeatCount = 0;
-               }
+
                void keyboardRepeatThreadFunc()
                {
                        keyboardRepeatOn = true;
index bf01f99ddbb867e8e1fa4c29e347028d1b016b1c..2ed8496a0f941b65d70b8b1b9ac9896f2d0d7927 100644 (file)
@@ -1,11 +1,11 @@
 <?xml version="1.0"?>
 <Popper Font="{./Font}" Caption="{./Caption}"  Background="{./Background}" PopDirection="{./PopDirection}"
-       Foreground = "{./Foreground}" CanPop="{./HasChildren}" MouseClick="./onMI_Click"
+       Foreground = "{./Foreground}" CanPop="{./HasChildren}"
        IsPopped="{²./IsOpened}" PopWidth="{./PopWidth}" PopHeight="{./PopHeight}" IsEnabled="{./IsEnabled}">
        <Template>
                <CheckBox IsChecked="{²./IsPopped}" Caption="{./Caption}" Background="{./Background}" Foreground="{./Foreground}">
                        <Template>
-                               <Border Name="border1"
+                               <Border Name="border1" ForwardMouseEvents="true"
                                                MouseEnter="{Foreground=vgradient|0:White|0.2:Grey|0.9:Grey|1:Black}"
                                                MouseLeave="{Foreground=Transparent}"
                                                MouseDown="{Foreground=vgradient|0:Black|0.05:Grey|0.85:Grey|1:White}"