2013-11-14 2 views
3

인사말 동료 Stackoverflowians,이클립스 RCP - 뷰가

내가 이클립스 RCP 응용 프로그램을 개발하고 생성 된 직후에 리스너를 추가하고이 만들어지는 후 Project Explorer view에 순간을 SelectionListener을 추가해야합니다. 내가합니다 (Activator start()가 호출 될 때 null되는) 활성 워크 벤치 창을 가지고 있어야합니다 SelectionServicePlatformUI.getWorkbench().getActiveWorkbenchWindow().getSelectionService()를 통해

을 얻기 위해 반면 나는, 나의 기여 플러그인의 액티베이터에서이 작업을 수행 할 수 없음을 깨달았다

내 질문 : 언제 SelectionService을 얻을 수 있으며 Project Explorer view이 생성되어 표시되지만 사용자는 아직 '모든 버튼을 누르지'못했습니까?

의견 및 제안을 부탁드립니다.

+1

선택 사항으로 무엇을 하시겠습니까? 사용자 정의보기 또는 편집기에서 사용 하시겠습니까? – isnot2bad

+0

각 플러그인에 맞는 컨텐츠를 생성하기 위해 플러그인에서 사용하게 될 것입니다. 특히 실행 구성에 적합합니다. –

답변

5

당신이 정말로에서 사용자 선택을 추적 할 때 시작시 ISelectionListener을 등록 할 수있는 UI (보기와 같은)가 없어도 시작할 수 있습니다.

Eclipse는 확장 점 org.eclipse.ui.startup을 제공합니다. 인터페이스 org.eclipse.ui.IStartup을 구현하는 클래스를 허용합니다. 그것은 UI가 생성 된 후에 호출, 그래서 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에 따라.co.kr/tips/3-top-10-in-eclipse-plug-in-development는 신생 기업을 사용하여 개발이 어려우므로 걱정하지 마십시오. –

+1

팁 주셔서 감사. 나는이 문제를 존중할 나의 대답을 확장했다. – isnot2bad

2

ApplicationWorkbenchWindowAdvisor.postWindowOpen() 메소드에서 선택 수신기를 추가 할 수 있습니다 (이 시점에서 Workbench가 이미 생성되었는지 확인할 수 있습니다).

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

그래서 리스너를 즉시 추가해야하고 ActiveWorkbenchWindow가 없다는 점을 감안할 때 어디에서 코드를 삽입 할 것입니까? (null을 반환합니다) –

+0

언급 한대로, 나는 그것을 ApplicationWorkbenchWindowAdvisor에 넣을 것입니다. –

+0

죄송합니다, 지금 받으실 수 있습니다. 지금까지 보았 듯이 ApplicationWorkbenchWindowAdvisor는 응용 프로그램 (및 응용 프로그램을 시작하는 제품)도 포함하는 플러그인에만 있습니다. 이 올바른지? 그렇다면, 나는 그것에 접근 할 수 없다. –

관련 문제