S-JIS[2013-02-22/2014-01-12] 変更履歴

Eclipseプラグイン ダイアログ

Eclipseプラグイン開発のダイアログについて。


メッセージダイアログ

メッセージを表示するダイアログ。

MessageDialogクラスの各メソッドを使う。

情報 openInformation(shell, title, message)  
警告 openWarning(shell, title, message)  
エラー openError(shell, title, message) ErrorDialog
疑問 openQuestion(shell, title, message)  
確認 openConfirm(shell, title, message)  

import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

import org.eclipse.jface.dialogs.MessageDialog;
	Shell shell = Display.getDefault().getActiveShell();
	MessageDialog.openInformation(shell, "title", "Hello, Eclipse world");

shellはnullでも大丈夫。


confirmの例

	boolean ok = MessageDialog.openConfirm(shell, "title", "○○しても良いですか?");

openConfirm()では、「Yes」「No」のボタンが表示される。[2014-01-12]
「Yes」が押されるとtrueが返る。それ以外(ダイアログを閉じるメニューも含む)だとfalseが返る。


MessageDialogインスタンスを自分で作る例

MessageDialogのインスタンスを自分で作ることも出来る。[2014-01-12]

	String title = "Setting Properties";
	String message = "設定値が変更されています。\n変更を適用しますか?";
	String[] buttonLabels = new String[] { "Apply", "Discard", "Cancel" };
	MessageDialog dialog = new MessageDialog(shell, title, null, message, MessageDialog.QUESTION, buttonLabels, 0);
	int res = dialog.open();

openメソッドでダイアログを開く。戻り値はボタンの番号(インデックス)。
この例だと、Applyボタンが押されたら0、Discardなら1、Cancelなら2が返ってくる。ダイアログが閉じられた場合は-1が返る。


エラーダイアログ

エラー情報を表示するダイアログ。

エラー(特に例外情報)を表示するにはErrorDialogを使う。

import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;

import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

import org.eclipse.jface.dialogs.ErrorDialog;
	Exception e = 〜;
	IStatus status = new Status(IStatus.WARNING, Activator.PLUGIN_ID, "エラー発生", e);
	Shell shell = Display.getDefault().getActiveShell();
	ErrorDialog.openError(shell, "title", "エラーが発生しました。", status);

MessageDialog.openError()はエラーメッセージを表示するだけだが、ErrorDialogは例外の情報も表示される。
(例外情報に関しては、Eclipse3.7だと例外メッセージだけ表示されるが、Eclipse4.2だとスタックトレースも表示されたような気がする)

CoreExceptionならIStatusを直接取り出すことが出来るので、ErrorDialog.openError()に渡しやすい。


プログレスダイアログ

進捗状況を表示するダイアログ。

ProgressMonitorDialog


ファイルダイアログ

ファイルシステム上(Eclipseのワークスペースの外)のファイルを選択するダイアログ。
(ワークスペース内のファイルを選択するにはElementTreeSelectionDialogを使う)

import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Shell;
コンストラクターの引数
第1引数 shell null不可。
第2引数 style SWT.OPEN ファイルを開く為に選択する場合に指定する。
SWT.SAVE ファイルを保存する為に選択する場合に指定する。
SWT.MULTI 複数ファイルを選択する場合に指定する。
FileDialogのメソッド
メソッド 説明 備考
setText(title) タイトルの文言を設定する。  
setFilterExtensions(ext) 表示する拡張子を設定する。  
setOverwrite(true) (保存ダイアログの場合)[2013-04-19]
ファイルが既存だったら上書きするかどうかを確認する。
上書きするかどうかの確認ダイアログが別途表示される。
open() ダイアログを表示する。 戻り値は、ファイルが選択された場合はそのパス。
ファイルが選択されなかった場合(キャンセルされた場合)はnull。
複数ファイルが選択された場合は先頭ファイルのみっぽい。
getFilterPath() 選択されたファイルのディレクトリー部分を返す。  
getFileNames() 選択されたファイルのファイル名部分を返す。 返り値の型はString配列なので、複数ファイルに対応している。

単一ファイルを開く例

	FileDialog dialog = new FileDialog(shell, SWT.OPEN);
	dialog.setText("title");
	String path = dialog.open();

単一ファイルを保存の為に選択する例

	FileDialog dialog = new FileDialog(shell, SWT.SAVE);

複数ファイルを開く例

	FileDialog dialog = new FileDialog(shell, SWT.OPEN | SWT.MULTI);
	dialog.open();
	String directory = dialog.getFilterPath();
	String[] names = dialog.getFileNames();

getFilterPath()でディレクトリー、getFileNames()でファイル名を取得する。
(つまり、別々のディレクトリーにまたがった複数ファイル選択は出来ないということだと思う)

拡張子を指定する例

	String[] extensions = { "*.jar", "*.jar; *.zip", "*.*" };
	dialog.setFilterExtensions(extensions);

*.拡張子」形式で拡張子を指定する。
複数指定できるのは、ユーザーが拡張子の種類を選択できるようになっている為。
ひとつの選択肢の中で複数の拡張子を指定したい場合はセミコロンで区切る。


ディレクトリーダイアログ

ファイルシステム上(Eclipseのワークスペースの外)のディレクトリーを選択するダイアログ。
(ワークスペース内のディレクトリーを選択するにはElementTreeSelectionDialogを使う)

ファイルダイアログと異なり、開く/保存に応じたオプションは無い。複数選択も出来ない。

import org.eclipse.swt.widgets.DirectoryDialog;
import org.eclipse.swt.widgets.Shell;
	DirectoryDialog dialog = new DirectoryDialog(shell);
	dialog.setText("title");
	dialog.setMessage("message");
	String path = dialog.open();

setText()で指定した文言はウィンドウのタイトルバーに表示される。
setMessage()で指定した文言はダイアログ本体の上部に表示される。

open()の戻り値は、選択されたパス。選択されなかった場合(キャンセルされた場合)はnullが返る。


木構造選択ダイアログ

ワークスペース内のファイルを選択する専用のダイアログは無いっぽい。
しかし木構造を表示してその中の要素を選択するダイアログ(ElementTreeSelectionDialog)はあるので、それを使う。

プロジェクト内のファイルを選択するダイアログの例

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
import org.eclipse.ui.model.BaseWorkbenchContentProvider;
import org.eclipse.ui.model.WorkbenchLabelProvider;
public class ProjectFileSelectionDialog extends ElementTreeSelectionDialog {

	private IProject project;
	public ProjectFileSelectionDialog(Shell parent, IProject project) {
		super(parent, new WorkbenchLabelProvider(), new BaseWorkbenchContentProvider());
		setInput(project);
	}
	@Override
	public final void setInput(Object input) {
		this.project = (IProject)input;
		super.setInput(input);
	}
	@Override
	public final void setInitialSelection(Object initialPath) {
		if (initialPath == null) {
			return;
		}

		// ワークスペースのrootからの相対パス形式でIFileを取得
		IPath path = project.getLocation().append((String)initialPath);
		IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
		IPath rel = path.makeRelativeTo(root.getLocation());
		IFile file = root.getFile(rel);

		super.setInitialSelection(file);
	}
	@Override
	public IFile[] getResult() {
		Object[] result = super.getResult();
		if (result == null) {
			return null;
		}
		IFile[] file = new IFile[result.length];
		for (int i = 0; i < result.length; i++) {
			file[i] = (IFile) result[i];
		}
		return file;
	}
}

コンストラクターで内容表示クラスと内容供給クラスにワークベンチ用のクラスを指定しているので、ワークスペースのツリーとして扱える。
そしてsetInput()(ツリー内容のルート要素を指定する)にはIProjectを渡す想定。

setInitialSelection()は初期状態で選択されるファイルを指定するもの。
特に呼ばなくても構わないし、存在しないファイルを指定してもエラーにならない。

getResult()で選択されたファイル群を返す。

使う側:

	IProject project = 〜;

	ProjectFileSelectionDialog dialog = new ProjectFileSelectionDialog(getShell(), project);
	dialog.setTitle("IFile Selection");   	// タイトル
	dialog.setMessage("Choose the file:");	// メッセージ
	dialog.setAllowMultiple(true);       	// 複数選択を可能にする
	dialog.setHelpAvailable(false);      	// ヘルプボタンを表示しない
	dialog.setInitialSelection("src/main/java");
	dialog.open();
	IFile[] path = dialog.getResult();

ElementTreeSelectionDialog#addFilter()を設定すれば、特定の拡張子のファイルだけ表示するといったことも出来る。


変数を使ったエントリーを作成するダイアログ

Eclipseでは、変数を使ってエントリー(パス)を指定することが出来る。

例えばMavenのリポジトリーに入っているjarファイルを、Mavenリポジトリーを指す変数M2_REPOを使って「M2_REPO/log4j/log4j/1.2.15/log4j-1.2.15.jar」という形で指定できる。
Eclipseのビルドパスの設定時に「変数の追加」ボタンによってこのような指定をすることが出来る。

これはNewVariableEntryDialogというクラスで実現されているが、このダイアログは公開されていない。
(publicなクラスではあるが、Eclipseプラグインでは明示的に「公開」の指定がされていないクラスは使えない。
 命名ルールとして、パッケージの一部に「internal」が入っているものは非公開らしい)

とは言っても警告が出るだけなので、使おうと思えば使える。

import org.eclipse.jdt.internal.ui.wizards.buildpaths.NewVariableEntryDialog;
@SuppressWarnings("restriction")	//公開されていないクラスを使う際の警告を消す
public class Example {
	NewVariableEntryDialog dialog = new NewVariableEntryDialog(getShell());
	dialog.open();
	IPath[] r = dialog.getResult();

Eclipseプラグインへ戻る / Eclipseへ戻る / 技術メモへ戻る
メールの送信先:ひしだま