private void HandleEvent()
        {
            var isContext = Event.current.type == EventType.MouseDown && Event.current.button == 1;

            if (!isContext)
            {
                return;
            }

            var contextMenu = new GenericMenu();

            var newTime = (((Event.current.mousePosition.x + XScroll - DisplayArea.x) / DisplayArea.width) * Duration) / XScale;
            USObserverKeyframe overKeyframe = null;

            foreach (var data in cachedObserverRenderData)
            {
                if (data.RenderRect.Contains(Event.current.mousePosition))
                {
                    contextMenu.AddItem(new GUIContent("Remove Observer Keyframe"), false, () => { RemoveKeyframe(data.Keyframe); });
                    contextMenu.AddSeparator("");
                    overKeyframe = data.Keyframe;
                    break;
                }
            }

            var cameras = Resources.FindObjectsOfTypeAll(typeof(Camera)) as Camera[];

            cameras = cameras.OrderBy(camera => camera.name).ToArray();
            foreach (var camera in cameras)
            {
                if (!ObserverTimeline.IsValidCamera(camera))
                {
                    continue;
                }

                var assetPath = AssetDatabase.GetAssetPath(camera.gameObject.transform.root.gameObject);
                if (!string.IsNullOrEmpty(assetPath))
                {
                    continue;
                }

                var cutTransition = Shared.TypeOfTransition.Cut;
                var cutDuration   = Shared.TransitionHelper.DefaultTransitionTimeFor(cutTransition);
                contextMenu.AddItem(new GUIContent(String.Format("Set Camera/Cut/{0}", camera.name)), false, (settingCamera) => SetCamera(overKeyframe, newTime, cutTransition, cutDuration, (Camera)settingCamera), camera);

                var transitions = Enum.GetValues(typeof(Shared.TypeOfTransition)).Cast <Shared.TypeOfTransition>();
                foreach (var transition in transitions)
                {
                    if (transition == Shared.TypeOfTransition.Cut)
                    {
                        continue;
                    }

                    var transitionType     = transition;                 // Keep a local copy of this, so it's safed for our delegate.
                    var transitionDuration = Shared.TransitionHelper.DefaultTransitionTimeFor(transitionType);
                    contextMenu.AddItem(new GUIContent(String.Format("Set Camera/Transition/{0}/{1}", camera.name, transitionType)), false, (settingCamera) => SetCamera(overKeyframe, newTime, transitionType, transitionDuration, (Camera)settingCamera), camera);
                }
            }

            if (DisplayArea.Contains(Event.current.mousePosition))
            {
                Event.current.Use();
                contextMenu.ShowAsContext();
            }
        }
        public void OnGUI()
        {
            if (ObserverTimeline != null && ObserverTimeline.Sequence != null && ObserverTimeline.Sequence.HasSequenceBeenStarted)
            {
                Shared.TransitionHelper.ForceGameViewRepaint();
            }

            GUILayout.Box("", TimelineBackground, GUILayout.MaxHeight(17.0f), GUILayout.ExpandWidth(true));
            if (Event.current.type == EventType.Repaint)
            {
                DisplayArea = GUILayoutUtility.GetLastRect();
            }

            var helperRect = DisplayArea;

            helperRect.y -= 17.0f;

            var validCamerasMessage = string.Empty;

            if (ObserverTimeline.Sequence.RunningTime > 0.0f && Camera.allCameras.Count(camera => ObserverTimeline.IsValidCamera(camera)) > 1)
            {
                validCamerasMessage = " -  You have more than one active camera in your scene, is this intentional?.";
            }

            GUI.Label(helperRect, string.Format("Current Keyframe : {0} {1}", ObserverTimeline.CurrentlyActiveKeyframe != null ? ObserverTimeline.CurrentlyActiveKeyframe.KeyframeCamera.name : "null", validCamerasMessage));

            var sortedKeyframes = cachedObserverRenderData.OrderBy(element => element.Keyframe.FireTime).ToList();

            for (var index = 0; index < sortedKeyframes.Count(); index++)
            {
                var data = sortedKeyframes[index];

                var xPos    = DisplayArea.width * (data.Keyframe.FireTime / Duration);
                var xMaxPos = DisplayArea.width * (data.Keyframe.TransitionDuration / Duration);
                xMaxPos = Mathf.Clamp(xMaxPos, 4.0f, float.MaxValue);

                data.RenderPosition = new Vector2(DisplayArea.x + ((xPos * XScale) - XScroll), DisplayArea.y);
                data.RenderRect     = new Rect((DisplayArea.x + ((xPos * XScale) - XScroll)) - 3.0f, DisplayArea.y, xMaxPos, DisplayArea.height - 1.0f);

                using (new Shared.GUIChangeColor(SelectedObjects.Contains(data.Keyframe) ? Color.yellow : GUI.color))
                {
                    GUI.Box(data.RenderRect, "");

                    var labelRect = data.RenderRect;
                    labelRect.x    += 4.0f;
                    labelRect.width = 1000.0f;
                    GUI.Label(labelRect, data.Keyframe.KeyframeCamera ? data.Keyframe.KeyframeCamera.name : "Null");
                }
            }

            HandleEvent();
        }