1from nevow import tags as t, static, util, loaders, athena, inevow
2
3
4class tabbedPaneGlue:
5    """
6    Record which holds information about the Javascript & CSS requirements
7    of L{TabbedPane} and L{TabbedPaneFragment}.
8
9    @type stylesheetPath: C{str}
10    @ivar stylesheetPath: Filesystem path of the tabbed pane stylesheet.
11
12    @type fileCSS: L{static.File}
13    @ivar fileCSS: Resource which serves L{stylesheetPath}.
14
15    @type inlineCSS: L{t.style}
16    @ivar inlineCSS: <style> tag containing the tabbedpane CSS inline.
17    """
18    stylesheetPath = util.resource_filename('nevow', 'css/Nevow/TagLibrary/TabbedPane.css')
19
20    fileCSS = static.File(stylesheetPath, 'text/css')
21
22    inlineCSS = t.style(type_='text/css')[ t.xml(file(stylesheetPath).read()) ]
23
24
25
26class TabbedPaneFragment(athena.LiveFragment):
27    jsClass = u'Nevow.TagLibrary.TabbedPane.TabbedPane'
28    cssModule = u'Nevow.TagLibrary.TabbedPane'
29
30    docFactory = loaders.xmlstr("""
31<div class="nevow-tabbedpane"
32  xmlns:nevow="http://nevow.com/ns/nevow/0.1"
33  xmlns:athena="http://divmod.org/ns/athena/0.7"
34  nevow:render="liveFragment"
35  style="opacity: .3">
36    <ul class="nevow-tabbedpane-tabs" id="tab-container">
37        <nevow:invisible nevow:render="tabs" />
38    </ul>
39    <li nevow:pattern="tab"
40      ><athena:handler event="onclick"
41      handler="dom_tabClicked" /><nevow:attr name="class"><nevow:slot
42     name="class" /></nevow:attr><nevow:slot name="tab-name" /></li>
43    <div nevow:pattern="page">
44        <nevow:attr name="class"><nevow:slot name="class" /></nevow:attr>
45        <nevow:slot name="page-content" />
46    </div>
47    <div id="pane-container"><nevow:invisible nevow:render="pages" /></div>
48</div>""".replace('\n', ''))
49
50    def __init__(self, pages, selected=0, name='default'):
51        self.pages = pages
52        self.selected = selected
53        self.name = name
54
55        super(TabbedPaneFragment, self).__init__()
56
57    def getInitialArguments(self):
58        return (unicode(self.pages[self.selected][0], 'utf-8'),)
59
60    def render_tabs(self, ctx, data):
61        tabPattern = inevow.IQ(self.docFactory).patternGenerator('tab')
62        for (i, (name, content)) in enumerate(self.pages):
63            if self.selected == i:
64                cls = 'nevow-tabbedpane-selected-tab'
65            else:
66                cls = 'nevow-tabbedpane-tab'
67            yield tabPattern.fillSlots(
68                      'tab-name', name).fillSlots(
69                      'class', cls)
70
71    def render_pages(self, ctx, data):
72        pagePattern = inevow.IQ(self.docFactory).patternGenerator('page')
73        for (i, (name, content)) in enumerate(self.pages):
74            if self.selected == i:
75                cls = 'nevow-tabbedpane-selected-pane'
76            else:
77                cls = 'nevow-tabbedpane-pane'
78            yield pagePattern.fillSlots(
79                    'page-content', content).fillSlots(
80                    'class', cls)
81
82__all__ = [ "tabbedPaneGlue", "TabbedPaneFragment" ]
83
84
85