2011-05-04 22 views
2

我正在爲Eclipse插件執行導入嚮導。允許嚮導僅從現有項目運行

只有在選擇是IProject並且顯示錯誤(並關閉本身)時才應該允許。

你這樣做是可行的嗎?

我嘗試使用getShell().close()getContainer().getShell().close()從我OwnWizard.init(...)方法,如果選擇不是一個IProject,但我得到一個關於NullPointerExceptiongetShell()(看來這還不是有效)。

我試着用這個片段:

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字段爲空)。

有沒有辦法阻止這種情況發生?這可能是巨大的,如果我沒有重新實現createControls()嚮導方法:)

感謝您的幫助,

最好的問候,

格雷格*。

回答

2

既然你是在談論關閉shell和等,因此我假設你已經想通了選擇一個的IProject並顯示錯誤

關閉嚮導:

所有標準的嚮導實現抽象 org.eclipse.jface.wizard.Wizard。如果你想關閉它,那麼只需調用它的 performCancel()方法即可。 (我不知道你是在init()呼籲getShell().close()


更新:

原因很簡單。當您選擇在import嚮導,按特定的嚮導下一那麼下面的方法是從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(); 
} 

稱爲正如你可以看到IselectedNode.getWizard();聲明都會早於wizard.addPages();因此,即使你已經確定了選擇而不是IProject,並且被稱爲performCancel()(由於沒有創建對話內容區本身,所以它不會產生任何效果),它仍然會繼續到wizard.addPages();

正如你已經注意到,getShell()init()方法將返回null。爲了解決這個問題(不幸)你必須重寫public void createPageControls(Composite pageContainer)不用擔心所需要的變化是最小的:

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

更多信息參見下面的完整代碼:

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; 
    } 
} 

給這是一個嘗試,同時我會看看它是否可以以更復雜的方式完成。

+0

是的,我做:)我已經添加了一些細節。 – Greg 2011-05-05 15:28:30

+0

@Greg:檢查我的更新答案。 – Favonius 2011-05-05 16:36:35

+0

謝謝它效果很好:) 其實我甚至不使用'flag',因爲它是'true'當'project!= null'的時候。 – Greg 2011-05-06 08:09:56

相關問題