第18回 プラグイン対応 その2

公開日:2018-04-04

1. 内容

1. 概要

外部のDLLに含まれているプラグインを動的に生成できるようにしました。
また、Form などを含めた主要なコントロールを全てプラグイン化して、
動的に画面を構築するようにしました。
これにより、設定ファイルを変更するだけで、
起動時に読み込むプラグインや配置などを変更できるようになります。

2. 動画


3. 説明

1. フォルダ構成

フォルダ構成
    NineCubedMemo.exe
    plugins
    │  startup.ini
    │
    ├─data  ※実行時に動的に作成
    │
    └─define
        ├─NineCubed.Memo.MainFormPlugin
        │  │  NineCubed.Memo.MainFormPlugin.ini
        │  │  
        │  └─data
        │      └─toolbar
        │              new.png
        │              open.png
        │              save.png
        │              
        ├─NineCubed.Memo.Plugins.FileList.FileListPlugin
        │  │  NineCubed.Memo.Plugins.FileList.FileListPlugin.ini
        │  │  
        │  └─data
        │      └─img
        │              opened_folder.png
        │              
        ├─NineCubed.Memo.Plugins.FileTree.FileTreePlugin
        │  │  NineCubed.Memo.Plugins.FileTree.FileTreePlugin.ini
        │  │  
        │  └─data
        │      └─img
        │              cd.png
        │              closed_folder.png
        │              hdd.png
        │              opened_folder.png
        │              removable.png
        │              root.png
        │              
        ├─NineCubed.Memo.Plugins.PluginLoader.PluginLoaderPlugin
        │  │  NineCubed.Memo.Plugins.PluginLoader.PluginLoaderPlugin.ini
        │  │  
        │  └─data
        │          plugin_extension.iniplugin_list.ini
        │          
        ├─NineCubed.Memo.Plugins.Splitter.SplitContainerPlugin
        │      NineCubed.Memo.Plugins.Splitter.SplitContainerPlugin.ini
        │      
        ├─NineCubed.Memo.Plugins.Tab.TabPlugin
        │      NineCubed.Memo.Plugins.Tab.TabPlugin.ini
        │      
        ├─NineCubed.Memo.Plugins.Test.TestPlugin
        │      NineCubed.Memo.Plugins.Test.TestPlugin.ini
        │      
        └─NineCubed.Memo.Plugins.TextEditor.TextEditorPlugin
                NineCubed.Memo.Plugins.TextEditor.TextEditorPlugin.ini

2. startup.ini

最初に起動するプラグインを定義します。
これにより、現在はプラグインローダーを指定していますが、
異なるプラグインローダーに変更することも可能です。
startup.ini
[startup]
class_name=NineCubed.Memo.Plugins.PluginLoader.PluginLoaderPlugin

3. プラグイン定義ファイル

プラグインがどのDLL、EXEに含まれるかを定義します。
ファイル名は命名規則があり、
plugins/define/{プラグインのフルクラス名}/{プラグインのフルクラス名}.ini
となります。
これにより、プラグインのフルクラス名から、プラグインの DLL、EXE を特定することができます。
プラグイン定義ファイル
[assembly]
path=NineCubedMemo.exe
また、ここにプラグインのダウンロードURLやVersionを定義することにより、
プラグインの自動更新を考えています。

4. dataフォルダ

プラグイン生成時に作成され、plugins/define 配下の各プラグインの data フォルダから新しいファイルだけ上書きされます。
初期値は define 側に入れて、ユーザ毎の設定は data を使います。
また、フォルダ名がフルクラス名ではなくプラグインID となっているのは、
同じプラグインを複数生成した場合に、フォルダ名が重複するのを避けるためです。

5. plugin_extension.ini

拡張子とプラグインの関連付けを行うためのファイルです。
ファイル選択イベントが発生した場合、
そのイベントをプラグインローダーが受け取り、
選択されたファイルの拡張子から、ファイルを開くプラグインを特定するために使います。
plugin_extension.ini 抜粋
.txt  = NineCubed.Memo.Plugins.TextEditor.TextEditorPlugin
.bat  = NineCubed.Memo.Plugins.TextEditor.TextEditorPlugin
.log  = NineCubed.Memo.Plugins.TextEditor.TextEditorPlugin

6. plugin_list.ini

起動時に生成するプラグインを定義したファイルです。
起動するプラグインのフルクラス名、パラメーターなどを指定します。
このファイルを変更することにより、画面の構成などを変更することができます。
plugin_list.ini 抜粋
[plugin_1]
id    = form
class = NineCubed.Memo.MainFormPlugin
param = 

[plugin_2]
id    = splitter_horizon
class = NineCubed.Memo.Plugins.Splitter.SplitContainerPlugin
param = orientation = vertical

4. 画面




5. 今後の課題

AppConfig.xmlを廃止してフォームやテキストエディターのプロパティファイルで対応
ツールバー、メニューのプラグイン化
現在のEXEからプラグインやUtilsなどをDLLへ移す
ファイルツリーの上にパス表示プラグインの追加
ファイルリストにコピペでクリックボードの内容をファイル出力
ファイルリストからバイナリエディターの起動
ファイルリストに新規作成機能の追加
お気に入りファイルツリープラグインの追加
画像ビューアープラグインの追加
見出しリストの表示、
左側の余白の不具合対応、
grep機能の追加、
プラグインでテキストの加工を行えるようにする、
プラグインでカレンダーをつけて日記をつけられるようにする、などなど。

ダウンロード

ver実行ファイルソース
1.1.4
2018/11/16
ncm_1_1_4.zipncm_1_1_4_src.zip