<configure
    xmlns="http://namespaces.zope.org/zope"
    xmlns:browser="http://namespaces.zope.org/browser"
    i18n_domain="zope">

  <include package="zope.component" file="meta.zcml" />
  <include package="zope.security" file="meta.zcml" />
  <include package="zope.browserpage" file="meta.zcml" />

  <browser:page
      for="*"
      name="widget_macros"
      permission="zope.Public"
      template="widget_macros.pt"
      />

  <adapter factory=".form.default_page_template" name="default" />
  <adapter factory=".form.default_subpage_template" name="default" />
  <adapter factory=".form.render_submit_button" name="render" />

  <!-- Error view for 'Invalid' -->
  <adapter
    factory=".errors.InvalidErrorView"
    permission="zope.Public"
  />

  <!-- Error view for 'CSRF protection errors' -->
  <adapter
    factory=".errors.InvalidCSRFTokenErrorView"
    provides="zope.publisher.interfaces.browser.IBrowserPage"
    permission="zope.Public"
  />

  <!-- For security proxied views -->
  <class class=".form.Widgets">
    <allow interface=".interfaces.IWidgets" />
  </class>

  <class class=".form.Actions">
    <allow interface=".interfaces.IActions" />
  </class>

  <class class=".form.Action">
    <allow interface=".interfaces.IAction" />
  </class>

  <!-- Views for Widget Errors -->

  <adapter
      for="zope.formlib.interfaces.IWidgetInputError
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.IWidgetInputErrorView"
      factory=".exception.WidgetInputErrorView"
      permission="zope.Public"
      />

  <!-- Core display wfdgets -->

  <adapter
      for="zope.schema.interfaces.IField
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.IDisplayWidget"
      factory=".widgets.DisplayWidget"
      permission="zope.Public"
      />

  <adapter
      for="zope.schema.interfaces.IBool
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.IDisplayWidget"
      factory=".widgets.BooleanDisplayWidget"
      permission="zope.Public"
      />

  <adapter
      for="zope.schema.interfaces.IBytes
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.IDisplayWidget"
      factory=".widgets.BytesDisplayWidget"
      permission="zope.Public"
      />

  <adapter
      for="zope.schema.interfaces.IBytesLine
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.IDisplayWidget"
      factory=".widgets.DisplayWidget"
      permission="zope.Public"
      />

  <adapter
      for="zope.schema.interfaces.IASCII
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.IDisplayWidget"
      factory=".widgets.ASCIIDisplayWidget"
      permission="zope.Public"
      />

  <adapter
      for="zope.schema.interfaces.IASCIILine
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.IDisplayWidget"
      factory=".widgets.DisplayWidget"
      permission="zope.Public"
      />

  <adapter
      for="zope.schema.interfaces.IURI
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.IDisplayWidget"
      factory=".widgets.URIDisplayWidget"
      permission="zope.Public"
      />

  <adapter
      for="zope.schema.interfaces.IDate
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.IDisplayWidget"
      factory=".widgets.DateDisplayWidget"
      permission="zope.Public"
      />

  <adapter
      for="zope.schema.interfaces.IDatetime
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.IDisplayWidget"
      factory=".widgets.DatetimeDisplayWidget"
      permission="zope.Public"
      />

  <!-- Core edit widgets -->

   <adapter
       for="zope.schema.interfaces.ITextLine
            zope.publisher.interfaces.browser.IBrowserRequest"
       provides="zope.formlib.interfaces.ITextBrowserWidget"
       factory=".widgets.TextWidget"
       permission="zope.Public"
       />

  <adapter
      for="zope.schema.interfaces.IText
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.ISimpleInputWidget"
      factory=".widgets.TextAreaWidget"
      permission="zope.Public"
      />

  <adapter
      for="zope.schema.interfaces.ISourceText
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.ISimpleInputWidget"
      factory=".widgets.TextAreaWidget"
      permission="zope.Public"
      />

  <adapter
      for="zope.schema.interfaces.IBytesLine
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.ISimpleInputWidget"
      factory=".widgets.BytesWidget"
      permission="zope.Public"
      />

  <adapter
      for="zope.schema.interfaces.IBytes
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.ISimpleInputWidget"
      factory=".widgets.FileWidget"
      permission="zope.Public"
      />

  <adapter
      for="zope.schema.interfaces.IASCII
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.ISimpleInputWidget"
      factory=".widgets.ASCIIAreaWidget"
      permission="zope.Public"
      />

  <adapter
      for="zope.schema.interfaces.IASCIILine
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.ISimpleInputWidget"
      factory=".widgets.ASCIIWidget"
      permission="zope.Public"
      />

  <adapter
      for="zope.schema.interfaces.IInt
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.ISimpleInputWidget"
      factory=".widgets.IntWidget"
      permission="zope.Public"
      />

  <adapter
      for="zope.schema.interfaces.IInt
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.IDisplayWidget"
      factory=".widgets.UnicodeDisplayWidget"
      permission="zope.Public"
      />

  <adapter
      for="zope.schema.interfaces.IFloat
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.ISimpleInputWidget"
      factory=".widgets.FloatWidget"
      permission="zope.Public"
      />

  <adapter
      for="zope.schema.interfaces.IFloat
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.IDisplayWidget"
      factory=".widgets.UnicodeDisplayWidget"
      permission="zope.Public"
      />

  <adapter
      for="zope.schema.interfaces.IDecimal
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.ISimpleInputWidget"
      factory=".widgets.DecimalWidget"
      permission="zope.Public"
      />

  <adapter
      for="zope.schema.interfaces.IDecimal
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.IDisplayWidget"
      factory=".widgets.UnicodeDisplayWidget"
      permission="zope.Public"
      />

  <adapter
      for="zope.schema.interfaces.IDatetime
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.ISimpleInputWidget"
      factory=".widgets.DatetimeWidget"
      permission="zope.Public"
      />

  <adapter
      for="zope.schema.interfaces.IDate
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.ISimpleInputWidget"
      factory=".widgets.DateWidget"
      permission="zope.Public"
      />

  <adapter
      for="zope.schema.interfaces.IBool
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.ISimpleInputWidget"
      factory=".widgets.CheckBoxWidget"
      permission="zope.Public"
      />

  <adapter
      for="zope.schema.interfaces.IPassword
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.ISimpleInputWidget"
      factory=".widgets.PasswordWidget"
      permission="zope.Public"
      />

  <!-- Items-related widgets; they are proxies for the multiviews below. -->

  <!-- Choices (dispatch to field + vocabulary lookup) -->
  <adapter
      for="zope.schema.interfaces.IChoice
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.IDisplayWidget"
      factory=".widgets.ChoiceDisplayWidget"
      permission="zope.Public"
      />

  <adapter
      for="zope.schema.interfaces.IChoice
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.ISimpleInputWidget"
      factory=".widgets.ChoiceInputWidget"
      permission="zope.Public"
      />

  <!-- Generic collections (dispatch to field + value_type lookup) -->
  <adapter
      for="zope.schema.interfaces.ICollection
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.IDisplayWidget"
      factory=".widgets.CollectionDisplayWidget"
      permission="zope.Public"
      />

  <adapter
      for="zope.schema.interfaces.ICollection
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.ISimpleInputWidget"
      factory=".widgets.CollectionInputWidget"
      permission="zope.Public"
      />

  <!--

       Need to repeat the above for Sequence to avoid being overridden by a
       DAV widget.  This suggests that we should be getting something
       more specific than IInputWidget.

       -->
  <adapter
      for="zope.schema.interfaces.ISequence
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.IDisplayWidget"
      factory=".widgets.CollectionDisplayWidget"
      permission="zope.Public"
      />
  <adapter
      for="zope.schema.interfaces.ISequence
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.ISimpleInputWidget"
      factory=".widgets.CollectionInputWidget"
      permission="zope.Public"
      />



  <!-- non-choice collection fields should register for the field + value type
       so as to allow specific field + value_type widgets such as the Choice
       pattern -->
  <adapter
      for="zope.schema.interfaces.ITuple
           zope.schema.interfaces.IField
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.ISimpleInputWidget"
      factory=".widgets.TupleSequenceWidget"
      permission="zope.Public"
      />

  <adapter
      for="zope.schema.interfaces.IList
           zope.schema.interfaces.IField
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.ISimpleInputWidget"
      factory=".widgets.ListSequenceWidget"
      permission="zope.Public"
      />

  <adapter
      for="zope.schema.interfaces.ISequence
           zope.schema.interfaces.IField
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.IDisplayWidget"
      factory=".widgets.SequenceDisplayWidget"
      permission="zope.Public"
      />

  <!-- Choice collections.  dispatch to field + vocabulary lookup.
       We must register the collection + choice factories for all ICollection
       subclasses because the field (the collection) has precedence: therefore
       a registration for (IList plus IField) would trump a registration for
       (ICollection plus IChoice), making choice lists not look up properly.
       So all new collection types should always register for IChoice if
       they want to follow in this configuration pattern. -->
  <!-- List + Choice -->
  <adapter
      for="zope.schema.interfaces.IList
           zope.schema.interfaces.IChoice
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.IDisplayWidget"
      factory=".widgets.ChoiceCollectionDisplayWidget"
      permission="zope.Public"
      />

  <adapter
      for="zope.schema.interfaces.IList
           zope.schema.interfaces.IChoice
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.ISimpleInputWidget"
      factory=".widgets.ChoiceCollectionInputWidget"
      permission="zope.Public"
      />

  <!-- Tuple + Choice -->
  <adapter
      for="zope.schema.interfaces.ITuple
           zope.schema.interfaces.IChoice
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.IDisplayWidget"
      factory=".widgets.ChoiceCollectionDisplayWidget"
      permission="zope.Public"
      />

  <adapter
      for="zope.schema.interfaces.ITuple
           zope.schema.interfaces.IChoice
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.ISimpleInputWidget"
      factory=".widgets.ChoiceCollectionInputWidget"
      permission="zope.Public"
      />

  <!-- Set + Choice -->
  <adapter
      for="zope.schema.interfaces.ISet
           zope.schema.interfaces.IChoice
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.IDisplayWidget"
      factory=".widgets.ChoiceCollectionDisplayWidget"
      permission="zope.Public"
      />

  <adapter
      for="zope.schema.interfaces.ISet
           zope.schema.interfaces.IChoice
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.ISimpleInputWidget"
      factory=".widgets.ChoiceCollectionInputWidget"
      permission="zope.Public"
      />

  <!-- FrozenSet + Choice -->
  <adapter
      for="zope.schema.interfaces.IFrozenSet
           zope.schema.interfaces.IChoice
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.IDisplayWidget"
      factory=".widgets.ChoiceCollectionDisplayWidget"
      permission="zope.Public"
      />

  <adapter
      for="zope.schema.interfaces.IFrozenSet
           zope.schema.interfaces.IChoice
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.ISimpleInputWidget"
      factory=".widgets.ChoiceCollectionInputWidget"
      permission="zope.Public"
      />

  <!-- Default Multi-Views for fields and vocabularies -->

  <adapter
      for="zope.schema.interfaces.IChoice
           zope.schema.interfaces.IBaseVocabulary
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.IDisplayWidget"
      factory=".widgets.ItemDisplayWidget"
      permission="zope.Public"
      />

  <adapter
      for="zope.schema.interfaces.IChoice
           zope.schema.interfaces.IVocabularyTokenized
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.ISimpleInputWidget"
      factory=".widgets.DropdownWidget"
      permission="zope.Public"
      />

  <!-- Default Multi-Views for fields and iterable sources -->

  <adapter
      for="zope.schema.interfaces.ISet
           zope.schema.interfaces.IIterableSource
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.ISimpleInputWidget"
      factory=".source.SourceMultiSelectSetWidget"
      permission="zope.Public"
      />

  <adapter
      for="zope.schema.interfaces.IFrozenSet
           zope.schema.interfaces.IIterableSource
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.ISimpleInputWidget"
      factory=".source.SourceMultiSelectFrozenSetWidget"
      permission="zope.Public"
      />

  <adapter
      for="zope.schema.interfaces.IChoice
           zope.schema.interfaces.IIterableSource
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.ISimpleInputWidget"
      factory=".source.SourceDropdownWidget"
      permission="zope.Public"
      />

  <adapter
      for="zope.schema.interfaces.IList
           zope.schema.interfaces.IIterableSource
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.ISimpleInputWidget"
      factory=".source.SourceOrderedMultiSelectWidget"
      permission="zope.Public"
      />

  <!-- These widgets are minimal and only support lists with unique members,
       without ordering capabilities -->

  <adapter
      for="zope.schema.interfaces.ISet
           zope.schema.interfaces.IVocabularyTokenized
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.ISimpleInputWidget"
      factory=".widgets.MultiSelectSetWidget"
      permission="zope.Public"
      />

  <adapter
      for="zope.schema.interfaces.IFrozenSet
           zope.schema.interfaces.IVocabularyTokenized
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.ISimpleInputWidget"
      factory=".widgets.MultiSelectFrozenSetWidget"
      permission="zope.Public"
      />

  <adapter
      for="zope.schema.interfaces.ISet
           zope.schema.interfaces.IBaseVocabulary
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.IDisplayWidget"
      factory=".widgets.SetDisplayWidget"
      permission="zope.Public"
      />

  <adapter
      for="zope.schema.interfaces.IFrozenSet
           zope.schema.interfaces.IBaseVocabulary
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.IDisplayWidget"
      factory=".widgets.SetDisplayWidget"
      permission="zope.Public"
      />

  <adapter
      for="zope.schema.interfaces.IList
           zope.schema.interfaces.IVocabularyTokenized
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.ISimpleInputWidget"
      factory=".widgets.OrderedMultiSelectWidget"
      permission="zope.Public"
      />

  <adapter
      for="zope.schema.interfaces.IList
           zope.schema.interfaces.IBaseVocabulary
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.IDisplayWidget"
      factory=".widgets.SetDisplayWidget"
      permission="zope.Public"
      />

  <!-- Source Views -->
  <adapter
      for="zope.schema.interfaces.IChoice
           zope.schema.interfaces.ISource
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.IDisplayWidget"
      factory=".source.SourceDisplayWidget"
      permission="zope.Public"
      />
  <adapter
      for="zope.schema.interfaces.IChoice
           zope.schema.interfaces.ISource
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.ISimpleInputWidget"
      factory=".source.SourceInputWidget"
      permission="zope.Public"
      />

  <adapter
      for="zope.schema.interfaces.ISequence
           zope.schema.interfaces.ISource
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.IDisplayWidget"
      factory=".source.SourceSequenceDisplayWidget"
      permission="zope.Public"
      />

    <adapter
      for="zope.schema.interfaces.IAbstractSet
           zope.schema.interfaces.ISource
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.IDisplayWidget"
      factory=".source.SourceSequenceDisplayWidget"
      permission="zope.Public"
      />



  <!-- TODO We need a widget for tuples (and sets, for that matter). -->
  <adapter
      for="zope.schema.interfaces.IList
           zope.schema.interfaces.ISource
           zope.publisher.interfaces.browser.IBrowserRequest"
      provides="zope.formlib.interfaces.ISimpleInputWidget"
      factory=".source.SourceListInputWidget"
      permission="zope.Public"
      />

</configure>
