[Zope3-checkins] CVS: Zope3/src/zope/app/rotterdam - __init__.py:1.1 configure.zcml:1.1 dialog_macros.pt:1.1 editingwidgets.py:1.1 favicon.png:1.1 ftests.py:1.1 logo.gif:1.1 mi.gif:1.1 navigation_macros.pt:1.1 onlinehelp.js:1.1 pl.gif:1.1 simpleeditingrow.pt:1.1 simpleeditingrowfragment.pt:1.1 site_management.css:1.1 standardmacros.py:1.1 template.pt:1.1 view_macros.pt:1.1 xmlobject.py:1.1 xmltree.js:1.1 zope3.css:1.1 zope3logo.gif:1.1

Philipp von Weitershausen philikon at philikon.de
Tue Mar 2 12:11:32 EST 2004


Update of /cvs-repository/Zope3/src/zope/app/rotterdam
In directory cvs.zope.org:/tmp/cvs-serv20275/rotterdam

Added Files:
	__init__.py configure.zcml dialog_macros.pt editingwidgets.py 
	favicon.png ftests.py logo.gif mi.gif navigation_macros.pt 
	onlinehelp.js pl.gif simpleeditingrow.pt 
	simpleeditingrowfragment.pt site_management.css 
	standardmacros.py template.pt view_macros.pt xmlobject.py 
	xmltree.js zope3.css zope3logo.gif 
Log Message:
Moved browser skins to their individual packages below zope.app.


=== Added File Zope3/src/zope/app/rotterdam/__init__.py ===
##

=== Added File Zope3/src/zope/app/rotterdam/configure.zcml ===
<configure
    xmlns="http://namespaces.zope.org/zope"
    xmlns:browser="http://namespaces.zope.org/browser">

  <browser:layer
      name="rotterdam" />
  <browser:skin
      name="Rotterdam" layers="rotterdam default" />
  
  <browser:resource 
      name="zope3.css" file="zope3.css" layer="rotterdam" />

  <browser:resource 
      name="site_management.css" file="site_management.css" layer="rotterdam" />
  
  <browser:resource 
      name="xmltree.js" file="xmltree.js" layer="rotterdam" />
  
  <browser:resource 
      name="onlinehelp.js" file="onlinehelp.js" layer="rotterdam" />
      
   <browser:resource
      name="favicon.png" file="favicon.png" layer="rotterdam" />
  
  <browser:resource
      name="zope3logo.gif" file="zope3logo.gif" layer="rotterdam" />
  
  <browser:resource
      name="logo.gif" file="logo.gif" layer="rotterdam" />
  
  <browser:resource 
      name="pl.gif" file="pl.gif" layer="rotterdam" />
  
  <browser:resource 
      name="mi.gif" file="mi.gif" layer="rotterdam" />
  
  <browser:pages
      for="zope.app.interfaces.container.IReadContainer"
      permission="zope.View"
      class=".xmlobject.ReadContainerXmlObjectView">
    <browser:page name="children.xml" attribute="children" />
    <browser:page name="singleBranchTree.xml" attribute="singleBranchTree" />
  </browser:pages>
  
  <browser:page
      name="singleBranchTree.xml" 
      for="zope.interface.interface.Interface"
      permission="zope.View"
      class=".xmlobject.XmlObjectView"
      attribute="singleBranchTree" 
      />
  
  <!-- below overrides the standard_macros by Rotterdam Skin -->
  <browser:page
      for="*"
      name="standard_macros"
      permission="zope.View"
      class=".standardmacros.StandardMacros"
      layer="rotterdam"
      allowed_interface="zope.interface.common.mapping.IItemMapping" 
      />
  
  <browser:page 
      for="*"
      name="skin_macros"
      permission="zope.View"
      layer="rotterdam"
      template="template.pt" 
      />
  
  <browser:page 
      for="*"
      name="view_macros"
      permission="zope.View"
      layer="rotterdam"
      template="view_macros.pt" />
  
  <browser:page
      for="*"
      name="dialog_macros"
      permission="zope.View"
      layer="rotterdam"
      template="dialog_macros.pt" />

  <browser:page
      for="*"
      name="navigation_macros"
      permission="zope.View"
      layer="rotterdam"
      template="navigation_macros.pt"
      />
 
  <browser:page
      permission="zope.Public"
      allowed_interface="zope.app.interfaces.browser.form.IBrowserWidget"
      for="zope.schema.interfaces.ISourceText"
      name="edit"
      layer="rotterdam"
      class=".editingwidgets.SimpleEditingWidget" 
      />

</configure>


=== Added File Zope3/src/zope/app/rotterdam/dialog_macros.pt ===
<metal:block define-macro="dialog"><metal:block define-slot="doctype"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"></metal:block>

<html
  xmlns="http://www.w3.org/1999/xhtml"
  xml:lang="en"
  lang="en" 
  i18n:domain="zope">

  <head>
    <!-- Waaa -->
    <title metal:define-slot="title" i18n:translate="">Z3 UI</title>


    <style type="text/css" 
           media="all"
           tal:content=
           "string: @import url(${context/++resource++zope3.css});"
           >
      @import url(zope3.css);
    </style>

    <metal:block define-slot="headers" />
    <metal:block define-slot="style_slot" />
    <metal:block define-slot="ecmascript_slot" />

    <!--
    <script type="text/javascript" src="xmltree.js" 
            tal:attributes="src string:${context/++resource++xmltree.js}"
            ></script>
    -->
    <link rel="icon" type="image/png"
          tal:attributes="href context/++resource++favicon.png" />
  </head>

  <body onload="loadtree('');"
        tal:define="rooturl     request/getApplicationURL;
                    thisbaseurl request/URL/-1;
                    "
        tal:attributes="
          onload string:loadtree('${rooturl}/', '${thisbaseurl}/');
          " 
        >

    <div id="global">
       <!--div tal:content="string:Usage:${usage}"></div>  
       <div tal:content="nocall:view"></div-->
       <img tal:attributes="src context/++resource++zope3logo.gif" />
    </div>

    <div id="personal">

      <metal:block define-macro="logged_user">
        <span tal:omit-tag="" i18n:translate="">User:</span>
        <tal:block replace="request/user/getTitle">
          User
        </tal:block>
      </metal:block>

      <!-- (Personal elements) -->
    </div>


    <div id="navigators">

<!--
      <div class="box" id="navigationTree">

        <h4 i18n:translate="">Navigation</h4>

        <div 
          xmlns="http://www.zope.org/zope3xmltree"
          id="navtreecontents" 
          class="body" 
          onclick="treeclicked(event);" 
          onmouseover="mouseOverTree(event);"
          onmouseout="mouseOutTree(event);"
          >
        </div>

      </div>
-->
    </div>

    <div id="content">


      <div class="itemViewsBar">
      &nbsp;
      </div>

      <div class="item">

        <metal:block define-slot="body">

            <table class="listing">

              <thead>

                <th>Test</th>
                <th>Another</th>

              </thead>


              <tbody>

                <tr>

                  <td>content</td>
                  <td>thingy</td>

                </tr>


                <tr class="even">

                  <td>more</td>
                  <td>data</td>

                </tr>

              </tbody>

            </table>
        </metal:block>
        </div>

    </div>


    <div id="context_information">

    <div id="helpers">

      <div class="box" id="itemHelp" tal:condition="pagetip|nothing">

        <h4 i18n:translate="">Tip</h4>

        <div class="body">

          <div class="content odd">

            <metal:block define-slot="pagetip" tal:replace="pagetip">
              A short tip goes here              
            </metal:block>

          </div>

        </div>

      </div>

    </div>



    </div>


    <div id="footer"
      metal:define-macro="footer"
      i18n:translate="">
      Powered by Zope
    </div>


  </body>

</html>

</metal:block>




=== Added File Zope3/src/zope/app/rotterdam/editingwidgets.py ===
##############################################################################
#
# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
# All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
#
##############################################################################
"""
$Id: editingwidgets.py,v 1.1 2004/03/02 17:11:30 philikon Exp $
"""
__metaclass__ = type

from zope.app.browser.form.widget import BrowserWidget, renderElement
from zope.app.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile

class SimpleEditingWidget(BrowserWidget):
    """Improved textarea editing, with async saving using JavaScript."""
    propertyNames = BrowserWidget.propertyNames + ['width', 'height', 'extra']

    default = ""
    width = 60
    height = 15
    extra=""
    style="width: 98%; font-family: monospace;"
    rowTemplate = ViewPageTemplateFile("simpleeditingrow.pt")
    rowFragment = ViewPageTemplateFile("simpleeditingrowfragment.pt")
    
    def _convert(self, value):
        if self.context.min_length and not value:
            return None
        return value

    def __call__(self):
        return renderElement("textarea",
                             name = self.name,
                             id = self.name,
                             cssClass = self.getValue('cssClass'),
                             rows = self.getValue('height'),
                             cols = self.getValue('width'),
                             style = self.style,
                             contents = self._showData(),
                             extra = self.getValue('extra'))

    def contents(self):
        """Make the contents available to the template"""
        return self._showData()

    # XXX: This is ridiculous! This cannot work in any browser well!
    #def row(self):
    #    # XXX This was originally set to make a colspan=2 table cell, and
    #    #     have the label above the text area. Perhaps we should use
    #    #     different div classes for this case?
    #    return self.rowTemplate()
    #    return '<h1>here</h1><div class="label">%s</div><div class="field">%s</div>' % (
    #            self.label(), self())


=== Added File Zope3/src/zope/app/rotterdam/favicon.png ===
  <Binary-ish file>

=== Added File Zope3/src/zope/app/rotterdam/ftests.py ===
##############################################################################
#
# Copyright (c) 2003 Zope Corporation and Contributors.
# All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
#
##############################################################################
"""$Id: ftests.py,v 1.1 2004/03/02 17:11:30 philikon Exp $
"""
import unittest
from xml.dom import minidom
from zope.testing.functional import BrowserTestCase

class TestNavTree(BrowserTestCase):

    def testnavtree(self):
        # Add some folders
        response = self.publish("/+/action.html", basic='mgr:mgrpw', 
                                form={'type_name':u'Folder', 
                                      'id':u'First'})
        self.assertEqual(response.getStatus(), 302)
        response = self.publish("/+/action.html", basic='mgr:mgrpw', 
                                form={'type_name':u'Folder', 
                                      'id':u'S&econd'})
        self.assertEqual(response.getStatus(), 302)
        response = self.publish("/+/action.html", basic='mgr:mgrpw', 
                                form={'type_name':u'Folder', 
                                      'id':u'Third'})
        self.assertEqual(response.getStatus(), 302)
        response = self.publish("/First/+/action.html", basic='mgr:mgrpw', 
                                form={'type_name':u'Folder', 
                                      'id':u'Firsts"Folder'})
        self.assertEqual(response.getStatus(), 302)
        response = self.publish("/First/+/action.html", basic='mgr:mgrpw', 
                                form={'type_name':u'Folder', 
                                      'id':u'somesite'})
        self.assertEqual(response.getStatus(), 302)

	#add a site manager This will break when site adding is fixed
	# see above for examples to fix by filling out a form
	# when further action is required to make a site
        response = self.publish("/First/somesite/addServiceManager.html",
						basic='mgr:mgrpw')
        self.assertEqual(response.getStatus(), 302)
        # /First/FirstsFolder/@@singleBranchTree.xml 
        # contains those 4 elements above
        # /@@children.xml 
	# contains First Second and Third
	
        response = self.publish(
	              "/First/somesite/++etc++site/@@singleBranchTree.xml",
						basic='mgr:mgrpw')
        self.assertEqual(response.getStatus(), 200)

	tree = minidom.parseString(response.getBody())

        response = self.publish("/@@children.xml", basic='mgr:mgrpw')
        self.assertEqual(response.getStatus(), 200)

	tree = minidom.parseString(response.getBody())

        response = self.publish("/First/+/action.html", basic='mgr:mgrpw', 
                                form={'type_name':u'Folder', 
                                      'id':u'Firsts2ndFolder'})
        self.assertEqual(response.getStatus(), 302)


def test_suite():
    suite = unittest.TestSuite()
    suite.addTest(unittest.makeSuite(TestNavTree))
    return suite

if __name__=='__main__':
    unittest.main(defaultTest='test_suite')



=== Added File Zope3/src/zope/app/rotterdam/logo.gif ===
  <Binary-ish file>

=== Added File Zope3/src/zope/app/rotterdam/mi.gif ===
  <Binary-ish file>

=== Added File Zope3/src/zope/app/rotterdam/navigation_macros.pt ===
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      i18n:domain="zope">
<body>

  <!-- Java scripts for the navigation tree -->

  <metal:tree define-macro="navigation_tree_js">
    <!-- Ugly is better than lobotomized. -->
    <script type="text/javascript" src="xmltree.js"
            tal:attributes="src string:${context/++resource++xmltree.js}" >
    </script>

    <tal:var define="rooturl     request/getApplicationURL;
                     thisbaseurl request/URL/-1;
              global body_onload string:loadtree('${rooturl}/', '${thisbaseurl}/');" />

  </metal:tree>

  <!-- Box containing the actual navigation tree-->

  <metal:tree define-macro="navigation_tree_box">
    <!-- Ugly is better than lobotomized. -->
      <div class="box" id="navigationTree">
        <h4 i18n:translate="">Navigation</h4>
        <div xmlns="http://www.zope.org/zope3xmltree"
             id="navtreecontents"
             class="body"
             onclick="treeclicked(event);"
             i18n:translate="">Loading...</div>
      </div>
  </metal:tree>
</body>
</html>


=== Added File Zope3/src/zope/app/rotterdam/onlinehelp.js ===
// popup for to open the OnlinHelp in a new window
function popup(page, name, settings) {
  win = window.open(page, name, settings);
  win.focus();
}

=== Added File Zope3/src/zope/app/rotterdam/pl.gif ===
  <Binary-ish file>

=== Added File Zope3/src/zope/app/rotterdam/simpleeditingrow.pt ===
<html>
<head>
  <title i18n:translate="">Extended Editor</title>
</head>
<body>
<metal:define define-macro="widget">
<script type="javascript">

function getKeyPress(e) {

        if(e.target) {
            // Mozilla uses this
            key=e.keyCode;
                }
        else {
            // IE uses this
            key=window.event.keyCode
        }
        prettydump("key is " + key, LG_INFO);
        return false;

}
</script>
<label for="source-text" tal:attributes="for view/name" 
       tal:content="view/title"
       i18n:translate="">Some Source</label>
<div class="field">


  <textarea style="width: 95%" rows="15" 
            tal:attributes="id view/name; name view/name"
            tal:content="view/contents">Some editing text here.</textarea>
</div>
</metal:define>
</body>
</html>


=== Added File Zope3/src/zope/app/rotterdam/simpleeditingrowfragment.pt ===
<metal:use use-macro="view/rowTemplate/macros/widget"/>


=== Added File Zope3/src/zope/app/rotterdam/site_management.css ===
/*
** Customisations for the Site Management view 
** Used when the URL contains ++etc++site
*/
a {
	color: #963;
}

#actions {
    background: #963;
    border-left: 1px solid #963;
    border-right: 1px solid #963;
}

#actions a {
	color: White;
	border-left: 1px dashed white;
}

#actions a:hover {
	color: black;
	background-color: White;
}

#breadcrumbs {
    border-bottom: 1px solid #963;
}

.itemViews {
    border-bottom: 1px solid #963;
}

.itemViews a {
    border: 1px solid #963;
}

.itemViews a.selected {
    background: #963;
    border-bottom: #963 1px solid;
}

.itemViews a:hover {
    background-color: #963;
    color: White;
}

hr {
    color: #963;
}


h1, h2, h3, h4, h5, h6 {
    border-bottom: 1px solid #963;
}


=== Added File Zope3/src/zope/app/rotterdam/standardmacros.py ===
##############################################################################
#
# Copyright (c) 2003 Zope Corporation and Contributors.
# All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
#
##############################################################################
"""
$Id: standardmacros.py,v 1.1 2004/03/02 17:11:30 philikon Exp $
"""
from zope.app.basicskin.standardmacros import StandardMacros as BaseMacros

class StandardMacros(BaseMacros):
    macro_pages = ('skin_macros', 'view_macros', 'dialog_macros',
                   'navigation_macros')


=== Added File Zope3/src/zope/app/rotterdam/template.pt ===
<metal:block define-macro="page"><metal:block define-slot="doctype"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"></metal:block>

<html xmlns="http://www.w3.org/1999/xhtml"
    xml:lang="en"
    lang="en"
    i18n:domain="zope"
    tal:define="sitemgmt python:'/++etc++site/' in str(request.URL)">

  <head>
    <title metal:define-slot="title"
           tal:content="string:Z3: ${context/zope:title_or_name}">Z3 UI</title>

    <style type="text/css" media="all"
           tal:content="string:@import url(${context/++resource++zope3.css});">
      @import url(zope3.css);
    </style>

    <style type="text/css" media="all" tal:condition="sitemgmt"
           tal:content="string:@import url(${context/++resource++site_management.css});">
      @import url(site_management.css);
    </style>

    <meta http-equiv="Content-Type"
          content="text/html;charset=utf-8" />

    <metal:block define-slot="headers" />
    <metal:block define-slot="style_slot" />
    <metal:block define-slot="ecmascript_slot" />

    <!-- Popup sript for the OnlineHelp -->
    <script type="text/javascript" src="onlinehelp.js"
            tal:attributes="src string:${context/++resource++onlinehelp.js}" >
    </script>

    <metal:tree use-macro="context/@@standard_macros/navigation_tree_js" />

    <link rel="icon" type="image/png"
          tal:attributes="href context/++resource++favicon.png" />
  </head>

  <body tal:attributes="onload body_onload | nothing">

    <div id="global">
      <!--div tal:content="usage"></div-->
      <div id="userDetails">
        <metal:block define-macro="logged_user">
          <span tal:omit-tag="" i18n:translate="">User:</span>
          <tal:block replace="request/user/getTitle">
            User
          </tal:block>
        </metal:block>
          <a href="" 
            tal:attributes="href string:@@logout.html?nextURL=${request/URL}"
            tal:condition="python: hasattr(request.user, 'getLogin')"
            i18n:translate="">
            [Logout]</a>
          <a href="" 
            tal:attributes="href string:@@login.html?nextURL=${request/URL}"
            tal:condition="python: not hasattr(request.user, 'getLogin')"
            i18n:translate="">
            [Login]</a>
      </div>
      <img tal:attributes="src context/++resource++zope3logo.gif" />
    </div>

    <div id="navigators">

      <!-- Navigation tree box -->
      <metal:tree use-macro="context/@@standard_macros/navigation_tree_box" />

      <tal:block condition="usage/objectview">
      
        <div class="box" id="commonTasks"
             tal:define="view context/@@commonTasks|nothing"
             tal:condition="view/strip|nothing">


          <h4 i18n:translate="">Add:</h4>
          <div class="body">
            <span tal:replace="structure view" />
          </div>
        </div>
      </tal:block>

      <!-- Tree of the help topics that appears on the help namespace -->
      <div class="box" id="help"
           tal:condition="not:python:request.getURL().find('++help++')==-1">
        <h4 i18n:translate="">Online Help - TOC</h4>              
        <div class="body">
          <div tal:content="structure view/getTopicTree|nothing"
               tal:omit-tag="">content of topicTree</div>
          <br />
        </div>

      </div>

    </div>


    <div id="workspace">

      <div id="breadcrumbs" metal:define-macro="breadcrumbs"
       > <div tal:omit-tag="" i18n:translate="">Location:&nbsp;</div><tal:block
           repeat="breadcrumb context/@@absolute_url/breadcrumbs"
          ><a href=""
              tal:condition="repeat/breadcrumb/start"
              tal:attributes="
              href string:${breadcrumb/url}/@@SelectedManagementView.html"
              i18n:translate="">[top]
          </a>
          <a href=""
             tal:condition="not:repeat/breadcrumb/start"
             tal:content="string:${breadcrumb/name}"
             tal:attributes="
             href string:${breadcrumb/url}/@@SelectedManagementView.html">
            breadcrumb item</a> / </tal:block>
      </div>

      <div tal:condition="usage/objectview" class="itemViews"
           metal:define-slot="tabs">
        <tal:block repeat="view context/@@view_get_menu/zmi_views">
          <a href=""
            tal:attributes="href view/action;
                            class view/selected;"
            tal:content="view/title"
            i18n:translate="">
            label
          </a>
        </tal:block>
      </div>

      <!-- OnlineHelp with popup support -->
      <!-- note, we reverse the actions list 'cos they're packed to the
           screen from the right -->
      <div tal:condition="usage/objectview" id="actions"
           tal:define="help_actions context/@@view_get_menu/help_actions;
                       actions context/@@view_get_menu/zmi_actions;
                       dummy python:actions.reverse()"
           metal:define-slot="tabs">

        <span tal:condition="help_actions"
              tal:repeat="help_info help_actions"
              tal:omit-tag="">
          <a href="#"
               tal:define="url string:'${help_info/action}';
                           name string:'OnlineHelp';
                           settings string:'height=400
                                           ,width=700
                                           ,resizable=1
                                           ,scrollbars=yes
                                           ,location=yes
                                           ,status=yes
                                           ,toolbar=yes
                                           ,menubar=yes'"
               tal:attributes="href python:'javascript:popup('
                                           + url + ',' 
                                           + name + ','
                                           + settings +')'"
               tal:content="help_info/title"
               i18n:translate="">
              Action name
          </a>
        </span>
        <span tal:condition="actions"
              tal:omit-tag="">
          <a href="#"
               tal:repeat="info actions"
               tal:attributes="href info/action"
               tal:content="info/title"
               i18n:translate="">
              Action name
          </a>
        </span>
        &nbsp;
      </div>

      <div id="viewspace">

        <div metal:define-slot="message" id="message">
        </div>

        <div id="content">
          <metal:block define-slot="body">
            <table class="listing">
              <thead>
                <th>Test</th>
                <th>Another</th>
              </thead>
              <tbody>
                      <tr>
                        <td>content</td>
                        <td>thingy</td>
                      </tr>
                      <tr class="even">
                        <td>more</td>
                        <td>data</td>
                      </tr>
              </tbody>
            </table>
          </metal:block>
        </div>


        <div id="context_information">

          <div id="helpers">

            <div class="box" id="itemHelp" tal:condition="pagetip|nothing">
              <h4 i18n:translate="">Tip</h4>
              <div class="body">
                <div class="content odd">
                  <metal:block define-slot="pagetip"
                               tal:replace="structure pagetip">
                    A short tip goes here
                  </metal:block>
                </div>
              </div>
            </div>


          </div>

<!--
          <div id="inspectors">

            <div class="box" id="metadata"
                tal:define="view context/@@MetaDataBox|nothing"
                tal:condition="view/strip|nothing">

              <h4 i18n:translate="">Metadata</h4>

              <div class="body">

                <div class="content" tal:content="structure view">
                  Some metadata
                </div>

              </div>
            </div>
          </div>
-->

        </div>

        <div class="spacer">
          &nbsp;
        </div>

      </div>
    </div>

    <div id="footer" metal:define-macro="footer" />

    <div id="logger" />

  </body>

</html>

</metal:block>



=== Added File Zope3/src/zope/app/rotterdam/view_macros.pt ===
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html metal:define-macro="page">
<head metal:define-macro="head">
  <title 
    metal:define-slot="title"
    tal:content="options/getTitle|view/getTitle|context/getTitle|default"
    i18n:translate=""
    >Zope</title>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  <link href="/@@/zopetopBasic.css" rel="stylesheet" type="text/css"
        tal:attributes="href string:/@@/zopetopBasic.css" />
  <link href="/@@/zopetopWidgets.css" rel="stylesheet" type="text/css"
        tal:attributes="href string:/@@/zopetopWidgets.css" />
  <link href="/@@/zopetopStructure.css" rel="stylesheet" type="text/css"
        tal:attributes="href string:/@@/zopetopStructure.css" />
  <div metal:define-slot="headers">
  </div>
</head>
<body>

  <table metal:define-macro="zmi_tabs"><tr>
    <td tal:repeat="view context/@@view_get_menu/zmi_views">
    <a href="" tal:attributes="href view/action" tal:content="view/title"
       i18n:translate="">label</a>
    <tal:block condition="not: repeat/view/end">'</tal:block>
    </td>
   </tr></table>

  <div metal:define-slot="body">
     <p>Body here</p>
  </div>

  <div metal:define-macro="logged_user">
    <p i18n:translate="">User: 
      <span tal:replace="request/user/getTitle">User</span>
    </p>
  </div>

  <div metal:define-macro="footer">
    <p i18n:translate="">Powered by Zope</p>
  </div>

</body>
</html>



=== Added File Zope3/src/zope/app/rotterdam/xmlobject.py ===
##############################################################################
#
# Copyright (c) 2002 Zope Corporation and Contributors.
# All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
#
##############################################################################
"""Service manager interfaces

$Id: xmlobject.py,v 1.1 2004/03/02 17:11:30 philikon Exp $
"""

from zope.publisher.browser import BrowserView
from zope.app import zapi
from zope.app.interfaces.container import IReadContainer
from zope.app.traversing import getParents, getParent, traverse
from zope.interface import Interface
from rfc822 import formatdate, time
from xml.sax.saxutils import quoteattr

def setNoCacheHeaders(response):
    """Ensure that the tree isn't cached"""
    response.setHeader('Pragma', 'no-cache')
    response.setHeader('Cache-Control', 'no-cache')
    response.setHeader('Expires', formatdate(time.time()-7*86400))#7 days ago

def xmlEscape(format, *args):
    quotedArgs = [ quoteattr(str(arg)) for arg in args ]
    return format%tuple(quotedArgs)
	
def xmlEscapeWithCData(format, *args):
    cData = args[-1]
    quotedArgs = [ quoteattr(str(arg)) for arg in args[:-1] ]
    quotedArgsWithCData = quotedArgs + [cData]
    return format%tuple(quotedArgsWithCData)
	

class ReadContainerXmlObjectView(BrowserView):
    """Provide a xml interface for dynamic navigation tree in UI"""

    __used_for__ = IReadContainer


    def getIconUrl(self, item):
        result = ''
        icon = zapi.queryView(item, 'zmi_icon', self.request)
        if icon:
            result = icon.url()
        return result

    def children_utility(self, container):
        """Return an XML document that contains the children of an object."""
        result = []

        keys = list(container.keys())

        # include the service manager
        keys.append('++etc++site')

        for name in keys:

            # Only include items we can traverse to
            item = traverse(container, name, None)
            if item is None:
                continue

            iconUrl = self.getIconUrl(item)
            if IReadContainer.isImplementedBy(item):
                result.append(xmlEscape(
                    '<collection name=%s length=%s icon_url=%s/>',
                    name, len(item), iconUrl))
            else:
                result.append(xmlEscape(
                    '<item name=%s icon_url=%s/>',
                    name, iconUrl))

        return ' '.join(result)


    def children(self):
        """ """
        container = self.context
        self.request.response.setHeader('Content-Type', 'text/xml')
        setNoCacheHeaders(self.request.response)
        res = (u'<?xml version="1.0" ?><children> %s </children>'
                % self.children_utility(container))
	return res

    def singleBranchTree(self, root=''):
        """Return an XML document with the siblings and parents of an object.

        There is only one branch expanded, in other words, the tree is
        filled with the object, its siblings and its parents with
        their respective siblings.

        """
        result = ''
        oldItem = self.context
        for item in getParents(self.context):
            # skip skin if present
            #if item == oldItem:
            #        continue
            subItems = []
            if IReadContainer.isImplementedBy(item):
                keys = list(item.keys())
            else:
                keys = []

            # include the service manager
            keys.append('++etc++site')

            for name in keys:
                # Only include items we can traverse to
                subItem = traverse(item, name, None)
                if IReadContainer.isImplementedBy(subItem):
                    iconUrl = self.getIconUrl(subItem)
		    # the test below seems to be browken with the ++etc++site case
                    if subItem == oldItem:
                        subItems.append(xmlEscapeWithCData(
                            '<collection name=%s length=%s '
                            'icon_url=%s>%s</collection>', 
                            name, len(subItem), iconUrl, result))
                    else:
                        subItems.append(xmlEscape(
                            '<collection name=%s length=%s '
                            'icon_url=%s/>',
                            name, len(subItem), iconUrl))
                else:
                    subItems.append(xmlEscape('<item name=%s />', name))

            result = ' '.join(subItems)
            oldItem = item

        # do not forget root folder
        iconUrl = self.getIconUrl(oldItem)
        result = (xmlEscapeWithCData('<collection name="" length=%s '
	          'icon_url=%s isroot="">%s</collection>',
                  len(oldItem), iconUrl, result))

        self.request.response.setHeader('Content-Type', 'text/xml')
        setNoCacheHeaders(self.request.response)
        res= u'<?xml version="1.0" ?><children> %s </children>' % result
	return res

class XmlObjectView(BrowserView):
    """Provide a xml interface for dynamic navigation tree in UI"""

    __used_for__ = Interface

    def singleBranchTree(self, root=''):
        parent = getParent(self.context)
        while parent is not None:
                if IReadContainer.isImplementedBy(parent):
                    view = zapi.queryView(parent,
                                          'singleBranchTree.xml',
                                          self.request)
                    return view()
                else:
                    parent = getParent(parent)


=== Added File Zope3/src/zope/app/rotterdam/xmltree.js ===
//constants
var ELEMENT_NODE = 1;
var TEXT_NODE = 3;
var COLLECTION = 'COLLECTION';
var ICON = 'ICON';
var EXPAND = 'EXPAND';
var XML_CHILDREN_VIEW = '@@children.xml';
var SINGLE_BRANCH_TREE_VIEW = '@@singleBranchTree.xml';
var CONTENT_VIEW = '@@manage';


var LG_DEBUG = 6;
var LG_TRACE_EVENTS = 5;
var LG_TRACE = 4;
var LG_INFO = 3;
var LG_NOLOG = 0;


// globals
var baseurl;
var navigationTree;
var docNavTree;
var loglevel = LG_NOLOG;



//class navigationTreeNode
function navigationTreeNode (domNode) {
        this.childNodes = new Array();
        this.isEmpty = 1;
        this.isCollapsed = 1;
        this.domNode = domNode;
        this.loadingNode = null;
        this.path = '';
        this.parentNode = null;
}

navigationTreeNode.prototype.appendChild = function(node) {
        this.childNodes.push(node);
        this.domNode.appendChild(node.domNode);
        node.parentNode = this;
}

navigationTreeNode.prototype.setPath = function(path) {
        this.path = path;
        this.domNode.setAttribute("path", path);
}

navigationTreeNode.prototype.collapse = function() {
 	this.isCollapsed = 1;
        this.changeExpandIcon("pl.gif");
}

navigationTreeNode.prototype.expand = function() {
 	this.isCollapsed = 0;
        this.changeExpandIcon("mi.gif");
}

navigationTreeNode.prototype.changeExpandIcon = function(icon) {
        var expand = this.domNode.getElementsByTagName('expand')[0];
        expand.style.backgroundImage = 'url("' + baseurl + '@@/' + icon + '")';
        }

navigationTreeNode.prototype.getNodeByPath = function(path) {
        var numchildren = this.childNodes.length;
        if (path == this.path) {
                return this;
                }
        else {
                for (var i=0; i< numchildren; i++) {
                        foundChild = this.childNodes[i].getNodeByPath(path);
                        if (foundChild) {
                                return foundChild;
                                }
                        }
                }
        return null;
}

navigationTreeNode.prototype.toggleExpansion = function() {
with (this) {
        prettydump('toggleExpansion', LG_TRACE);
        // If this collection is empty, load it from server
        // todo xxx optimize for the case where collection has null length
        if (isEmpty) {
                startLoadingChildren();
                }
        else
                {
                refreshExpansion();
                }

        }
}

navigationTreeNode.prototype.startLoadingChildren = function() {
with (this) {
        loadingNode = createLoadingNode();
        domNode.appendChild(loadingNode);
        var url = baseurl + path + XML_CHILDREN_VIEW;
        loadtreexml(url, this);
        }
}

navigationTreeNode.prototype.finishLoadingChildren = function() {
with (this) {
        isEmpty = 0;
        refreshExpansion();
        domNode.removeChild(loadingNode);
        loadingNode = null;
        }
}

navigationTreeNode.prototype.refreshExpansion = function() {
with (this) {
        if (isCollapsed) {
	 	expand();
                showChildren();
   		}
        else {
                collapse();
                hideChildren();
   		}
        }
}


navigationTreeNode.prototype.hideChildren = function() {
with (this) {
        prettydump('hideChildren', LG_TRACE);
        var num = childNodes.length;
	for (var i = num - 1; i >=0; i--) {
	        childNodes[i].domNode.style.display = 'none';
        	}
        }
}

navigationTreeNode.prototype.showChildren = function() {
with (this) {
        prettydump('showChildren', LG_TRACE);
        var num = childNodes.length;
	for (var i = num - 1; i >=0; i--) {
	        childNodes[i].domNode.style.display = 'block';
        	}
        }
}

// utilities
function prettydump(s, locallog) {
        // Put the string "s" in a box on the screen as an log message
        if (locallog <= loglevel) {
                var logger = document.getElementById('logger');
  	        var msg = document.createElement('code');
	        var br1 = document.createElement('br');
  	        var br2 = document.createElement('br');
  	        var msg_text = document.createTextNode(s);
  	        msg.appendChild(msg_text);
          	logger.insertBefore(br1, logger.firstChild);
  	        logger.insertBefore(br2, logger.firstChild);
          	logger.insertBefore(msg, logger.firstChild);
	        }
        }


function debug(s) {
        var oldlevel = loglevel;
        loglevel = LG_DEBUG;
        prettydump("Debug : " + s, LG_DEBUG);
        loglevel = oldlevel;
}

// DOM utilities
function getTreeEventTarget(e) {
	var elem;
        if(e.target) {
                // Mozilla uses this
       		if (e.target.nodeType == TEXT_NODE) {
                        elem=e.target.parentNode;
		        }
		else {
		        elem=e.target;
			}
                }
        else {
                // IE uses this
                elem=e.srcElement;
                }
        return elem;
        }

function isCollection(elem) {
	return (checkTagName(elem, COLLECTION));
	}


function isIcon(elem) {
	return (checkTagName(elem, ICON));
	}

function isExpand(elem) {
	return (checkTagName(elem, EXPAND));
	}

function checkTagName(elem, tagName) {
	return (elem.tagName.toUpperCase() == tagName);
	}

function getCollectionChildNodes(xmlDomElem) {
        // get collection element nodes among childNodes of elem
        var result = new Array();

        var items = xmlDomElem.childNodes;
        var numitems = items.length;
        var currentItem;
        for (var i = 0; i < numitems; i++) {
                currentItem = items[i];

                if (currentItem.nodeType != ELEMENT_NODE) {
                        continue;
                        }

                if (!isCollection(currentItem)) {
                        continue;
                        }
                result.push(currentItem);
                }
        return result;
        }

//events
function treeclicked (e) {
        prettydump('treeclicked', LG_TRACE_EVENTS);
        var elem = getTreeEventTarget(e);
        if (elem.id == 'navtree') return;

        // if node clicked is expand elem, toggle expansion
        if (isExpand(elem)) {
                //get collection node
                elem = elem.parentNode;
                var navTreeNode = navigationTree.getNodeByPath(elem.getAttribute('path'));
                navTreeNode.toggleExpansion();
                }
        }

// helpers
function getControlPrefix() {
        if (getControlPrefix.prefix)
                return getControlPrefix.prefix;

        var prefixes = ["MSXML2", "Microsoft", "MSXML", "MSXML3"];
        var o, o2;
        for (var i = 0; i < prefixes.length; i++) {
                try {
                        // try to create the objects
                        o = new ActiveXObject(prefixes[i] + ".XmlHttp");
                        o2 = new ActiveXObject(prefixes[i] + ".XmlDom");
                        return getControlPrefix.prefix = prefixes[i];
                        }
                catch (ex) {};
                }

        throw new Error("Could not find an installed XML parser");
        }


// XmlHttp factory
function XmlHttp() {}


XmlHttp.create = function () {
if (window.XMLHttpRequest) {
        var req = new XMLHttpRequest();

        // some older versions of Moz did not support the readyState property
        // and the onreadystate event so we patch it!
        if (req.readyState == null) {
                req.readyState = 1;
                req.addEventListener("load", function () {
                                req.readyState = 4;
                                if (typeof req.onreadystatechange == "function")
                                req.onreadystatechange();}, false);
                }

                return req;
        }
if (window.ActiveXObject) {
        s = getControlPrefix() + '.XmlHttp';
        return new ActiveXObject(getControlPrefix() + ".XmlHttp");
        }
return;
};

function loadtreexml (url, node) {
        var xmlHttp = XmlHttp.create();
        if (xmlHttp) {
                prettydump('URL ' + url, LG_INFO);
                xmlHttp.open('GET', url, true);


                xmlHttp.onreadystatechange = function () {
        		if (xmlHttp.readyState == 4) {
                                prettydump('Response XML ' + xmlHttp.responseText, LG_INFO);
			        parseXML(xmlHttp.responseXML, node);
		                }
	                };

                // call in new thread to allow ui to update
	        window.setTimeout(function () {
		        xmlHttp.send(null);
	                }, 10);
                }
        else {
                }
        }

function loadtree (rooturl, thisbaseurl) {
        baseurl = rooturl;  // Global baseurl
        docNavTree = document.getElementById('navtreecontents');

	var url = thisbaseurl + SINGLE_BRANCH_TREE_VIEW;
        loadtreexml(url, null);
        }


function removeChildren(node) {
        var items = node.childNodes;
        var numitems = items.length;
        for (var i = 0; i < numitems; i++) {
                node.removeChild(items[i]);
                }
        }


function parseXML(responseXML, node) {
        if (responseXML) {
                var data = responseXML.documentElement;
                if (node == null) {
                        //[top] node
                        removeChildren(docNavTree);
                        addNavigationTreeNodes(data, null, 1);
//                        docNavTree.appendChild(navigationTree.domNode);
                        }
                else {
                        //expanding nodes
                        addNavigationTreeNodes(data, node, 0);
                        node.finishLoadingChildren();
                        }
                }
        }

function addNavigationTreeNodes(sourceNode, targetNavTreeNode, deep) {
        // create tree nodes from XML children nodes of sourceNode
        // and add them to targetNode
        // if deep, create all descendants of sourceNode
        var basePath = "";
        if (targetNavTreeNode) {
                basePath = targetNavTreeNode.path;
                }
        var items = getCollectionChildNodes(sourceNode);
        var numitems = items.length;
        for (var i=0; i< numitems; i++) {
                var navTreeChild = createNavigationTreeNode(items[i], basePath, deep);
                if (targetNavTreeNode) {
                        targetNavTreeNode.appendChild(navTreeChild);
                        }
                }
        }


function createPresentationNodes(title, targetUrl, icon_url, length) {
        // create nodes hierarchy for one collection (without children)

        // create elem for plus/minus icon
        var expandElem = document.createElement('expand');
        // create elem for item icon
        var iconElem = document.createElement('icon');
        expandElem.appendChild(iconElem);
        // Mozilla tries to infer an URL if url is empty and reloads containing page
        if (icon_url != '')  {
                iconElem.style.backgroundImage = 'url("' + icon_url + '")';
                }
        // create link
        var linkElem = document.createElement('a');
        var titleTextNode = document.createTextNode(title);

        linkElem.appendChild(titleTextNode);
        linkElem.setAttribute('title', 'Contains ' + length + ' item(s)');
        linkElem.setAttribute('href', targetUrl);

        iconElem.appendChild(linkElem);

        return expandElem;
        }

function createLoadingNode() {
        var loadingElem = document.createElement('loading');
        //XXX should not hardcode loading string
        var titleTextNode = document.createTextNode('Loading...');

        loadingElem.appendChild(titleTextNode);

        return loadingElem;
        }

function createNavigationTreeNode(source, basePath, deep) {
        var newelem = document.createElement(source.tagName);

        var navTreeNode = new navigationTreeNode(newelem);
        var elemPath;
        var elemTitle;
        //XXX should not hardcode root folder title string
        if (source.getAttribute('isroot') != null) {
                elemTitle = '[top]';
                elemPath = basePath;
                newelem.style.marginLeft = '0px';
                navigationTree = navTreeNode;
                docNavTree.appendChild(newelem);
                }
        else {
                elemTitle = source.getAttribute('name');
                elemPath = basePath + elemTitle + '/';
                }
        navTreeNode.setPath(elemPath);

        //could show number of child items
        var length = source.getAttribute('length');

        var icon_url = source.getAttribute('icon_url');

        var targetUrl = baseurl;
	targetUrl = targetUrl + elemPath;
	targetUrl = targetUrl + CONTENT_VIEW;

        var expandElem = createPresentationNodes(elemTitle, targetUrl, icon_url, length);
        newelem.appendChild(expandElem);


        if (deep) {
                var children = getCollectionChildNodes(source);
                var numchildren = children.length;
                for (var i=0; i< numchildren; i++) {
                        var navTreeNodeChild =  createNavigationTreeNode(children[i], navTreeNode.path, deep);
                        navTreeNode.appendChild(navTreeNodeChild);
                        }
                if (numchildren) {
                        navTreeNode.isEmpty = 0;
                        navTreeNode.expand();
                        }
                else {
                        navTreeNode.isEmpty = 1;
                        navTreeNode.collapse();
                        }
                }
        else {
                navTreeNode.isEmpty = 1;
                navTreeNode.collapse();
                }
        return navTreeNode;
        }



=== Added File Zope3/src/zope/app/rotterdam/zope3.css ===
/*
** Zope3 style sheet for CSS2-capable browsers.
**
*/

/*
* { border: 1px dotted red }
*/


/* Basic Elements */

body {
    font: 85% Helvetica, Arial, sans-serif;
    background: White;
    color: Black;
    margin: 0;
    padding: 0;
/* These work in IE only, changes the look of the scrollbar + textareas */
    scrollbar-base-color: White;
    scrollbar-highlight-color: White;
    scrollbar-track-color: #F8F8F8;
    scrollbar-darkshadow-color: #F8F8F8;
    scrollbar-3dlight-color: #369;
    scrollbar-shadow-color: #369;
    scrollbar-arrow-color: Black;
}

table {
    font-size: 100%;
}

a {
    text-decoration: none;
    color: #369;
    background-color: transparent;
}

a[href]:active {
    text-decoration: underline;
}


table {

}


img {
    border: none;
    vertical-align: middle;
}

p {
    margin: 0.5em 0em 1em 0em;
    line-height: 1.5em;
}

p a:visited {
    color: Purple;
    background-color: transparent;
}

p a:active {
    color: Red;
    background-color: transparent;
}

p img {
    border: 0;
    margin: 0;
}


hr {
    clear: both;
    height: 1px;
    color: #369;
    background-color: transparent;
}


h1, h2, h3, h4, h5, h6 {
    color: Black;
    clear: left;
    font: 100% bold Verdana, Helvetica, Arial, sans-serif;
    margin: 0;
    padding-top: 0.5em;
    border-bottom: 1px solid #369;
}

h1 {
    font-size: 160%;
}

h2 {
    font-size: 150%;
}

h3 {
    font-size: 140%;
}

h4 {
    font-size: 120%;
}

h5 {
    font-size: 100%;
}

h6 {
    font-size: 80%;
}

ul { 
    line-height: 1.5em;
    /* list-style-image: url("bullet.gif"); */
    margin-left: 2em;
    padding:0;
}

ol {
    line-height: 1.5em;
    margin-left: 2em;
    padding:0;
}

dl {
}

dt {
    font-weight: bold;    
}

dd {
    line-height: 1.5em;
    margin-bottom: 1em;
}


fieldset {
    border: 1px solid #A0A0A0;
    margin: 2em 0em 1em 0em;
    padding: 1em 0em;
}

legend {
    background: White;
    padding: 0.5em;
}


form {
    border: none;
    margin: 0;
}

textarea {
    color: Black;
    width: 88%;
    padding: 0.1em;
}

input {
    font: normal 100% Verdana, Helvetica, Arial, sans-serif;
    color: Black;
    vertical-align: middle;
    margin-bottom: 1px; /* IE bug fix */
    padding: 0.1em;
}

select {
    font: normal 100% Verdana, Helvetica, Arial, sans-serif;
    vertical-align: top;
}

abbr, acronym, .explain {
    border-bottom: 1px dotted Black;
    color: Black;
    background-color: transparent;
    cursor: help;
}

q {
    font-family: Times, "Times New Roman", serif;
    font-style: italic;
    font-size: 120%;
}

blockquote {
    font-family: Times, "Times New Roman", serif;
    font-style: italic;
    font-size: 120%;
}

code {
    font-size: 120%;
    color: Black;
    background-color: #CCCCCC;
}

pre {
    font-size: 120%;
    padding: 1em;
    border: 1px solid #A0A0A0;
    color: Black;
    background-color: #CCCCCC;
}

.netscape4 {
    display: none;
}


/*  Styles for xmltree
*/

#navtreecontents a {
       cursor: pointer;
       height: 20px;
}

#navtreecontents loading {
       display: block;
       padding-left: 31px;
       height: 18px;
}

#navtreecontents expand {
       background-repeat: no-repeat;
       padding-left: 14px;
       display: inline;
       cursor: pointer;
                }

#navtreecontents icon {
       background-repeat: no-repeat;
       padding-left: 20px;
       display: inline;
       cursor: auto;
                }

#navtreecontents collection {
       display: block;
       margin-left: 10px;
/*     border: red solid 1pt;  */
       height: auto;
}



/* Structural elements */


#global {
    border-bottom: 0.1em solid black;
}

#global #userDetails {
    float:right;
    margin-top: 1.2em;
    padding-right: 0.5em;
}

#actions {
    background: #369;
    border-left: 1px solid #369;
    border-right: 1px solid #369;
	padding: 0.3em;
    color: Black;
	border-collapse: collapse;
}

#actions a {
	color: White;
    float: right;
	border-left: 1px dashed white;
	padding: 0 0.5em;
}

#actions a:hover {
	color: black;
	background-color: White;
}

#breadcrumbs {
    padding-top: 1px;
    padding-bottom: 1px;
    border: 1px solid #369;
    border-style: none none solid none;
    margin: 0;
}


#navigators {
    float: left;
    width: 15%;
	padding: 1em;
    overflow: hidden;
}

#workspace {
    width: 79%;
    float: left;
}

#content { 
    float: left; 
    /* width: 75%; */
}

#context_information {
    padding-top: 1em;
    width: 15%;
    float: left;
    padding-left: 0.5em;
}

#helpers {
}

#inspectors {
}

#footer {
    border-bottom: 1px solid black;
    float: left;
    clear: both;
}

div.row {
    clear: both;
    padding-top: 10px;
}
/* XXX: div.row div.field doesn't appear to be selecting. div.row div
        is a workaround */
div.row div {
    float: left;
}
div.row div.label {
    text-align: right;
    width: 100px;
    margin-right: 0.8em;
    font-weight: bold;
}
div.row div.error {
    float: left;
    color: red;
    margin-left: 0.8em;
}
div.row div.error:before {
    content: "\2190  "; /* Left pointing arrow */
}

div.box {
    margin: 0em 0em 2em 0em;
    padding: 0em;
}

div.box h4 { 
    background: #CCCCCC;
    border: 1px solid #CCCCCC;
    border-style: solid solid none solid;
    color: #808080;
    padding: 0em 1em;
    display: block;
    font-size: 1em;
    height: 1em;
    text-align: center;
}


div.box div.body {
    background: transparent;
    border-collapse: collapse;
    border: 1px solid #CCCCCC;
}

div.box .content {
    padding: 0.5em;
}

div.box h1, 
div.box h2, 
div.box h3, 
div.box h4 {
    margin: 0;
}

div.box .even {
    background-color: #F8F8F8;
}

div.box .odd {
    background-color: White;
}


#metadata .label {
    font-size: 80%;
}

.itemViews {
    background: transparent;
    border-collapse: collapse;
    border-bottom: 1px solid #369;
    padding-top: 1px;
    padding-bottom: 1px;
    padding-left: 1em;
    margin-top: 0.8em;
    white-space: nowrap;
}

.itemViews a {
    background: transparent;
    border: 1px solid #369;
    color: Black;
    font-weight: normal;
    margin-right: 0.5em;
    padding: 0.1em 0.5em 0.1em 0.5em;
}

.itemViews a.selected {
    background: #369;
    border-bottom: #369 1px solid;
    color: White;
    font-weight: normal;
}


.itemViews a:hover {
    background-color: #369;
    color: White;
}

#viewspace {
    border-collapse: collapse;
    padding: 10px;
    margin: 0;
}

table.listingdescription, table.listing {
    /* The default table for document listings. Contains name, document types, modification times etc in a file-browser-like fashion */
    border-collapse: collapse;
    border-left: 1px solid #CCCCCC;
    border-bottom: 1px solid #CCCCCC;
    margin: 1em 0em 1em 0em;
/*    clear: both; */
}

table.listingdescription {
    width: 100%
}

table.listingdescription th, table.listing th {
    background: #CCCCCC;
    border-top: 1px solid #CCCCCC;
    border-bottom: 1px solid #CCCCCC;
    border-right: 1px solid #CCCCCC;
    color: #808080;
    font-weight: normal;
    padding: 0em 1em 0em 1em;
    white-space: nowrap;
}

table.listingdescription td.top, table.listing td.top {
    border-left: 1px solid White;
    border-top: 1px solid White ! important;
    border-right: 1px solid White ! important;
    text-align: right ! important;
    padding: 0em 0em 1em 0em;
    /* insane IE row bug workaround */
    position: relative;
    left: -1px;
    top: -1px;
}

table.listingdescription tr.odd, table.listing tr.odd {
    /*every second line should be shaded */
    background: White;
}

table.listingdescription tr.even, table.listing tr.even {
    background: #F8F8F8;
}


table.listing td {
    border-right: 1px solid #CCCCCC;
    padding: 0em 1em;
    text-align: left;
}


table.listingdescription img, table.listing img {
    vertical-align: middle;
}

table.listingdescription td {
    border-right: 1px solid #CCCCCC;
    padding: 5px;
    text-align: left;
}


div.spacer {
    clear: both;
}


.registrationSummary {
    margin-left: 2em;
    margin-bottom: 1em;
}
.registrationSummary .usageSummary {
    font-weight: bold;
}
.registrationSummary .modificationLink {
    display: block;
}


div.message {
    background: #FFCE7B;
    border: 1px solid #FFA500;
    color: Black;
    font: bold 80% Verdana, Helvetica, Arial, sans-serif;
    margin: 2em 0em 1em 0em;
    padding: 0.5em 1em;
    vertical-align: middle;
}

div.message a {
    color: Black;
}

/* Style for page error divs.  Use this for displaying errors for a
   page as a whole.
 */
div.page_error { 
    background: #FFCE7B; 
    font: bold 80% Verdana, Helvetica, Arial, sans-serif; 
    padding: 0.5em 1em; 
    vertical-align: middle; 
}


=== Added File Zope3/src/zope/app/rotterdam/zope3logo.gif ===
  <Binary-ish file>



More information about the Zope3-Checkins mailing list