2010년 2월 25일 목요일

ElementTreeSelectionDialog 사용하기

org.eclipse.ui.dialogs 에는 이클립스에서 제공하는 유용한 다이얼로그들이 많다.
ElementTreeSelectionDialog는 트리 형태의 데이터를 출력한 후 사용자가 선택을 반영할 수 있는 다이얼로그다.
ContentProvider와 LabelProvider를 생성해 주어야 한다.
아래와 같이 간단하게 TreeSelection 다이얼로그를 사용할 수 있다.




SqlMapConfigParser parser = new SqlMapConfigParser();

SqlMapConfig sqlMapConfig =
parser.parse(ProjectHelper.getSqlMapConfigFile(javaProject.getProject()).getContents());


ElementTreeSelectionDialog dialog =
new ElementTreeSelectionDialog(getShell(), new SqlMapLabelProvider(),
new SqlMapContentProvider());

dialog.setTitle("dialog title");
dialog.setMessage("dialog message");

dialog.setInput(sqlMapConfig);
if(dialog.open() == Window.OK) {
for(Object selected: dialog.getResult()) {
if(selected instanceof SqlMap.IbatisQuery) {
ibatisStatements.add((SqlMap.IbatisQuery)selected);
}
}
tableViewer.refresh();
}





ElementTreeSelectionDialog를 사용할 때 트리의 최하단 노드만 선택할 수 있게 하거나, 선택된 노드들의 validation을 선택하게 만들면 사용하기 편할때가 있다. 이럴 경우에는 ISelectionStatusValidator 를 이용하면 된다. 아래의 코드를 참조하기 바란다.



dialog.setValidator(new ISelectionStatusValidator() {

@Override
public IStatus validate(Object[] selection) {
for(Object obj : selection) {
if (!(obj instanceof MethodDeclaration)) {
return new Status(IStatus.ERROR, IRuntimeConstants.PI_RUNTIME, IStatus.ERROR, "Only methods can be selected.", null);
}
}
return Status.OK_STATUS;
}
});




Dialog의 창 크기를 명시적으로 지정하고자 한다면 org.eclipse.pde.internal.ui.util.SWTUtil 를 이용하면 된다. SWTUtil 이름으로 된 클래스는 한 두개가 아니라서 fullyQualifiedName으로 알아두지 않으면 종종 귀찮은 일이 생긴다. SWTUtil.setDialogSize() 를 호출하기 전에 반드시 dialog.create() 먼저 해 줘야 NullPointerException이 발생하지 않는 다는 것도 알아두기 바란다.



dialog.create();

SWTUtil.setDialogSize(dialog, 600, 400);






Resources:
http://blog.cypal-solutions.com/2008/07/selection-dialogs-in-eclipse.html

댓글 없음:

댓글 쓰기