##
## multilistwidget.py
## Login : <uli@pu.smp.net>
## Started on  Tue Jul 20 02:53:10 2010 Uli Fouquet
## $Id$
## 
## Copyright (C) 2010 Uli Fouquet
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
## the Free Software Foundation; either version 2 of the License, or
## (at your option) any later version.
## 
## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
## GNU General Public License for more details.
## 
## You should have received a copy of the GNU General Public License
## along with this program; if not, write to the Free Software
## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
##
"""A widget that renders multiple contained items horizontally.
"""
from zope.browserpage import ViewPageTemplateFile
from zope.formlib.sequencewidget import (
    ListSequenceWidget, SequenceDisplayWidget)
from zope.formlib.widget import renderElement
from zope.i18n import translate


class MultiListWidget(ListSequenceWidget):
    template = ViewPageTemplateFile('multilistwidget.pt')

class MultiListDisplayWidget(SequenceDisplayWidget):
    cssClass = "multiSequenceWidget"

    def __call__(self):
        # get the data to display:
        if self._renderedValueSet():
            data = self._data
        else:
            data = self.context.get(self.context.context)

        # deal with special cases:
        if data == self.context.missing_value:
            return translate(self._missingValueMessage, self.request)
        data = list(data)
        if not data:
            return translate(self._emptySequenceMessage, self.request)

        parts = ['<table>']
        for i, item in enumerate(data):
            widget = self._getWidget(i)
            if i == 0:
                parts.append('<thead><tr>')
                for x in widget.subwidgets():
                    parts.append('<th>%s</th>' % x.label)
                parts.append('</tr></thead><tbody>')
            widget.setRenderedValue(item)
            s = widget()
            #print s
            if self.itemTag:
                #s = "<%s>%s</%s>" % (self.itemTag, s, self.itemTag)
                evenodd = i%2 and 'odd' or 'even'
                s = '<tr class="%s">%s</tr>' % (evenodd, s)
            parts.append(s)
        parts.append('</tbody></table>')
        contents = "\n".join(parts)
        if self.tag:
            contents = "\n%s\n" % contents
            contents = renderElement(self.tag,
                                     cssClass=self.cssClass,
                                     extra=self.extra,
                                     contents=contents)
        return contents
