##
## resultswidget.py
## Login : <uli@pu.smp.net>
## Started on  Tue Jul 20 02:04:30 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 to display IObject instances in forms.
"""
import grok
import os
import zope.file.file
import zope.file.upload
from zope.app.file.interfaces import IImage
from zope.browserpage import ViewPageTemplateFile
from zope.formlib.interfaces import IDisplayWidget
from zope.formlib.objectwidget import ObjectWidget, ObjectWidgetView
from zope.formlib.widget import renderElement, DisplayWidget
from zope.formlib.widgets import FileWidget
from zope.formlib.utility import setUpWidgets
from zope.interface import implements, implementsOnly
from zope.schema import getFieldNamesInOrder
from zope.publisher.interfaces.browser import IBrowserRequest
from zope.traversing.browser import absoluteURL


class WAeUPPassportWidgetView(ObjectWidgetView):
    template = ViewPageTemplateFile('objectwidget.pt')

class PassportImage(object):
    grok.implements(IImage)

    _data = None
    _file = None
    contenttype = 'image/jpeg'
    path = None
    
    def __init__(self, data=None, fileobj=None, contenttype='image/jpeg'):
        print "INIT"
        self.contenttype = contenttype
        self._data = data
        if data is not None:
            self._data = None
            return
        if fileobj is not None:
            self._file = fileobj
            return
        self.path = os.path.join(
            os.path.dirname(os.path.dirname(__file__)),
            'browser', 'static', 'placeholder_m.jpg')

    @property
    def contentType(self):
        return self.contenttype

    @property
    def data(self):
        print "DATA"
        if self._file is not None:
            print "FILE"
            return self._file.open().read()
        if self.path:
            print "PATH"
            return open(self.path, 'rb').read()
        print "NONE"
        return self._data

    def getSize(self):
        if self._file is not None:
            return self._file.size
        if self.path is not None:
            info = os.stat(self.path)
            return info.st_size
        return len(self._data)

class PassportWidget(FileWidget):

    def __call__(self):
        result = super(PassportWidget, self).__call__()
        url = absoluteURL(self.context.context, self.request) + '/passport.jpg'
        image = renderElement(
            'img',
            src=url,
            width='100px',
            )
        #import pdb; pdb.set_trace()
        return '%s <br />%s' % (image, result)

    def _toFieldValue(self, input):
        if input is None or input == '':
            return self.context.missing_value
        if getattr(input, 'filename', False):
            contenttype = input.headers.get('Content-Type')
            file_ = zope.file.file.File()
            zope.file.upload.updateBlob(file_, input)
            return PassportImage(fileobj=file_, contenttype=contenttype)
            return file_
        return self.context.missing_value
        try:
            seek = input.seek
            read = input.read
        except AttributeError, e:
            raise ConversionError(_('Form input is not a file object'), e)
        else:
            seek(0)
            data = read()
            if data or getattr(input, 'filename', ''):
                return PassportImage(data)
                return data
            else:
                return self.context.missing_value

    def no__init__(self, context, request, factory, **kw):
        super(PassportWidget, self).__init__(context, request)

        # define view that renders the widget
        self.view = self._getView(request)

        # factory used to create content that this widget (field)
        # represents
        self.factory = factory

        # handle foo_widget specs being passed in
        self.names = getFieldNamesInOrder(self.context.schema)
        for k, v in kw.items():
            if k.endswith('_widget'):
                setattr(self, k, v)

        # set up my subwidgets
        self._setUpWidgets()

    def nosubwidgets(self):
        result = [self.getSubWidget(name) for name in self.names]
        return result

    def no_setUpWidgets(self):
        return self._setUpEditWidgets()

    def no_getView(self, request):
        return WAeUPObjectWidgetView(self, request)

#class WAeUPObjectDisplayWidget(WAeUPObjectWidget):
#
#    implementsOnly(IDisplayWidget)
#
#    def _setUpDisplayWidgets(self):
#        # subwidgets need a new name
#        setUpWidgets(self, self.context.schema, IDisplayWidget,
#                         prefix=self.name, names=self.names,
#                         context=self.context)
#
#    def _setUpWidgets(self):
#        return self._setUpDisplayWidgets()

class PassportDisplayWidget(DisplayWidget):

    grok.implements(IDisplayWidget)
    
    def __call__(self):
        #result = super(PassportDisplayWidget, self).__call__()
        url = absoluteURL(self.context, self.request) + '/passport.jpg'
        #url = absoluteURL(self.context.context, self.request) + '/passport.jpg'
        image = renderElement(
            'img',
            src=url,
            width='100px',
            )
        #import pdb; pdb.set_trace()
        #print "IMAGE: ", image
        return '<br />%s' % (image,)# result)
        return '%s <br />%s' % (image, result)
