[Checkins] SVN: Sandbox/ulif/grokadmin/trunk/src/grokadmin/ Application overview for grokadmin.

Uli Fouquet uli at gnufix.de
Sun Oct 7 14:03:05 EDT 2007


Log message for revision 80696:
  Application overview for grokadmin.

Changed:
  U   Sandbox/ulif/grokadmin/trunk/src/grokadmin/app.py
  A   Sandbox/ulif/grokadmin/trunk/src/grokadmin/app_templates/
  A   Sandbox/ulif/grokadmin/trunk/src/grokadmin/app_templates/applications.pt
  A   Sandbox/ulif/grokadmin/trunk/src/grokadmin/app_templates/grokadminmacros.pt
  A   Sandbox/ulif/grokadmin/trunk/src/grokadmin/ftests/application/apps.py
  A   Sandbox/ulif/grokadmin/trunk/src/grokadmin/static/
  A   Sandbox/ulif/grokadmin/trunk/src/grokadmin/static/GROK_Ornament3.jpg
  A   Sandbox/ulif/grokadmin/trunk/src/grokadmin/static/banner-shadow.jpg
  A   Sandbox/ulif/grokadmin/trunk/src/grokadmin/static/grok-admin.jpg
  A   Sandbox/ulif/grokadmin/trunk/src/grokadmin/static/grok-relax.png
  A   Sandbox/ulif/grokadmin/trunk/src/grokadmin/static/grok-relax4.png
  A   Sandbox/ulif/grokadmin/trunk/src/grokadmin/static/grok-relax5.gif
  A   Sandbox/ulif/grokadmin/trunk/src/grokadmin/static/grok.css

-=-
Modified: Sandbox/ulif/grokadmin/trunk/src/grokadmin/app.py
===================================================================
--- Sandbox/ulif/grokadmin/trunk/src/grokadmin/app.py	2007-10-07 13:32:29 UTC (rev 80695)
+++ Sandbox/ulif/grokadmin/trunk/src/grokadmin/app.py	2007-10-07 18:03:05 UTC (rev 80696)
@@ -13,8 +13,16 @@
 ##############################################################################
 """The Grok Administration and Development UI"""
 
+import zope.component
+
+from zope.app.broken.broken import IBroken
+from zope.interface import Interface
+from ZODB.broken import Broken
+
 import grok
 
+grok.define_permission('grok.ManageApplications')
+
 class GrokAdmin(grok.Application, grok.Container):
     """The Grok Administrators and Developers UI.
 
@@ -26,3 +34,129 @@
        <grokadmin.app.GrokAdmin object at 0x...>
        
     """
+
+
+class Index(grok.View):
+    """A redirector to the real frontpage.
+    """
+    grok.name('index')
+    grok.require('grok.ManageApplications')
+
+    def render(self):
+        # Go to the first page immediately.
+        self.redirect(self.url('applications'))
+
+
+class GrokAdminMacros(grok.View):
+    """Provides the o-wrap layout."""
+    grok.context(Interface)
+
+
+class Applications(grok.View):
+    """View for application management.
+
+    """
+    grok.name('applications')
+    grok.require('grok.ManageApplications')
+
+    def getDocOfApp(self, apppath, headonly = True):
+        return ""
+        # XXX Reactivate docfinder...
+        doctor = docgrok.docgrok_handle(apppath)
+        result = doctor.getDoc(headonly)
+        if result is None:
+            result = ""
+        return result
+
+    def update(self):
+        # Available apps...
+        apps = zope.component.getAllUtilitiesRegisteredFor(
+            grok.interfaces.IApplication)
+        apps_folder = get_apps_folder(self.context)
+        self.applications = (
+            {'name': "%s.%s" % (x.__module__, x.__name__),
+             'docurl':("%s.%s" % (x.__module__, x.__name__)).replace('.', '/')}
+            for x in apps)
+
+        # Installed apps...
+        inst_apps = [x for x in apps_folder.values()
+                     if hasattr(x, '__class__') and x.__class__ in apps
+                     and not issubclass(x.__class__, Broken)]
+        inst_apps.sort(lambda x, y: cmp(x.__name__, y.__name__))
+        self.installed_applications = inst_apps
+
+        # Broken apps...
+        broken_apps = [{'obj':y, 'name':x} for x,y in apps_folder.items()
+                       if isinstance(y, Broken)]
+        broken_apps.sort(lambda x, y: cmp(x['name'], y['name']))
+        self.broken_applications = broken_apps
+
+
+class Add(grok.View):
+    """Add an application.
+    """
+    grok.require('grok.ManageApplications')
+
+    def update(self, inspectapp=None, application=None):
+        if inspectapp is not None:
+            self.redirect(self.url("docgrok") + "/%s/index"%(
+                application.replace('.','/'),))
+        return
+
+    def render(self, application, name, inspectapp=None):
+        if name is None or name == "":
+            self.redirect(self.url(self.context))
+            return
+        if name is None or name == "":
+            self.redirect(self.url(self.context))
+            return
+        app = zope.component.getUtility(grok.interfaces.IApplication,
+                                        name=application)
+        try:
+            apps_folder = get_apps_folder(self.context)
+            apps_folder[name] = app()
+            self.flash(u'Added %s `%s`.' % (application, name))
+        except DuplicationError:
+            self.flash(
+                u'Name `%s` already in use. Please choose another name.' % (
+                name,))
+        self.redirect(self.url(self.context))
+
+
+def get_apps_folder(context):
+    """Return a folder where apps can be added for a context.
+
+    For contexts, that have no parent, we return the context itself::
+    
+       >>> from grokadmin.app import get_apps_folder
+       >>> from grokadmin.app import GrokAdmin
+       >>> admin = GrokAdmin()
+       >>> first_folder = get_apps_folder(admin)
+       >>> first_folder
+       <grokadmin.app.GrokAdmin object at 0x...>
+
+       >>> first_folder is admin
+       True
+       
+    For contexts, that _have_ a parent, that parent is returned::
+
+       >>> admin2 = GrokAdmin()
+       >>> admin['subadmin'] = admin2
+       >>> second_folder = get_apps_folder(admin2)
+       >>> second_folder is first_folder
+       True
+
+    We only 'go up' one level::
+
+       >>> admin3 = GrokAdmin()
+       >>> admin2['subsubadmin'] = admin3
+       >>> third_folder = get_apps_folder(admin3)
+       >>> third_folder is admin2
+       True
+       
+    
+    """
+    if getattr(context, '__parent__', None) is None:
+        return context
+    return context.__parent__
+

Added: Sandbox/ulif/grokadmin/trunk/src/grokadmin/app_templates/applications.pt
===================================================================
--- Sandbox/ulif/grokadmin/trunk/src/grokadmin/app_templates/applications.pt	                        (rev 0)
+++ Sandbox/ulif/grokadmin/trunk/src/grokadmin/app_templates/applications.pt	2007-10-07 18:03:05 UTC (rev 80696)
@@ -0,0 +1,79 @@
+<html metal:use-macro="context/@@grokadminmacros/gaia-page">
+  <div metal:fill-slot="content">
+
+    <form tal:define="apps context/values"
+	  tal:attributes="action string:${context/@@absolute_url}/delete">
+
+      <fieldset>
+        <legend>Installed applications</legend>
+
+	<div tal:condition="not: python: len(view.installed_applications)">
+	  <p class="menu-description1">Currently no working applications are 
+	  installed.</p>
+	</div>
+
+	<div tal:condition="python: len(view.installed_applications) or True" 
+	     tal:repeat="app view/installed_applications">
+	  <input type="checkbox" 
+		 class="checkbox" 
+		 tal:attributes="value app/__name__;
+				 name string:items" />
+          <a tal:attributes="href string:${app/@@absolute_url}">
+	    <span tal:replace="app/__name__"/>
+	    (<span tal:replace="app/__class__/__name__"/>)
+	  </a>
+	  &nbsp;&nbsp;
+	  [<a href=""
+	  tal:attributes="href string:${context/@@absolute_url}/${app/__name__}/@@inspect.html"
+	  >object browser</a>]
+	</div>
+
+	<div tal:condition="view/broken_applications">
+	  <br/><div class="emph">Broken applications:</div>
+	</div>
+        <div tal:repeat="app view/broken_applications">
+	  <input type="checkbox" 
+		 class="checkbox" 
+		 tal:attributes="value app/name;
+				 name string:items" />
+	  <span tal:content="app/name" />
+	  (broken type: <span tal:replace="string:${app/obj/__class__/__module__}.${app/obj/__class__/__name__}"/>). This application is broken!
+	</div>
+
+	<p>
+	  <input tal:condition="python:len(view.installed_applications)+len(view.broken_applications) > 0"
+	      class="button" type="submit" value="Delete Selected"/></p>
+      </fieldset>
+    </form>
+
+    <fieldset>	
+      <legend>Add application</legend>
+
+      <div class="menu-box1"
+	   tal:repeat="app view/applications">
+	<form action="" tal:attributes="action string:${context/@@absolute_url}/add;
+                                        name python: app['name'].split('.')[-1]">
+	  <div class="menu-box2">
+	    <div class="menu-head1"><a href=""
+				       tal:attributes="href string:${context/@@absolute_url}/docgrok/${app/docurl}"
+				       tal:content="app/name">Application Name</a></div>
+	    <div class="menu-description1">
+	      <span tal:replace="structure python: view.getDocOfApp(app['name']) or ''">
+		Application description here.
+	      </span>
+	    </div>
+	    <div class="menu-box3">
+	      <label>Name your new app: <input type="text" name="name"/></label>
+	      <input type="hidden" name="application" value=""
+		     tal:attributes="value app/name" />
+	      <input class="button" type="submit" name="Add" value="Create"/>
+	    </div>
+	  </div>
+	</form>
+      </div>
+
+    </fieldset>
+
+  </div>
+
+</html>

Added: Sandbox/ulif/grokadmin/trunk/src/grokadmin/app_templates/grokadminmacros.pt
===================================================================
--- Sandbox/ulif/grokadmin/trunk/src/grokadmin/app_templates/grokadminmacros.pt	                        (rev 0)
+++ Sandbox/ulif/grokadmin/trunk/src/grokadmin/app_templates/grokadminmacros.pt	2007-10-07 18:03:05 UTC (rev 80696)
@@ -0,0 +1,128 @@
+<html xmlns="http://www.w3.org/1999/xhtml"
+      i18n:domain="zope"
+      metal:define-macro="gaia-page">
+  <head>
+    <title
+      metal:define-slot="title"
+      >grok administration interface</title>
+    <link metal:define-slot="header"
+      rel="stylesheet" type="text/css" href="static/grok.css"
+      tal:on-error="nothing"
+      tal:attributes="href view/static/grok.css" />
+    <metal:block define-slot="extrahead">
+    </metal:block>
+  </head>
+
+  <body>
+<!--
+    <div tal:condition="not:exists: view/root_url">
+      This template (grokadminmacros.pt in grok.admin) must be called
+      from a view with defined root_url.
+    </div>
+
+    <div tal:condition="exists: view/root_url">
+-->
+    <div>
+      <div id="banner">
+        <a href="/" id="logo">
+          <img alt="Grok" src="images/grok-admin.jpg" height="40"
+            tal:attributes="src view/static/grok-admin.jpg" />
+        </a>
+      </div>
+
+      <div id="logout" metal:define-macro="logged_user">
+<!--
+	<span tal:condition="view/is_authenticated">
+-->
+	<span tal:condition="request/principal/title">
+	  <span i18n:translate="">User:
+	  <span tal:replace="request/principal/title"
+		i18n:name="user_title">User</span>
+	  </span>
+	</span>
+      </div>
+
+      <div id="breadcrumbs">
+        <div id="banner-shadow">
+          &nbsp;
+        </div>
+      </div>
+      <div id="fireplace">
+        <img alt="grok_relax_image" src="images/grok-relax5.gif"
+          tal:attributes="src view/static/grok-relax5.gif" />
+      </div>
+      <div id="menu-links" 
+	   metal:define-slot="menu-links"
+	   tal:define="currview python:view.url()">
+<!--
+        <span class="menu-link-inactive"
+          tal:define="target string:${view/root_url}/applications">
+-->
+        <span class="menu-link-inactive"
+          tal:define="target python:view.url('applications')">
+          <a href="applications"
+            tal:condition="python: target != currview"
+            tal:attributes="href target"
+            >Applications</a>
+          <span class="emph"
+            tal:condition="python: target == currview">
+            Applications
+          </span>
+        </span>
+        &nbsp;&nbsp;
+<!--
+        <span class="menu-link-inactive"
+          tal:define="target string:${view/root_url}/server"
+          >
+-->
+        <span class="menu-link-inactive"
+          tal:define="target python:view.url('server')"
+          >
+          <a href="z3index"
+            tal:condition="python: target != currview"
+            tal:attributes="href target"
+            >Server Control</a>
+          <span class="emph"
+            tal:condition="python: target == currview">
+            Server Control
+          </span>
+        </span>
+<!--
+        &nbsp;&nbsp;
+        <a href=""
+          tal:attributes="href view/root_url">Debug</a>
+-->
+        &nbsp;&nbsp;
+<!--
+        <a href=""
+          tal:attributes="href string:${view/root_url}/docgrok/">
+-->
+        <a href=""
+          tal:attributes="href python:view.url('docgrok')">
+
+          <span tal:attributes="class python:getattr(view, 'in_docgrok', False)  and 'emph'"
+            >Documentation</span>
+        </a>
+      </div>
+
+        <div id="content">
+
+          <div id="messages" tal:content="structure context/@@messages" />
+
+          <div metal:define-slot="content">
+
+            <h1>Welcome to Grok!</h1>
+
+            <div>
+              Your friendly and easy way to Zope 3.
+            </div>
+
+          </div>
+          <div>
+            <p id="footer-copyright">&copy; Copyright 2007, The Zope Foundation<br />Design inspired by Sebastian Ware</p>
+          </div>
+        </div>
+
+    </div>
+  </body>
+</html>

Added: Sandbox/ulif/grokadmin/trunk/src/grokadmin/ftests/application/apps.py
===================================================================
--- Sandbox/ulif/grokadmin/trunk/src/grokadmin/ftests/application/apps.py	                        (rev 0)
+++ Sandbox/ulif/grokadmin/trunk/src/grokadmin/ftests/application/apps.py	2007-10-07 18:03:05 UTC (rev 80696)
@@ -0,0 +1,121 @@
+##############################################################################
+#
+# Copyright (c) 2007 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (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.
+#
+##############################################################################
+"""
+
+===============================================
+Add and remove applications using ``GrokAdmin``
+===============================================
+
+Setup a testing environment::
+
+  >>> from zope.testbrowser.testing import Browser
+  >>> browser = Browser()
+  >>> browser.addHeader('Authorization', 'Basic mgr:mgrpw')
+  >>> root = getRootFolder()
+
+Now we install an instance of ``GrokAdmin`` named `admin`::
+
+  >>> from grokadmin.app import GrokAdmin
+  >>> root['admin'] = GrokAdmin()
+  >>> list(root.keys())
+  [u'admin']
+  
+We fetch the standard page, which should provide us a menu to get all
+installable grok applications/components::
+
+  >>> browser.open("http://localhost/admin")
+  >>> print browser.contents
+  <html xmlns="http://www.w3.org/1999/xhtml">
+  ...
+  ...      <legend>Add application</legend>
+  ...
+
+The opening screen should inform us, that there is our GrokAdmin
+installed::
+
+  >>> print browser.contents
+  <html xmlns="http://www.w3.org/1999/xhtml">
+  ...
+  ...<legend>Installed applications</legend>
+  ...
+  ...<a href="http://localhost/admin">
+  ...
+
+We are able to add a mammoth manager...
+
+  >>> subform = browser.getForm(name='MammothManager')
+  >>> subform.getControl('Name your new app:').value = 'my-mammoth-manager'
+  >>> subform.getControl('Create').click()
+
+  >>> print browser.contents
+  <html xmlns="http://www.w3.org/1999/xhtml">
+  ...
+  ...<legend>Installed applications</legend>
+  ...
+  ...<a href="http://localhost/my-mammoth-manager">
+  ...
+
+Launch the added mammoth manager
+
+  >>> mylink = browser.getLink('my-mammoth-manager (MammothManager)').click()
+  >>> print browser.contents
+  Let's manage some mammoths!
+
+  >>> print browser.url
+  http://localhost/my-mammoth-manager
+
+"""
+"""
+
+We can go to the object browser for every installed application:
+
+  >>> browser.open("http://localhost/applications")
+  >>> browser.getLink('object browser').click()
+  >>> print browser.contents
+  <html xmlns="http://www.w3.org/1999/xhtml">
+  ...
+  ...<span ...>...<a href=...>MammothManager</a> object at ...></span>
+  ... 
+
+We are able to delete installed mammoth-managers
+
+  >>> browser.open("http://localhost/applications")
+  >>> print browser.contents
+  <html xmlns="http://www.w3.org/1999/xhtml">
+  ...
+  ... <legend>Installed applications</legend>
+  ...
+  >>> ctrl = browser.getControl(name='items')
+  >>> ctrl.getControl(value='my-mammoth-manager').selected = True
+  >>> browser.getControl('Delete Selected').click()
+  >>> print browser.contents
+  <html xmlns="http://www.w3.org/1999/xhtml">
+  ...
+  ... <p ...>Currently no working applications...are installed.</p>
+  ...
+  ...<legend>Add application</legend>
+  ...
+
+"""
+
+import grok
+
+class MammothManager(grok.Application, grok.Container):
+    """A mammoth manager"""
+    pass
+
+class Index(grok.View):#
+
+    def render(self):
+        return u"Let's manage some mammoths!"

Added: Sandbox/ulif/grokadmin/trunk/src/grokadmin/static/GROK_Ornament3.jpg
===================================================================
(Binary files differ)


Property changes on: Sandbox/ulif/grokadmin/trunk/src/grokadmin/static/GROK_Ornament3.jpg
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: Sandbox/ulif/grokadmin/trunk/src/grokadmin/static/banner-shadow.jpg
===================================================================
(Binary files differ)


Property changes on: Sandbox/ulif/grokadmin/trunk/src/grokadmin/static/banner-shadow.jpg
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: Sandbox/ulif/grokadmin/trunk/src/grokadmin/static/grok-admin.jpg
===================================================================
(Binary files differ)


Property changes on: Sandbox/ulif/grokadmin/trunk/src/grokadmin/static/grok-admin.jpg
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: Sandbox/ulif/grokadmin/trunk/src/grokadmin/static/grok-relax.png
===================================================================
(Binary files differ)


Property changes on: Sandbox/ulif/grokadmin/trunk/src/grokadmin/static/grok-relax.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: Sandbox/ulif/grokadmin/trunk/src/grokadmin/static/grok-relax4.png
===================================================================
(Binary files differ)


Property changes on: Sandbox/ulif/grokadmin/trunk/src/grokadmin/static/grok-relax4.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: Sandbox/ulif/grokadmin/trunk/src/grokadmin/static/grok-relax5.gif
===================================================================
(Binary files differ)


Property changes on: Sandbox/ulif/grokadmin/trunk/src/grokadmin/static/grok-relax5.gif
___________________________________________________________________
Name: svn:executable
   + *
Name: svn:mime-type
   + application/octet-stream

Added: Sandbox/ulif/grokadmin/trunk/src/grokadmin/static/grok.css
===================================================================
--- Sandbox/ulif/grokadmin/trunk/src/grokadmin/static/grok.css	                        (rev 0)
+++ Sandbox/ulif/grokadmin/trunk/src/grokadmin/static/grok.css	2007-10-07 18:03:05 UTC (rev 80696)
@@ -0,0 +1,327 @@
+/* @override http://www.urbantalk.se/DEVELOPER/grok_2/grok.css */
+
+/* ---- general styling elements ---- */
+body {
+background:#fff;
+color:#555;
+font-family:verdana;
+font-size:0.8em;
+margin:0;
+}
+
+h1 {
+border-bottom:1px solid #C90;
+color:#C90;
+font-family:verdana;
+font-size:1.5em;
+text-align:left;
+width:100%;
+}
+
+h2 {
+border-bottom:1px dotted #ccc;
+color:#C90;
+font-family:verdana;
+font-size:1.3em;
+width:100%;
+}
+
+h3 {
+color:#555;
+font-family:verdana;
+font-size:1.2em;
+width:100%;
+}
+
+p {
+color:#555;
+font-family:verdana;
+font-size:1em;
+}
+
+a:link,a:visited {
+border-bottom-style:dotted;
+border-bottom-width:1px;
+color:#555;
+text-decoration:none;
+}
+
+a:hover {
+background-color:#fff;
+border-bottom-style:dotted;
+border-width:0.1em;
+color:#C90;
+}
+
+img {
+  border:none;
+}
+
+pre {
+background:#eee;
+border-bottom:1px solid #ddd;
+border-top:1px solid #ccc;
+color:#A90101;
+font-family:courier;
+font-size:1.1em;
+margin:0.8em auto;
+padding:1.6em 0.8em;
+}
+
+ul {
+color:#555;
+font-family:verdana;
+font-size:1.1em;
+list-style-type:none;
+margin:1.6em auto;
+}
+
+li {
+left:0;
+margin:0 5em 0 0;
+padding:0;
+}
+
+div#banner {
+background:#cc9900 url("GROK_Ornament3.jpg") repeat-x;
+height:40px;
+}
+
+div#banner-shadow {
+margin-left:1.3em;
+}
+
+div#banner a,div#banner a:hover,div#banner a:visited, div#banner a:link {
+border:none;
+}
+
+div#logo {
+border:none;
+}
+
+div#fireplace {
+position: absolute;
+right: 0px;
+top: 5px;
+width: 160px;
+height: 75px;
+}
+
+div#breadcrumbs {
+}
+
+div#content {
+margin-left:5%;
+margin-right:5%;
+text-align:left;
+}
+
+#footer-copyright {
+font-size:0.9em;
+text-align:center;
+}
+
+/* ---- form and form-like elements ----- */
+form {
+clear:both;
+}
+
+input, select {
+border:1px solid #C90;
+margin:0;
+padding:0;
+}
+
+.button {
+background-color:#ccc;
+font-size:1em;
+padding:0;
+margin:0;
+}
+
+fieldset {
+position: relative;
+margin-top:1em;
+padding:0.75em;
+border:1px solid #c90;
+text-align:left;
+background-color:#f9f9D4;
+}
+
+legend {
+position:absolute;
+top:-0.8em;
+left:0.5em;
+color:#C90;
+font-family:verdana;
+font-size:1.2em;
+font-weight:700;
+background-color:#fff;
+}
+
+a.button {
+border-bottom:groove #C90 2px;
+color:#000;
+padding:0 0.2em 0.2em;
+}
+
+a:hover.button {
+background-color:#ccc;
+border:groove #C90 2px;
+border-bottom:groove #C90 2px;
+color:#000;
+padding:0 0.2em 0.2em;
+}
+
+.checkbox {
+border:groove #C90 2px;
+}
+
+/* ----- menu elements ----- */
+#menu {
+color:#A90101;
+font-family:verdana;
+font-size:1.1em;
+}
+
+div#menu-links {
+margin-left:5%;
+margin-right:5%;
+text-align:center;
+}
+
+.menu-box1 {
+padding:0.5em;
+}
+
+.menu-box2 {
+background-color:#fff4be;
+border:1px solid #fc9;
+padding:0.5em;
+}
+
+.menu-description1 {
+margin-left:1.5em;
+}
+
+.menu-label1 { 
+width: 40em;
+}
+
+/* ---- docgrok related ---- */
+.docgrok-entry {
+margin-bottom:0.5em;
+}
+
+.docgrok-value { 
+margin-left:2em;
+}
+
+.docgrok-pathvalue {
+font-family:courier;
+}
+
+.docgrok-annotation1 {
+margin-left:2em;
+}
+
+.docgrok-annotation2 {
+margin-left:5em;
+}
+
+.docgrok-pycode1 {
+color:#00f;
+font-family:courier;
+}
+
+.docgrok-sourcetext {
+background-color:#f8f8f8;
+border:2px groove #eee;
+margin:1em;
+padding:1.5em;
+}
+
+.docgrok-sourceheader {
+background-color:#fff;
+}
+
+.docgrok-table { 
+font-size:1.0em;
+empty-cells:show;
+border-collapse:separate;
+}
+.docgrok-table th { 
+padding-left:3px;
+padding-right:3px;
+border:1px solid #eee;
+}
+.docgrok-table td {
+min-height:1.0em;
+padding-left:5px;
+padding-right:5px;
+
+}
+
+/* --- system proces related --- */
+div#server-processes {
+background-color:#f9f9D4;
+border:1px solid #cc9900;
+padding:0.75em;
+}
+
+div#server-processes dl {
+margin-top:-0.5em;
+padding-top:0;
+}
+
+div#server-processes dt.emph {
+background:url(banner-shadow.jpg) top left repeat-x;
+border:1px solid grey;
+margin-left:0;
+margin-top:0.5em;
+padding-left:0.75em;
+}
+
+div#server-processes dd {
+border:1px solid grey;
+border-top:none;
+margin-left:0;
+padding-left:0.75em;
+}
+
+div#server-processes ul {
+margin:0;
+padding:0;
+}
+
+/* ----- misc elements ----- */
+.huge {
+font-size:1.6em;
+text-align:center;
+}
+
+.rightalign {
+text-align:right;
+}
+
+.emph,.menu-head1,.docgrok-description1 {
+font-weight:700;
+}
+
+.header {
+color:#C90;
+clear:both;
+display:block;
+font-family:verdana;
+font-size:1.2em;
+font-weight:700;
+padding-top:1em;
+padding-left:0.8em;
+}
+
+#logout { 
+padding:1px;
+padding-right:150px;
+background-color:#ddd;
+text-align:right;
+}
\ No newline at end of file



More information about the Checkins mailing list