/// <summary> /// プラグインメニューを追加します。 /// </summary> /// <param name="plugin">対象のプラグインを表すIImageBatchPlugin。</param> private void addPluginMenu(Plugins.IImageBatchPlugin plugin) { // Toolボタンに追加 this.tbtBatch.DropDownItems.Add(this.getPluginMenuItem(plugin)); // メニューに追加 this.mniBatch.DropDownItems.Add(this.getPluginMenuItem(plugin)); }
/// <summary> /// プラグインをロードします。 /// </summary> private void loadPlugins() { foreach (var dllPath in Directory.GetFiles(this.PluginPath, "*.dll")) { Assembly asm = null; try { asm = Assembly.LoadFrom(dllPath); } catch (Exception) { // DLL読込エラーは無視 continue; } foreach (var libType in asm.GetTypes()) { // パブリッククラスのみ対象 if (!libType.IsClass) { continue; } if (!libType.IsPublic) { continue; } // IImageBatchPluginをインプリメントしているクラスのみ if (!typeof(Plugins.IImageBatchPlugin).IsAssignableFrom(libType)) { continue; } Plugins.IImageBatchPlugin plugin = null; try { plugin = Activator.CreateInstance(libType) as Plugins.IImageBatchPlugin; if (plugin == null) { continue; } plugin.PluginFolderPath = this.PluginPath; } catch (Exception ex) { // インスタンス化のエラーは無視 Debug.WriteLine(ex.ToString()); continue; } this.addPluginMenu(plugin); } } }
/// <summary> /// プラグイン実行用のToolStripMenuItemを取得します。 /// </summary> /// <param name="plugin">対象のプラグインを表すIImageBatchPlugin。</param> /// <returns>プラグイン実行用のToolStripMenuItem。</returns> private ToolStripMenuItem getPluginMenuItem(Plugins.IImageBatchPlugin plugin) { ToolStripMenuItem pluginMenu = new ToolStripMenuItem(plugin.PluginInformations.MenuText, plugin.PluginInformations.MenuImage, this.pluginMenuItem_Click); pluginMenu.Tag = plugin; pluginMenu.Enabled = false; this.pluginMenuList.Add(pluginMenu); return(pluginMenu); }
/// <summary> /// プラグインを実行します。 /// </summary> /// <param name="plugin">実行するプラグインを表すIImageBatchPlugin。</param> private void execPlugin(Plugins.IImageBatchPlugin plugin) { try { this.Cursor = Cursors.WaitCursor; this.tscMain.Enabled = false; var retList = new List <Plugins.BatchTargetImage>(); var targetList = this.getBatchTargetList(); var targetCount = 0; if (plugin.IsTargetAllFiles) { targetCount = targetList.Count; } else { targetCount = tnvMain.SelectedIndices.Count; } // プログレスバーを表示 if (0 < targetList.Count) { this.showPluginProgress(targetCount); } foreach (var item in targetList) { if (!item.HasError) { // エラーが無い場合のみ retList.AddRange(plugin.Execute(item)); } // プログレスバーをインクリメント this.tpbPlugin.Increment(1); TaskbarManager.Instance.SetProgressValue(this.tpbPlugin.Value, targetCount); } } finally { TaskbarManager.Instance.SetProgressState(TaskbarProgressBarState.NoProgress); this.tpbPlugin.Visible = false; this.tscMain.Enabled = true; this.Cursor = Cursors.Default; } }