跳转到内容

XForms/大纲编辑器

来自维基教科书,开放的书籍,开放的世界

有时您希望允许用户能够向列表添加属性,这些属性会更改列表中项目的显示方式。在此示例中,缩进级别由列表中称为“级别”的属性控制,该属性是大纲视图中的缩进级别。

注意:此程序基于 Kurt Cagle 在 Mozilla XForms 开发者新闻组中发布的示例。此示例经其允许发布。

屏幕图像

[编辑 | 编辑源代码]
大纲编辑器
[编辑 | 编辑源代码]

树编辑器

示例程序

[编辑 | 编辑源代码]

这是一个示例大纲编辑器程序。如果要测试此程序,请确保使用编辑视图复制文本。此文件包含多个制表符,这些制表符在视图模式下无法正确显示。

<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/2007/xhtml"
   xmlns:xf="http://www.w3.org/2002/xforms"
   xmlns:ev="http://www.w3.org/2001/xml-events"
   xmlns:xbl="http://www.mozilla.org/xbl">
    <head>
       <!-- based on example posted by Kurt Cagle on Mozilla XForms Newsgroup in Feb. 2007 -->
       <style type="text/css">
       #itemEntry .xf-value {
          width:250px;
       }
       #content {
          border:inset 2px blue;
          width:350px;
          height:400px;
          overflow-y:auto;
          background: silver;
      }
      </style>
      <xf:model id="data_model">
          <xf:instance id="document_data" src="item-tree.xml" xmlns=""/>
          <xf:bind nodeset="//delete-trigger-enabled" relevant="count(//item) &gt; 1" />
             
          <xf:action ev:event="xforms-ready">
              <xf:setfocus control="itemEntry" />
          </xf:action>
             
          <xf:action ev:event="addItemEvent">
              <xf:insert nodeset="//data//item[position() =
                  index('list')]" at="index('list')" position="after" />
              <xf:setvalue ref="//data//item[position() =
                  index('list')]" value="" />
               <xf:setvalue ref="//data//item[position() =
                  index('list')]/@level" value="//data//item[position() =
                  index('list') - 1]/@level" />
                <xf:setfocus control="itemEntry" />
          </xf:action>
             
          <xf:action ev:event="removeItemEvent">
              <xf:delete nodeset="//data//item[position() =
                  index('list')]" at="index('list')" />
               <xf:setindex repeat="list" index="index('list')-1" />
               <xf:setfocus control="itemEntry" />
          </xf:action>
             
             <xf:action ev:event="promoteItemEvent">
                  <xf:setvalue ref="//data//item[position() =
                  index('list')]/@level" value="if(number(.) - 1 &lt; 1,1, number(.) - 1)" />
                  <xf:setfocus control="itemEntry" />
             </xf:action>
             
             <xf:action ev:event="demoteItemEvent">
                  <xf:setvalue ref="//data//item[position() =
                     index('list')]/@level" value="if(index('list') != 1,
                     if (number(.) &gt; //data//item[position() =
                         index('list')-1]/@level,(//data//item[position() =
                         index('list')-1]/@level) + 1,number(.) + 1),1)" />
                  <xf:setfocus control="itemEntry" />
             </xf:action>
             <xf:submission id="save" method="put" action="item-tree.xml" instance="document_data"/>
         </xf:model>
    </head>
    <body>
       <xf:group ref="/container/data">
           <div>
               <xf:trigger id="addItem">
                   <xf:label>Add</xf:label>
                      <xf:action ev:event="DOMActivate">
                           <xf:dispatch name="addItemEvent" target="data_model" />
                      </xf:action>
               </xf:trigger>
                  
               <xf:trigger id="removeItem">
                      <xf:label>Remove</xf:label>
                      <xf:action ev:event="DOMActivate">
                           <xf:dispatch name="removeItemEvent" target="data_model" />
                      </xf:action>
               </xf:trigger>
                  
               <xf:trigger id="promote">
                      <xf:label>Promote &lt;</xf:label>
                      <xf:action ev:event="DOMActivate">
                           <xf:dispatch name="promoteItemEvent" target="data_model" />
                      </xf:action>
               </xf:trigger>
               <xf:trigger id="demote">
                      <xf:label>Demote &gt;</xf:label>
                      <xf:action ev:event="DOMActivate">
                           <xf:dispatch name="demoteItemEvent" target="data_model" />
                      </xf:action>
               </xf:trigger>
               <div id="content">
                  <xf:repeat nodeset="items/item" id="list">
                     <div>
                         <xf:input ref="." id="itemEntry" incremental="true">
                            <xf:label>
                                <xf:output value="concat(substring('&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;',
1, 3*(number(@level) - 1)),'* ')" />
                             </xf:label>
                              <xf:action ev:event="DOMActivate">
                                   <xf:dispatch name="addItemEvent" target="data_model" />
                              </xf:action>
                         </xf:input>
                     </div>
                 </xf:repeat>
              </div>
           </div>
        </xf:group>
        <xf:submit submission="save">
            <xf:label>Save</xf:label>
        </xf:submit>
    </body>
</html>

示例实例文件 "item-tree.xml"

[编辑 | 编辑源代码]
<?xml version="1.0" encoding="UTF-8"?>
<container>
   <data>
      <items>
         <item level="1">none</item>
         <item level="2">Fiction</item>
         <item level="3">Fantasy</item>
         <item level="3">Mystery</item>
         <item level="3">Religion</item>
         <item level="3">Romance</item>
         <item level="3">Science Fiction</item>
         <item level="2">Non-Fiction</item>
         <item level="3">Cooking</item>
         <item level="3">History</item>
         <item level="3">Biographies</item>
         <item level="3">Computers</item>
         <item level="4">Software</item>
         <item level="5">XForms Tutorial and Cookbook</item>
         <item level="3">Internet</item>
         <item level="3">Nature</item>
         <item level="3">Science</item>
         <item level="1">Electronics</item>
         <item level="1">Music</item>
      </items>
   </data>
</container>

此程序的结构使用自定义事件。请注意,模型中有一系列操作,每个操作都有其自己的事件名称

<xf: model id="data_model">
...
   <xf:action ev:event="addItemEvent">
...

这些事件直接在触发器中调用,如下所示

   <xf:dispatch name="addItemEvent" target="data_model" />

请注意,target 属性是事件所在模型的名称。

虽然操作可以直接放入触发器中,但有时操作在逻辑上更适合与实例数据分组,因此应该直接放在模型中。这也允许其他需要重用这些操作的事件,因此将可重用操作直接放在模型中是一个好主意

参考资料

[编辑 | 编辑源代码]

此程序的版本最初由 Kurt Cagle 发布在 Mozilla XForms 新闻组中。


下一页: 同义词集编辑器 | 上一页: 分层书签
主页: XForms
华夏公益教科书