diff -r 000000000000 -r b97547f5f1fa web/htmlwidgets.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/htmlwidgets.py Wed Nov 05 15:52:50 2008 +0100 @@ -0,0 +1,314 @@ +"""html widgets + +those are in cubicweb.common since we need to know available widgets at schema +serialization time + +:organization: Logilab +:copyright: 2001-2008 LOGILAB S.A. (Paris, FRANCE), all rights reserved. +:contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr +""" + +from logilab.mtconverter import html_escape + +from cubicweb.common.utils import UStringIO +from cubicweb.common.uilib import toggle_action + +class HTMLWidget(object): + + def _initialize_stream(self, w=None): + if w: + self.w = w + else: + self._stream = UStringIO() + self.w = self._stream.write + + def _render(self): + raise NotImplementedError + + def render(self, w=None): + self._initialize_stream(w) + self._render() + if w is None: + return self._stream.getvalue() + + def is_empty(self): + return False + + +class BoxWidget(HTMLWidget): + def __init__(self, title, id, items=None, _class="boxFrame", + islist=True, shadow=True, escape=True): + self.title = title + self.id = id + self.items = items or [] + self._class = _class + self.islist = islist + self.shadow = shadow + self.escape = escape + + def __len__(self): + return len(self.items) + + def is_empty(self): + return len(self) == 0 + + def append(self, item): + self.items.append(item) + + main_div_class = 'boxContent' + listing_class = 'boxListing' + + def box_begin_content(self): + self.w(u'
\n' % self.main_div_class) + if self.islist: + self.w(u'\n') + self.w(u'
\n') + if self.shadow: + self.w(u'
 
') + + def _render(self): + if self.id: + self.w(u'
' % (self._class, self.id)) + else: + self.w(u'
' % self._class) + if self.title: + if self.escape: + title = '%s' % html_escape(self.title) + else: + title = '%s' % self.title + self.w(u'
%s
' % title) + if self.items: + self.box_begin_content() + for item in self.items: + item.render(self.w) + self.box_end_content() + self.w(u'
') + + +class SideBoxWidget(BoxWidget): + """default CubicWeb's sidebox widget""" + main_div_class = u'sideBoxBody' + listing_class = '' + + def __init__(self, title, id=None): + super(SideBoxWidget, self).__init__(title, id=id, _class='sideBox', + shadow=False) + + +class MenuWidget(BoxWidget): + main_div_class = 'menuContent' + listing_class = 'menuListing' + + def box_end_content(self): + if self.islist: + self.w(u'\n') + self.w(u'
\n') + + +class RawBoxItem(HTMLWidget): + """a simpe box item displaying raw data""" + def __init__(self, label, liclass=None): + self.label = label + self.liclass = liclass + + def _start_li(self): + if self.liclass is None: + return u'
  • ' + else: + return u'
  • ' % self.liclass + + return self.label + + def _render(self): + self.w(u'%s%s
  • ' % (self._start_li(), self.label)) + + +class BoxMenu(RawBoxItem): + """a menu in a box""" + link_class = 'boxMenu' + + def __init__(self, label, items=None, isitem=True, liclass=None, ident=None, + link_class=None): + super(BoxMenu, self).__init__(label, liclass) + self.items = items or [] + self.isitem = isitem + self.ident = ident or u'boxmenu_%s' % label.replace(' ', '_').replace("'", '') + if link_class: + self.link_class = link_class + + def append(self, item): + self.items.append(item) + + def _begin_menu(self, ident): + self.w(u'') + + def _render(self): + if self.isitem: + self.w(self._start_li()) + ident = self.ident + self.w(u'%s' % ( + toggle_action(ident), self.link_class, self.label)) + self._begin_menu(ident) + for item in self.items: + item.render(self.w) + self._end_menu() + if self.isitem: + self.w(u'') + + +class PopupBoxMenu(BoxMenu): + """like BoxMenu but uses div and specific css class + in order to behave like a popup menu + """ + link_class = 'popupMenu' + + def _begin_menu(self, ident): + self.w(u'
    ') + + +class BoxField(HTMLWidget): + """couples label / value meant to be displayed in a box""" + def __init__(self, label, value): + self.label = label + self.value = value + + def _render(self): + self.w(u'
  • %s ' + u'%s
  • ' + % (self.label, self.value)) + +class BoxSeparator(HTMLWidget): + """a menu separator""" + + def _render(self): + self.w(u'