[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">
</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: </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>
</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">
</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