1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 """
23 Base classes for component UI's using GTK+
24 """
25
26 import gettext
27 import locale
28 import os
29
30 from twisted.python import util
31 from twisted.internet import defer
32
33 from flumotion.common import log
34 from flumotion.common.errors import SleepingComponentError
35 from flumotion.common.i18n import getLL, gettexter
36 from flumotion.component.base.componentnode import ComponentAdminGtkNode
37 from flumotion.component.base.eatersnode import EatersAdminGtkNode
38 from flumotion.component.base.feedersnode import FeedersAdminGtkNode
39 from flumotion.component.base.propertiesnode import PropertiesAdminGtkNode
40
41 _ = gettext.gettext
42 __version__ = "$Rev: 6990 $"
43 T_ = gettexter()
44
45
46 dir(locale)
47
49 """
50 I am a base class for all GTK+-based Admin views.
51 I am a view on one component's properties.
52
53 @type nodes: L{twisted.python.util.OrderedDict}
54 @ivar nodes: an ordered dict of name -> L{BaseAdminGtkNode}
55 """
56
57 logCategory = "admingtk"
58 gettextDomain = None
59
61 """
62 @param state: state of component this is a UI for
63 @type state: L{flumotion.common.planet.AdminComponentState}
64 @type admin: L{flumotion.admin.admin.AdminModel}
65 @param admin: the admin model that interfaces with the manager for us
66 """
67 self._debugEnabled = False
68 self.state = state
69 self.name = state.get('name')
70 self.admin = admin
71 self.debug('creating admin gtk for state %r' % state)
72 self.uiState = None
73 self.nodes = util.OrderedDict()
74
75 d = admin.componentCallRemote(state, 'getUIState')
76 d.addCallback(self.setUIState)
77 d.addErrback(lambda failure: failure.trap(SleepingComponentError))
78
80 """Set if debug should be enabled.
81 Not all pages are visible unless debugging is set to true
82
83 @param enabled: whether debug should be enabled
84 @type enabled: bool
85 """
86 self._debugEnabled = enabled
87 for node in self.getNodes().values():
88 node.setDebugEnabled(enabled)
89
96
105
106 - def callRemote(self, methodName, *args, **kwargs):
109
110
111
113 """
114 Set up the admin view so it can display nodes.
115 """
116 self.debug('BaseAdminGtk.setup()')
117
118 def fetchTranslations():
119 if not self.gettextDomain:
120 return defer.succeed(None)
121
122 def haveBundle(localedatadir):
123 localeDir = os.path.join(localedatadir, 'locale')
124 self.debug("Loading locales for %s from %s" % (
125 self.gettextDomain, localeDir))
126 gettext.bindtextdomain(self.gettextDomain, localeDir)
127 locale.bindtextdomain(self.gettextDomain, localeDir)
128
129 lang = getLL()
130 self.debug("loading bundle for %s locales" % lang)
131 bundleName = '%s-locale-%s' % (self.gettextDomain, lang)
132 d = self.admin.bundleLoader.getBundleByName(bundleName)
133 d.addCallbacks(haveBundle, lambda _: None)
134 return d
135
136 def addPages(_):
137
138
139
140
141 self.nodes['Component'] = ComponentAdminGtkNode(self.state,
142 self.admin)
143
144 config = self.state.get('config')
145
146
147 if config['feed']:
148 self.debug("Component has feeders, show Feeders node")
149 self.nodes['Feeders'] = FeedersAdminGtkNode(
150 self.state, self.admin)
151
152
153 if 'eater' in config and config['eater']:
154 self.debug("Component has eaters, show Eaters node")
155 self.nodes['Eaters'] = EatersAdminGtkNode(
156 self.state, self.admin)
157
158
159 self.nodes['Properties'] = PropertiesAdminGtkNode(self.state,
160 self.admin)
161
162 d = fetchTranslations()
163 d.addCallback(addPages)
164
165
166
167 return
168
170 """
171 Return a dict of admin UI nodes.
172
173 @rtype: dict of str -> L{BaseAdminGtkNode}
174 @returns: dict of name (untranslated) -> admin node
175 """
176 return self.nodes
177
178
180 """
181 Render the GTK+ admin view for this component and return the
182 main widget for embedding.
183 """
184 raise NotImplementedError
185
191
192 - def stateSet(self, object, key, value):
194
197
200