2016-06-13 14 views
0

私が聞くリスナーを追加したいとき Eclipseの設定が変更されました。どのように設定変更に応答するIPreferenceChangeListenerを追加できますか?

ページを宣言するUIプラグインのアクティベータを使用して、特定の設定ページでこれを行う方法を知っています。あなたはActivator.start()メソッドから呼び出され、次のAPI使用する可能性があります:

getPreferenceStore().addPropertyChangeListener(IPropertyChangeListener listener) 

をしかし、私はすべての設定が変更されるたびに、リスナーが通知されるようにしたいと思います。私は「/」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); 
    } 
} 

;:私は私のActivator.start()メソッドから呼び出され、次のことを試してみました環境設定を変更すると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が表示されます。私はそれで何ができますか?私は別の受け入れ(ビジター)を実行し、新しいノードにリスナーを追加できるように、IEclipsePreferencesノードを期待していました。 – betamax

+0

IEclipsePreferencesはプリファレンスを拡張しています。私はあなたが価値にキャストできるはずだと思います。 –

+0

はい、そうです。内部(NodeChangeEventイベント)を追加しました。これを行うことができました:\t \t \t \t \t \t \t IEclipsePreferences node =(IEclipsePreferences)event.getChild(); \t \t \t \t \t \t \t node.addPreferenceChangeListener(fPreferenceChangeListener);しかし、ノードが削除されたため例外がスローされるため、removed()のリスナーを削除できませんでした。私はこれに言及した他のコードを見てきました。 – betamax

1

彼の答えはgreg-449のおかげです。ここに私の最終的な参照コードがあります。 プリファレンスリスナーは、アクティベータの開始メソッドから追加されます。このプラグインは起動時にextension point="org.eclipse.ui.startup"を使用して開始されます。 プラグインが停止するとリスナーが削除されます。

環境設定を変更すると、「PreferenceChangeEvent」が表示されます。私はこの時点で、私が望む実際の仕事をしています。示されていない。 新しい環境変数(Window> Preferences> C/C++> Build> Environment)を作成してApplyを押すなど、新しい環境変数が作成された場合、 "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; 
    } 
} 
関連する問題