2011-01-04 3 views
0

도구 모음을 업데이트하려면/acceptdialog 이벤트)파이어 폭스 도구 모음 Prefwindow 언로드 나는 파이어 폭스 도구 모음을 개발하기 위해 노력하고있어

나의 구조는 options.xul에서

alt text

는 PrefWindow입니다 어느 쪽이 먼저 열려 있습니까

<toolbarbutton oncommand="esbTb_OpenPreferences()"/> 
    function esbTb_OpenPreferences() { 
window.openDialog("chrome://Toolbar/content/options.xul", "einstellungen", "chrome,titlebar,toolbar,centerscreen,modal", this);} 

그래서 내 환경 설정에서 어떤 툴바에 어떤 링크가 표시되는지를 나타내는 체크 박스를 설정할 수 있습니다. 따라서 환경 설정 창이 닫히거나 "확인"버튼이 눌려지면 DOM을 통해 업데이트하는 이벤트 나 기능을 발생시키고 싶습니다.

그래서 툴바가로드 될 때 호출되는 함수입니다. 툴바의 링크 가시성을 설정합니다.

function esbTB_LoadMenue() { 
    var MenuItemNews = document.getElementById("esbTb_rss_reader"); 
    var MenuItemEservice = document.getElementById("esbTb_estv"); 

    if (!(prefManager.getBoolPref("extensions.esbtoolbar.ShowNews"))) { 
    MenuItemNews.style.display = 'none'; 
    } 

    if (!(prefManager.getBoolPref("extensions.esbtoolbar.ShowEservice"))) { 
    MenuItemEservice.style.display = 'none'; 
    } 
} 

그래서 나는 ... 일부는 내가 시도한 방법으로 ... 작동하지 않는 대화에의 EventListener를 추가하는 것처럼 생각 을 시도 그리고 나는 또한 루트 창에서 창 개체를 넘겨 시도 (툴바)를 opendialog 함수의 인수로 사용하여이 함수를 this로 변경했습니다.

function esbTB_LoadMenue(RootWindow) { 
    var MenuItemNews = RootWindow.getElementById("esbTb_rss_reader"); 
    var MenuItemEservice = RootWindow.getElementById("esbTb_estv");} 

그리고 나서 핸드 오버 개체를 통해 요소에 액세스하려고했으나 런타임에도 도구 모음이 변경되지 않았습니다.

그래서 난 할 노력하고있어 런타임 동안 내 도구 모음의 공개 대상 링크를 변경하는 것입니다 내가 그렇게하는 방법을 난 이해가 안돼 ... 사전에

감사

------- 편집 -------

var prefManager = { 
    prefs: null, 

    start: function() 
    { 

     this.prefs = Components.classes["@mozilla.org/preferences-service;1"] 
       .getService(Components.interfaces.nsIPrefService) 
       .getBranch("extensions.esbtoolbar."); 
     this.prefs.QueryInterface(Components.interfaces.nsIPrefBranch2); 
     this.prefs.addObserver("", this, false); 

    }, 


    end: function() 
    { 
     this.prefs.removeObserver("", this); 
    }, 


    observe: function(subject, topic, data) 
    { 
     if (topic != "nsPref:changed") 
     { 
      return; 
     } 
     //Stuff what is done when Prefs have changed 
     esbTB_LoadMenue(); 

    }, 

    SetBoolPref: function(pref,value) 
    { 
     this.prefs.setBoolPref(pref,value); 
    }, 

    GetBoolPref: function(pref) 
    { 
     this.prefs.getBoolPref(pref); 
    } 
} 

따라서 구현되었습니다.

답변

1

트릭은 환경 설정 변경 내용을 듣는 것입니다. 그렇게하면 PrefWindow, about : config 또는 다른 메커니즘을 통해 발생했는지에 상관없이 환경 설정이 변경 될 때마다 도구 모음이 업데이트됩니다. Toolbar.js에서

당신이 지금
var esbTB_observe = function(subject, topic, data) { 
    if (topic != "nsPref:changed") { 
    return; 
    } 

    // find out which pref changed and do stuff 
} 

var esbTB_init = function() { 
    prefs = 
    Components.classes["@mozilla.org/preferences-service;1"] 
       .getService(Components.interfaces.nsIPrefService) 
       .getBranch("extensions.esbtoolbar."); 
    prefs.QueryInterface(Components.interfaces.nsIPrefBranch2); 
    prefs.addObserver("", esbTB_observe, false); 
} 

// Init addin after window loaded 
window.addEventListener("load", esbTB_init, false); 

을 다음을 수행 할 때 함수가 호출되는 창이로드의 esbTB_init() 이는 현 지사에 관찰자에 "extensions.esbtoolbar." 추가됩니다. 나중에 분기의 기본 설정이 변경되면 esbTB_observe() 함수가 자동으로 호출됩니다.

esbTB_observe()에서 사용자 환경 설정 값을 읽고 툴바를 조정해야합니다.

+0

알겠습니다. 그래서 prefmanager 객체의 구현을 수정해야한다고 생각합니다. 나는 이것을 좋아했다. var prefManager = Components.classes [ "@ mozilla.org/preferences-service;1"] ... 그리고 나서 메소드를 추가 할 수 있도록 변경해야한다. 그래서 약간의 질문이 prefManager.setBoolPref ("extensions.esbtoolbar.rss.visited", true); 예를 들어 prefmanager 객체에서 구현 한 다음 설정하고 설정을 가져 오는 메소드가 있어야합니까? 내가 무슨 뜻인지 알기를 바랍니다 :) 안부 – Mark

+0

nsIPrefBranch2 인터페이스를 구현할 필요가 없습니다. 간단하게 사용하십시오. 관찰 방법을 어디에 두어야하는지 묻고 있습니까? – speedball2001

+0

나는 내 대답에 좀 더 많은 코드와 설명을 넣었다. 희망이 도움이됩니다. – speedball2001