/**
* @version $Id: PreviewableAction.java 1839 2014-04-16 02:33:51Z yukihiro-kinjyo $
*
* 2011/12/21 15:21:23
* @author kousuke-morishima
*
* Copyright 2011-2014 TIDAコンソーシアム All Rights Reserved.
*/
package com.tida_okinawa.corona;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.widgets.Shell;
/**
* IPreviewableActionの抽象実装クラス。
*
* @author kousuke-morishima
*/
public abstract class PreviewableAction extends Action implements IPreviewableAction {
@Override
public void run() {
if (checkEffected()) {
doRun();
}
}
@Override
public void preview(Shell shell) {
if (checkEffected()) {
int retCode = openPreviewDialog(shell);
if (retCode == Dialog.OK) {
doRun();
} else if (retCode == Dialog.CANCEL) {
doCancel();
}
} else {
if (doRunWhenNoEffectedItems()) {
doRun();
}
}
}
/**
* プレビューの結果、影響を受けるアイテムがなかったとき、処理を続行するか、何もしないか。
* このメソッドは、オーバーライドするためにprotectedになっている。通常、サブクラスで呼び出す必要はない。
*
* @return 処理を続行する(doRunを呼び出す)ならtrue
*/
protected boolean doRunWhenNoEffectedItems() {
return false;
}
/**
* 変更を伴う処理を実際に行う
*/
protected abstract void doRun();
/**
* プレビューでキャンセルを押されたときの処理
*/
protected void doCancel() {
setResult(Status.CANCEL_STATUS);
}
private IStatus result = Status.OK_STATUS;
/**
* @param result
* 処理結果
*/
protected void setResult(IStatus result) {
this.result = result;
}
/**
* @return 処理結果
*/
public final IStatus getResult() {
return result;
}
/**
* プレビューで表示するアイテムを探したり、実際に処理するアイテムを探したりする。
*
* @return 影響を受けるアイテムが見つかったらtrue
*/
protected abstract boolean checkEffected();
/**
* プレビュー画面を開いて、処理を実行するかユーザに確認する
*
* @param shell
* 親Shell
* @return 処理を実行するなら {@link Window#OK}。処理しないならそれ以外。
*/
protected abstract int openPreviewDialog(Shell shell);
}