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'
' % self.listing_class)
+
+ def box_end_content(self):
+ 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'' % ident)
+
+ def _end_menu(self):
+ 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'