EMF によって生成されたエディターは、commandstacklistener を使用して PROP_DIRTY をエディターに送信します。このプロパティが起動されると、基礎となるフレームワークはエディタ #isDirty メソッドにダーティ状態を尋ねます。これは、ロジックを実装できる場所です。
@Override
public boolean isDirty() {
Diagnostic diagnostic = validateMyModel();
return ((BasicCommandStack)editingDomain.getCommandStack()).isSaveNeeded() && diagnostic.getSeverity() == Diagnostic.OK;
}
このケースは、ユーザーがモデルに対して無効な編集を行ったときにエディターが既にダーティになっている可能性があるユースケースをカバーしていません。
しかし、それは私見の最善の方法ではありません。ユーザーがエディターを閉じると、通知なしでモデルのすべての変更が失われるためです (ダーティ フラグがないため)。したがって、彼はおそらく 100 回の有効な変更を行い、1 回は無効で、変更したモデルを失いました。
より良い方法は、ユーザーがダイアログを保存したい場合に警告メッセージを表示することです。ダイアログにエラーがある場合、エディターはその状態をダーティから非ダーティに変更できず、ユーザーが変更する必要があります。
- すべてのエラーを修正するか、
- エディターを閉じて、すべての変更を失います
これを実現するには、doSave(IProgressMonitor progressMonitor) メソッドにエラーを表示するダイアログを実装する必要があります。さらにトリッキーな部分は、ダーティー エディターを閉じるデフォルトの動作をオーバーライドすることです。ワークベンチには、[はい]、[いいえ]、[キャンセル] のダイアログが表示されます。この動作をオーバーライドするには、エディターでインターフェース org.eclipse.ui.ISaveablePart2 を実装して、promptToSaveOnClose() メソッドをオーバーライドする必要があります。このメソッドにも、モデルのエラーをチェックするロジックが必要です。エラーがある場合、このメソッドは ISaveablePart2.CANCEL を返す必要があるため、ダーティ モデルにエラーがある限りエディターを閉じることはできません。
HTH トム