2013-11-14 33 views
3

問候同胞Stackoverflowians,Eclipse RCP的 - 添加之後立即查看已創建

我開發Eclipse RCP應用程序監聽器,它的創建之後必須添加SelectionListenerProject Explorer view的時刻。

我意識到,我不能這樣做在我的貢獻插件的激活,而爲了得到SelectionService通過PlatformUI.getWorkbench().getActiveWorkbenchWindow().getSelectionService()我必須有一個活動工作臺窗口(這是nullActivator start()被調用)

所以我的問題: 我什麼時候可以得到SelectionService使得Project Explorer view已創建並是可見的,但用戶至今還沒有能夠「推動任何按鈕的?

感謝您的意見和建議!

+1

你想做什麼選擇?你想在自定義視圖或編輯器中使用它嗎? – isnot2bad

+0

我將在我的插件中使用它來生成特定於每個項目的內容。特別是它將用於運行配置。 –

回答

5

當你真的想跟蹤來自用戶的選擇沒有一個可以在創建時註冊ISelectionListener的用戶界面(如視圖)的啓動,您可以啓動一個啓動鉤子。

Eclipse提供了擴展點org.eclipse.ui.startup。它接受一個實現接口org.eclipse.ui.IStartup的類。用戶界面創建後,它會被調用,所以ISelectionService已經是可用的,那麼:

public class StartupHook implements IStartup, ISelectionListener { 

    @Override 
    public void earlyStartup() { 
     final IWorkbench workbench = PlatformUI.getWorkbench(); 
     workbench.addWindowListener(new IWindowListener() { 

      @Override 
      public void windowOpened(IWorkbenchWindow window) { 
       addSelectionListener(window); 
      } 

      @Override 
      public void windowClosed(IWorkbenchWindow window) { 
       removeSelectionListener(window); 
      } 
      /* ... */ 
     }); 

     workbench.getDisplay().asyncExec(new Runnable() { 
      public void run() { 
       for (IWorkbenchWindow window : workbench.getWorkbenchWindows()) { 
        addSelectionListener(window); 
       } 
      } 
     }); 
    } 

    private void addSelectionListener(IWorkbenchWindow window) { 
     if (window != null) { 
      window.getSelectionService().addSelectionListener("org.eclipse.ui.navigator.ProjectExplorer", this); 
     } 
    } 

    private void removeSelectionListener(IWorkbenchWindow window) { 
     if (window != null) { 
      window.getSelectionService().removeSelectionListener("org.eclipse.ui.navigator.ProjectExplorer", this); 
     } 
    } 

    @Override 
    public void selectionChanged(IWorkbenchPart part, ISelection selection) { 
     // TODO handle selection changes 
     System.out.println("selection changed"); 
    } 
} 

注意it is discouraged to use this UI startup hook因爲它迫使OSGi的激活你的包很早(等所有相關的包呢!),並減緩關閉系統啓動。所以請確保你的包裝整潔而苗條。儘量減少捆綁依賴關係。有時候需要將啓動鉤子代碼移入一個單獨的包來實現。

+0

按照http:// eclipse-tips。com/tips/3-top-10-errors-in-eclipse-plug-in-development使用初創公司是不鼓勵的,請謹慎介紹一下這個問題。 –

+1

感謝您的提示。我已經擴展我的答案來尊重這個問題。 – isnot2bad

2

您可以在ApplicationWorkbenchWindowAdvisor.postWindowOpen()方法中添加您的選擇偵聽器(此時您可以確定工作臺已經創建)。如果你想添加它,當「Project Explorer視圖」獲取可見的,那麼就可以做這樣的事情:

PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().addPartListener(new PartAdapter() { 

    @Override 
    public void partVisible(IWorkbenchPartReference partRef) { 
     if ("org.eclipse.ui.navigator.ProjectExplorer".equals(partRef.getId())) { 
      // add selection listener 
     } 
    } 
}); 

UPD: OK,如果你沒有訪問AppliationWorkbenchWindowAdvisor(其很奇怪,如果你正在開發Eclipse RCP產品),那麼ASAIK就沒有乾淨的解決方案來獲得關於UI可用性的通知。所以這樣的解決方案之一可能是添加一個工作,這將等待UI被初始化。在你的插件Activator.start()方法考慮增加以下工作(確保你可以將它解壓到單獨的類和改進的方法很多,但一開始就應該足夠了):

Job j = new Job("") { 

    @Override 
    protected IStatus run(IProgressMonitor monitor) { 
     final boolean[] workbenchAvailable = new boolean[] { false }; 
     Display.getDefault().syncExec(new Runnable() { 

      @Override 
      public void run() { 
       if (PlatformUI.isWorkbenchRunning() && PlatformUI.getWorkbench().getActiveWorkbenchWindow() != null) { 
        workbenchAvailable[0] = true; 
       } 

      } 
     }); 
     if (workbenchAvailable[0]) { 
      System.out.println("Workbench is available"); 
      Display.getDefault().asyncExec(new Runnable() { 

       @Override 
       public void run() { 
        ISelectionService selectionService = 
         PlatformUI.getWorkbench().getActiveWorkbenchWindow().getSelectionService(); 

        System.out.println(selectionService); 
       } 
      }); 
     } else { 
      System.out.println("Waiting for the Workbench ..."); 
      schedule(1000); 
     } 
     return Status.OK_STATUS; 
    } 
}; 

j.schedule(); 
+0

那麼,你會在哪裏放置代碼,考慮到Listener需要立即添加,並且沒有ActiveWorkbenchWindow? (它返回null) –

+0

如前所述,我將它放入ApplicationWorkbenchWindowAdvisor。 –

+0

對不起,我現在明白了。就我所見,ApplicationWorkbenchWindowAdvisor僅存在於包含應用程序(以及啓動應用程序的產品)的插件中。它是否正確?如果是這樣,我無法訪問它。 –