private void ShowCalls(CallHierarchyExplorerViewManager manager,
                               Func <CallHierarchyFindResult, bool> filter,
                               DeclaredElementInstance <IClrDeclaredElement> start,
                               ShowCallsType callType)
        {
            var text = Text;

            switch (callType)
            {
            case ShowCallsType.INCOMING:
                text += " to " + start.Element.ShortName;
                manager.ShowIncoming(start, text, filter);
                break;

            case ShowCallsType.OUTGOING:
                text += " from " + start.Element.ShortName;
                manager.ShowOutgoing(start, text, filter);
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
        public void Execute(ISolution solution, ITextControl textControl)
        {
            solution.Locks.AssertReadAccessAllowed();

            var text = Text;

            if (!UnityCallGraphUtil.IsCallGraphReady(solution))
            {
                BulbActionUtils.ShowTooltip(text + TooltipSuffix, textControl);
                return;
            }

            if (!solution.GetPsiServices().Caches.WaitForCaches(text))
            {
                return;
            }

            var manager  = CallHierarchyExplorerViewManager.GetInstance(solution);
            var filter   = GetFilter(solution);
            var start    = GetStartElement();
            var callType = CallsType;

            ShowCalls(manager, filter, start, callType);
        }