private void CreateInfoBar(IVsInfoBarUIFactory factory, IVsWindowFrame frame, string message, ErrorReportingUI[] items) { if (ErrorHandler.Failed(frame.GetProperty((int)__VSFPROPID7.VSFPROPID_InfoBarHost, out var unknown))) { return; } var textSpans = new List<IVsInfoBarTextSpan>() { new InfoBarTextSpan(message) }; // create action item list var actionItems = new List<IVsInfoBarActionItem>(); foreach (var item in items) { switch (item.Kind) { case ErrorReportingUI.UIKind.Button: actionItems.Add(new InfoBarButton(item.Title)); break; case ErrorReportingUI.UIKind.HyperLink: actionItems.Add(new InfoBarHyperlink(item.Title)); break; case ErrorReportingUI.UIKind.Close: break; default: throw ExceptionUtilities.UnexpectedValue(item.Kind); } } var infoBarModel = new InfoBarModel( textSpans, actionItems.ToArray(), KnownMonikers.StatusInformation, isCloseButtonVisible: true); if (!TryCreateInfoBarUI(factory, infoBarModel, out var infoBarUI)) { return; } uint? infoBarCookie = null; var eventSink = new InfoBarEvents(items, () => { // run given onClose action if there is one. items.FirstOrDefault(i => i.Kind == ErrorReportingUI.UIKind.Close).Action?.Invoke(); if (infoBarCookie.HasValue) { infoBarUI.Unadvise(infoBarCookie.Value); } }); infoBarUI.Advise(eventSink, out var cookie); infoBarCookie = cookie; var host = (IVsInfoBarHost)unknown; host.AddInfoBar(infoBarUI); }
public InfoBarEvents(ErrorReportingUI[] items, Action onClose) { Contract.ThrowIfNull(onClose); _items = items; _onClose = onClose; }