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$"
43 T_ = gettexter()
44
45
46 dir(locale)
47
48
50 """
51 I am a base class for all GTK+-based Admin views.
52 I am a view on one component's properties.
53
54 @type nodes: L{twisted.python.util.OrderedDict}
55 @ivar nodes: an ordered dict of name -> L{BaseAdminGtkNode}
56 """
57
58 logCategory = "admingtk"
59 gettextDomain = None
60
62 """
63 @param state: state of component this is a UI for
64 @type state: L{flumotion.common.planet.AdminComponentState}
65 @type admin: L{flumotion.admin.admin.AdminModel}
66 @param admin: the admin model that interfaces with the manager for us
67 """
68 self._debugEnabled = False
69 self.state = state
70 self.name = state.get('name')
71 self.admin = admin
72 self.debug('creating admin gtk for state %r' % state)
73 self.uiState = None
74 self.nodes = util.OrderedDict()
75
76 d = admin.componentCallRemote(state, 'getUIState')
77 d.addCallback(self.setUIState)
78 d.addErrback(lambda failure: failure.trap(SleepingComponentError))
79
81 """Set if debug should be enabled.
82 Not all pages are visible unless debugging is set to true
83
84 @param enabled: whether debug should be enabled
85 @type enabled: bool
86 """
87 self._debugEnabled = enabled
88 for node in self.getNodes().values():
89 node.setDebugEnabled(enabled)
90
97
106
107 - def callRemote(self, methodName, *args, **kwargs):
110
111
112
113
115 """
116 Set up the admin view so it can display nodes.
117 """
118 self.debug('BaseAdminGtk.setup()')
119
120 def fetchTranslations():
121 if not self.gettextDomain:
122 return defer.succeed(None)
123
124 def haveBundle(localedatadir):
125 localeDir = os.path.join(localedatadir, 'locale')
126 self.debug("Loading locales for %s from %s" % (
127 self.gettextDomain, localeDir))
128 gettext.bindtextdomain(self.gettextDomain, localeDir)
129 locale.bindtextdomain(self.gettextDomain, localeDir)
130
131 lang = getLL()
132 self.debug("loading bundle for %s locales" % lang)
133 bundleName = '%s-locale-%s' % (self.gettextDomain, lang)
134 d = self.admin.bundleLoader.getBundleByName(bundleName)
135 d.addCallbacks(haveBundle, lambda _: None)
136 return d
137
138 def addPages(_):
139
140
141
142
143 self.nodes['Component'] = ComponentAdminGtkNode(self.state,
144 self.admin)
145
146 config = self.state.get('config')
147
148
149 if config['feed']:
150 self.debug("Component has feeders, show Feeders node")
151 self.nodes['Feeders'] = FeedersAdminGtkNode(
152 self.state, self.admin)
153
154
155 if 'eater' in config and config['eater']:
156 self.debug("Component has eaters, show Eaters node")
157 self.nodes['Eaters'] = EatersAdminGtkNode(
158 self.state, self.admin)
159
160
161 self.nodes['Properties'] = PropertiesAdminGtkNode(self.state,
162 self.admin)
163
164 d = fetchTranslations()
165 d.addCallback(addPages)
166
167
168
169 return
170
172 """
173 Return a dict of admin UI nodes.
174
175 @rtype: dict of str -> L{BaseAdminGtkNode}
176 @returns: dict of name (untranslated) -> admin node
177 """
178 return self.nodes
179
180
181
183 """
184 Render the GTK+ admin view for this component and return the
185 main widget for embedding.
186 """
187 raise NotImplementedError
188
194
195 - def stateSet(self, object, key, value):
197
200
203