2016-06-13 4 views
0

화재가 발생하는 리스너를 추가하고 싶습니다. Eclipse 환경 설정이 변경되었습니다.환경 설정 변경에 응답하는 IPreferenceChangeListener를 어떻게 추가합니까?

페이지를 선언하는 UI 플러그인의 활성기를 사용하여 특정 환경 설정 페이지에서이를 수행하는 방법을 알고 있습니다. 당신은 Activator.start() 메소드 호출 다음과 같은 API 사용할 수 있습니다 :

getPreferenceStore().addPropertyChangeListener(IPropertyChangeListener listener) 

을하지만 어떤 환경 설정이 변경 될 때마다 청취자가 통지 싶습니다. 내 Activator.start() 메소드 호출 다음, 시도 :는 getNode은 환경 설정의 루트를 나타낼 수 있지만,이 작동하지 않는 것의

import org.eclipse.ui.plugin.AbstractUIPlugin; 
import org.osgi.framework.BundleContext; 

public class Activator extends AbstractUIPlugin { 
... 
    public void start(BundleContext context) throws Exception { 
     super.start(context); 
     plugin = this; 
     addMyPreferenceChangeListener(); 
    } 

    private IPreferenceChangeListener fPreferenceChangeListener; 
    private void addMyPreferenceChangeListener() { 
     fPreferenceChangeListener = new IPreferenceChangeListener() { 
      public void preferenceChange(PreferenceChangeEvent event) { 
       System.err.println("PreferenceChangeEvent"); 
      } 
     }; 
     IEclipsePreferences prefs = InstanceScope.INSTANCE.getNode("/"); 
     prefs.addPreferenceChangeListener(fPreferenceChangeListener); 
    } 
} 

내가 "/"희망을; 환경 설정 (예 : 윈도우> 환경 설정> 일반> 항상 백그라운드에서 실행)을 변경하면 println()이 실행되지 않습니다.

답변

1

모든 노드에 대해 통지 한 청취자가 할 수있는 방법이 없습니다, 당신은 당신이에 관심이있는 각 노드에 리스너를 추가해야합니다.

당신은 IPreferenceNodeVisitor

를 사용하여 기존의 모든 노드를 찾을 수 있습니다

IPreferencesService prefsService = Platform.getPreferencesService(); 

IEclipsePreferences root = prefsService.getRootNode(); 

root.accept(visitor); 

또한 새 노드에 대해 알려면 IEclipsePreferences.addNodeChangeListener을 사용해야합니다.

활성 화기의 start 메소드는 플러그인의 다른 코드가 사용될 때까지 실행되지 않습니다. 이는 일반적으로 Eclipse 시작 중에 실행되지 않습니다.

+0

안녕 그렉-449, 우수 감사합니다. 첫 번째 비트 (방문자)를 얻을 수는 있지만 addNodeChangeListener를 완료하는 방법을 모르겠습니다. 제거 (NodeChangeEvent 이벤트) 또는 추가 (NodeChangeEvent 이벤트) 메소드에서 event.getChild()를 할 수 있지만 org.osgi.service.prefs.Preferences를 제공합니다. 그걸로 내가 뭘 할 수 있니? 다른 accept (visitor)를 실행하고 새로운 listener를 새로운 노드에 추가 할 수 있도록 IEclipsePreferences 노드를 기대하고있었습니다. – betamax

+0

IEclipsePreferences는 환경 설정을 확장합니다. 저는 여러분이 가치있게 캐스트 할 수 있어야한다고 생각합니다. –

+0

네, 맞습니다.내부 (NodeChangeEvent 이벤트) 추가 할 수 있었다 : \t \t \t \t \t \t \t IEclipsePreferences 노드 = (IEclipsePreferences) event.getChild(); \t \t \t \t \t \t \t node.addPreferenceChangeListener (fPreferenceChangeListener); 그러나 노드가 제거 되었기 때문에 예외가 발생하기 때문에 removed()에서 리스너를 제거 할 수 없습니다. 나는 다른 코드가 이것을 언급하는 것을 보았다. – betamax

1

감사합니다. greg-449에게 감사드립니다. 다음은 참고 용 마지막 코드입니다. 기본 설정 리스너는 Activator 시작 메소드에서 추가됩니다. 이 플러그인은 실행시 extension point="org.eclipse.ui.startup"을 사용하여 시작됩니다. 플러그인이 중지되면 리스너가 제거됩니다.

환경 설정을 변경하면 "PreferenceChangeEvent"가 인쇄됩니다. 나는 내가 원하는 실제 작업을하기 위해이 지점에 연결한다. 표시되지 않습니다. 새 환경 변수 (예 : 환경> 환경 설정> C/C++> 빌드> 환경)를 작성하고 적용을 누르면 새 환경 설정 노드가 작성되면 "PreferenceChangeEvent"가 인쇄됩니다. 변수의 값이 환경 설정에서 연속적으로 변경 될 때마다 인쇄됩니다.

import org.eclipse.core.runtime.Platform; 
import org.eclipse.core.runtime.preferences.IEclipsePreferences; 
import org.eclipse.core.runtime.preferences.IPreferenceNodeVisitor; 
import org.eclipse.core.runtime.preferences.IPreferencesService; 
import org.eclipse.core.runtime.preferences.IEclipsePreferences.INodeChangeListener; 
import org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener; 
import org.eclipse.core.runtime.preferences.IEclipsePreferences.NodeChangeEvent; 
import org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChangeEvent; 
import org.eclipse.jface.resource.ImageDescriptor; 
import org.eclipse.ui.plugin.AbstractUIPlugin; 
import org.osgi.framework.BundleContext; 
import org.osgi.service.prefs.BackingStoreException; 

public class Activator extends AbstractUIPlugin { 

... 그것에 대해

public void start(BundleContext context) throws Exception { 
     super.start(context); 
     plugin = this; 
     addPreferenceChangeListeners(); 
    } 

    public void stop(BundleContext context) throws Exception { 
     removePreferenceChangeListeners(); 
     plugin = null; 
     super.stop(context); 
    } 

    private IPreferenceChangeListener fPreferenceChangeListener; 
    private void addPreferenceChangeListeners() { 
     /* 
     * Create a single preference change listener; the same listener is 
     * used for all the Preference Nodes. 
     */ 
     fPreferenceChangeListener = new IPreferenceChangeListener() { 
      @Override 
      public void preferenceChange(PreferenceChangeEvent event) { 
       System.err.println("PreferenceChangeEvent"); 
      } 
     }; 

     IPreferencesService prefsService = Platform.getPreferencesService(); 
     IEclipsePreferences root = prefsService.getRootNode(); 
     /* 
     * Create a visitor for adding the pref change listener to each node. 
     */ 
     IPreferenceNodeVisitor addingVisitor = new IPreferenceNodeVisitor() { 
      public boolean visit(IEclipsePreferences node) throws BackingStoreException { 
       if(null!=fPreferenceChangeListener) { 
        System.out.println("Adding pref change listener"); 
        node.addPreferenceChangeListener(fPreferenceChangeListener); 
        /* 
        * Add a addNodeChangeListener so that if any new preference nodes 
        * are added they will also have our listener added too. 
        */ 
        node.addNodeChangeListener(new INodeChangeListener() { 
         @Override 
         public void removed(NodeChangeEvent event) { 
          System.out.println("removed: event=" + event.toString()); 
         } 
         @Override 
         public void added(NodeChangeEvent event) { 
          System.out.println("added: event=" + event.toString()); 
          IEclipsePreferences node = (IEclipsePreferences) event.getChild(); 
          node.addPreferenceChangeListener(fPreferenceChangeListener); 
         } 
        }); 
       } 
       return true; 
      } 
     }; 

     /* 
     * Add the listener to the root and all its children 
     */ 
     try { 
      root.accept(addingVisitor); 
     } catch (BackingStoreException e) { 
      e.printStackTrace(); 
     } 
    } 

    private class PreferenceChangeRemovingVisitor implements IPreferenceNodeVisitor { 
     @Override 
     public boolean visit(IEclipsePreferences node) { 
      if(null!=fPreferenceChangeListener) { 
       System.out.println("Removing pref change listener"); 
       node.removePreferenceChangeListener(fPreferenceChangeListener); 
      } 
      return true; 
     } 
    } 

    private void removePreferenceChangeListeners() { 
     IPreferencesService prefsService = Platform.getPreferencesService(); 
     IEclipsePreferences root = prefsService.getRootNode(); 
     IPreferenceNodeVisitor removingVisitor = new PreferenceChangeRemovingVisitor(); 
     try { 
      root.accept(removingVisitor); 
     } catch (BackingStoreException e) { 
      e.printStackTrace(); 
     } 
     fPreferenceChangeListener = null; 
    } 
}