페이지

2012년 11월 28일 수요일

Eclipse Wizard Tutorial

Wizard

History

revisionchangesauthor
0.1initial version 2012-11-28 수 Darren Ha

Wizard

Wizard 클래스에서 상속받아서 클래스를 만든다. IImportWizard interface를 implement하는 이유는 eclipse의 import 메뉴에 사용하기 위해서 이다. 내부 구현을 보면 IImportWizard, IExportWizard, INewWizard 모두 같은 interface이고 단지 이름만 다르다. 따라서, IImportWizard를 implement한 클래스도 new project 혹은 export wizard에서 사용될 수 있다.
public class MyWizard extends Wizard implements IImportWizard {
    @Override
    public void init(IWorkbench workbench, IStructuredSelection selection) {
    }

    @Override
    public void addPages() {
        MainPage main = new MainPage();
        addPage(main);
    }

    @Override
    public boolean performFinish() {
        // TODO Auto-generated method stub
        return false;
    }
}

Wizard Page

MyWizard::addPages에서 추가될 page는 WizardPage를 상속받아서 만들고, Dialog와 마찬가지로 createControl에서 dialog를 구성해주면 된다.
public class MainPage extends WizardPage {
    public MainPage() {
        super("main");
    }
    @Override
    public void createControl(Composite parent) {

        Label l = new Label(parent, SWT.NONE);
        l.setText("test");
        setControl(l);
    }
}  

Validating each page's input

WizardPage::setPageComplete()로 해당 페이지의 input이 조건에 맞게 들어왔는지 검사해서 next 버튼을 enable할지 여부를 판단한다. SetMessage 함수로 여러가지 메세지를 wizard 헤더 영역에 나타낼 수 있다. 아래는 Text control에 제대로 된 비밀번호를 입력했을때만 finish 버튼을 enable하는 부분임.
protected void updatePageComplete() {
       setMessage(null);
       setPageComplete(false);

       String pwd = fText.getText();

       if (!pwd.equals(PASSWORD)) {
           setMessage(MSG, ERROR);
           return;
       }

       setPageComplete(true);
   }

Launching Wizard

Wizard Extension Points

eclipse의 File>New/Import/Export에 나타나게 하려면 eclipse가 제공하는 wizard extension point를 추가해야 한다. Eclipse의 plugin.xml editor에서 extension tab으로 이동한 후 아래 extension중 하나를 추가. new project -> org.eclipse.ui.newWizards import -> org.eclipse.ui.importWizards export -> org.eclipse.ui.exportWizards 추가한 extension point의 하위에 context menu를 이용하여 wizard 를 추가. class 를 실제 구현한 클래스의 이름을 추가하여 매핑해준다.

Using WizardDialog

WizardDialog를 이용해서 언제든 Programatically wizard를 띄울 수 있다. 아래 처럼.
public Object execute(ExecutionEvent event) throws ExecutionException {
        IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindowChecked(event);
        IStructuredSelection selection = StructuredSelection.EMPTY;

        ISelection sel = HandlerUtil.getCurrentSelection(event);
        if (sel instanceof IStructuredSelection) {
            selection = (IStructuredSelection)sel;
        }


        MyWizard wizard = new MyWizard();
        wizard.init(window.getWorkbench(), selection);

        WizardDialog dialog = new WizardDialog(window.getShell(), wizard);
        dialog.open();
        return null;
    }

Tutorial Project

https://github.com/nberserk/eclipsetutorials 에 가시면 위에서 언급된 소스가 모두 포함된 eclipse project가 있습니다.