Xpoint
   [напомнить пароль]

рекурсивное меню используя XUL шаблон

Метки: [без меток]
2007-03-06 12:40:35 [обр] sndralex(2/2)[досье]

Здравствуйте,

Мне нужно сгенерить меню вида:
acc1
  opp1
    q001
    q002
acc2
  opp2
    q003
    q004
  q005
На входе у меня есть набор записей:
q001 | acc1 | opp1
q002 | acc1 | opp1
q003 | acc2 | opp2
q004 | acc2 | opp2
q005 | acc2 | null

Я сделал из него вот такой RDF :
    <RDF:Seq RDF:about="urn:root">
        <RDF:li RDF:resource="urn:acc1"/>
        <RDF:li RDF:resource="urn:acc2"/>
    </RDF:Seq>
    <RDF:Description RDF:about="urn:acc1"
        alt:name="account 1"/>
    <RDF:Description RDF:about="urn:acc2"
        alt:name="account 2"/>
    <RDF:Seq RDF:about="urn:acc1">
        <RDF:li RDF:resource="urn:opp1"/>
    </RDF:Seq>
    <RDF:Seq RDF:about="urn:acc2">
        <RDF:li RDF:resource="urn:opp2"/>
        <RDF:li RDF:resource="urn:q5"/>
    </RDF:Seq>
    <RDF:Description RDF:about="urn:opp1"
        alt:name="Opportunity 1"/>
    <RDF:Description RDF:about="urn:opp2"
        alt:name="Opportunity 2"/>
    <RDF:Seq RDF:about="urn:opp1">
        <RDF:li RDF:resource="urn:q1"/>
        <RDF:li RDF:resource="urn:q2"/>
    </RDF:Seq>
    <RDF:Seq RDF:about="urn:opp2">
        <RDF:li RDF:resource="urn:q3"/>
        <RDF:li RDF:resource="urn:q4"/>
    </RDF:Seq>
    <alt:quote RDF:about="urn:q1"
        alt:name="Quote 1"/>
    <alt:quote RDF:about="urn:q2"
        alt:name="Quote 2"/>
    <alt:quote RDF:about="urn:q3"
        alt:name="Quote 3"/>
    <alt:quote RDF:about="urn:q4"
        alt:name="Quote 4"/>
    <alt:quote RDF:about="urn:q5"
        alt:name="Quote 5"/>
Вот такой шаблон я использую:
    <menu label="Choose quote..." id="file-menu" datasources="rdf:null" ref="urn:root"
          xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
    <template>
        <rule rdf:type="alt/rdf#quote">
          <menupopup>
            <menuitem uri="rdf:*" label="rdf:alt/rdf#name"/>
          </menupopup>
        </rule>
        <rule>
          <menupopup>
            <menu uri="rdf:*" label="rdf:alt/rdf#name"/>
          </menupopup>
        </rule>

И ничего не получаю.
Помогите разобраться. Может я где то ошибся?
Можно ли сделать рекурсию используя полный синтакс Шаблонов?

Спасибо.

спустя 2 дня 3 часа [обр] sndralex(2/2)[досье]
Начал разбираться.
Переделал XUL на:
    <menu label="Choose quote...">
        <menupopup id="file-menu" datasources="rdf:null"
            ref="urn:root">
    <template>
        <rule iscontainer="true">
            <menu uri="rdf:*" label="rdf:alt/rdf#name">
                <menupopup uri="rdf:*"/>
            </menu>
        </rule>
        <rule>
            <menuitem uri="rdf:*" label="rdf:alt/rdf#name"/>
        </rule>
    </template>
    </menupopup>
  </menu>
Теперь получилось отобразить меню, но оно как то странно реагирует:
если в подменю присутствует еще одно подменю в одном экземпляре, то оно не открывается, а если не одно а вместе с menuitem, то открывается.
Странно. А вообще, похоже, что все примеры с рекурсивным меню на XULPlanet.com и developer.mozilla.org - не рабочие для версии FF 2.
спустя 1 день 4 часа [обр] sndralex(2/2)[досье]

В продолжение темы рекурсивного меню,
Я делаю menulist с под-меню на javascript, используя следующий код:
    var qlist = document.getElementById("qlist-popup");
    var menu = document.createElementNS(qlist.namespaceURI,"menu");
    menu.id = "menu1"
    menu.setAttribute("label","menu 1");
    menu = qlist.appendChild(menu);
    var menupopup = document.createElementNS(qlist.namespaceURI,"menupopup");
    menupopup = menu.appendChild(menupopup);
    var item = document.createElementNS(qlist.namespaceURI,"menuitem");
    item.id = "item1"
    item.setAttribute("label", " ite m 1");
    item = menupopup.appendChild(item);

В результате сгенерированое Меню и все его содержимое не видны, хотя DOM inspector показывате мне, что оно есть

Если я меняю последнюю строку кода на:
    item = qlist.appendChild(item);
Я получаю menuitem под моим menulist, как и положено.

Можно ли генерить сложное меню?

Спасибо.

спустя 23 часа [обр] Владимир Палант(434/4445)[досье]
У меня ваш код работает. Вот полный код примера:
<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>

<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" onload="initMenu()">

<script type="application/x-javascript">
  function initMenu() {
    var qlist = document.getElementById("qlist-popup");

    var menu = document.createElementNS(qlist.namespaceURI,"menu");
    menu.id = "menu1"
    menu.setAttribute("label","menu 1");
    menu = qlist.appendChild(menu);

    var menupopup = document.createElementNS(qlist.namespaceURI,"menupopup");
    menupopup = menu.appendChild(menupopup);

    var item = document.createElementNS(qlist.namespaceURI,"menuitem");
    item.id = "item1"
    item.setAttribute("label", " ite m 1");
    item = menupopup.appendChild(item);
  }
</script>

<menubar>
  <menu label="Test">
    <menupopup id="qlist-popup"/>
  </menu>
</menubar>

</window>
спустя 2 часа 8 минут [обр] sndralex(2/2)[досье]
Я использовал этот код с menulist.
С menulist он не работает.
спустя 3 минуты [обр] sndralex(2/2)[досье]
Хотя если я делаю menulist, то наверно и внутри тоже надо создавать menulist а не меню. Но тогда под меню выглядит как dropdown, а не как dropright. может там какой то аттрибут указать надо?
Powered by POEM™ Engine Copyright © 2002-2005