[z3-checkins] r10839 - in z3/Five/branch/philikon-restructuring: . browser form skin

philikon at codespeak.net philikon at codespeak.net
Tue Apr 19 01:22:53 MEST 2005


Author: philikon
Date: Tue Apr 19 01:22:53 2005
New Revision: 10839

Added:
   z3/Five/branch/philikon-restructuring/browser/
   z3/Five/branch/philikon-restructuring/browser/__init__.py
      - copied, changed from r10836, z3/Five/branch/philikon-restructuring/browser.py
   z3/Five/branch/philikon-restructuring/browser/absoluteurl.py
      - copied, changed from r10836, z3/Five/branch/philikon-restructuring/browser.py
   z3/Five/branch/philikon-restructuring/browser/adding.pt
      - copied unchanged from r10836, z3/Five/branch/philikon-restructuring/adding.pt
   z3/Five/branch/philikon-restructuring/browser/adding.py
      - copied, changed from r10836, z3/Five/branch/philikon-restructuring/adding.py
   z3/Five/branch/philikon-restructuring/browser/configure.zcml
      - copied, changed from r10836, z3/Five/branch/philikon-restructuring/browser.zcml
   z3/Five/branch/philikon-restructuring/browser/meta.zcml
      - copied, changed from r10836, z3/Five/branch/philikon-restructuring/meta.zcml
   z3/Five/branch/philikon-restructuring/browser/metaconfigure.py
      - copied, changed from r10836, z3/Five/branch/philikon-restructuring/browserconfigure.py
   z3/Five/branch/philikon-restructuring/browser/pagetemplatefile.py
      - copied, changed from r10836, z3/Five/branch/philikon-restructuring/pagetemplatefile.py
   z3/Five/branch/philikon-restructuring/browser/resource.py
      - copied, changed from r10836, z3/Five/branch/philikon-restructuring/resource.py
   z3/Five/branch/philikon-restructuring/form/
   z3/Five/branch/philikon-restructuring/form/__init__.py
      - copied, changed from r10836, z3/Five/branch/philikon-restructuring/browser.py
   z3/Five/branch/philikon-restructuring/form/add.pt
      - copied unchanged from r10836, z3/Five/branch/philikon-restructuring/add.pt
   z3/Five/branch/philikon-restructuring/form/configure.zcml   (contents, props changed)
   z3/Five/branch/philikon-restructuring/form/edit.pt
      - copied unchanged from r10836, z3/Five/branch/philikon-restructuring/edit.pt
   z3/Five/branch/philikon-restructuring/form/macros.py
      - copied, changed from r10836, z3/Five/branch/philikon-restructuring/skin.py
   z3/Five/branch/philikon-restructuring/form/meta.zcml
      - copied, changed from r10836, z3/Five/branch/philikon-restructuring/meta.zcml
   z3/Five/branch/philikon-restructuring/form/metaconfigure.py
      - copied, changed from r10836, z3/Five/branch/philikon-restructuring/browserconfigure.py
   z3/Five/branch/philikon-restructuring/skin/
   z3/Five/branch/philikon-restructuring/skin/__init__.py   (contents, props changed)
   z3/Five/branch/philikon-restructuring/skin/configure.zcml
      - copied, changed from r10836, z3/Five/branch/philikon-restructuring/browser.zcml
   z3/Five/branch/philikon-restructuring/skin/five_template.pt
      - copied unchanged from r10836, z3/Five/branch/philikon-restructuring/five_template.pt
   z3/Five/branch/philikon-restructuring/skin/standardmacros.py
      - copied, changed from r10836, z3/Five/branch/philikon-restructuring/skin.py
Removed:
   z3/Five/branch/philikon-restructuring/add.pt
   z3/Five/branch/philikon-restructuring/adding.pt
   z3/Five/branch/philikon-restructuring/adding.py
   z3/Five/branch/philikon-restructuring/browser.py
   z3/Five/branch/philikon-restructuring/browser.zcml
   z3/Five/branch/philikon-restructuring/browserconfigure.py
   z3/Five/branch/philikon-restructuring/edit.pt
   z3/Five/branch/philikon-restructuring/five_template.pt
   z3/Five/branch/philikon-restructuring/pagetemplatefile.py
   z3/Five/branch/philikon-restructuring/resource.py
   z3/Five/branch/philikon-restructuring/skin.py
Modified:
   z3/Five/branch/philikon-restructuring/__init__.py
   z3/Five/branch/philikon-restructuring/api.py
   z3/Five/branch/philikon-restructuring/configure.zcml
   z3/Five/branch/philikon-restructuring/fiveconfigure.py
   z3/Five/branch/philikon-restructuring/meta.zcml
Log:
Major restructuring. We now have the following sub-packages:
* Five.browser
* Five.form
* Five.skin

Tests aren't passing yet which is due to a weird behaviour of
ZopeTwoPageTemplateFile.


Modified: z3/Five/branch/philikon-restructuring/__init__.py
==============================================================================
--- z3/Five/branch/philikon-restructuring/__init__.py	(original)
+++ z3/Five/branch/philikon-restructuring/__init__.py	Tue Apr 19 01:22:53 2005
@@ -22,7 +22,7 @@
 # public API provided by Five
 # usage: from Products.Five import <something>
 from browser import BrowserView
-from skin import StandardMacros
+from skin.standardmacros import StandardMacros
 
 def initialize(context):
     zcml.load_site()

Deleted: /z3/Five/branch/philikon-restructuring/add.pt
==============================================================================
--- /z3/Five/branch/philikon-restructuring/add.pt	Tue Apr 19 01:22:53 2005
+++ (empty file)
@@ -1,72 +0,0 @@
-<html metal:use-macro="context/@@standard_macros/page">
-  <body>
-  <div metal:fill-slot="body">
-
-  <div metal:define-macro="addform">
-
-    <form action="." tal:attributes="action request/URL" method="post"
-          enctype="multipart/form-data">
-
-      <div metal:define-macro="formbody">
-
-        <h3 tal:condition="view/label"
-            tal:content="view/label"
-            metal:define-slot="heading"
-            >Edit something</h3>
-
-        <p tal:define="status view/update"
-           tal:condition="status"
-           tal:content="status" />
-
-        <p tal:condition="view/errors" i18n:translate="">
-          There are <strong tal:content="python:len(view.errors)"
-                            i18n:name="num_errors">6</strong> input errors.
-        </p>
-
-        <div metal:define-slot="extra_info" tal:replace="nothing">
-        </div>
-
-        <div class="row" metal:define-slot="extra_top" tal:replace="nothing">
-            <div class="label">Extra top</div>
-            <div class="label"><input type="text" style="width:100%" /></div>
-        </div>
-
-        <div metal:use-macro="context/@@widget_macros/widget_rows" />
-
-        <div class="separator"></div>
-
-        <div class="row"
-            metal:define-slot="extra_bottom" tal:replace="nothing">
-          <div class="label">Extra bottom</div>
-          <div class="field"><input type="text" style="width:100%" /></div>
-        </div>
-
-        <div class="separator"></div>
-
-      </div>
-      <br/><br/>
-      <div class="row">
-        <div class="controls"><hr />
-          <input type='submit' value='Refresh'
-                 i18n:attributes='value refresh-button' />
-          <input type='submit' value='Add' name='UPDATE_SUBMIT'
-                 i18n:attributes='value add-button' />
-          <span tal:condition="context/nameAllowed|nothing" tal:omit-tag="">
-               &nbsp;&nbsp;<b i18n:translate="">Object Name</b>&nbsp;&nbsp;
-              <input type='text' name='add_input_name'
-                     tal:attributes="value context/contentName" />
-          </span>
-        </div>
-      </div>
-
-      <div class="row" metal:define-slot="extra_buttons" tal:replace="nothing">
-      </div>
-
-      <div class="separator"></div>
-    </form>
-  </div>
-
-  </div>
-  </body>
-
-</html>

Deleted: /z3/Five/branch/philikon-restructuring/adding.pt
==============================================================================
--- /z3/Five/branch/philikon-restructuring/adding.pt	Tue Apr 19 01:22:53 2005
+++ (empty file)
@@ -1,7 +0,0 @@
-<html metal:use-macro="here/five_template/macros/master">
-<body>
-<div metal:fill-slot="main">
-  <p>+ screen not yet supported by Five</p>
-</div>
-</body>
-</html>

Deleted: /z3/Five/branch/philikon-restructuring/adding.py
==============================================================================
--- /z3/Five/branch/philikon-restructuring/adding.py	Tue Apr 19 01:22:53 2005
+++ (empty file)
@@ -1,245 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2002 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.
-#
-##############################################################################
-"""Adding View
-
-The Adding View is used to add new objects to a container. It is sort of a
-factory screen.
-"""
-__docformat__ = 'restructuredtext'
-
-from warnings import warn
-from zope.interface import implements
-from zope.publisher.interfaces import IPublishTraverse
-from zope.component.interfaces import IFactory
-
-from zope.app.exception.interfaces import UserError
-from zope.app.container.interfaces import IAdding, INameChooser
-from zope.app.container.interfaces import IContainerNamesContainer
-from zope.app.container.constraints import checkFactory, checkObject
-
-from zope.app import zapi
-from zope.app.event.objectevent import ObjectCreatedEvent
-from zope.event import notify
-
-from zExceptions import BadRequest
-
-from Products.Five import BrowserView
-from Products.Five.traversable import Traversable
-from Products.Five.pagetemplatefile import ZopeTwoPageTemplateFile
-
-from Acquisition import Implicit
-from OFS.SimpleItem import SimpleItem
-
-class BasicAdding(Implicit, BrowserView):
-    implements(IAdding, IPublishTraverse)
-
-    def add(self, content):
-        """See zope.app.container.interfaces.IAdding
-        """
-        container = self.context
-        name = self.contentName
-        chooser = INameChooser(container)
-
-        # check precondition
-        checkObject(container, name, content)
-
-        if IContainerNamesContainer.providedBy(container):
-            # The container picks it's own names.
-            # We need to ask it to pick one.
-            name = chooser.chooseName(self.contentName or '', content)
-        else:
-            request = self.request
-            name = request.get('add_input_name', name)
-
-            if name is None:
-                name = chooser.chooseName(self.contentName or '', content)
-            elif name == '':
-                name = chooser.chooseName('', content)
-            chooser.checkName(name, container)
-        
-        content.id = name
-        container._setObject(name, content)
-        self.contentName = name # Set the added object Name
-        return container._getOb(name)
-
-    contentName = None # usually set by Adding traverser
-
-    def nextURL(self):
-        """See zope.app.container.interfaces.IAdding"""
-        # XXX this is definitely not right for all or even most uses
-        # of Five, but can be overridden by an AddView subclass, using
-        # the class attribute of a zcml:addform directive
-        return (str(zapi.getView(self.context, "absolute_url", self.request))
-                + '/manage_main')
-
-    # set in BrowserView.__init__
-    request = None 
-    context = None
-
-    def renderAddButton(self):
-        warn("The renderAddButton method is deprecated, use nameAllowed",
-            DeprecationWarning, 2)
-    
-
-    def publishTraverse(self, request, name):
-        """See zope.app.container.interfaces.IAdding"""
-        if '=' in name:
-            view_name, content_name = name.split("=", 1)
-            self.contentName = content_name
-
-            if view_name.startswith('@@'):
-                view_name = view_name[2:]
-            return zapi.getView(self, view_name, request)
-
-        if name.startswith('@@'):
-            view_name = name[2:]
-        else:
-            view_name = name
-
-        view = zapi.queryView(self, view_name, request)
-        if view is not None:
-            return view
-
-        factory = zapi.queryUtility(IFactory, name)
-        if factory is None:
-            return super(BasicAdding, self).publishTraverse(request, name)
-
-        return factory
-
-    def action(self, type_name='', id=''):
-        if not type_name:
-            raise UserError("You must select the type of object to add.")
-
-        if type_name.startswith('@@'):
-            type_name = type_name[2:]
-
-        if '/' in type_name:
-            view_name  = type_name.split('/', 1)[0]
-        else:
-            view_name = type_name
-
-        if zapi.queryView(self, view_name, self.request) is not None:
-            url = "%s/%s=%s" % (
-                zapi.getView(self, "absolute_url", self.request),
-                type_name, id)
-            self.request.response.redirect(url)
-            return
-
-        if not self.contentName:
-            self.contentName = id
-
-        factory = zapi.getUtility(IFactory, type_name)
-        content = factory()
-
-        notify(ObjectCreatedEvent(content))
-        self.add(content)
-        self.request.response.redirect(self.nextURL())
-
-    def namesAccepted(self):
-        return not IContainerNamesContainer.providedBy(self.context)
-
-    def nameAllowed(self):
-        """Return whether names can be input by the user."""
-        return not IContainerNamesContainer.providedBy(self.context)
-    
-
-class Adding(BasicAdding):
-
-    menu_id = None
-    index = ZopeTwoPageTemplateFile("adding.pt")
-
-    def addingInfo(self):
-        """Return menu data.
-
-        This is sorted by title.
-        """
-        container = self.context
-        menu_service = zapi.getService("BrowserMenu")
-        result = []
-        for menu_id in (self.menu_id, 'zope.app.container.add'):
-            if not menu_id:
-                continue
-            for item in menu_service.getMenu(menu_id, self, self.request):
-                extra = item.get('extra')
-                if extra:
-                    factory = extra.get('factory')
-                    if factory:
-                        factory = zapi.getUtility(IFactory, factory)
-                        if not checkFactory(container, None, factory):
-                            continue
-                        elif item['extra']['factory'] != item['action']:
-                            item['has_custom_add_view']=True
-                result.append(item)
-
-        result.sort(lambda a, b: cmp(a['title'], b['title']))
-        return result
-
-    def isSingleMenuItem(self):
-        "Return whether there is single menu item or not."
-        return len(self.addingInfo()) == 1
-
-    def hasCustomAddView(self):
-       "This should be called only if there is `singleMenuItem` else return 0"
-       if self.isSingleMenuItem():
-           menu_item = self.addingInfo()[0]
-           if 'has_custom_add_view' in menu_item:
-               return True
-       return False
-
-class ContentAdding(Adding, Traversable, SimpleItem):
-
-    menu_id = "add_content"
-
-class ObjectManagerNameChooser:
-    """A name chooser for a Zope object manager.
-    """
-    
-    implements(INameChooser)
-    
-    def __init__(self, context):
-        self.context = context
-
-    def checkName(self, name, object):
-        try:
-            self.context._checkId(name, allow_dup=False)
-        except BadRequest:
-            raise UserError, "Id is in use or invalid"
-
-    def chooseName(self, name, object):
-        if not name:
-            name = object.__class__.__name__
-
-        dot = name.rfind('.')
-        if dot >= 0:
-            suffix = name[dot:]
-            name = name[:dot]
-        else:
-            suffix = ''
-
-        n = name + suffix
-        i = 1
-        while True:
-            try:
-                container._getOb(n)
-            except AttributeError:
-                pass
-            else:
-                break
-            i += 1
-            n = name + '-' + str(i) + suffix
-            
-        # Make sure tha name is valid.  We may have started with something bad.
-        self.checkName(n, object)
-
-        return n

Modified: z3/Five/branch/philikon-restructuring/api.py
==============================================================================
--- z3/Five/branch/philikon-restructuring/api.py	(original)
+++ z3/Five/branch/philikon-restructuring/api.py	Tue Apr 19 01:22:53 2005
@@ -17,6 +17,7 @@
               'Import directly from Products.Five instead for public API.',
               DeprecationWarning)
 
-from browser import BrowserView, StandardMacros
+from browser import BrowserView
+from form.standardmacros import StandardMacros
 from traversable import Traversable
 from viewable import Viewable

Deleted: /z3/Five/branch/philikon-restructuring/browser.py
==============================================================================
--- /z3/Five/branch/philikon-restructuring/browser.py	Tue Apr 19 01:22:53 2005
+++ (empty file)
@@ -1,292 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2004 Five Contributors. All rights reserved.
-#
-# This software is distributed under the terms of the Zope Public
-# License (ZPL) v2.1. See COPYING.txt for more information.
-#
-##############################################################################
-"""Provide basic browser functionality
-
-$Id$
-"""
-
-# python
-import sys
-from datetime import datetime
-
-# Zope 2
-import Acquisition
-from  Acquisition import aq_inner, aq_parent, aq_base
-from AccessControl import ClassSecurityInfo
-from Globals import InitializeClass
-
-# Zope 3
-from interfaces import ITraversable
-from zope.interface import implements
-from zope.component import getViewProviding
-from zope.app.traversing.browser.interfaces import IAbsoluteURL
-from zope.app.location.interfaces import ILocation
-from zope.app.location import LocationProxy
-from zope.app.form.utility import setUpEditWidgets, applyWidgetsChanges
-from zope.app.form.browser.submit import Update
-from zope.app.form.interfaces import WidgetsError, MissingInputError
-from zope.event import notify
-from zope.app.form.utility import setUpWidgets, getWidgetsData
-from zope.app.form.interfaces import IInputWidget, WidgetsError
-from zope.schema.interfaces import ValidationError
-from zope.app.event.objectevent import ObjectCreatedEvent, ObjectModifiedEvent
-
-# Five
-from Products.Five.pagetemplatefile import FivePageTemplateFile
-
-class BrowserView(Acquisition.Explicit):
-    security = ClassSecurityInfo()
-
-    def __init__(self, context, request):
-        self.context = context
-        self.request = request
-
-    # XXX do not create any methods on the subclass called index_html,
-    # as this makes Zope 2 traverse into that first!
-
-InitializeClass(BrowserView)
-
-class AbsoluteURL(BrowserView):
-    """An adapter for Zope3-style absolute_url using Zope2 methods
-
-    (original: zope.app.traversing.browser.absoluteurl)
-    """
-
-    def __init__(self, context, request):
-        self.context, self.request = context, request
-
-    implements(IAbsoluteURL)
-
-    def __str__(self):
-        context = aq_inner(self.context)
-        return context.absolute_url()
-
-    __call__ = __str__
-
-    def breadcrumbs(self):
-        context = self.context.aq_inner
-        container = context.aq_parent
-        request = self.request
-
-        name = context.getId()
-        
-        if container is None or self._isVirtualHostRoot() \
-            or not ITraversable.providedBy(container):
-            return (
-                {'name': name, 'url': context.absolute_url()},)
-
-        view = getViewProviding(container, IAbsoluteURL, request)
-        base = tuple(view.breadcrumbs())
-        base += (
-            {'name': name, 'url': ("%s/%s" % (base[-1]['url'], name))},)
-
-        return base
-
-    def _isVirtualHostRoot(self):
-        virtualrootpath = self.request.get('VirtualRootPhysicalPath', None)
-        if virtualrootpath is None:
-            return False
-        context = self.context.aq_inner
-        return context.restrictedTraverse(virtualrootpath) == context
-
-class SiteAbsoluteURL(AbsoluteURL):
-    """An adapter for Zope3-style absolute_url using Zope2 methods
-
-    This one is just used to stop breadcrumbs from crumbing up
-    to the Zope root.
-
-    (original: zope.app.traversing.browser.absoluteurl)
-    """
-
-    def breadcrumbs(self):
-        context = self.context
-        request = self.request
-
-        return ({'name': context.getId(),
-                 'url': context.absolute_url()
-                 },)
-
-class EditView(BrowserView):
-    """Simple edit-view base class
-
-    Subclasses should provide a schema attribute defining the schema
-    to be edited.
-    """
-
-    errors = ()
-    update_status = None
-    label = ''
-
-    # Fall-back field names computes from schema
-    fieldNames = property(lambda self: getFieldNamesInOrder(self.schema))
-    # Fall-back template
-    generated_form = FivePageTemplateFile('edit.pt')
-
-    def __init__(self, context, request):
-        BrowserView.__init__(self, context, request)
-        self._setUpWidgets()
-
-    def _setUpWidgets(self):
-        adapted = self.schema(self.context)
-        if adapted is not self.context:
-            if not ILocation.providedBy(adapted):
-                adapted = LocationProxy(adapted)
-            adapted.__parent__ = self.context
-        self.adapted = adapted
-        setUpEditWidgets(self, self.schema, source=self.adapted,
-                         names=self.fieldNames)
-
-    def setPrefix(self, prefix):
-        for widget in self.widgets():
-            widget.setPrefix(prefix)
-
-    def widgets(self):
-        return [getattr(self, name+'_widget')
-                for name in self.fieldNames]
-
-    def changed(self):
-        # This method is overridden to execute logic *after* changes
-        # have been made.
-        pass
-
-    def update(self):
-        if self.update_status is not None:
-            # We've been called before. Just return the status we previously
-            # computed.
-            return self.update_status
-
-        status = ''
-
-        content = self.adapted
-
-        if Update in self.request.form.keys():
-            changed = False
-            try:
-                changed = applyWidgetsChanges(self, self.schema,
-                    target=content, names=self.fieldNames)
-                # We should not generate events when an adapter is used.
-                # That's the adapter's job.
-                if changed and self.context is self.adapted:
-                    notify(ObjectModifiedEvent(content))
-            except WidgetsError, errors:
-                self.errors = errors
-                status = "An error occured."
-                get_transaction().abort()
-            else:
-                setUpEditWidgets(self, self.schema, source=self.adapted,
-                                 ignoreStickyValues=True,
-                                 names=self.fieldNames)
-                if changed:
-                    self.changed()
-                    # XXX: Needs i18n support:
-                    # formatter = self.request.locale.dates.getFormatter(
-                    #     'dateTime', 'medium')
-                    # status = _("Updated on ${date_time}")
-                    # status.mapping = {'date_time': formatter.format(
-                    #     datetime.utcnow())}
-                    status = "Updated on %s" % str(datetime.utcnow())
-
-        self.update_status = status
-        return status
-
-class AddView(EditView):
-    """Simple edit-view base class.
-
-    Subclasses should provide a schema attribute defining the schema
-    to be edited.
-    """
-
-    def _setUpWidgets(self):
-        setUpWidgets(self, self.schema, IInputWidget, names=self.fieldNames)
-
-    def update(self):
-        if self.update_status is not None:
-            # We've been called before. Just return the previous result.
-            return self.update_status
-
-        if self.request.form.has_key(Update):
-
-            self.update_status = ''
-            try:
-                data = getWidgetsData(self, self.schema, names=self.fieldNames)
-                self.createAndAdd(data)
-            except WidgetsError, errors:
-                self.errors = errors
-                self.update_status = "An error occured."
-                return self.update_status
-
-            self.request.response.redirect(self.nextURL())
-
-        return self.update_status
-
-    def create(self, *args, **kw):
-        """Do the actual instantiation."""
-        # hack to please typical Zope 2 factories, which expect id and title
-        args = ('tmp_id', 'Temporary title') + args
-        return self._factory(*args, **kw)
-
-    def createAndAdd(self, data):
-        """Add the desired object using the data in the data argument.
-
-        The data argument is a dictionary with the data entered in the form.
-        """
-
-        args = []
-        if self._arguments:
-            for name in self._arguments:
-                args.append(data[name])
-
-        kw = {}
-        if self._keyword_arguments:
-            for name in self._keyword_arguments:
-                if name in data:
-                    kw[str(name)] = data[name]
-
-        content = self.create(*args, **kw)
-        adapted = self.schema(content)
-
-        errors = []
-
-        if self._set_before_add:
-            for name in self._set_before_add:
-                if name in data:
-                    field = self.schema[name]
-                    try:
-                        field.set(adapted, data[name])
-                    except ValidationError:
-                        errors.append(sys.exc_info()[1])
-
-        if errors:
-            raise WidgetsError(*errors)
-
-        notify(ObjectCreatedEvent(content))
-
-        content = self.add(content)
-
-        adapted = self.schema(content)
-
-        if self._set_after_add:
-            for name in self._set_after_add:
-                if name in data:
-                    field = self.schema[name]
-                    try:
-                        field.set(adapted, data[name])
-                    except ValidationError:
-                        errors.append(sys.exc_info()[1])
-
-        if errors:
-            raise WidgetsError(*errors)
-
-        return content
-
-    def add(self, content):
-        return self.context.add(content)
-
-    def nextURL(self):
-        return self.context.nextURL()

Deleted: /z3/Five/branch/philikon-restructuring/browser.zcml
==============================================================================
--- /z3/Five/branch/philikon-restructuring/browser.zcml	Tue Apr 19 01:22:53 2005
+++ (empty file)
@@ -1,71 +0,0 @@
-<configure xmlns="http://namespaces.zope.org/zope"
-           xmlns:browser="http://namespaces.zope.org/browser">
-
-  <browser:page
-      for="*"
-      name="absolute_url"
-      class=".browser.AbsoluteURL"
-      permission="zope.Public"
-      allowed_interface="zope.app.traversing.browser.interfaces.IAbsoluteURL"
-      />
-
-  <browser:page
-      for="*"
-      template="five_template.pt"
-      name="five_template"
-      permission="zope.Public"
-      />
-
-  <browser:page
-      for="*"
-      name="standard_macros"
-      permission="zope2.View"
-      class=".skin.StandardMacros"
-      allowed_interface="zope.interface.common.mapping.IItemMapping"
-      />
-
-  <browser:page
-      for="*"
-      name="form_macros"
-      permission="zope2.View"
-      class=".skin.FormMacros"
-      allowed_interface="zope.interface.common.mapping.IItemMapping"
-      />
-
-  <view
-      for="*"
-      factory=".browser.AbsoluteURL"
-      type="zope.publisher.interfaces.http.IHTTPRequest"
-      permission="zope.Public"
-      provides="zope.app.traversing.browser.interfaces.IAbsoluteURL"
-      />
-
-  <browser:page
-      for="zope.app.traversing.interfaces.IContainmentRoot"
-      name="absolute_url"
-      class=".browser.SiteAbsoluteURL"
-      permission="zope.Public"
-      allowed_interface="zope.app.traversing.browser.interfaces.IAbsoluteURL"
-      />
-
-  <view
-      for="zope.app.traversing.interfaces.IContainmentRoot"
-      factory=".browser.SiteAbsoluteURL"
-      type="zope.publisher.interfaces.http.IHTTPRequest"
-      permission="zope.Public"
-      provides="zope.app.traversing.browser.interfaces.IAbsoluteURL"
-      />
-
-  <browser:view
-      for=".interfaces.IObjectManager"
-      name="+"
-      class=".adding.ContentAdding"
-      permission="zope2.ViewManagementScreens"
-      >
-
-    <browser:page name="index.html"  template="adding.pt" />
-    <browser:page name="action.html" attribute="action" />
-
-  </browser:view>
-
-</configure>

Copied: z3/Five/branch/philikon-restructuring/browser/__init__.py (from r10836, z3/Five/branch/philikon-restructuring/browser.py)
==============================================================================
--- z3/Five/branch/philikon-restructuring/browser.py	(original)
+++ z3/Five/branch/philikon-restructuring/browser/__init__.py	Tue Apr 19 01:22:53 2005
@@ -11,35 +11,10 @@
 $Id$
 """
 
-# python
-import sys
-from datetime import datetime
-
-# Zope 2
 import Acquisition
-from  Acquisition import aq_inner, aq_parent, aq_base
 from AccessControl import ClassSecurityInfo
 from Globals import InitializeClass
 
-# Zope 3
-from interfaces import ITraversable
-from zope.interface import implements
-from zope.component import getViewProviding
-from zope.app.traversing.browser.interfaces import IAbsoluteURL
-from zope.app.location.interfaces import ILocation
-from zope.app.location import LocationProxy
-from zope.app.form.utility import setUpEditWidgets, applyWidgetsChanges
-from zope.app.form.browser.submit import Update
-from zope.app.form.interfaces import WidgetsError, MissingInputError
-from zope.event import notify
-from zope.app.form.utility import setUpWidgets, getWidgetsData
-from zope.app.form.interfaces import IInputWidget, WidgetsError
-from zope.schema.interfaces import ValidationError
-from zope.app.event.objectevent import ObjectCreatedEvent, ObjectModifiedEvent
-
-# Five
-from Products.Five.pagetemplatefile import FivePageTemplateFile
-
 class BrowserView(Acquisition.Explicit):
     security = ClassSecurityInfo()
 
@@ -51,242 +26,3 @@
     # as this makes Zope 2 traverse into that first!
 
 InitializeClass(BrowserView)
-
-class AbsoluteURL(BrowserView):
-    """An adapter for Zope3-style absolute_url using Zope2 methods
-
-    (original: zope.app.traversing.browser.absoluteurl)
-    """
-
-    def __init__(self, context, request):
-        self.context, self.request = context, request
-
-    implements(IAbsoluteURL)
-
-    def __str__(self):
-        context = aq_inner(self.context)
-        return context.absolute_url()
-
-    __call__ = __str__
-
-    def breadcrumbs(self):
-        context = self.context.aq_inner
-        container = context.aq_parent
-        request = self.request
-
-        name = context.getId()
-        
-        if container is None or self._isVirtualHostRoot() \
-            or not ITraversable.providedBy(container):
-            return (
-                {'name': name, 'url': context.absolute_url()},)
-
-        view = getViewProviding(container, IAbsoluteURL, request)
-        base = tuple(view.breadcrumbs())
-        base += (
-            {'name': name, 'url': ("%s/%s" % (base[-1]['url'], name))},)
-
-        return base
-
-    def _isVirtualHostRoot(self):
-        virtualrootpath = self.request.get('VirtualRootPhysicalPath', None)
-        if virtualrootpath is None:
-            return False
-        context = self.context.aq_inner
-        return context.restrictedTraverse(virtualrootpath) == context
-
-class SiteAbsoluteURL(AbsoluteURL):
-    """An adapter for Zope3-style absolute_url using Zope2 methods
-
-    This one is just used to stop breadcrumbs from crumbing up
-    to the Zope root.
-
-    (original: zope.app.traversing.browser.absoluteurl)
-    """
-
-    def breadcrumbs(self):
-        context = self.context
-        request = self.request
-
-        return ({'name': context.getId(),
-                 'url': context.absolute_url()
-                 },)
-
-class EditView(BrowserView):
-    """Simple edit-view base class
-
-    Subclasses should provide a schema attribute defining the schema
-    to be edited.
-    """
-
-    errors = ()
-    update_status = None
-    label = ''
-
-    # Fall-back field names computes from schema
-    fieldNames = property(lambda self: getFieldNamesInOrder(self.schema))
-    # Fall-back template
-    generated_form = FivePageTemplateFile('edit.pt')
-
-    def __init__(self, context, request):
-        BrowserView.__init__(self, context, request)
-        self._setUpWidgets()
-
-    def _setUpWidgets(self):
-        adapted = self.schema(self.context)
-        if adapted is not self.context:
-            if not ILocation.providedBy(adapted):
-                adapted = LocationProxy(adapted)
-            adapted.__parent__ = self.context
-        self.adapted = adapted
-        setUpEditWidgets(self, self.schema, source=self.adapted,
-                         names=self.fieldNames)
-
-    def setPrefix(self, prefix):
-        for widget in self.widgets():
-            widget.setPrefix(prefix)
-
-    def widgets(self):
-        return [getattr(self, name+'_widget')
-                for name in self.fieldNames]
-
-    def changed(self):
-        # This method is overridden to execute logic *after* changes
-        # have been made.
-        pass
-
-    def update(self):
-        if self.update_status is not None:
-            # We've been called before. Just return the status we previously
-            # computed.
-            return self.update_status
-
-        status = ''
-
-        content = self.adapted
-
-        if Update in self.request.form.keys():
-            changed = False
-            try:
-                changed = applyWidgetsChanges(self, self.schema,
-                    target=content, names=self.fieldNames)
-                # We should not generate events when an adapter is used.
-                # That's the adapter's job.
-                if changed and self.context is self.adapted:
-                    notify(ObjectModifiedEvent(content))
-            except WidgetsError, errors:
-                self.errors = errors
-                status = "An error occured."
-                get_transaction().abort()
-            else:
-                setUpEditWidgets(self, self.schema, source=self.adapted,
-                                 ignoreStickyValues=True,
-                                 names=self.fieldNames)
-                if changed:
-                    self.changed()
-                    # XXX: Needs i18n support:
-                    # formatter = self.request.locale.dates.getFormatter(
-                    #     'dateTime', 'medium')
-                    # status = _("Updated on ${date_time}")
-                    # status.mapping = {'date_time': formatter.format(
-                    #     datetime.utcnow())}
-                    status = "Updated on %s" % str(datetime.utcnow())
-
-        self.update_status = status
-        return status
-
-class AddView(EditView):
-    """Simple edit-view base class.
-
-    Subclasses should provide a schema attribute defining the schema
-    to be edited.
-    """
-
-    def _setUpWidgets(self):
-        setUpWidgets(self, self.schema, IInputWidget, names=self.fieldNames)
-
-    def update(self):
-        if self.update_status is not None:
-            # We've been called before. Just return the previous result.
-            return self.update_status
-
-        if self.request.form.has_key(Update):
-
-            self.update_status = ''
-            try:
-                data = getWidgetsData(self, self.schema, names=self.fieldNames)
-                self.createAndAdd(data)
-            except WidgetsError, errors:
-                self.errors = errors
-                self.update_status = "An error occured."
-                return self.update_status
-
-            self.request.response.redirect(self.nextURL())
-
-        return self.update_status
-
-    def create(self, *args, **kw):
-        """Do the actual instantiation."""
-        # hack to please typical Zope 2 factories, which expect id and title
-        args = ('tmp_id', 'Temporary title') + args
-        return self._factory(*args, **kw)
-
-    def createAndAdd(self, data):
-        """Add the desired object using the data in the data argument.
-
-        The data argument is a dictionary with the data entered in the form.
-        """
-
-        args = []
-        if self._arguments:
-            for name in self._arguments:
-                args.append(data[name])
-
-        kw = {}
-        if self._keyword_arguments:
-            for name in self._keyword_arguments:
-                if name in data:
-                    kw[str(name)] = data[name]
-
-        content = self.create(*args, **kw)
-        adapted = self.schema(content)
-
-        errors = []
-
-        if self._set_before_add:
-            for name in self._set_before_add:
-                if name in data:
-                    field = self.schema[name]
-                    try:
-                        field.set(adapted, data[name])
-                    except ValidationError:
-                        errors.append(sys.exc_info()[1])
-
-        if errors:
-            raise WidgetsError(*errors)
-
-        notify(ObjectCreatedEvent(content))
-
-        content = self.add(content)
-
-        adapted = self.schema(content)
-
-        if self._set_after_add:
-            for name in self._set_after_add:
-                if name in data:
-                    field = self.schema[name]
-                    try:
-                        field.set(adapted, data[name])
-                    except ValidationError:
-                        errors.append(sys.exc_info()[1])
-
-        if errors:
-            raise WidgetsError(*errors)
-
-        return content
-
-    def add(self, content):
-        return self.context.add(content)
-
-    def nextURL(self):
-        return self.context.nextURL()

Copied: z3/Five/branch/philikon-restructuring/browser/absoluteurl.py (from r10836, z3/Five/branch/philikon-restructuring/browser.py)
==============================================================================
--- z3/Five/branch/philikon-restructuring/browser.py	(original)
+++ z3/Five/branch/philikon-restructuring/browser/absoluteurl.py	Tue Apr 19 01:22:53 2005
@@ -6,51 +6,13 @@
 # License (ZPL) v2.1. See COPYING.txt for more information.
 #
 ##############################################################################
-"""Provide basic browser functionality
+"""Absolute URL
 
 $Id$
 """
-
-# python
-import sys
-from datetime import datetime
-
-# Zope 2
-import Acquisition
-from  Acquisition import aq_inner, aq_parent, aq_base
-from AccessControl import ClassSecurityInfo
-from Globals import InitializeClass
-
-# Zope 3
-from interfaces import ITraversable
 from zope.interface import implements
-from zope.component import getViewProviding
 from zope.app.traversing.browser.interfaces import IAbsoluteURL
-from zope.app.location.interfaces import ILocation
-from zope.app.location import LocationProxy
-from zope.app.form.utility import setUpEditWidgets, applyWidgetsChanges
-from zope.app.form.browser.submit import Update
-from zope.app.form.interfaces import WidgetsError, MissingInputError
-from zope.event import notify
-from zope.app.form.utility import setUpWidgets, getWidgetsData
-from zope.app.form.interfaces import IInputWidget, WidgetsError
-from zope.schema.interfaces import ValidationError
-from zope.app.event.objectevent import ObjectCreatedEvent, ObjectModifiedEvent
-
-# Five
-from Products.Five.pagetemplatefile import FivePageTemplateFile
-
-class BrowserView(Acquisition.Explicit):
-    security = ClassSecurityInfo()
-
-    def __init__(self, context, request):
-        self.context = context
-        self.request = request
-
-    # XXX do not create any methods on the subclass called index_html,
-    # as this makes Zope 2 traverse into that first!
-
-InitializeClass(BrowserView)
+from Products.Five.browser import BrowserView
 
 class AbsoluteURL(BrowserView):
     """An adapter for Zope3-style absolute_url using Zope2 methods
@@ -111,182 +73,3 @@
         return ({'name': context.getId(),
                  'url': context.absolute_url()
                  },)
-
-class EditView(BrowserView):
-    """Simple edit-view base class
-
-    Subclasses should provide a schema attribute defining the schema
-    to be edited.
-    """
-
-    errors = ()
-    update_status = None
-    label = ''
-
-    # Fall-back field names computes from schema
-    fieldNames = property(lambda self: getFieldNamesInOrder(self.schema))
-    # Fall-back template
-    generated_form = FivePageTemplateFile('edit.pt')
-
-    def __init__(self, context, request):
-        BrowserView.__init__(self, context, request)
-        self._setUpWidgets()
-
-    def _setUpWidgets(self):
-        adapted = self.schema(self.context)
-        if adapted is not self.context:
-            if not ILocation.providedBy(adapted):
-                adapted = LocationProxy(adapted)
-            adapted.__parent__ = self.context
-        self.adapted = adapted
-        setUpEditWidgets(self, self.schema, source=self.adapted,
-                         names=self.fieldNames)
-
-    def setPrefix(self, prefix):
-        for widget in self.widgets():
-            widget.setPrefix(prefix)
-
-    def widgets(self):
-        return [getattr(self, name+'_widget')
-                for name in self.fieldNames]
-
-    def changed(self):
-        # This method is overridden to execute logic *after* changes
-        # have been made.
-        pass
-
-    def update(self):
-        if self.update_status is not None:
-            # We've been called before. Just return the status we previously
-            # computed.
-            return self.update_status
-
-        status = ''
-
-        content = self.adapted
-
-        if Update in self.request.form.keys():
-            changed = False
-            try:
-                changed = applyWidgetsChanges(self, self.schema,
-                    target=content, names=self.fieldNames)
-                # We should not generate events when an adapter is used.
-                # That's the adapter's job.
-                if changed and self.context is self.adapted:
-                    notify(ObjectModifiedEvent(content))
-            except WidgetsError, errors:
-                self.errors = errors
-                status = "An error occured."
-                get_transaction().abort()
-            else:
-                setUpEditWidgets(self, self.schema, source=self.adapted,
-                                 ignoreStickyValues=True,
-                                 names=self.fieldNames)
-                if changed:
-                    self.changed()
-                    # XXX: Needs i18n support:
-                    # formatter = self.request.locale.dates.getFormatter(
-                    #     'dateTime', 'medium')
-                    # status = _("Updated on ${date_time}")
-                    # status.mapping = {'date_time': formatter.format(
-                    #     datetime.utcnow())}
-                    status = "Updated on %s" % str(datetime.utcnow())
-
-        self.update_status = status
-        return status
-
-class AddView(EditView):
-    """Simple edit-view base class.
-
-    Subclasses should provide a schema attribute defining the schema
-    to be edited.
-    """
-
-    def _setUpWidgets(self):
-        setUpWidgets(self, self.schema, IInputWidget, names=self.fieldNames)
-
-    def update(self):
-        if self.update_status is not None:
-            # We've been called before. Just return the previous result.
-            return self.update_status
-
-        if self.request.form.has_key(Update):
-
-            self.update_status = ''
-            try:
-                data = getWidgetsData(self, self.schema, names=self.fieldNames)
-                self.createAndAdd(data)
-            except WidgetsError, errors:
-                self.errors = errors
-                self.update_status = "An error occured."
-                return self.update_status
-
-            self.request.response.redirect(self.nextURL())
-
-        return self.update_status
-
-    def create(self, *args, **kw):
-        """Do the actual instantiation."""
-        # hack to please typical Zope 2 factories, which expect id and title
-        args = ('tmp_id', 'Temporary title') + args
-        return self._factory(*args, **kw)
-
-    def createAndAdd(self, data):
-        """Add the desired object using the data in the data argument.
-
-        The data argument is a dictionary with the data entered in the form.
-        """
-
-        args = []
-        if self._arguments:
-            for name in self._arguments:
-                args.append(data[name])
-
-        kw = {}
-        if self._keyword_arguments:
-            for name in self._keyword_arguments:
-                if name in data:
-                    kw[str(name)] = data[name]
-
-        content = self.create(*args, **kw)
-        adapted = self.schema(content)
-
-        errors = []
-
-        if self._set_before_add:
-            for name in self._set_before_add:
-                if name in data:
-                    field = self.schema[name]
-                    try:
-                        field.set(adapted, data[name])
-                    except ValidationError:
-                        errors.append(sys.exc_info()[1])
-
-        if errors:
-            raise WidgetsError(*errors)
-
-        notify(ObjectCreatedEvent(content))
-
-        content = self.add(content)
-
-        adapted = self.schema(content)
-
-        if self._set_after_add:
-            for name in self._set_after_add:
-                if name in data:
-                    field = self.schema[name]
-                    try:
-                        field.set(adapted, data[name])
-                    except ValidationError:
-                        errors.append(sys.exc_info()[1])
-
-        if errors:
-            raise WidgetsError(*errors)
-
-        return content
-
-    def add(self, content):
-        return self.context.add(content)
-
-    def nextURL(self):
-        return self.context.nextURL()

Copied: z3/Five/branch/philikon-restructuring/browser/adding.py (from r10836, z3/Five/branch/philikon-restructuring/adding.py)
==============================================================================
--- z3/Five/branch/philikon-restructuring/adding.py	(original)
+++ z3/Five/branch/philikon-restructuring/browser/adding.py	Tue Apr 19 01:22:53 2005
@@ -36,7 +36,7 @@
 
 from Products.Five import BrowserView
 from Products.Five.traversable import Traversable
-from Products.Five.pagetemplatefile import ZopeTwoPageTemplateFile
+from Products.Five.browser.pagetemplatefile import ZopeTwoPageTemplateFile
 
 from Acquisition import Implicit
 from OFS.SimpleItem import SimpleItem

Copied: z3/Five/branch/philikon-restructuring/browser/configure.zcml (from r10836, z3/Five/branch/philikon-restructuring/browser.zcml)
==============================================================================
--- z3/Five/branch/philikon-restructuring/browser.zcml	(original)
+++ z3/Five/branch/philikon-restructuring/browser/configure.zcml	Tue Apr 19 01:22:53 2005
@@ -4,37 +4,14 @@
   <browser:page
       for="*"
       name="absolute_url"
-      class=".browser.AbsoluteURL"
+      class=".absoluteurl.AbsoluteURL"
       permission="zope.Public"
       allowed_interface="zope.app.traversing.browser.interfaces.IAbsoluteURL"
       />
 
-  <browser:page
-      for="*"
-      template="five_template.pt"
-      name="five_template"
-      permission="zope.Public"
-      />
-
-  <browser:page
-      for="*"
-      name="standard_macros"
-      permission="zope2.View"
-      class=".skin.StandardMacros"
-      allowed_interface="zope.interface.common.mapping.IItemMapping"
-      />
-
-  <browser:page
-      for="*"
-      name="form_macros"
-      permission="zope2.View"
-      class=".skin.FormMacros"
-      allowed_interface="zope.interface.common.mapping.IItemMapping"
-      />
-
   <view
       for="*"
-      factory=".browser.AbsoluteURL"
+      factory=".absoluteurl.AbsoluteURL"
       type="zope.publisher.interfaces.http.IHTTPRequest"
       permission="zope.Public"
       provides="zope.app.traversing.browser.interfaces.IAbsoluteURL"
@@ -43,21 +20,21 @@
   <browser:page
       for="zope.app.traversing.interfaces.IContainmentRoot"
       name="absolute_url"
-      class=".browser.SiteAbsoluteURL"
+      class=".absoluteurl.SiteAbsoluteURL"
       permission="zope.Public"
       allowed_interface="zope.app.traversing.browser.interfaces.IAbsoluteURL"
       />
 
   <view
       for="zope.app.traversing.interfaces.IContainmentRoot"
-      factory=".browser.SiteAbsoluteURL"
+      factory=".absoluteurl.SiteAbsoluteURL"
       type="zope.publisher.interfaces.http.IHTTPRequest"
       permission="zope.Public"
       provides="zope.app.traversing.browser.interfaces.IAbsoluteURL"
       />
 
   <browser:view
-      for=".interfaces.IObjectManager"
+      for="Products.Five.interfaces.IObjectManager"
       name="+"
       class=".adding.ContentAdding"
       permission="zope2.ViewManagementScreens"
@@ -68,4 +45,10 @@
 
   </browser:view>
 
+  <adapter
+      for="Products.Five.interfaces.IObjectManager"
+      factory=".adding.ObjectManagerNameChooser"
+      provides="zope.app.container.interfaces.INameChooser"
+      />
+
 </configure>

Copied: z3/Five/branch/philikon-restructuring/browser/meta.zcml (from r10836, z3/Five/branch/philikon-restructuring/meta.zcml)
==============================================================================
--- z3/Five/branch/philikon-restructuring/meta.zcml	(original)
+++ z3/Five/branch/philikon-restructuring/browser/meta.zcml	Tue Apr 19 01:22:53 2005
@@ -2,129 +2,42 @@
     xmlns="http://namespaces.zope.org/zope"
     xmlns:meta="http://namespaces.zope.org/meta">
 
-  <meta:directives namespace="http://namespaces.zope.org/zope">
-
-    <meta:directive
-        name="permission"
-        schema="zope.app.security.metadirectives.IDefinePermissionDirective"
-        handler="zope.app.security.metaconfigure.definePermission"
-        />
-
-    <meta:directive
-        name="redefinePermission"
-        schema="zope.app.security.metadirectives.IRedefinePermission"
-        handler="zope.app.security.metaconfigure.redefinePermission"
-        />
-
-    <meta:directive
-        name="interface"
-        schema="zope.app.component.metadirectives.IInterfaceDirective"
-        handler="zope.app.component.metaconfigure.interface"
-        />
-
-    <meta:directive
-        name="view"
-        schema="zope.app.component.metadirectives.IViewDirective"
-        handler="zope.app.component.metaconfigure.view"
-        />
-
-    <meta:directive
-        name="adapter"
-        schema="zope.app.component.metadirectives.IAdapterDirective"
-        handler="zope.app.component.metaconfigure.adapter"
-        />
-
-    <meta:directive
-        name="subscriber"
-        schema="zope.app.component.metadirectives.ISubscriberDirective"
-        handler="zope.app.component.metaconfigure.subscriber"
-        />
-
-    <meta:directive
-        name="utility"
-        schema="zope.app.component.metadirectives.IUtilityDirective"
-        handler="zope.app.component.metaconfigure.utility"
-        />
+  <meta:directives namespace="http://namespaces.zope.org/browser">
 
     <meta:directive
-        name="serviceType"
-        schema="zope.app.component.metadirectives.IServiceTypeDirective"
-        handler="zope.app.component.metaconfigure.serviceType"
+        name="layer"
+        schema="zope.app.publisher.browser.metadirectives.ILayerDirective"
+        handler="zope.app.publisher.browser.metaconfigure.layer"
         />
 
     <meta:directive
-        name="service"
-        schema="zope.app.component.metadirectives.IServiceDirective"
-        handler="zope.app.component.metaconfigure.service"
+        name="skin"
+        schema="zope.app.publisher.browser.metadirectives.ISkinDirective"
+        handler="zope.app.publisher.browser.metaconfigure.skin"
         />
 
-    <meta:complexDirective
-        name="content"
-        schema="zope.app.component.metadirectives.IClassDirective"
-        handler=".metaconfigure.ContentDirective"
-        >
-
-      <meta:subdirective
-          name="implements"
-          schema="zope.app.component.metadirectives.IImplementsSubdirective"
-          />
-
-      <meta:subdirective
-          name="require"
-          schema="zope.app.component.metadirectives.IRequireSubdirective"
-          />
-
-      <meta:subdirective
-          name="allow"
-          schema="zope.app.component.metadirectives.IAllowSubdirective"
-          />
-
-    </meta:complexDirective>
-
     <meta:directive
-        name="vocabulary"
-        schema="zope.app.schema.metadirectives.IVocabularyDirective"
-        handler="zope.app.schema.metaconfigure.vocabulary"
+        name="defaultSkin"
+        schema="zope.app.publisher.browser.metadirectives.IDefaultSkinDirective"
+        handler="zope.app.publisher.browser.metaconfigure.defaultSkin"
         />
 
-  </meta:directives>
-
-  <meta:directives namespace="http://namespaces.zope.org/browser">
-
-    <meta:directive
-       name="layer"
-       schema="zope.app.publisher.browser.metadirectives.ILayerDirective"
-       handler="zope.app.publisher.browser.metaconfigure.layer"
-       />
-
-     <meta:directive
-       name="skin"
-       schema="zope.app.publisher.browser.metadirectives.ISkinDirective"
-       handler="zope.app.publisher.browser.metaconfigure.skin"
-       />
-
-     <meta:directive
-       name="defaultSkin"
-       schema="zope.app.publisher.browser.metadirectives.IDefaultSkinDirective"
-       handler="zope.app.publisher.browser.metaconfigure.defaultSkin"
-       />
-
     <meta:directive
         name="defaultView"
         schema="zope.app.publisher.browser.metadirectives.IDefaultViewDirective"
-        handler=".browserconfigure.defaultView"
+        handler=".metaconfigure.defaultView"
         />
 
     <meta:directive
         name="page"
         schema="zope.app.publisher.browser.metadirectives.IPageDirective"
-        handler=".browserconfigure.page"
+        handler=".metaconfigure.page"
         />
 
     <meta:complexDirective
         name="pages"
         schema="zope.app.publisher.browser.metadirectives.IPagesDirective"
-        handler=".browserconfigure.pages"
+        handler=".metaconfigure.pages"
         >
 
       <meta:subdirective
@@ -137,13 +50,13 @@
     <meta:directive
         name="resource"
         schema="zope.app.publisher.browser.metadirectives.IResourceDirective"
-        handler=".browserconfigure.resource"
+        handler=".metaconfigure.resource"
         />
 
     <meta:directive
         name="resourceDirectory"
         schema="zope.app.publisher.browser.metadirectives.IResourceDirectoryDirective"
-        handler=".browserconfigure.resourceDirectory"
+        handler=".metaconfigure.resourceDirectory"
         />
 
     <meta:directive
@@ -174,7 +87,7 @@
     <meta:complexDirective
         name="view"
         schema="zope.app.publisher.browser.metadirectives.IViewDirective"
-        handler=".browserconfigure.view"
+        handler=".metaconfigure.view"
         >
 
       <meta:subdirective
@@ -189,101 +102,6 @@
 
     </meta:complexDirective>
 
-    <meta:complexDirective
-        name="editform"
-        schema="zope.app.form.browser.metadirectives.IEditFormDirective"
-        handler=".browserconfigure.EditFormDirective"
-        >
-
-      <meta:subdirective
-          name="widget"
-          schema="zope.app.form.browser.metadirectives.IWidgetSubdirective"
-          />
-
-    </meta:complexDirective>
-
-    <meta:complexDirective
-        name="addform"
-        schema="zope.app.form.browser.metadirectives.IAddFormDirective"
-        handler=".browserconfigure.AddFormDirective"
-        >
-
-      <meta:subdirective
-          name="widget"
-          schema="zope.app.form.browser.metadirectives.IWidgetSubdirective"
-          />
-
-    </meta:complexDirective>
-
-  </meta:directives>
-
-
-  <meta:directives namespace="http://namespaces.zope.org/five">
-
-    <!-- specific to Five -->
-
-    <meta:directive
-       name="loadProducts"
-       schema="zope.interface.Interface"
-       handler=".fiveconfigure.loadProducts"
-       />
-
-    <meta:directive
-       name="loadProductsOverrides"
-       schema="zope.interface.Interface"
-       handler=".fiveconfigure.loadProductsOverrides"
-       />
-
-    <meta:directive
-       name="implements"
-       schema=".fivedirectives.IImplementsDirective"
-       handler=".fiveconfigure.implements"
-       />
-
-    <meta:directive
-       name="defaultViewable"
-       schema=".fivedirectives.IDefaultViewableDirective"
-       handler=".fiveconfigure.defaultViewable"
-       />
-
-    <meta:directive
-       name="traversable"
-       schema=".fivedirectives.ITraversableDirective"
-       handler=".fiveconfigure.traversable"
-       />
-
-    <meta:directive
-       name="sendEvents"
-       schema=".fivedirectives.ISendEventsDirective"
-       handler=".eventconfigure.sendEvents"
-       />
-
-    <meta:directive
-       name="sizable"
-       schema=".fivedirectives.ISendEventsDirective"
-       handler=".sizeconfigure.sizable"
-       />
-
-    <meta:directive
-        name="pagesFromDirectory"
-        schema=".fivedirectives.IPagesFromDirectoryDirective"
-        handler=".fiveconfigure.pagesFromDirectory"
-        />
-
-    <!-- viewable is deprecated, use traversable instead -->
-
-    <meta:directive
-       name="viewable"
-       schema=".fivedirectives.ITraversableDirective"
-       handler=".fiveconfigure.viewable"
-       />
-
-    <meta:directive
-       name="bridge"
-       schema=".fivedirectives.IBridgeDirective"
-       handler=".fiveconfigure.bridge"
-       />
-
   </meta:directives>
 
 </configure>

Copied: z3/Five/branch/philikon-restructuring/browser/metaconfigure.py (from r10836, z3/Five/branch/philikon-restructuring/browserconfigure.py)
==============================================================================
--- z3/Five/branch/philikon-restructuring/browserconfigure.py	(original)
+++ z3/Five/branch/philikon-restructuring/browser/metaconfigure.py	Tue Apr 19 01:22:53 2005
@@ -26,17 +26,16 @@
      menuItemDirective
 from zope.app.component.metaconfigure import handler
 from zope.app.component.interface import provideInterface
-from zope.app.form.browser.metaconfigure import BaseFormDirective
 from zope.app.container.interfaces import IAdding
 
-from resource import FileResourceFactory, ImageResourceFactory
-from resource import PageTemplateResourceFactory
-from resource import DirectoryResourceFactory
-from browser import BrowserView, EditView, AddView
-from metaclass import makeClass
-from security import getSecurityInfo, protectClass, protectName,\
-     initializeClass
-from pagetemplatefile import ZopeTwoPageTemplateFile
+from Products.Five.browser import BrowserView
+from Products.Five.browser.resource import FileResourceFactory, ImageResourceFactory
+from Products.Five.browser.resource import PageTemplateResourceFactory
+from Products.Five.browser.resource import DirectoryResourceFactory
+from Products.Five.browser.pagetemplatefile import ZopeTwoPageTemplateFile
+from Products.Five.metaclass import makeClass
+from Products.Five.security import getSecurityInfo, protectClass, \
+    protectName, initializeClass
 
 import ExtensionClass
 
@@ -420,174 +419,6 @@
             args = (new_class,)
             )
 
-
-#
-# Form generation from schema
-#
-def EditViewFactory(name, schema, label, permission, layer,
-                    template, default_template, bases, for_, fields,
-                    fulledit_path=None, fulledit_label=None, menu=u''):
-    s = getGlobalService(Presentation)
-    class_ = makeClassForTemplate(template, used_for=schema, bases=bases)
-    class_.schema = schema
-    class_.label = label
-    class_.fieldNames = fields
-
-    class_.fulledit_path = fulledit_path
-    if fulledit_path and (fulledit_label is None):
-        fulledit_label = "Full edit"
-
-    class_.fulledit_label = fulledit_label
-
-    class_.generated_form = ZopeTwoPageTemplateFile(default_template)
-
-
-    s.provideView(for_, name, IBrowserRequest, class_, layer)
-
-
-class FiveFormDirective(BaseFormDirective):
-
-    def _processWidgets(self):
-        if self._widgets:
-            customWidgetsObject = makeClass('CustomWidgetsMixin', (ExtensionClass.Base,), self._widgets)
-            self.bases = self.bases + (customWidgetsObject,)
-
-class EditFormDirective(FiveFormDirective):
-
-    view = EditView
-    default_template = 'edit.pt'
-    title = 'Edit'
-
-    def _handle_menu(self):
-        if self.menu:
-            menuItemDirective(
-                self._context, self.menu, self.for_ or self.schema,
-                '@@' + self.name, self.title, permission=self.permission)
-
-    def __call__(self):
-        self._processWidgets()
-        self._handle_menu()
-        self._context.action(
-            discriminator=self._discriminator(),
-            callable=EditViewFactory,
-            args=self._args(),
-            kw={'menu': self.menu},
-        )
-
-def AddViewFactory(name, schema, label, permission, layer,
-                   template, default_template, bases, for_,
-                   fields, content_factory, arguments,
-                   keyword_arguments, set_before_add, set_after_add,
-                   menu=u''):
-
-    s = getGlobalService(Presentation)
-    class_ = makeClassForTemplate(template, used_for=schema, bases=bases)
-
-    class_.schema = schema
-    class_.label = label
-    class_.fieldNames = fields
-    class_._factory = content_factory
-    class_._arguments = arguments
-    class_._keyword_arguments = keyword_arguments
-    class_._set_before_add = set_before_add
-    class_._set_after_add = set_after_add
-
-    class_.generated_form = ZopeTwoPageTemplateFile(default_template)
-
-    s.provideView(for_, name, IBrowserRequest, class_, layer)
-
-class AddFormDirective(FiveFormDirective):
-
-    view = AddView
-    default_template = 'add.pt'
-    for_ = IAdding
-
-    # default add form information
-    description = None
-    content_factory = None
-    arguments = None
-    keyword_arguments = None
-    set_before_add = None
-    set_after_add = None
-
-    def _handle_menu(self):
-        if self.menu or self.title:
-            if (not self.menu) or (not self.title):
-                raise ValueError("If either menu or title are specified, "
-                                 "they must both be specified")
-            # Add forms are really for IAdding components, so do not use
-            # for=self.schema.
-            menuItemDirective(
-                self._context, self.menu, self.for_, '@@' + self.name,
-                self.title, permission=self.permission,
-                description=self.description)
-
-    def _handle_arguments(self, leftover=None):
-        schema = self.schema
-        fields = self.fields
-        arguments = self.arguments
-        keyword_arguments = self.keyword_arguments
-        set_before_add = self.set_before_add
-        set_after_add = self.set_after_add
-
-        if leftover is None:
-            leftover = fields
-
-        if arguments:
-            missing = [n for n in arguments if n not in fields]
-            if missing:
-                raise ValueError("Some arguments are not included in the form",
-                                 missing)
-            optional = [n for n in arguments if not schema[n].required]
-            if optional:
-                raise ValueError("Some arguments are optional, use"
-                                 " keyword_arguments for them",
-                                 optional)
-            leftover = [n for n in leftover if n not in arguments]
-
-        if keyword_arguments:
-            missing = [n for n in keyword_arguments if n not in fields]
-            if missing:
-                raise ValueError(
-                    "Some keyword_arguments are not included in the form",
-                    missing)
-            leftover = [n for n in leftover if n not in keyword_arguments]
-
-        if set_before_add:
-            missing = [n for n in set_before_add if n not in fields]
-            if missing:
-                raise ValueError(
-                    "Some set_before_add are not included in the form",
-                    missing)
-            leftover = [n for n in leftover if n not in set_before_add]
-
-        if set_after_add:
-            missing = [n for n in set_after_add if n not in fields]
-            if missing:
-                raise ValueError(
-                    "Some set_after_add are not included in the form",
-                    missing)
-            leftover = [n for n in leftover if n not in set_after_add]
-
-            self.set_after_add += leftover
-
-        else:
-            self.set_after_add = leftover
-
-    def __call__(self):
-        self._processWidgets()
-        self._handle_menu()
-        self._handle_arguments()
-
-        self._context.action(
-            discriminator=self._discriminator(),
-            callable=AddViewFactory,
-            args=self._args()+(self.content_factory, self.arguments,
-                                 self.keyword_arguments,
-                                 self.set_before_add, self.set_after_add),
-            kw={'menu': self.menu},
-            )
-
 #
 # mixin classes / class factories
 #

Copied: z3/Five/branch/philikon-restructuring/browser/pagetemplatefile.py (from r10836, z3/Five/branch/philikon-restructuring/pagetemplatefile.py)
==============================================================================
--- z3/Five/branch/philikon-restructuring/pagetemplatefile.py	(original)
+++ z3/Five/branch/philikon-restructuring/browser/pagetemplatefile.py	Tue Apr 19 01:22:53 2005
@@ -1,18 +1,25 @@
-'''A 'PageTemplateFile' without security restrictions.'''
+##############################################################################
+#
+# Copyright (c) 2005 Five Contributors. All rights reserved.
+#
+# This software is distributed under the terms of the Zope Public
+# License (ZPL) v2.1. See COPYING.txt for more information.
+#
+##############################################################################
+"""A 'PageTemplateFile' without security restrictions.
 
+$Id$
+"""
 import os, sys
 
-# Zope 2
 from Globals import package_home
 from Products.PageTemplates.PageTemplateFile import PageTemplateFile
 
-# Zope 3
 from zope.app.pagetemplate.viewpagetemplatefile import ViewMapper
 from zope.app.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile
 
-# Five
-from ReuseUtils import rebindFunction
-from TrustedExpression import getEngine, ModuleImporter
+from Products.Five.ReuseUtils import rebindFunction
+from Products.Five.TrustedExpression import getEngine, ModuleImporter
 
 class ZopeTwoPageTemplateFile(PageTemplateFile):
     """A strange hybrid between Zope 2 and Zope 3 page template.

Copied: z3/Five/branch/philikon-restructuring/browser/resource.py (from r10836, z3/Five/branch/philikon-restructuring/resource.py)
==============================================================================
--- z3/Five/branch/philikon-restructuring/resource.py	(original)
+++ z3/Five/branch/philikon-restructuring/browser/resource.py	Tue Apr 19 01:22:53 2005
@@ -10,14 +10,13 @@
 
 $Id: browser.py 5259 2004-06-23 15:59:52Z philikon $
 """
-
 import os
 import urllib
 
 from Acquisition import Explicit, aq_inner, aq_parent
 from ComputedAttribute import ComputedAttribute
-from browser import BrowserView
 from OFS.Traversable import Traversable as OFSTraversable
+
 from zope.exceptions import NotFoundError
 from zope.interface import implements
 from zope.component.interfaces import IResource
@@ -29,6 +28,8 @@
 from zope.app.publisher.pagetemplateresource import PageTemplate
 from zope.app.publisher.browser.resources import empty
 
+from Products.Five.browser import BrowserView
+
 _marker = []
 
 class Resource(Explicit):

Deleted: /z3/Five/branch/philikon-restructuring/browserconfigure.py
==============================================================================
--- /z3/Five/branch/philikon-restructuring/browserconfigure.py	Tue Apr 19 01:22:53 2005
+++ (empty file)
@@ -1,634 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2004 Five Contributors. All rights reserved.
-#
-# This software is distributed under the terms of the Zope Public
-# License (ZPL) v2.1. See COPYING.txt for more information.
-#
-##############################################################################
-"""Browser directives
-
-Directives to emulate the 'http://namespaces.zope.org/browser'
-namespace in ZCML known from zope.app.
-
-$Id$
-"""
-import os
-
-from zope.interface import Interface
-from zope.component import getGlobalService, ComponentLookupError
-from zope.configuration.exceptions import ConfigurationError
-from zope.component.servicenames import Presentation
-from zope.publisher.interfaces.browser import IBrowserRequest
-from zope.app.publisher.browser.viewmeta import pages as zope_app_pages
-from zope.app.publisher.browser.viewmeta import view as zope_app_view
-from zope.app.publisher.browser.globalbrowsermenuservice import\
-     menuItemDirective
-from zope.app.component.metaconfigure import handler
-from zope.app.component.interface import provideInterface
-from zope.app.form.browser.metaconfigure import BaseFormDirective
-from zope.app.container.interfaces import IAdding
-
-from resource import FileResourceFactory, ImageResourceFactory
-from resource import PageTemplateResourceFactory
-from resource import DirectoryResourceFactory
-from browser import BrowserView, EditView, AddView
-from metaclass import makeClass
-from security import getSecurityInfo, protectClass, protectName,\
-     initializeClass
-from pagetemplatefile import ZopeTwoPageTemplateFile
-
-import ExtensionClass
-
-def page(_context, name, permission, for_,
-         layer='default', template=None, class_=None,
-         allowed_interface=None, allowed_attributes=None,
-         attribute='__call__', menu=None, title=None,
-         ):
-
-    try:
-        s = getGlobalService(Presentation)
-    except ComponentLookupError, err:
-        pass
-
-    _handle_menu(_context, menu, title, [for_], name, permission)
-
-    if not (class_ or template):
-        raise ConfigurationError("Must specify a class or template")
-    if allowed_attributes is None:
-        allowed_attributes = []
-    if allowed_interface is not None:
-        for interface in allowed_interface:
-            attrs = [n for n, d in interface.namesAndDescriptions(1)]
-            allowed_attributes.extend(attrs)
-
-    if attribute != '__call__':
-        if template:
-            raise ConfigurationError(
-                "Attribute and template cannot be used together.")
-
-        if not class_:
-            raise ConfigurationError(
-                "A class must be provided if attribute is used")
-
-    if template:
-        template = os.path.abspath(str(_context.path(template)))
-        if not os.path.isfile(template):
-            raise ConfigurationError("No such file", template)
-
-    if class_:
-        # new-style classes do not work with Five. As we want to import
-        # packages from z3 directly, we ignore new-style classes for now.
-        if type(class_) == type:
-            return
-        if attribute != '__call__':
-            if not hasattr(class_, attribute):
-                raise ConfigurationError(
-                    "The provided class doesn't have the specified attribute "
-                    )
-        cdict = getSecurityInfo(class_)
-        if template:
-            new_class = makeClassForTemplate(template, bases=(class_, ),
-                                             cdict=cdict)
-        elif attribute != "__call__":
-            # we're supposed to make a page for an attribute (read:
-            # method) and it's not __call__.  We thus need to create a
-            # new class using our mixin for attributes.
-            cdict.update({'__page_attribute__': attribute})
-            new_class = makeClass(class_.__name__,
-                                  (class_, ViewMixinForAttributes),
-                                  cdict)
-
-            # in case the attribute does not provide a docstring,
-            # ZPublisher refuses to publish it.  So, as a workaround,
-            # we provide a stub docstring
-            func = getattr(new_class, attribute)
-            if not func.__doc__:
-                # cannot test for MethodType/UnboundMethod here
-                # because of ExtensionClass
-                if hasattr(func, 'im_func'):
-                    # you can only set a docstring on functions, not
-                    # on method objects
-                    func = func.im_func
-                func.__doc__ = "Stub docstring to make ZPublisher work"
-        else:
-            # we could use the class verbatim here, but we'll execute
-            # some security declarations on it so we really shouldn't
-            # modify the original.  So, instead we make a new class
-            # with just one base class -- the original
-            new_class = makeClass(class_.__name__, (class_,), cdict)
-
-    else:
-        # template
-        new_class = makeClassForTemplate(template)
-
-    _handle_for(_context, for_)
-
-    _context.action(
-        discriminator = ('view', for_, name, IBrowserRequest, layer),
-        callable = handler,
-        args = (Presentation, 'provideAdapter',
-                IBrowserRequest, new_class, name, [for_], Interface, layer,
-                _context.info),
-        )
-    _context.action(
-        discriminator = ('five:protectClass', new_class),
-        callable = protectClass,
-        args = (new_class, permission)
-        )
-    if allowed_attributes:
-        for attr in allowed_attributes:
-            _context.action(
-                discriminator = ('five:protectName', new_class, attr),
-                callable = protectName,
-                args = (new_class, attr, permission)
-                )
-    _context.action(
-        discriminator = ('five:initialize:class', new_class),
-        callable = initializeClass,
-        args = (new_class,)
-        )
-
-class pages(zope_app_pages):
-
-    def page(self, _context, name, attribute='__call__', template=None,
-             menu=None, title=None):
-        return page(_context,
-                    name=name,
-                    attribute=attribute,
-                    template=template,
-                    menu=menu, title=title,
-                    **(self.opts))
-
-def defaultView(_context, name, for_=None):
-
-    type = IBrowserRequest
-
-    _context.action(
-        discriminator = ('defaultViewName', for_, type, name),
-        callable = handler,
-        args = (Presentation,
-                'setDefaultViewName', for_, type, name),
-        )
-
-    _handle_for(_context, for_)
-
-# view (named view with pages)
-
-class view(zope_app_view):
-
-    def __call__(self):
-        (_context, name, for_, permission, layer, class_,
-         allowed_interface, allowed_attributes) = self.args
-
-        required = {}
-
-        cdict = {}
-        pages = {}
-
-        for pname, attribute, template in self.pages:
-            try:
-                s = getGlobalService(Presentation)
-            except ComponentLookupError, err:
-                pass
-
-            if template:
-                cdict[pname] = ZopeTwoPageTemplateFile(template)
-                if attribute and attribute != name:
-                    cdict[attribute] = cdict[pname]
-            else:
-                if not hasattr(class_, attribute):
-                    raise ConfigurationError("Undefined attribute",
-                                             attribute)
-
-            attribute = attribute or pname
-            required[pname] = permission
-
-            pages[pname] = attribute
-
-        # This should go away, but noone seems to remember what to do. :-(
-        if hasattr(class_, 'publishTraverse'):
-
-            def publishTraverse(self, request, name,
-                                pages=pages, getattr=getattr):
-
-                if name in pages:
-                    return getattr(self, pages[name])
-                view = zapi.queryView(self, name, request)
-                if view is not None:
-                    return view
-
-                m = class_.publishTraverse.__get__(self)
-                return m(request, name)
-
-        else:
-            def publishTraverse(self, request, name,
-                                pages=pages, getattr=getattr):
-
-                if name in pages:
-                    return getattr(self, pages[name])
-                view = zapi.queryView(self, name, request)
-                if view is not None:
-                    return view
-
-                raise NotFoundError(self, name, request)
-
-        cdict['publishTraverse'] = publishTraverse
-
-        if not hasattr(class_, 'browserDefault'):
-            if self.default or self.pages:
-                default = self.default or self.pages[0][0]
-                cdict['browserDefault'] = (
-                    lambda self, request, default=default:
-                    (self, (default, ))
-                    )
-            elif providesCallable(class_):
-                cdict['browserDefault'] = (
-                    lambda self, request: (self, ())
-                    )
-
-        if class_ is not None:
-            bases = (class_, ViewMixinForTemplates)
-        else:
-            bases = (ViewMixinForTemplates)
-
-        try:
-            cname = str(name)
-        except:
-            cname = "GeneratedClass"
-            
-        newclass = makeClass(cname, bases, cdict)
-        
-        _handle_for(_context, for_)
-
-        if self.provides is not None:
-            _context.action(
-                discriminator = None,
-                callable = provideInterface,
-                args = ('', self.provides)
-                )
-
-        _context.action(
-            discriminator = ('view', for_, name, IBrowserRequest, layer,
-                             self.provides),
-            callable = handler,
-            args = (Presentation, 'provideAdapter',
-                    IBrowserRequest, newclass, name, [for_],  self.provides,
-                    layer, _context.info),
-            )
-
-def _handle_for(_context, for_):
-    if for_ is not None:
-        _context.action(
-            discriminator = None,
-            callable = provideInterface,
-            args = ('', for_)
-            )
-
-def _handle_menu(_context, menu, title, for_, name, permission):
-    if menu or title:
-        if not (menu and title):
-            raise ConfigurationError(
-                "If either menu or title are specified, they must "
-                "both be specified.")
-
-        if len(for_) != 1:
-            raise ConfigurationError(
-                "Menus can be specified only for single-view, not for "
-                "multi-views.")
-
-        return menuItemDirective(
-            _context, menu, for_[0], '@@' + str(name), title,
-            permission=permission)
-
-    return []
-
-_factory_map = {'image':{'prefix':'ImageResource',
-                         'count':0,
-                         'factory':ImageResourceFactory},
-                'file':{'prefix':'FileResource',
-                        'count':0,
-                        'factory':FileResourceFactory},
-                'template':{'prefix':'PageTemplateResource',
-                            'count':0,
-                            'factory':PageTemplateResourceFactory}
-                }
-
-def resource(_context, name, layer='default', permission='zope.Public',
-             file=None, image=None, template=None):
-
-    if ((file and image) or (file and template) or
-        (image and template) or not (file or image or template)):
-        raise ConfigurationError(
-            "Must use exactly one of file or image or template"
-            "attributes for resource directives"
-            )
-
-    res = file or image or template
-    res_type = ((file and 'file') or
-                 (image and 'image') or
-                 (template and 'template'))
-    factory_info = _factory_map.get(res_type)
-    factory_info['count'] += 1
-    res_factory = factory_info['factory']
-    class_name = '%s%s' % (factory_info['prefix'], factory_info['count'])
-    new_class = makeClass(class_name, (res_factory.resource,), {})
-    factory = res_factory(name, res, resource_factory=new_class)
-
-    _context.action(
-        discriminator = ('resource', name, IBrowserRequest, layer),
-        callable = handler,
-        args = (Presentation, 'provideResource',
-                name, IBrowserRequest, factory, layer),
-        )
-    _context.action(
-        discriminator = ('five:protectClass', new_class),
-        callable = protectClass,
-        args = (new_class, permission)
-        )
-    _context.action(
-        discriminator = ('five:initialize:class', new_class),
-        callable = initializeClass,
-        args = (new_class,)
-        )
-
-_rd_map = {ImageResourceFactory:{'prefix':'DirContainedImageResource',
-                                 'count':0},
-           FileResourceFactory:{'prefix':'DirContainedFileResource',
-                                'count':0},
-           PageTemplateResourceFactory:{'prefix':'DirContainedPTResource',
-                                        'count':0},
-           DirectoryResourceFactory:{'prefix':'DirectoryResource',
-                                     'count':0}
-           }
-
-def resourceDirectory(_context, name, directory, layer='default',
-                      permission='zope.Public'):
-
-    if not os.path.isdir(directory):
-        raise ConfigurationError(
-            "Directory %s does not exist" % directory
-            )
-
-    resource = DirectoryResourceFactory.resource
-    f_cache = {}
-    resource_factories = dict(resource.resource_factories)
-    resource_factories['default'] = resource.default_factory
-    for ext, factory in resource_factories.items():
-        if f_cache.get(factory) is not None:
-            continue
-        factory_info = _rd_map.get(factory)
-        factory_info['count'] += 1
-        class_name = '%s%s' % (factory_info['prefix'], factory_info['count'])
-        factory_name = '%s%s' % (factory.__name__, factory_info['count'])
-        f_resource = makeClass(class_name, (factory.resource,), {})
-        f_cache[factory] = makeClass(factory_name, (factory,),
-                                     {'resource':f_resource})
-    for ext, factory in resource_factories.items():
-        resource_factories[ext] = f_cache[factory]
-    default_factory = resource_factories['default']
-    del resource_factories['default']
-
-    cdict = {'resource_factories':resource_factories,
-             'default_factory':default_factory}
-
-    factory_info = _rd_map.get(DirectoryResourceFactory)
-    factory_info['count'] += 1
-    class_name = '%s%s' % (factory_info['prefix'], factory_info['count'])
-    dir_factory = makeClass(class_name, (resource,), cdict)
-    factory = DirectoryResourceFactory(name, directory,
-                                       resource_factory=dir_factory)
-
-    new_classes = [dir_factory,
-                   ] + [f.resource for f in f_cache.values()]
-
-    _context.action(
-        discriminator = ('resource', name, IBrowserRequest, layer),
-        callable = handler,
-        args = (Presentation, 'provideResource',
-                name, IBrowserRequest, factory, layer),
-        )
-    for new_class in new_classes:
-        _context.action(
-            discriminator = ('five:protectClass', new_class),
-            callable = protectClass,
-            args = (new_class, permission)
-            )
-        _context.action(
-            discriminator = ('five:initialize:class', new_class),
-            callable = initializeClass,
-            args = (new_class,)
-            )
-
-
-#
-# Form generation from schema
-#
-def EditViewFactory(name, schema, label, permission, layer,
-                    template, default_template, bases, for_, fields,
-                    fulledit_path=None, fulledit_label=None, menu=u''):
-    s = getGlobalService(Presentation)
-    class_ = makeClassForTemplate(template, used_for=schema, bases=bases)
-    class_.schema = schema
-    class_.label = label
-    class_.fieldNames = fields
-
-    class_.fulledit_path = fulledit_path
-    if fulledit_path and (fulledit_label is None):
-        fulledit_label = "Full edit"
-
-    class_.fulledit_label = fulledit_label
-
-    class_.generated_form = ZopeTwoPageTemplateFile(default_template)
-
-
-    s.provideView(for_, name, IBrowserRequest, class_, layer)
-
-
-class FiveFormDirective(BaseFormDirective):
-
-    def _processWidgets(self):
-        if self._widgets:
-            customWidgetsObject = makeClass('CustomWidgetsMixin', (ExtensionClass.Base,), self._widgets)
-            self.bases = self.bases + (customWidgetsObject,)
-
-class EditFormDirective(FiveFormDirective):
-
-    view = EditView
-    default_template = 'edit.pt'
-    title = 'Edit'
-
-    def _handle_menu(self):
-        if self.menu:
-            menuItemDirective(
-                self._context, self.menu, self.for_ or self.schema,
-                '@@' + self.name, self.title, permission=self.permission)
-
-    def __call__(self):
-        self._processWidgets()
-        self._handle_menu()
-        self._context.action(
-            discriminator=self._discriminator(),
-            callable=EditViewFactory,
-            args=self._args(),
-            kw={'menu': self.menu},
-        )
-
-def AddViewFactory(name, schema, label, permission, layer,
-                   template, default_template, bases, for_,
-                   fields, content_factory, arguments,
-                   keyword_arguments, set_before_add, set_after_add,
-                   menu=u''):
-
-    s = getGlobalService(Presentation)
-    class_ = makeClassForTemplate(template, used_for=schema, bases=bases)
-
-    class_.schema = schema
-    class_.label = label
-    class_.fieldNames = fields
-    class_._factory = content_factory
-    class_._arguments = arguments
-    class_._keyword_arguments = keyword_arguments
-    class_._set_before_add = set_before_add
-    class_._set_after_add = set_after_add
-
-    class_.generated_form = ZopeTwoPageTemplateFile(default_template)
-
-    s.provideView(for_, name, IBrowserRequest, class_, layer)
-
-class AddFormDirective(FiveFormDirective):
-
-    view = AddView
-    default_template = 'add.pt'
-    for_ = IAdding
-
-    # default add form information
-    description = None
-    content_factory = None
-    arguments = None
-    keyword_arguments = None
-    set_before_add = None
-    set_after_add = None
-
-    def _handle_menu(self):
-        if self.menu or self.title:
-            if (not self.menu) or (not self.title):
-                raise ValueError("If either menu or title are specified, "
-                                 "they must both be specified")
-            # Add forms are really for IAdding components, so do not use
-            # for=self.schema.
-            menuItemDirective(
-                self._context, self.menu, self.for_, '@@' + self.name,
-                self.title, permission=self.permission,
-                description=self.description)
-
-    def _handle_arguments(self, leftover=None):
-        schema = self.schema
-        fields = self.fields
-        arguments = self.arguments
-        keyword_arguments = self.keyword_arguments
-        set_before_add = self.set_before_add
-        set_after_add = self.set_after_add
-
-        if leftover is None:
-            leftover = fields
-
-        if arguments:
-            missing = [n for n in arguments if n not in fields]
-            if missing:
-                raise ValueError("Some arguments are not included in the form",
-                                 missing)
-            optional = [n for n in arguments if not schema[n].required]
-            if optional:
-                raise ValueError("Some arguments are optional, use"
-                                 " keyword_arguments for them",
-                                 optional)
-            leftover = [n for n in leftover if n not in arguments]
-
-        if keyword_arguments:
-            missing = [n for n in keyword_arguments if n not in fields]
-            if missing:
-                raise ValueError(
-                    "Some keyword_arguments are not included in the form",
-                    missing)
-            leftover = [n for n in leftover if n not in keyword_arguments]
-
-        if set_before_add:
-            missing = [n for n in set_before_add if n not in fields]
-            if missing:
-                raise ValueError(
-                    "Some set_before_add are not included in the form",
-                    missing)
-            leftover = [n for n in leftover if n not in set_before_add]
-
-        if set_after_add:
-            missing = [n for n in set_after_add if n not in fields]
-            if missing:
-                raise ValueError(
-                    "Some set_after_add are not included in the form",
-                    missing)
-            leftover = [n for n in leftover if n not in set_after_add]
-
-            self.set_after_add += leftover
-
-        else:
-            self.set_after_add = leftover
-
-    def __call__(self):
-        self._processWidgets()
-        self._handle_menu()
-        self._handle_arguments()
-
-        self._context.action(
-            discriminator=self._discriminator(),
-            callable=AddViewFactory,
-            args=self._args()+(self.content_factory, self.arguments,
-                                 self.keyword_arguments,
-                                 self.set_before_add, self.set_after_add),
-            kw={'menu': self.menu},
-            )
-
-#
-# mixin classes / class factories
-#
-
-class ViewMixinForAttributes(BrowserView):
-
-    # we have an attribute that we can simply tell ZPublisher to go to
-    def __browser_default__(self, request):
-        return self, (self.__page_attribute__,)
-
-    # this is technically not needed because ZPublisher finds our
-    # attribute through __browser_default__; but we also want to be
-    # able to call pages from python modules, PythonScripts or ZPT
-    def __call__(self, *args, **kw):
-        attr = self.__page_attribute__
-        meth = getattr(self, attr)
-        return meth(*args, **kw)
-
-class ViewMixinForTemplates(BrowserView):
-
-    # short cut to get to macros more easily
-    def __getitem__(self, name):
-        if name == 'macros':
-            return self.index.macros
-        return self.index.macros[name]
-
-    # make the template publishable
-    def __call__(self, *args, **kw):
-        return self.index(self, *args, **kw)
-
-def makeClassForTemplate(src, template=None, used_for=None,
-                         bases=(), cdict=None):
-    # XXX needs to deal with security from the bases?
-    if cdict is None:
-        cdict = {}
-    cdict.update({'index': ZopeTwoPageTemplateFile(src, template)})
-    bases += (ViewMixinForTemplates,)
-    class_ = makeClass("SimpleViewClass from %s" % src, bases, cdict)
-
-    if used_for is not None:
-        class_.__used_for__ = used_for
-
-    return class_
-

Modified: z3/Five/branch/philikon-restructuring/configure.zcml
==============================================================================
--- z3/Five/branch/philikon-restructuring/configure.zcml	(original)
+++ z3/Five/branch/philikon-restructuring/configure.zcml	Tue Apr 19 01:22:53 2005
@@ -6,7 +6,9 @@
   <include file="services.zcml" />
   <include file="interfaces.zcml" />
   <include file="permissions.zcml" />
-  <include file="browser.zcml" />
+  <include package=".browser" />
+  <include package=".form" />
+  <include package=".skin" />
 
   <include package="zope.app.traversing" />
   <include package="zope.app.form.browser" />
@@ -30,12 +32,6 @@
       provides=".interfaces.IBrowserDefault"
       />
 
-  <adapter
-      for=".interfaces.IObjectManager"
-      factory=".adding.ObjectManagerNameChooser"
-      provides="zope.app.container.interfaces.INameChooser"
-      />
-
   <!-- this is really lying, but it's to please checkContainer -->
   <five:implements class="OFS.ObjectManager.ObjectManager"
                    interface="zope.app.container.interfaces.IContainer" />

Deleted: /z3/Five/branch/philikon-restructuring/edit.pt
==============================================================================
--- /z3/Five/branch/philikon-restructuring/edit.pt	Tue Apr 19 01:22:53 2005
+++ (empty file)
@@ -1,65 +0,0 @@
-<tal:tag condition="view/update"/>
-<html metal:use-macro="context/@@standard_macros/page">
-<body metal:fill-slot="body">
-
-  <div metal:define-macro="body">
-
-    <form action="." tal:attributes="action request/URL" method="POST"
-          enctype="multipart/form-data">
-
-      <div metal:define-macro="formbody">
-
-        <h3 tal:condition="view/label"
-            tal:content="view/label"
-            metal:define-slot="heading"
-            >Edit something</h3>
-
-        <p tal:define="status view/update"
-           tal:condition="status"
-           tal:content="status" />
-
-        <p tal:condition="view/errors" i18n:translate="">
-          There are <strong tal:content="python:len(view.errors)"
-                            i18n:name="num_errors">6</strong> input errors.
-        </p>
-
-        <div metal:define-slot="extra_info" tal:replace="nothing">
-        </div>
-
-        <div class="row"
-             metal:define-slot="extra_top" tal:replace="nothing">
-          <div class="label">Extra top</div>
-          <div class="field"><input type="text" style="width:100%" /></div>
-        </div>
-
-        <div metal:use-macro="context/@@widget_macros/widget_rows" />
-
-        <div class="separator"></div>
-
-        <div class="row"
-             metal:define-slot="extra_bottom" tal:replace="nothing">
-          <div class="label">Extra bottom</div>
-          <div class="field"><input type="text" style="width:100%" /></div>
-        </div>
-        <div class="separator"></div>
-      </div>
-
-      <div class="row">
-        <div class="controls">
-          <input type="submit" value="Refresh"
-              i18n:attributes="value refresh-button" />
-          <input type="submit" name="UPDATE_SUBMIT" value="Change"
-              i18n:attributes="value submit-button"/>
-        </div>
-      </div>
-      <div class="row" metal:define-slot="extra_buttons" tal:replace="nothing">
-      </div>
-
-      <div class="separator"></div>
-
-    </form>
-
-  </div>
-  </body>
-
-</html>

Deleted: /z3/Five/branch/philikon-restructuring/five_template.pt
==============================================================================
--- /z3/Five/branch/philikon-restructuring/five_template.pt	Tue Apr 19 01:22:53 2005
+++ (empty file)
@@ -1,10 +0,0 @@
-<html metal:define-macro="page">
-<head>
-<metal:block define-slot="style_slot">
-</metal:block>
-</head>
-<body>
-<metal:block define-slot="body">
-</metal:block>
-</body>
-</html>

Modified: z3/Five/branch/philikon-restructuring/fiveconfigure.py
==============================================================================
--- z3/Five/branch/philikon-restructuring/fiveconfigure.py	(original)
+++ z3/Five/branch/philikon-restructuring/fiveconfigure.py	Tue Apr 19 01:22:53 2005
@@ -12,17 +12,18 @@
 
 $Id$
 """
-
 import os
 import glob
 import warnings
+
 from zope.interface import classImplements
 from zope.configuration import xmlconfig
 from zope.app.component.interface import provideInterface
+
 from viewable import Viewable
 from traversable import Traversable
 from bridge import fromZ2Interface
-from browserconfigure import page
+from browser.metaconfigure import page
 
 def findProducts():
     import Products

Copied: z3/Five/branch/philikon-restructuring/form/__init__.py (from r10836, z3/Five/branch/philikon-restructuring/browser.py)
==============================================================================
--- z3/Five/branch/philikon-restructuring/browser.py	(original)
+++ z3/Five/branch/philikon-restructuring/form/__init__.py	Tue Apr 19 01:22:53 2005
@@ -6,111 +6,29 @@
 # License (ZPL) v2.1. See COPYING.txt for more information.
 #
 ##############################################################################
-"""Provide basic browser functionality
+"""Add and edit views
 
 $Id$
 """
-
-# python
 import sys
 from datetime import datetime
 
-# Zope 2
 import Acquisition
-from  Acquisition import aq_inner, aq_parent, aq_base
-from AccessControl import ClassSecurityInfo
-from Globals import InitializeClass
-
-# Zope 3
-from interfaces import ITraversable
-from zope.interface import implements
-from zope.component import getViewProviding
-from zope.app.traversing.browser.interfaces import IAbsoluteURL
+
+from zope.event import notify
+from zope.schema.interfaces import ValidationError
 from zope.app.location.interfaces import ILocation
 from zope.app.location import LocationProxy
 from zope.app.form.utility import setUpEditWidgets, applyWidgetsChanges
 from zope.app.form.browser.submit import Update
 from zope.app.form.interfaces import WidgetsError, MissingInputError
-from zope.event import notify
 from zope.app.form.utility import setUpWidgets, getWidgetsData
 from zope.app.form.interfaces import IInputWidget, WidgetsError
-from zope.schema.interfaces import ValidationError
 from zope.app.event.objectevent import ObjectCreatedEvent, ObjectModifiedEvent
 
-# Five
-from Products.Five.pagetemplatefile import FivePageTemplateFile
-
-class BrowserView(Acquisition.Explicit):
-    security = ClassSecurityInfo()
-
-    def __init__(self, context, request):
-        self.context = context
-        self.request = request
-
-    # XXX do not create any methods on the subclass called index_html,
-    # as this makes Zope 2 traverse into that first!
-
-InitializeClass(BrowserView)
-
-class AbsoluteURL(BrowserView):
-    """An adapter for Zope3-style absolute_url using Zope2 methods
-
-    (original: zope.app.traversing.browser.absoluteurl)
-    """
-
-    def __init__(self, context, request):
-        self.context, self.request = context, request
-
-    implements(IAbsoluteURL)
-
-    def __str__(self):
-        context = aq_inner(self.context)
-        return context.absolute_url()
-
-    __call__ = __str__
-
-    def breadcrumbs(self):
-        context = self.context.aq_inner
-        container = context.aq_parent
-        request = self.request
-
-        name = context.getId()
-        
-        if container is None or self._isVirtualHostRoot() \
-            or not ITraversable.providedBy(container):
-            return (
-                {'name': name, 'url': context.absolute_url()},)
-
-        view = getViewProviding(container, IAbsoluteURL, request)
-        base = tuple(view.breadcrumbs())
-        base += (
-            {'name': name, 'url': ("%s/%s" % (base[-1]['url'], name))},)
-
-        return base
-
-    def _isVirtualHostRoot(self):
-        virtualrootpath = self.request.get('VirtualRootPhysicalPath', None)
-        if virtualrootpath is None:
-            return False
-        context = self.context.aq_inner
-        return context.restrictedTraverse(virtualrootpath) == context
-
-class SiteAbsoluteURL(AbsoluteURL):
-    """An adapter for Zope3-style absolute_url using Zope2 methods
-
-    This one is just used to stop breadcrumbs from crumbing up
-    to the Zope root.
-
-    (original: zope.app.traversing.browser.absoluteurl)
-    """
-
-    def breadcrumbs(self):
-        context = self.context
-        request = self.request
-
-        return ({'name': context.getId(),
-                 'url': context.absolute_url()
-                 },)
+from Products.Five.interfaces import ITraversable
+from Products.Five.browser import BrowserView
+from Products.Five.browser.pagetemplatefile import FivePageTemplateFile
 
 class EditView(BrowserView):
     """Simple edit-view base class

Added: z3/Five/branch/philikon-restructuring/form/configure.zcml
==============================================================================
--- (empty file)
+++ z3/Five/branch/philikon-restructuring/form/configure.zcml	Tue Apr 19 01:22:53 2005
@@ -0,0 +1,12 @@
+<configure xmlns="http://namespaces.zope.org/zope"
+           xmlns:browser="http://namespaces.zope.org/browser">
+
+  <browser:page
+      for="*"
+      name="form_macros"
+      permission="zope2.View"
+      class=".macros.FormMacros"
+      allowed_interface="zope.interface.common.mapping.IItemMapping"
+      />
+
+</configure>
\ No newline at end of file

Copied: z3/Five/branch/philikon-restructuring/form/macros.py (from r10836, z3/Five/branch/philikon-restructuring/skin.py)
==============================================================================
--- z3/Five/branch/philikon-restructuring/skin.py	(original)
+++ z3/Five/branch/philikon-restructuring/form/macros.py	Tue Apr 19 01:22:53 2005
@@ -1,51 +1,16 @@
 ##############################################################################
 #
-# Copyright (c) 2004 Five Contributors. All rights reserved.
+# Copyright (c) 2005 Five Contributors. All rights reserved.
 #
 # This software is distributed under the terms of the Zope Public
 # License (ZPL) v2.1. See COPYING.txt for more information.
 #
 ##############################################################################
-"""Mimick the Zope 3 skinning system in Five.
+"""Form macros
 
 $Id$
 """
-from zope.interface.common.mapping import IItemMapping
-from zope.interface import implements
-from zope.component import getView
-from Products.Five.browser import BrowserView
-
-# this is a verbatim copy of zope.app.basicskin except that it doesn't
-# derive from ``object``
-class Macros:
-    implements(IItemMapping)
-
-    macro_pages = ()
-    aliases = {
-        'view': 'page',
-        'dialog': 'page',
-        'addingdialog': 'page'
-        }
-
-    def __getitem__(self, key):
-        key = self.aliases.get(key, key)
-        context = self.context
-        request = self.request
-        for name in self.macro_pages:
-            page = getView(context, name, request)
-            try:
-                v = page[key]
-            except KeyError:
-                pass
-            else:
-                return v
-        raise KeyError, key
-
-
-class StandardMacros(BrowserView, Macros):
-    macro_pages = ('five_template',
-                   'widget_macros',
-                   'form_macros',) 
+from Products.Five.skin.standardmacros import StandardMacros
 
 # copy of zope.app.form.browser.macros.FormMacros
 class FormMacros(StandardMacros):    

Copied: z3/Five/branch/philikon-restructuring/form/meta.zcml (from r10836, z3/Five/branch/philikon-restructuring/meta.zcml)
==============================================================================
--- z3/Five/branch/philikon-restructuring/meta.zcml	(original)
+++ z3/Five/branch/philikon-restructuring/form/meta.zcml	Tue Apr 19 01:22:53 2005
@@ -2,197 +2,12 @@
     xmlns="http://namespaces.zope.org/zope"
     xmlns:meta="http://namespaces.zope.org/meta">
 
-  <meta:directives namespace="http://namespaces.zope.org/zope">
-
-    <meta:directive
-        name="permission"
-        schema="zope.app.security.metadirectives.IDefinePermissionDirective"
-        handler="zope.app.security.metaconfigure.definePermission"
-        />
-
-    <meta:directive
-        name="redefinePermission"
-        schema="zope.app.security.metadirectives.IRedefinePermission"
-        handler="zope.app.security.metaconfigure.redefinePermission"
-        />
-
-    <meta:directive
-        name="interface"
-        schema="zope.app.component.metadirectives.IInterfaceDirective"
-        handler="zope.app.component.metaconfigure.interface"
-        />
-
-    <meta:directive
-        name="view"
-        schema="zope.app.component.metadirectives.IViewDirective"
-        handler="zope.app.component.metaconfigure.view"
-        />
-
-    <meta:directive
-        name="adapter"
-        schema="zope.app.component.metadirectives.IAdapterDirective"
-        handler="zope.app.component.metaconfigure.adapter"
-        />
-
-    <meta:directive
-        name="subscriber"
-        schema="zope.app.component.metadirectives.ISubscriberDirective"
-        handler="zope.app.component.metaconfigure.subscriber"
-        />
-
-    <meta:directive
-        name="utility"
-        schema="zope.app.component.metadirectives.IUtilityDirective"
-        handler="zope.app.component.metaconfigure.utility"
-        />
-
-    <meta:directive
-        name="serviceType"
-        schema="zope.app.component.metadirectives.IServiceTypeDirective"
-        handler="zope.app.component.metaconfigure.serviceType"
-        />
-
-    <meta:directive
-        name="service"
-        schema="zope.app.component.metadirectives.IServiceDirective"
-        handler="zope.app.component.metaconfigure.service"
-        />
-
-    <meta:complexDirective
-        name="content"
-        schema="zope.app.component.metadirectives.IClassDirective"
-        handler=".metaconfigure.ContentDirective"
-        >
-
-      <meta:subdirective
-          name="implements"
-          schema="zope.app.component.metadirectives.IImplementsSubdirective"
-          />
-
-      <meta:subdirective
-          name="require"
-          schema="zope.app.component.metadirectives.IRequireSubdirective"
-          />
-
-      <meta:subdirective
-          name="allow"
-          schema="zope.app.component.metadirectives.IAllowSubdirective"
-          />
-
-    </meta:complexDirective>
-
-    <meta:directive
-        name="vocabulary"
-        schema="zope.app.schema.metadirectives.IVocabularyDirective"
-        handler="zope.app.schema.metaconfigure.vocabulary"
-        />
-
-  </meta:directives>
-
   <meta:directives namespace="http://namespaces.zope.org/browser">
 
-    <meta:directive
-       name="layer"
-       schema="zope.app.publisher.browser.metadirectives.ILayerDirective"
-       handler="zope.app.publisher.browser.metaconfigure.layer"
-       />
-
-     <meta:directive
-       name="skin"
-       schema="zope.app.publisher.browser.metadirectives.ISkinDirective"
-       handler="zope.app.publisher.browser.metaconfigure.skin"
-       />
-
-     <meta:directive
-       name="defaultSkin"
-       schema="zope.app.publisher.browser.metadirectives.IDefaultSkinDirective"
-       handler="zope.app.publisher.browser.metaconfigure.defaultSkin"
-       />
-
-    <meta:directive
-        name="defaultView"
-        schema="zope.app.publisher.browser.metadirectives.IDefaultViewDirective"
-        handler=".browserconfigure.defaultView"
-        />
-
-    <meta:directive
-        name="page"
-        schema="zope.app.publisher.browser.metadirectives.IPageDirective"
-        handler=".browserconfigure.page"
-        />
-
-    <meta:complexDirective
-        name="pages"
-        schema="zope.app.publisher.browser.metadirectives.IPagesDirective"
-        handler=".browserconfigure.pages"
-        >
-
-      <meta:subdirective
-          name="page"
-          schema="zope.app.publisher.browser.metadirectives.IPagesPageSubdirective"
-          />
-
-    </meta:complexDirective>
-
-    <meta:directive
-        name="resource"
-        schema="zope.app.publisher.browser.metadirectives.IResourceDirective"
-        handler=".browserconfigure.resource"
-        />
-
-    <meta:directive
-        name="resourceDirectory"
-        schema="zope.app.publisher.browser.metadirectives.IResourceDirectoryDirective"
-        handler=".browserconfigure.resourceDirectory"
-        />
-
-    <meta:directive
-        name="menu"
-        schema="zope.app.publisher.browser.metadirectives.IMenuDirective"
-        handler="zope.app.publisher.browser.globalbrowsermenuservice.menuDirective"
-        />
-
-    <meta:directive
-        name="menuItem"
-        schema="zope.app.publisher.browser.metadirectives.IMenuItemDirective"
-        handler="zope.app.publisher.browser.globalbrowsermenuservice.menuItemDirective"
-        />
-
-    <meta:complexDirective
-        name="menuItems"
-        schema="zope.app.publisher.browser.metadirectives.IMenuItemsDirective"
-        handler="zope.app.publisher.browser.globalbrowsermenuservice.menuItemsDirective"
-        >
-
-      <meta:subdirective
-          name="menuItem"
-          schema="zope.app.publisher.browser.metadirectives.IMenuItemSubdirective"
-          />
-
-    </meta:complexDirective>
-
-    <meta:complexDirective
-        name="view"
-        schema="zope.app.publisher.browser.metadirectives.IViewDirective"
-        handler=".browserconfigure.view"
-        >
-
-      <meta:subdirective
-          name="page"
-          schema="zope.app.publisher.browser.metadirectives.IViewPageSubdirective"
-          />
-
-      <meta:subdirective
-          name="defaultPage"
-          schema="zope.app.publisher.browser.metadirectives.IViewDefaultPageSubdirective"
-          />
-
-    </meta:complexDirective>
-
     <meta:complexDirective
         name="editform"
         schema="zope.app.form.browser.metadirectives.IEditFormDirective"
-        handler=".browserconfigure.EditFormDirective"
+        handler=".metaconfigure.EditFormDirective"
         >
 
       <meta:subdirective
@@ -205,7 +20,7 @@
     <meta:complexDirective
         name="addform"
         schema="zope.app.form.browser.metadirectives.IAddFormDirective"
-        handler=".browserconfigure.AddFormDirective"
+        handler=".metaconfigure.AddFormDirective"
         >
 
       <meta:subdirective
@@ -217,73 +32,4 @@
 
   </meta:directives>
 
-
-  <meta:directives namespace="http://namespaces.zope.org/five">
-
-    <!-- specific to Five -->
-
-    <meta:directive
-       name="loadProducts"
-       schema="zope.interface.Interface"
-       handler=".fiveconfigure.loadProducts"
-       />
-
-    <meta:directive
-       name="loadProductsOverrides"
-       schema="zope.interface.Interface"
-       handler=".fiveconfigure.loadProductsOverrides"
-       />
-
-    <meta:directive
-       name="implements"
-       schema=".fivedirectives.IImplementsDirective"
-       handler=".fiveconfigure.implements"
-       />
-
-    <meta:directive
-       name="defaultViewable"
-       schema=".fivedirectives.IDefaultViewableDirective"
-       handler=".fiveconfigure.defaultViewable"
-       />
-
-    <meta:directive
-       name="traversable"
-       schema=".fivedirectives.ITraversableDirective"
-       handler=".fiveconfigure.traversable"
-       />
-
-    <meta:directive
-       name="sendEvents"
-       schema=".fivedirectives.ISendEventsDirective"
-       handler=".eventconfigure.sendEvents"
-       />
-
-    <meta:directive
-       name="sizable"
-       schema=".fivedirectives.ISendEventsDirective"
-       handler=".sizeconfigure.sizable"
-       />
-
-    <meta:directive
-        name="pagesFromDirectory"
-        schema=".fivedirectives.IPagesFromDirectoryDirective"
-        handler=".fiveconfigure.pagesFromDirectory"
-        />
-
-    <!-- viewable is deprecated, use traversable instead -->
-
-    <meta:directive
-       name="viewable"
-       schema=".fivedirectives.ITraversableDirective"
-       handler=".fiveconfigure.viewable"
-       />
-
-    <meta:directive
-       name="bridge"
-       schema=".fivedirectives.IBridgeDirective"
-       handler=".fiveconfigure.bridge"
-       />
-
-  </meta:directives>
-
 </configure>

Copied: z3/Five/branch/philikon-restructuring/form/metaconfigure.py (from r10836, z3/Five/branch/philikon-restructuring/browserconfigure.py)
==============================================================================
--- z3/Five/branch/philikon-restructuring/browserconfigure.py	(original)
+++ z3/Five/branch/philikon-restructuring/form/metaconfigure.py	Tue Apr 19 01:22:53 2005
@@ -6,424 +6,25 @@
 # License (ZPL) v2.1. See COPYING.txt for more information.
 #
 ##############################################################################
-"""Browser directives
-
-Directives to emulate the 'http://namespaces.zope.org/browser'
-namespace in ZCML known from zope.app.
+"""Edit form directives
 
 $Id$
 """
-import os
+import ExtensionClass
 
-from zope.interface import Interface
-from zope.component import getGlobalService, ComponentLookupError
-from zope.configuration.exceptions import ConfigurationError
+from zope.component import getGlobalService
 from zope.component.servicenames import Presentation
 from zope.publisher.interfaces.browser import IBrowserRequest
-from zope.app.publisher.browser.viewmeta import pages as zope_app_pages
-from zope.app.publisher.browser.viewmeta import view as zope_app_view
-from zope.app.publisher.browser.globalbrowsermenuservice import\
+from zope.app.publisher.browser.globalbrowsermenuservice import \
      menuItemDirective
-from zope.app.component.metaconfigure import handler
-from zope.app.component.interface import provideInterface
 from zope.app.form.browser.metaconfigure import BaseFormDirective
 from zope.app.container.interfaces import IAdding
 
-from resource import FileResourceFactory, ImageResourceFactory
-from resource import PageTemplateResourceFactory
-from resource import DirectoryResourceFactory
-from browser import BrowserView, EditView, AddView
-from metaclass import makeClass
-from security import getSecurityInfo, protectClass, protectName,\
-     initializeClass
-from pagetemplatefile import ZopeTwoPageTemplateFile
-
-import ExtensionClass
-
-def page(_context, name, permission, for_,
-         layer='default', template=None, class_=None,
-         allowed_interface=None, allowed_attributes=None,
-         attribute='__call__', menu=None, title=None,
-         ):
-
-    try:
-        s = getGlobalService(Presentation)
-    except ComponentLookupError, err:
-        pass
-
-    _handle_menu(_context, menu, title, [for_], name, permission)
-
-    if not (class_ or template):
-        raise ConfigurationError("Must specify a class or template")
-    if allowed_attributes is None:
-        allowed_attributes = []
-    if allowed_interface is not None:
-        for interface in allowed_interface:
-            attrs = [n for n, d in interface.namesAndDescriptions(1)]
-            allowed_attributes.extend(attrs)
-
-    if attribute != '__call__':
-        if template:
-            raise ConfigurationError(
-                "Attribute and template cannot be used together.")
-
-        if not class_:
-            raise ConfigurationError(
-                "A class must be provided if attribute is used")
-
-    if template:
-        template = os.path.abspath(str(_context.path(template)))
-        if not os.path.isfile(template):
-            raise ConfigurationError("No such file", template)
-
-    if class_:
-        # new-style classes do not work with Five. As we want to import
-        # packages from z3 directly, we ignore new-style classes for now.
-        if type(class_) == type:
-            return
-        if attribute != '__call__':
-            if not hasattr(class_, attribute):
-                raise ConfigurationError(
-                    "The provided class doesn't have the specified attribute "
-                    )
-        cdict = getSecurityInfo(class_)
-        if template:
-            new_class = makeClassForTemplate(template, bases=(class_, ),
-                                             cdict=cdict)
-        elif attribute != "__call__":
-            # we're supposed to make a page for an attribute (read:
-            # method) and it's not __call__.  We thus need to create a
-            # new class using our mixin for attributes.
-            cdict.update({'__page_attribute__': attribute})
-            new_class = makeClass(class_.__name__,
-                                  (class_, ViewMixinForAttributes),
-                                  cdict)
-
-            # in case the attribute does not provide a docstring,
-            # ZPublisher refuses to publish it.  So, as a workaround,
-            # we provide a stub docstring
-            func = getattr(new_class, attribute)
-            if not func.__doc__:
-                # cannot test for MethodType/UnboundMethod here
-                # because of ExtensionClass
-                if hasattr(func, 'im_func'):
-                    # you can only set a docstring on functions, not
-                    # on method objects
-                    func = func.im_func
-                func.__doc__ = "Stub docstring to make ZPublisher work"
-        else:
-            # we could use the class verbatim here, but we'll execute
-            # some security declarations on it so we really shouldn't
-            # modify the original.  So, instead we make a new class
-            # with just one base class -- the original
-            new_class = makeClass(class_.__name__, (class_,), cdict)
-
-    else:
-        # template
-        new_class = makeClassForTemplate(template)
-
-    _handle_for(_context, for_)
-
-    _context.action(
-        discriminator = ('view', for_, name, IBrowserRequest, layer),
-        callable = handler,
-        args = (Presentation, 'provideAdapter',
-                IBrowserRequest, new_class, name, [for_], Interface, layer,
-                _context.info),
-        )
-    _context.action(
-        discriminator = ('five:protectClass', new_class),
-        callable = protectClass,
-        args = (new_class, permission)
-        )
-    if allowed_attributes:
-        for attr in allowed_attributes:
-            _context.action(
-                discriminator = ('five:protectName', new_class, attr),
-                callable = protectName,
-                args = (new_class, attr, permission)
-                )
-    _context.action(
-        discriminator = ('five:initialize:class', new_class),
-        callable = initializeClass,
-        args = (new_class,)
-        )
-
-class pages(zope_app_pages):
-
-    def page(self, _context, name, attribute='__call__', template=None,
-             menu=None, title=None):
-        return page(_context,
-                    name=name,
-                    attribute=attribute,
-                    template=template,
-                    menu=menu, title=title,
-                    **(self.opts))
-
-def defaultView(_context, name, for_=None):
-
-    type = IBrowserRequest
-
-    _context.action(
-        discriminator = ('defaultViewName', for_, type, name),
-        callable = handler,
-        args = (Presentation,
-                'setDefaultViewName', for_, type, name),
-        )
-
-    _handle_for(_context, for_)
-
-# view (named view with pages)
+from Products.Five.form import EditView, AddView
+from Products.Five.metaclass import makeClass
+from Products.Five.browser.pagetemplatefile import ZopeTwoPageTemplateFile
+from Products.Five.browser.metaconfigure import makeClassForTemplate
 
-class view(zope_app_view):
-
-    def __call__(self):
-        (_context, name, for_, permission, layer, class_,
-         allowed_interface, allowed_attributes) = self.args
-
-        required = {}
-
-        cdict = {}