イベントハンドラが呼ばれない
山本(sgry)です。 kanryuさん、いつもフィードバックありがとうございます。
AzukiControl.TextChanged イベントは、現在ご指摘通り発行していません。 当初からの設計方針として Document ごとに発生する「内容変更」というイベントは Document.ContentChanged から受け取る方法をメインと据えています。 ただ、やはり AzukiControl でもアクティブなドキュメントの ContentChanged イベントをそのまま受け渡すようなイベントを用意した方が使い勝手が良いだろうと思っています。
別プロジェクトの話なのですが2008年前半頃、テキスト変更時に Control.OnTextChanged を呼び出す実装で何かの問題が起こり、独自に ContentChanged というイベントを作って発行するよう変更した記憶があります。 しかし困ったことにその経緯が、記録にも記憶にも残っていません・・・。 これが引っかかっていたため以前から TextChanged イベントは「手つかずのまま」になっており、 使われないのに存在する邪魔なイベントとなってしまっています。 紛らわしい現状で申し訳ありませんが、 内容変更を外部で知りたい場合は(少なくとも現在は) Document.ContentChanged イベントをご利用ください。
良い機会と思いますので 1.3.1 リリース後に OnTextChanged を呼び出す実装をしばらく試してみて、 問題が無さそうであれば適用したいと思います。
AzukiControl で発生するイベントはというのはキー入力に対するアクションのマッピング定義と呼び出し部分を指していますでしょうか。 キー入力に対して発行するアクションを関連づける部分はUMLのクラス図を描けば委譲と描かれるかもしれませんが、本質的に委譲ではありません。 これはアクションの「マッピングを外部に公開する」のが目的であり、 Actions という第三者に丸投げするのが目的ではありません。
各イベントハンドラの明示的呼び出しはprotectedになっているので、AzukiControl内で呼び出さざるを得ず
すいません、うーん、ご指摘の意図をつかみかねているので間違っているかもしれませんが・・・ Xxx イベントを発行する Control.OnXxx を外部のアクションから呼び出せないことを言われているのでしょうか。 少なくとも Windows.Forms フレームワーク自体が、 外部のイベントハンドラがイベント発行元オブジェクトのイベントを発行することを禁止していると思います(OnXxx メソッドが public でなく protected なので)。 ですから AzukiControl も外部からイベントを発行できないことで問題は特に無いと思っていますが・・・いかがでしょうか。
何か意図を勘違いしているようでしたらご指摘いただければ幸いです。
要するに、AzukiControlに対するアクションの反応が外部クラスであるActionクラス他に記述されているため、Control.OnXxxが呼び出せないのではないかという指摘をしています。
実装上問題ないようなのでしたら特に申し上げるほどのことではありません。
ただ、ちょっと触ってみた限りでは追記するのに適切なコード位置が見当たらなかったので。設計の修正が必要なんではないかなと思いました。
要するに、AzukiControlに対するアクションの反応が外部クラスであるActionクラス他に記述されているため、Control.OnXxxが呼び出せないのではないかという指摘をしています。
はい、呼び出すことはできず、呼び出せることを意図していません。
Azuki のアクションには、いわゆるコマンドパターンの「もどき」を採用しています (厳密にはGoFのコマンドパターンと違うが本質は同じと思う代物)。 これは SharpDevelopのエディタエンジンと同じであり、あのレベルまで完成したIDEに組み込んでも問題が無いことを考えれば きっとそれ自体に問題は無いだろうと考えています。
もし今後何か問題がありそうでしたら、この点も検討させていただきます。 ご提言ありがとうございます。
Forms.Controlクラスを継承してAzuki.Controlが定義されているならば、Controlクラスがサポートしているイベントハンドラも使用可能であると期待されるのではないかと思います。
SharpDevelopは今はじめて知りましたが、なかなか規模の大きい優秀なソフトウェア、プロジェクトのようですね。ただしそこで使われているテキストエディタエンジンはSharpDevelop専用です。
アプリケーション内で閉じているならばそれで問題ないものの、Azukiは様々な.NET アプリケーションから広く利用されるべき共通のコンポーネントであるわけです。
したがってアプリケーションから利用するインターフェイスと言う場面では同列には語れません。できるならば.NETの標準コントロールと同じような使い方ができるべきではないかと思います。
この辺はアプリケーションごとにAzukiを外からカスタマイズする際に重要なことなので、安易にサポートを切り捨てるべきではないでしょう。
AzukiのTextChangedイベントが一向に発行されないのでソースを覗いてみたのですが、実際呼び出していないようです。
AzukiControl中では各イベントをstaticクラスであるActionに委譲しているようです。 Forms.Controlクラスの各イベントハンドラの明示的呼び出しはprotectedになっているので、AzukiControl内で呼び出さざるを得ず、外部であるActionクラスに委譲する実装は設計的にまずいような気がします。