============== CheckBoxWidget ============== Note: the checkbox widget isn't registered for a field by default. You can use the ``widgetFactory`` argument of a ``IField`` object if you construct fields or set the custom widget factory on selected fields later. The ``CheckBoxWidget`` widget renders a checkbox input type field e.g.
      >>> from zope.interface.verify import verifyClass
      >>> from z3c.form import interfaces
      >>> from z3c.form.browser import checkbox

    The ``CheckboxWidget`` is a widget:

      >>> verifyClass(interfaces.IWidget, checkbox.CheckBoxWidget)
      True

    The widget can render a input field only by adapting a request:

      >>> from z3c.form.testing import TestRequest
      >>> request = TestRequest()
      >>> widget = checkbox.CheckBoxWidget(request)

    Set a name and id for the widget:

      >>> widget.id = 'widget-id'
      >>> widget.name = 'widget.name'

    Such a field provides IWidget:

      >>> interfaces.IWidget.providedBy(widget)
      True

    We also need to register the template for at least the widget and request:

      >>> import os.path
      >>> import zope.interface
      >>> from zope.publisher.interfaces.browser import IDefaultBrowserLayer
      >>> from zope.pagetemplate.interfaces import IPageTemplate
      >>> import z3c.form.browser
      >>> import z3c.form.widget
      >>> template = os.path.join(os.path.dirname(z3c.form.browser.__file__),
      ...     'checkbox_input.pt')
      >>> factory = z3c.form.widget.WidgetTemplateFactory(template)
      >>> zope.component.provideAdapter(factory,
      ...     (zope.interface.Interface, IDefaultBrowserLayer, None, None, None),
      ...     IPageTemplate, name='input')

    If we render the widget we only get the empty marker:

      >>> print widget.render()
    Let's provide some values for this widget. We can do this by defining
    a vocabulary providing ``ITerms``. This vocabulary uses descriminators
    wich will fit for our setup.

      >>> import zope.schema.interfaces
      >>> from zope.schema.vocabulary import SimpleVocabulary
      >>> import z3c.form.term
      >>> class MyTerms(z3c.form.term.ChoiceTermsVocabulary):
      ...     def __init__(self, context, request, form, field, widget):
      ...         self.terms = SimpleVocabulary.fromValues(['yes', 'no'])
      >>> zope.component.provideAdapter(z3c.form.term.BoolTerms,
      ...     adapts=(zope.interface.Interface,
      ...             interfaces.IFormLayer, zope.interface.Interface,
      ...             zope.interface.Interface, interfaces.ICheckBoxWidget))

    Now let's try if we get widget values:

      >>> widget.update()
      >>> print widget.render()
yes no If we set the value for the widget to ``yes``, we can se that the checkbox field get rendered with a checked flag: >>> widget.value = 'true' >>> widget.update() >>> print widget.render() yes no
    Check HIDDEN_MODE:

      >>> template = os.path.join(os.path.dirname(z3c.form.browser.__file__),
      ...     'checkbox_hidden.pt')
      >>> factory = z3c.form.widget.WidgetTemplateFactory(template)
      >>> zope.component.provideAdapter(factory,
      ...     (zope.interface.Interface, IDefaultBrowserLayer, None, None, None),
      ...     IPageTemplate, name='hidden')

      >>> widget.value = 'true'
      >>> widget.mode = interfaces.HIDDEN_MODE
      >>> print widget.render()
    Single Checkbox Widget
    ----------------------

    Instead of using the checkbox widget as an UI component to allow multiple
    selection from a list of choices, it can be also used by itself to toggle a
    selection, effectively making it a binary selector. So in this case it lends
    itself well as a boolean UI input component.

    The ``SingleCheckboxWidget`` is a widget:

      >>> verifyClass(interfaces.IWidget, checkbox.SingleCheckBoxWidget)
      True

    The widget can render a input field only by adapting a request:

      >>> request = TestRequest()
      >>> widget = checkbox.SingleCheckBoxWidget(request)

    Set a name and id for the widget:

      >>> widget.id = 'widget-id'
      >>> widget.name = 'widget.name'

    Such a widget provides the ``IWidget`` interface:

      >>> interfaces.IWidget.providedBy(widget)
      True

    For there to be a sensible output, we need to give the widget a label:

      >>> widget.label = u'Do you want that?'

      >>> widget.update()
      >>> print widget.render()
Do you want that? Initially, the box is not checked. Changing the widget value to the selection value, ... >>> widget.value = ['selected'] will make the box checked: >>> widget.update() >>> print widget.render() Do you want that?
    If you do not specify the label on the widget directly, it is taken from the
    field

      >>> from zope.schema import Bool
      >>> widget = checkbox.SingleCheckBoxWidget(request)
      >>> widget.id = 'widget-id'
      >>> widget.name = 'widget.name'
      >>> widget.field = Bool(title=u"Do you REALLY want that?")
      >>> widget.update()
      >>> print widget.render()
Do you REALLY want that?
    Check HIDDEN_MODE:

      >>> template = os.path.join(os.path.dirname(z3c.form.browser.__file__),
      ...     'checkbox_hidden.pt')
      >>> factory = z3c.form.widget.WidgetTemplateFactory(template)
      >>> zope.component.provideAdapter(factory,
      ...     (zope.interface.Interface, IDefaultBrowserLayer, None, None, None),
      ...     IPageTemplate, name='hidden')

      >>> widget.value = 'true'
      >>> widget.mode = interfaces.HIDDEN_MODE
      >>> print widget.render()