public void OnAttractedEdge(IAttractable attractable, AttractedEdge edge, double time, double duration)
            {
                TimelineClipGUI timelineClipGUI = attractable as TimelineClipGUI;

                if (timelineClipGUI != null)
                {
                    TimelineClip clip = timelineClipGUI.clip;
                    if (edge == AttractedEdge.Right)
                    {
                        clip.duration = time - clip.start;
                        clip.duration = Math.Max(clip.duration, TimelineClip.kMinDuration);
                    }
                    else if (edge == AttractedEdge.Left)
                    {
                        double num      = time - clip.start;
                        double newValue = clip.clipIn + num * clip.timeScale;
                        if (DragClipHandle.SetClipIn(clip, newValue, num))
                        {
                            this.m_FrameSnap.Reset();
                        }
                    }
                    else
                    {
                        clip.start    = time;
                        clip.duration = duration;
                    }
                }
            }
 protected virtual void OnMouseDrag(Event evt, TimelineWindow.TimelineState state, TimelineClipHandle handle)
 {
     if (evt.get_modifiers() == 2)
     {
         DragClipHandle.ManipulateBlending(handle, evt, state.timeAreaScale.x);
     }
     else
     {
         if (!this.m_UndoSaved)
         {
             TimelineUndo.PushUndo(handle.clip.parentTrackGUI.track, "Trim Clip");
             this.m_UndoSaved = true;
         }
         float num = evt.get_delta().x / state.timeAreaScale.x;
         if (this.m_Ripple != null)
         {
             this.m_Ripple.Run(num, state);
         }
         ManipulateEdges edges;
         if (handle.direction == TimelineClipHandle.DragDirection.Right)
         {
             double val = this.m_FrameSnap.ApplyOffset(handle.clip.clip.duration, num, state);
             handle.clip.clip.duration = Math.Max(val, TimelineClip.kMinDuration);
             if (handle.clip.clip.SupportsSpeedMultiplier() && evt.get_modifiers() == 1)
             {
                 double num2 = this.m_OriginalDuration / handle.clip.clip.duration;
                 handle.clip.clip.timeScale = this.m_OriginalTimeScale * num2;
             }
             edges = ManipulateEdges.Right;
         }
         else
         {
             double num3 = handle.clip.clip.clipIn / handle.clip.clip.timeScale;
             if (num3 > 0.0 && num3 + (double)num < 0.0)
             {
                 num = (float)(-(float)num3);
             }
             if (this.m_MagnetEngine == null || !this.m_MagnetEngine.isSnapped)
             {
                 double newValue = this.m_FrameSnap.ApplyOffset(num3, num, state) * handle.clip.clip.timeScale;
                 DragClipHandle.SetClipIn(handle.clip.clip, newValue, this.m_FrameSnap.lastOffsetApplied);
             }
             edges = ManipulateEdges.Left;
         }
         if (this.m_MagnetEngine != null && evt.get_modifiers() != 1)
         {
             this.m_MagnetEngine.Snap(evt.get_delta().x, edges);
         }
         handle.clip.clip.duration = Math.Max(handle.clip.clip.duration, TimelineClip.kMinDuration);
     }
 }