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