/// <summary> /// 通过反射创建插件中的命令(ICommand),设置命令的传入参数 /// </summary> /// <typeparam name="TCmdData"></typeparam> /// <param name="plugin"></param> /// <param name="inputData"></param> /// <returns></returns> public static ICommand CreateCommand <TCmdData>(this IPluginItem plugin, TCmdData inputData) { var cmd = Assembly.LoadFrom(plugin.AssemblyPath).CreateInstance(plugin.TypeName) as ICommand <TCmdData>; cmd.InputData = inputData; return(plugin.Command = cmd); }
/// <summary> /// 通过反射创建插件中的命令(ICommand),设置命令的传入参数 /// </summary> /// <typeparam name="TCmdData"></typeparam> /// <param name="plugin"></param> /// <param name="inputData"></param> /// <returns></returns> public static ICommand CreateCommand<TCmdData>(this IPluginItem plugin, TCmdData inputData) { var assemblyPath = FileOpt.GetRootPath(plugin.AssemblyPath); var objCmd = Assembly.LoadFile(assemblyPath).CreateInstance(plugin.TypeName); var cmd = objCmd as ICommand<TCmdData>; cmd.InputData = inputData; return plugin.Command = cmd; }
/// <summary> /// 获取插件图标 /// </summary> /// <param name="plugin"></param> /// <returns></returns> public static Image GetImage(this IPluginItem plugin) { if (!string.IsNullOrWhiteSpace(plugin.IconPath) && !Path.IsPathRooted(plugin.IconPath)) { plugin.IconPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, plugin.IconPath); } var image = File.Exists(plugin.IconPath) ? Image.FromFile(plugin.IconPath) : null; return(image); }
/// <summary> /// 修改插件信息的窗口 /// </summary> /// <param name="plugin"></param> public PluginInfoForm(IPluginItem plugin = null) { InitializeComponent(); this.cmbShortcutKeys.Items.AddRange(Enum.GetNames(typeof(Shortcut))); this.cmbShortcutKeys.SelectedIndex = 0; this.cmbInvokeType.Items.AddRange(EnumDescriptionHelper.GetDescriptions <EPluginInvokeType>()); this.cmbInvokeType.SelectedIndex = 0; if (plugin != null) { Plugin = plugin; } }
/// <summary> /// 将插件作为菜单,创建菜单 /// </summary> /// <param name="plugin">插件</param> /// <param name="form">插件/菜单所在窗口</param> /// <returns></returns> private static ToolStripMenuItem CreateMenuItem(IPluginItem plugin, Form form) { var menuItem = new ToolStripMenuItem { Text = plugin.Text, ToolTipText = plugin.Tips, Tag = plugin, Image = plugin.GetIcon(), ShortcutKeys = string.IsNullOrWhiteSpace(plugin.ShortcutKeys) ? Keys.None : (Keys)Enum.Parse(typeof(Keys), plugin.ShortcutKeys) }; menuItem.Click += (sender, e) => plugin.Command?.Invoke(form); return(menuItem); }
/// <summary> /// 获取插件图标 /// </summary> /// <param name="plugin"></param> /// <param name="imageFolderPath">默认插件图标目录,仅在<see cref="PluginItem.IconPath"/>为相对路径时使用该值</param> /// <returns></returns> public static Bitmap GetIcon(this IPluginItem plugin, string imageFolderPath = null) { var path = plugin.IconPath; if (!string.IsNullOrWhiteSpace(path) && !Path.IsPathRooted(path)) { if (!string.IsNullOrWhiteSpace(imageFolderPath)) path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, imageFolderPath, path); else path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, path); } if (!File.Exists(path)) return null; return GetBitmap.FromFile(path); }
/// <summary> /// 根据插件创建调用插件的<see cref="BarButtonItem"/> /// </summary> /// <typeparam name="TCmdData"></typeparam> /// <param name="plugin"></param> /// <param name="imageCollection"></param> /// <param name="caller"></param> /// <param name="cmdData"></param> /// <returns></returns> private static BarButtonItem PluginToButtonItem <TCmdData>(IPluginItem plugin, ImageCollection imageCollection, object caller, string imageDir, TCmdData cmdData) { var bitmap = plugin.GetIcon(imageDir); int imageIndex = bitmap == null ? -1 : imageCollection.Images.Add(bitmap); var item = new BarButtonItem { Caption = plugin.Text, SuperTip = SuperTipsEx.CreateSuperTips(plugin.Tips, plugin.Text), RibbonStyle = RibbonItemStyles.All, LargeImageIndex = imageIndex, Tag = plugin, Visibility = plugin.Visible ? BarItemVisibility.Always : BarItemVisibility.Never, }; if (!string.IsNullOrWhiteSpace(plugin.ShortcutKeys)) { item.ItemShortcut = new BarShortcut((Keys)Enum.Parse(typeof(Keys), plugin.ShortcutKeys)); } plugin.CreateCommand(cmdData); item.ItemClick += (sender, e) => plugin.Command?.Invoke(caller); return(item); }
private void btnAdd_Click(object sender, EventArgs e) { TreeNode node = tvPlugins.SelectedNode; if (node.Tag is IPluginItem) { IPluginItem pluginItem = (IPluginItem)Activator.CreateInstance(node.Tag.GetType()); ListViewItem lvi = new ListViewItem(pluginItem.Name); lvi.Tag = pluginItem; pluginItem.PreviewTextChanged += p => lvi.Text = string.Format("{0}: {1}", pluginItem.Name, p); if (lvEffects.SelectedIndices.Count > 0) { lvEffects.Items.Insert(lvEffects.SelectedIndices[lvEffects.SelectedIndices.Count - 1] + 1, lvi); } else { lvEffects.Items.Add(lvi); lvEffects.Items[lvEffects.Items.Count - 1].Selected = true; } } UpdatePreview(); }