using CefSharp; using TweetDuck.Core.Controls; using TweetDuck.Core.Notification; namespace TweetDuck.Core.Handling{ sealed class ContextMenuNotification : ContextMenuBase{ private const CefMenuCommand MenuViewDetail = (CefMenuCommand)26600; private const CefMenuCommand MenuSkipTweet = (CefMenuCommand)26601; private const CefMenuCommand MenuFreeze = (CefMenuCommand)26602; private const CefMenuCommand MenuCopyTweetUrl = (CefMenuCommand)26603; private const CefMenuCommand MenuCopyQuotedTweetUrl = (CefMenuCommand)26604; private readonly FormNotificationBase form; private readonly bool enableCustomMenu; public ContextMenuNotification(FormNotificationBase form, bool enableCustomMenu) : base(form){ this.form = form; this.enableCustomMenu = enableCustomMenu; } public override void OnBeforeContextMenu(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model){ model.Clear(); if (parameters.TypeFlags.HasFlag(ContextMenuType.Selection)){ model.AddItem(CefMenuCommand.Copy, "Copy"); model.AddSeparator(); } base.OnBeforeContextMenu(browserControl, browser, frame, parameters, model); if (enableCustomMenu){ if (form.CanViewDetail){ model.AddItem(MenuViewDetail, "View detail"); } model.AddItem(MenuSkipTweet, "Skip tweet"); model.AddCheckItem(MenuFreeze, "Freeze"); model.SetChecked(MenuFreeze, form.FreezeTimer); if (!string.IsNullOrEmpty(form.CurrentTweetUrl)){ model.AddSeparator(); model.AddItem(MenuCopyTweetUrl, "Copy tweet address"); if (!string.IsNullOrEmpty(form.CurrentQuoteUrl)){ model.AddItem(MenuCopyQuotedTweetUrl, "Copy quoted tweet address"); } } } if (HasDevTools){ AddSeparator(model); AddDebugMenuItems(model); } RemoveSeparatorIfLast(model); form.InvokeAsyncSafe(() => { form.ContextMenuOpen = true; form.AnalyticsFile.NotificationContextMenus.Trigger(); }); } public override bool OnContextMenuCommand(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, CefMenuCommand commandId, CefEventFlags eventFlags){ if (base.OnContextMenuCommand(browserControl, browser, frame, parameters, commandId, eventFlags)){ return true; } switch(commandId){ case MenuSkipTweet: form.InvokeAsyncSafe(form.FinishCurrentNotification); return true; case MenuFreeze: form.InvokeAsyncSafe(() => form.FreezeTimer = !form.FreezeTimer); return true; case MenuViewDetail: form.InvokeSafe(form.ShowTweetDetail); return true; case MenuCopyTweetUrl: SetClipboardText(form, form.CurrentTweetUrl); return true; case MenuCopyQuotedTweetUrl: SetClipboardText(form, form.CurrentQuoteUrl); return true; } return false; } public override void OnContextMenuDismissed(IWebBrowser browserControl, IBrowser browser, IFrame frame){ base.OnContextMenuDismissed(browserControl, browser, frame); form.InvokeAsyncSafe(() => form.ContextMenuOpen = false); } } }