public IEnumerable <BufermanMenuItem> GenerateContextMenuItems(BuferContextMenuState buferContextMenuState, IBufermanHost bufermanHost, IBuferTypeMenuGenerator buferTypeMenuGenerator) { var bufer = buferContextMenuState.Bufer; var buferViewModel = bufer.ViewModel; IList <BufermanMenuItem> menuItems = new List <BufermanMenuItem>(); buferContextMenuState.MarkAsPinnedMenuItem.ShortCut = Shortcut.CtrlS; menuItems.Add(buferContextMenuState.MarkAsPinnedMenuItem); var formats = buferContextMenuState.Bufer.ViewModel.Clip.GetFormats(); var formatsMenuItems = new List <BufermanMenuItem>(); foreach (var format in formats) { if (format != ClipboardFormats.CUSTOM_IMAGE_FORMAT && format != ClipboardFormats.FROM_FILE_FORMAT) { var particularFormatMenu = bufermanHost.CreateMenuItem(format); var formatData = buferContextMenuState.Bufer.ViewModel.Clip.GetData(format); if (formatData is Stream) { particularFormatMenu.Text += $" ({Resource.StreamFormat})"; } else if (formatData is string) { particularFormatMenu.Text += $" ({Resource.TextFormat})"; } if (formatData == null) { particularFormatMenu.Enabled = false; } else { var data = formatData.ToString(); if (data.Length > 2300) { data = $"{data.Substring(0, 2000)}{Environment.NewLine}{Environment.NewLine}..."; } particularFormatMenu.AddOnClickHandler((object sender, EventArgs args) => { bufermanHost.UserInteraction.ShowPopup(data, format); }); } formatsMenuItems.Add(particularFormatMenu); } } var formatsMenuItem = bufermanHost.CreateMenuItem(() => Resource.MenuFormats + $" ({formatsMenuItems.Count})"); foreach (var formatMenuItem in formatsMenuItems) { formatsMenuItem.AddMenuItem(formatMenuItem); } menuItems.Add(formatsMenuItem); buferContextMenuState.DeleteBuferMenuItem = bufermanHost.CreateMenuItem(() => Resource.DeleteBuferMenuItem, (object sender, EventArgs args) => { buferContextMenuState.RemoveBufer(); }); menuItems.Add(buferContextMenuState.DeleteBuferMenuItem); buferContextMenuState.PasteMenuItem = bufermanHost.CreateMenuItem(() => Resource.MenuPaste); menuItems.Add(buferContextMenuState.PasteMenuItem); buferContextMenuState.PlaceInBuferMenuItem = bufermanHost.CreateMenuItem(() => Resource.MenuPlaceInBufer, (object sender, EventArgs e) => { this._clipboardWrapper.SetDataObject(buferContextMenuState.Bufer.ViewModel.Clip); }); buferContextMenuState.PlaceInBuferMenuItem.ShortCut = Shortcut.CtrlC; if (bufer.ViewModel.IsChangeTextAvailable) { buferContextMenuState.PasteMenuItem.AddMenuItem(bufermanHost.CreateMenuItem(() => Resource.MenuPasteAsIs + $" {new String('\t', 4)} Enter", (object sender, EventArgs ars) => { new KeyboardEmulator().PressEnter(); })); if (formats.Length != 3 || ClipboardFormats.TextFormats.Any(tf => !formats.Contains(tf))) { var pasteAsTextMenuItem = bufermanHost.CreateMenuItem(() => Resource.MenuPasteAsText, (object sender, EventArgs args) => { var textDataObject = new DataObject(); textDataObject.SetText(buferViewModel.OriginBuferTitle); var oldClip = buferViewModel.Clip; buferViewModel.Clip = textDataObject; var textBuferSelectionHandler = this._buferSelectionHandlerFactory.CreateHandler(bufer, bufermanHost); textBuferSelectionHandler.DoOnClipSelection(sender, args); buferViewModel.Clip = oldClip; }); buferContextMenuState.PasteMenuItem.AddMenuItem(pasteAsTextMenuItem); pasteAsTextMenuItem.ShortCut = Shortcut.CtrlA; } buferContextMenuState.PasteMenuItem.AddMenuItem(bufermanHost.CreateMenuItem(() => Resource.MenuCharByChar, (object sender, EventArgs args) => { bufermanHost.HideWindow(); new KeyboardEmulator().TypeText(buferContextMenuState.Bufer.ViewModel.OriginBuferTitle); })); menuItems.Add(bufermanHost.CreateMenuSeparatorItem()); var editTextMenuItem = bufermanHost.CreateMenuItem(() => Resource.MenuEdit); new EditBuferTextMenuItem(editTextMenuItem, buferContextMenuState, bufermanHost, this._settings, this._clipboardWrapper); menuItems.Add(editTextMenuItem); var returnTextToInitialMenuItem = bufermanHost.CreateMenuItem(() => Resource.MenuReturn); new ReturnToInitialTextMenuItem(returnTextToInitialMenuItem, buferContextMenuState.Bufer, bufermanHost); buferContextMenuState.ReturnTextToInitialMenuItem = returnTextToInitialMenuItem; var changeTextMenuItem = bufermanHost.CreateMenuItem(() => Resource.MenuChange); var ctmi = new ChangeTextMenuItem(changeTextMenuItem, buferContextMenuState.Bufer, bufermanHost, this._settings); if (!string.IsNullOrWhiteSpace(buferViewModel.Alias)) { ctmi.TryChangeText(buferViewModel.Alias); } ctmi.TextChanged += (object sender, TextChangedEventArgs e) => { buferContextMenuState.ReturnTextToInitialMenuItem.Enabled = !e.IsOriginText; }; buferContextMenuState.ChangeTextMenuItem = changeTextMenuItem; menuItems.Add(buferContextMenuState.ChangeTextMenuItem); menuItems.Add(buferContextMenuState.ReturnTextToInitialMenuItem); buferContextMenuState.AddToFileMenuItem = bufermanHost.CreateMenuItem(() => Resource.MenuAddToFile); if (formats.Contains(ClipboardFormats.FROM_FILE_FORMAT)) { buferContextMenuState.MarkMenuItemAsAddedToFile(); } else { var addToDefaultFileMenuItem = bufermanHost.CreateMenuItem(() => Resource.MenuAddToDefaultFile, (object sender, EventArgs args) => { var bufersStorage = this._bufersStorageFactory.CreateStorageByFileExtension( this._fileStorage.CombinePaths( this._fileStorage.DataDirectory, this._settings.DefaultBufersFileName)); var buferItem = buferContextMenuState.Bufer.ViewModel.ToModel(); bufersStorage.SaveBufer(buferItem); buferContextMenuState.MarkMenuItemAsAddedToFile(); }); addToDefaultFileMenuItem.ShortCut = Shortcut.CtrlF; buferContextMenuState.AddToFileMenuItem.AddMenuItem(addToDefaultFileMenuItem); var addToFileMenuItem = bufermanHost.CreateMenuItem(() => Resource.MenuAddToSelectedFile, (object sender, EventArgs args) => { var buferItem = buferContextMenuState.Bufer.ViewModel.ToModel(); this._userFileSelector.TrySelectBufersStorage(storage => storage.SaveBufer(buferItem)); }); buferContextMenuState.AddToFileMenuItem.AddSeparator(); buferContextMenuState.AddToFileMenuItem.AddMenuItem(addToFileMenuItem); } menuItems.Add(buferContextMenuState.AddToFileMenuItem); var loginCredentialsMenuItem = bufermanHost.CreateMenuItem(() => Resource.CreateCredsMenuItem); var clcmi = new CreateLoginCredentialsMenuItem(loginCredentialsMenuItem, buferContextMenuState.Bufer, bufermanHost); clcmi.LoginCreated += (object sender, CreateLoginCredentialsEventArgs e) => { buferContextMenuState.PasteMenuItem.SetTextFunction(() => $"{Resource.LoginWith} {new String('\t', 2)} Enter"); buferContextMenuState.PasteMenuItem.TextRefresh(); buferContextMenuState.ReturnTextToInitialMenuItem.Enabled = false; buferContextMenuState.PlaceInBuferMenuItem.Enabled = false; buferContextMenuState.ChangeTextMenuItem.Enabled = false; buferViewModel.Clip.SetData(ClipboardFormats.PASSWORD_FORMAT, e.Password); if (!buferViewModel.Pinned) { buferContextMenuState.TryTogglePinBufer(sender, e); } buferContextMenuState.RemoveBuferSelectionHandler(); }; buferContextMenuState.CreateLoginDataMenuItem = loginCredentialsMenuItem; menuItems.Add(buferContextMenuState.CreateLoginDataMenuItem); buferContextMenuState.PasteMenuItem.AddSeparator(); buferContextMenuState.PasteMenuItem.AddMenuItem(buferContextMenuState.PlaceInBuferMenuItem); } else { buferContextMenuState.PasteMenuItem.Text += $" {new String('\t', 4)} Enter"; buferContextMenuState.PasteMenuItem.AddOnClickHandler((object sender, EventArgs ars) => { new KeyboardEmulator().PressEnter(); }); menuItems.Add(buferContextMenuState.PlaceInBuferMenuItem); } if (buferTypeMenuGenerator != null) { menuItems = buferTypeMenuGenerator.Generate(menuItems, bufermanHost); } menuItems.Add(bufermanHost.CreateMenuSeparatorItem()); var createdAtMenuItem = bufermanHost.CreateMenuItem(() => string.Format(Resource.MenuCopyingTime, buferViewModel.CreatedAt)); createdAtMenuItem.Enabled = false; menuItems.Add(createdAtMenuItem); return(menuItems); }
public BuferHandlersWrapper( IClipboardBuferService clipboardBuferService, IBuferContextMenuGenerator buferContextMenuGenerator, IBuferSelectionHandlerFactory buferSelectionHandlerFactory, IFileStorage fileStorage, IBufermanHost bufermanHost, IProgramSettingsGetter settingsGetter, IProgramSettingsSetter settingsSetter, IEnumerable<IBufermanPlugin> plugins, IBufer bufer) { this._settingsGetter = settingsGetter; this._settingsSetter = settingsSetter; this._clipboardBuferService = clipboardBuferService; this._bufermanHost = bufermanHost; this._bufer = bufer; this._buferSelectionHandlerFactory = buferSelectionHandlerFactory; this._fileStorage = fileStorage; var formats = this._bufer.ViewModel.Clip.GetFormats(); string buferTitle = null; var clipFiles = this._bufer.ViewModel.Clip.GetData(DataFormats.FileDrop) as string[]; if (clipFiles != null && clipFiles.Length > 0) { var firstFile = clipFiles.First(); var onlyFolders = clipFiles.Select(f => this._fileStorage.GetFileAttributes(f).HasFlag(FileAttributes.Directory)) .All(f => f); if (clipFiles.Length == 1) { buferTitle = this._MakeSpecialBuferText( firstFile.Length < settingsGetter.MaxFilePathLengthForBuferTitle ? firstFile : (onlyFolders ? Resource.FolderBufer : Resource.FileBufer));// TODO (m) these resources are duplicated in BuferMAN.Application project } else { buferTitle = this._MakeSpecialBuferText($"{(onlyFolders ? Resource.FoldersBufer : Resource.FilesBufer)} ({clipFiles.Length})"); } } else { if (formats.Contains(ClipboardFormats.CUSTOM_IMAGE_FORMAT) || formats.Contains(ClipboardFormats.FILE_CONTENTS_FORMAT)) { this._bufer.ApplyFontStyle(FontStyle.Italic | FontStyle.Bold); } } string buferText = buferTitle ?? this._bufer.ViewModel.TextRepresentation; if (string.IsNullOrWhiteSpace(buferText)) { this._bufer.ApplyFontStyle(FontStyle.Italic | FontStyle.Bold); this._bufer.ViewModel.IsChangeTextAvailable = false; if (buferText == null) { if (formats.Any(f => string.Equals(f, ClipboardFormats.VISUAL_STUDIO_PROJECT_ITEMS, StringComparison.InvariantCultureIgnoreCase))) { buferText = "<< VISUAL STUDIO project items >>"; } else { buferText = Resource.NotTextBufer; // TODO (l) maybe track such cases and/or ask user to send info (at least formats list) of this bufer? // Or user can think of some name for this combination of formats } } else { buferText = this._MakeSpecialBuferText($"{buferText.Length} {Resource.WhiteSpaces}"); this._bufer.ViewModel.TooltipTitle = buferText; } } this._bufer.ViewModel.DefaultBackColor = this._bufer.BackColor; buferText = buferText.Trim(); this._bufer.SetText(buferText); this._bufer.ViewModel.OriginBuferTitle = buferText; this._bufer.SetMouseOverToolTip(this._bufer.ViewModel.TextRepresentation); this._bufer.ViewModel.TooltipTitle = this._bufer.ViewModel.TooltipTitle ?? buferTitle; if (!string.IsNullOrWhiteSpace(this._bufer.ViewModel.TooltipTitle)) { this._bufer.MouseOverTooltip.ToolTipTitle = this._bufer.ViewModel.TooltipTitle; this._bufer.FocusTooltip.ToolTipTitle = this._bufer.ViewModel.TooltipTitle; } IBuferTypeMenuGenerator buferTypeMenuGenerator = null; if (Uri.TryCreate(this._bufer.ViewModel.OriginBuferTitle, UriKind.Absolute, out var uriResult) && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps)) { buferTypeMenuGenerator = new HttpUrlBuferMenuGenerator(this._bufer.ViewModel.OriginBuferTitle, this._settingsGetter, this._settingsSetter); } else { var files = this._bufer.ViewModel.Clip.GetData(DataFormats.FileDrop) as string[]; if (files != null && files.Length > 0) { var firstFile = files.First(); if (files.Length == 1) { buferTypeMenuGenerator = new FileBuferMenuGenerator(firstFile); } } } if (formats.Contains(ClipboardFormats.CUSTOM_IMAGE_FORMAT)) { var image = this._bufer.ViewModel.Clip.GetData(ClipboardFormats.CUSTOM_IMAGE_FORMAT) as Image; if (image != null) { this._bufer.ViewModel.Representation = image; this._bufer.MouseOverTooltip.IsBalloon = false; this._bufer.MouseOverTooltip.OwnerDraw = true; this._bufer.MouseOverTooltip.Popup += (object sender, PopupEventArgs e) => { e.ToolTipSize = new Size((int)(image.Width * IMAGE_SCALE), (int)(image.Height * IMAGE_SCALE)); }; this._bufer.MouseOverTooltip.Draw += (object sender, DrawToolTipEventArgs e) => { using (var b = new TextureBrush(new Bitmap(image))) { b.ScaleTransform(IMAGE_SCALE, IMAGE_SCALE); var g = e.Graphics; g.FillRectangle(b, e.Bounds); } }; } } this._bufer.AddOnFocusHandler(this._Bufer_GotFocus); this._bufer.AddOnUnfocusHandler(this._Bufer_LostFocus); var buferSelectionHandler = this._buferSelectionHandlerFactory.CreateHandler(this._bufer, bufermanHost); if (this._settingsGetter.IsBuferClickingExplained) { this._bufer.AddOnClickHandler(buferSelectionHandler.DoOnClipSelection); } else { this._bufer.AddOnClickHandler((object sender, EventArgs e) => { if (this._settingsGetter.IsBuferClickingExplained) { buferSelectionHandler.DoOnClipSelection(sender, e); } else { this._bufermanHost.UserInteraction.ShowPopup(Resource.BuferClickingExplanationText, Application.ProductName); this._settingsSetter.MarkThatBuferClickingWasExplained(); } }); } var buferContextMenuState = new BuferContextMenuState( clipboardBuferService, buferSelectionHandler, bufermanHost, () => Resource.MenuPin, // TODO (m) remove these actions () => Resource.MenuUnpin, () => Resource.MenuAddedToFile, bufer); bufer.ContextMenu = buferContextMenuGenerator.GenerateContextMenuItems(buferContextMenuState, bufermanHost, buferTypeMenuGenerator); foreach (var plugin in plugins) if (plugin.Available && plugin.Enabled) { try { plugin.UpdateBuferItem(buferContextMenuState); } catch (Exception exc) { bufermanHost .UserInteraction .ShowPopup(exc.Message, plugin.Name); } } }