2011-05-04 5 views
2

Eclipse 플러그인에 대한 가져 오기 마법사를 수행하고 있습니다.마법사가 기존 프로젝트에서만 실행되도록 허용

선택 사항이 IProject 인 경우에만 허용되어야하며 그렇지 않은 경우 오류를 표시하고 닫습니다.

어떻게 가능합니까?

나는 선택이 IProject없는 경우 내 OwnWizard.init(...) 방법에서 getShell().close()getContainer().getShell().close()를 사용하여 시도,하지만 난 NullPointerException에 관한 getShell() (그것은 아직 유효하지의 표시)을 얻는다.

나는이 조각으로 시도 : 마법사가 종료

public class GetPackWizard extends Wizard implements IImportWizard { 
private IProject project = null; 
// ... 
@Override 
public void addPages() { 
    logger.trace("Adding pages."); 
    addPage(new SelectPackagesWizardPage(project)); 
    versionsPage = new SelectVersionsWizardPage(project); 
    addPage(versionsPage); 
} 

//... 
@Override 
public void init(IWorkbench workbench, IStructuredSelection selection) { 
    project = null; 
    if (selection.size() > 0) { 
     Object obj = selection.getFirstElement(); 
     if (obj instanceof IResource) { 
      IResource resource = (IResource)obj; 
       if (obj instanceof IProject) 
        project = (IProject)obj; 
       else 
        project = resource.getProject(); 
     } 
    } 

    if (project == null) { 
     MessageDialog.openError(
      getShell(), 
      "GetPack Wizard", 
      "You must run this wizard from a project." 
     ); 
     performCancel(); 
    } 
} 

있지만, addPages() 방법은 여전히 ​​따라서 일부 NullPointerException합니다 (project 필드가 null 이후)에지도라고합니다.

내가 그런 일을 막을 수있는 방법이 있습니까? 나는 createControls() 마법사 방법 : 당신의 도움에 대한

감사합니다,

안부를 구현할 필요가 없습니다 경우는 *,

그렉 큰 수 있습니다. 당신이 등등 shell을 닫고 얘기 때문에

답변

2

, 그러므로 나는 IProject 이미 선택이 알아 낸 것입니다 가정 및 오류을 표시하고 있습니다. 마법사 닫기

:

모든 표준 마법사는 추상적 인 org.eclipse.jface.wizard.Wizard 구현합니다. 그것을 닫으려면 그냥 performCancel() 메서드를 호출하십시오.


업데이트 (난 당신이 init()getShell().close()를 호출 몰랐) :

이유는 간단하다. 다음에 다음 import 마법사를 누릅니다의 특정 마법사를 선택하면 당신은 IselectedNode.getWizard(); 문은 당신이 선택임을 확인 했음에도 불구하고, 따라서 이전의 wizard.addPages(); 오는 볼 수있는 다음과 같은 방법은 org.eclipse.jface.wizard.WizardSelectionPage

public IWizardPage getNextPage() 
{ 
    if (selectedNode == null) { 
     return null; 
    } 

    boolean isCreated = selectedNode.isContentCreated(); 

    IWizard wizard = selectedNode.getWizard(); // THIS WILL CALL THE INIT 

    if (wizard == null) { 
     setSelectedNode(null); 
     return null; 
    } 

    if (!isCreated) { 
     // Allow the wizard to create its pages 
     wizard.addPages();    // THIS IS ADDING THE EXTRA PAGES 
    } 

    return wizard.getStartingPage(); 
} 

에서 호출 IProject이 아니며 performCancel() (대화 내용 - 영역 자체가 만들어지지 않으므로 아무런 영향을주지 않음)이라고하면 wizard.addPages();으로 계속 이동합니다.

당신은 이미 init() 방법 getShell()null를 반환 것으로 나타났습니다 것처럼.당신이 public void createPageControls(Composite pageContainer), 를 오버라이드 (override) 할 필요가 있지만, 필요한 변화를 걱정하지 마십시오 (불행히도)이 문제를 해결하려면 최소한 :

public class MyImportWizard extends Wizard implements IImportWizard { 

    private IProject project = null; 

    private boolean flag = false; 

    public void addPages() { 
     if(!flag) 
      System.out.println("Hello"); 
    } 

    public void createPageControls(Composite pageContainer) { 
     if(flag){ 
      getShell().close(); 
      return; 
     } 
     super.createPageControls(pageContainer); 
    } 

    public void init(IWorkbench workbench, IStructuredSelection selection) 
    { 
     project = null; 
     if (selection.size() > 0) { 
      Object obj = selection.getFirstElement(); 
      if (obj instanceof IResource) { 
       IResource resource = (IResource)obj; 
       if (obj instanceof IProject) 
        project = (IProject)obj; 
       else 
        project = resource.getProject(); 
      } 
     } 

     if (project == null) { 
      MessageDialog.openError(
        getShell(), 
        "GetPack Wizard", 
        "You must run this wizard from a project." 
      ); 
      flag = true; 
     } 
    } 

    @Override 
    public boolean performFinish() { 
     return true; 
    } 
} 

보내기 참고로

public void createPageControls(Composite pageContainer) { 
    if(flag){ 
     getShell().close(); 
     return; 
    } 
    super.createPageControls(pageContainer); 
} 

아래의 전체 코드를 참조 한번 시도 해보면보다 정교한 방법으로 수행 할 수 있는지 알게 될 것입니다.

+0

예 저는 이에 대해 몇 가지 세부 사항을 추가했습니다. – Greg

+0

@Greg : 업데이트 된 답변을 확인하십시오. – Favonius

+0

정말 고마워요 :) 실제로'project'는'true'의'flag'를 사용하지 않습니다. – Greg

관련 문제