private void OnTimelineBeginDrag()
        {
            Select();

            Dopesheet.DsAnimationClip clip = Clip;


            IList <Dopesheet.DsKeyframe> selectedKeyframes = clip.SelectedKeyframes;

            if (selectedKeyframes != null && selectedKeyframes.Count > 0)
            {
                BeginRefresh();
            }
            List <Dopesheet.DsKeyframe> keyframesWithUnselectedChildren = new List <Dopesheet.DsKeyframe>();

            for (int i = 0; i < selectedKeyframes.Count; ++i)
            {
                Dopesheet.DsKeyframe selectedKeyframe = selectedKeyframes[i];
                if (HasUnselectedDescendants(selectedKeyframe))
                {
                    Dopesheet.DsKeyframe keyframe = new Dopesheet.DsKeyframe(selectedKeyframe.Row, selectedKeyframe.Col, selectedKeyframe.Value);
                    keyframesWithUnselectedChildren.Add(keyframe);
                }
            }

            clip.AddKeyframes(keyframesWithUnselectedChildren.ToArray());
        }
        private void OnTimelineDrop()
        {
            Dopesheet.DsAnimationClip clip = Clip;

            Dopesheet.DsKeyframe[] selectedKeyframes = clip.SelectedKeyframes.ToArray();
            Dictionary <int, Dopesheet.DsKeyframe> selectedKfDictionary = new Dictionary <int, Dopesheet.DsKeyframe>();

            for (int i = 0; i < selectedKeyframes.Length; ++i)
            {
                Dopesheet.DsKeyframe keyframe = selectedKeyframes[i];
                if (keyframe.Col < 0)
                {
                    keyframe.Col = 0;
                }

                if (keyframe.Col >= m_pointer.ColumnsCount)
                {
                    keyframe.Col = m_pointer.ColumnsCount - 1;
                }

                int key = keyframe.Row.Index * clip.ColsCount + keyframe.Col;
                if (!selectedKfDictionary.ContainsKey(key))
                {
                    selectedKfDictionary.Add(key, keyframe);
                }
            }

            clip.RemoveKeyframes(false, selectedKeyframes);
            clip.ClearSelectedKeyframes();

            clip.AddKeyframes(selectedKfDictionary.Values.ToArray());
            clip.SelectKeyframes(selectedKfDictionary.Values.ToArray());

            clip.Refresh(true, true, true);

            m_renderGraphics = true;
        }