Ingo D. Ongemuth: XUL - Referenz auf die Sidebar?

Hallo Zusammen,

vielleicht kennt sich ja jemand mit Sidebars unter XUL aus? Ich habe mir also im Overlay eine Sidebar definiert:

<broadcasterset id="mainBroadcasterSet">
        <broadcaster
                id="mainbar"
                autoCheck="false"
                label="MySidebar"
                type="checkbox"
                group="sidebar"
                sidebarurl="chrome://om/content/mainbar.xul"
                sidebartitle="MySidebar"
                oncommand="toggleSidebar('mainbar');"/>

Nun habe ich schon recht früh herausgefunden, wie man das Ding an/ausschaltet, und zwar mit "toggleSidebar()". Aber ich weiß nicht, wie ich den aktuellen Status herausfinde, also ob die Sidebar nu sichtbar is oder nicht. Warum kann man denn nicht einfach mit document.getElementById('mainbar') dran? Aber selbst wenn, wüsste ich gar nicht welche Eigenschaften und Methoden das Teil hat :/

Ich habe jetzt knappe 24 Stunden nur mit diesem einen Thema zugebracht und frage mich so langsam, warum man zu so einem tragenden Bestandteil von XUL wie den Sidebars überhaupt keine vernünftige Doku findet. Überhaupt scheint es einige Entwickler zu geben, die nahezu undokumentierte Eigenschaften von XUL nutzen. Gibt es einen Trick, wie ich an die Insiderinformationen gelange? Oder lesen die auch nur die kaum dokumentierten Schnittstellen und prüfen dann mühsam das Verhalten aus?

Danke und Grüsse,
Ingo

  1. Hallo,

    Überhaupt scheint es einige Entwickler zu geben, die nahezu undokumentierte Eigenschaften von XUL nutzen. Gibt es einen Trick, wie ich an die Insiderinformationen gelange? Oder lesen die auch nur die kaum dokumentierten Schnittstellen und prüfen dann mühsam das Verhalten aus?

    Genau! Willkommen im Club!

    Vielleicht hilft dir die Beschreibungen und der Script in:
    http://lxr.mozilla.org/aviarybranch/source/browser/base/content/browser.js#3431

    und der Aufruf der Funktion:
    http://lxr.mozilla.org/aviarybranch/source/browser/base/content/browser.js#4394

    Grüße
    Thomas

    1. Hallo Thomas,

      Genau! Willkommen im Club!

      oh je, ich hatte es mir schon gedacht, nachdem ich jeden Pup der etwas tiefer in die Materie geht mühsam erkunden musste. Ich habe mir jetzt mal ein Buch bestellt, da stehen hoffentlich die geheimnisse drin :-)

      Vielleicht hilft dir die Beschreibungen und der Script in:
      http://lxr.mozilla.org/aviarybranch/source/browser/base/content/browser.js#3431

      und der Aufruf der Funktion:
      http://lxr.mozilla.org/aviarybranch/source/browser/base/content/browser.js#4394

      Danke, jetzt geht es tatsächlich. Ich steige aber immer noch nicht dahinter, wie andere so programmieren. Also ich finde ja, dass man schnell was hinbekommt, an einigen Stellen bleibe ich dafür stundenlang mit irgendeiner bescheuerten Sache hängen. Aktuell beispielsweise massive Probleme mit dem Box-Model von Mozilla (vermute ich). Aus irgendeinem Grund stellt der eine Box nach einem display:none und wieder display:block in einer anderen Größe da, als vorher. Wieso das Box-Element plötzlich weniger Platz in Anspruch nimmt, keine Ahnung. Wäre ja nicht schlimm, wenn man nicht immer Ewigkeiten googlen müsste, weil die Infos über tausend Sites verteilt sind...

      Aber nu, damit muss ich wohl jetzt leben lernen.
      Hach, und jetzt habe ich es mir sogar nicht von der Seele geschrieben, danke! ;-)
      Schönen Sonntag noch..
      Ingo

  2. Hallo Ingo,

    gerade, ist mir aufgefallen, daß es unter den Archiven in /usr/lib/mozilla/chrome kein JavaScript gibt, welches die Funktion definiert. Jedenfalls wird in der browser.js des FF (sitze selbst gerade an einer zu gestaltenden Oberfläche für FF) die Funktion definiert:

      
    function toggleSidebar(aCommandID, forceOpen) {  
      
      var sidebarBox = document.getElementById("sidebar-box");  
      if (!aCommandID)  
        aCommandID = sidebarBox.getAttribute("sidebarcommand");  
      
      var elt = document.getElementById(aCommandID);  
      var sidebar = document.getElementById("sidebar");  
      var sidebarTitle = document.getElementById("sidebar-title");  
      var sidebarSplitter = document.getElementById("sidebar-splitter");  
      
      if (!forceOpen && elt.getAttribute("checked") == "true") {  
        elt.removeAttribute("checked");  
        sidebarBox.setAttribute("sidebarcommand", "");  
        sidebarTitle.setAttribute("value", "");  
        sidebarBox.hidden = true;  
        sidebarSplitter.hidden = true;  
        content.focus();  
        return;  
      }  
      
      var elts = document.getElementsByAttribute("group", "sidebar");  
      for (var i = 0; i < elts.length; ++i)  
        elts[i].removeAttribute("checked");  
      
      elt.setAttribute("checked", "true");;  
      
      if (sidebarBox.hidden) {  
        sidebarBox.hidden = false;  
        sidebarSplitter.hidden = false;  
      }  
      
      var url = elt.getAttribute("sidebarurl");  
      var title = elt.getAttribute("sidebartitle");  
      if (!title)  
        title = elt.getAttribute("label");  
      sidebar.setAttribute("src", url);  
      sidebarBox.setAttribute("src", url);  
      sidebarBox.setAttribute("sidebarcommand", elt.id);  
      sidebarTitle.setAttribute("value", title);  
      if (aCommandID != "viewWebPanelsSidebar") { // no searchbox there  
        // if the sidebar we want is already constructed, focus the searchbox  
        if ((aCommandID == "viewBookmarksSidebar" && sidebar.contentDocument.getElementById("bookmarksPanel"))  
        || (aCommandID == "viewHistorySidebar" && sidebar.contentDocument.getElementById("history-panel")))  
          sidebar.contentDocument.getElementById("search-box").focus();  
        // otherwiese, attach an onload handler  
        else  
          sidebar.addEventListener("load", asyncFocusSearchBox, true);  
      }  
    }  
    
    

    Es ist also möglich mittels getElementById() auf das XUL-Objekt "broadcaster" zuzugreifen und die Eigenschaft hidden in einer if-Anweisung abzufragen.
    Als Dokumentation habe ich bis jetzt die sites http://www.xulplanet.com/ und http://www.mozilla.org/projects/xul/ genutzt.

    Gruß aus Berlin!
    eddi

    --
    Ja - ich gebe manchmal Lösungen auf dem silbernen Tablett und
    Nein - sie werden dennoch nicht den Schlag vor den Kopf mit dem goldenen abwehren ;)
    1. Hallo Eddi,

      danke sehr :) Leider hilft mir das nicht so recht weiter:

      var sidebarBox = top.document.getElementById('sidebar-box');
              alert(sidebarBox);

      liefert "null" zurück. Auch ohne das "top." davor. Muss ich die browser.js erst irgendwie einbinden, damit das Objekt in meinem Dokument sichtbar wird?

      Danke und viele Grüsse aus Berlin nach Berlin :)
      Ingo

    2. Halt!

      Alles zurück, geht doch. Keine Ahnung warum jetzt doch, vielleicht hatte ich vorhin noch einen firefox-Prozess nicht abgeschossen oder so.

      Wie auch immer, herzlichen Dank!
      Ingo