1 # Copyright 2015 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file.
10 """// Copyright %(year)d The Chromium Authors. All rights reserved.
11 // Use of this source code is governed by a BSD-style license that can be
12 // found in the LICENSE file.
14 // NOTE: this file is generated from "%(source)s". Do not modify directly.
16 #ifndef %(include_guard)s
17 #define %(include_guard)s
19 #include "base/macros.h"
20 #include "components/webui_generator/view_model.h"
21 #include "%(export_h_include_path)s"
27 %(children_forward_declarations)s
31 class %(export_macro)s %(class_name)s : public ::webui_generator::ViewModel {
33 using FactoryFunction = %(class_name)s* (*)(content::BrowserContext*);
37 static %(class_name)s* Create(content::BrowserContext* context);
38 static void SetFactory(FactoryFunction factory);
48 void Initialize() override {}
49 void OnAfterChildrenReady() override {}
50 void OnViewBound() override {}
53 void OnEvent(const std::string& event) final;
55 static FactoryFunction factory_function_;
60 #endif // %(include_guard)s
63 CHILD_FORWARD_DECLARATION_TEMPLATE
= \
68 CONTEXT_KEY_DECLARATION_TEMPLATE
= \
69 """ static const char %s[];"""
71 CHILD_GETTER_DECLARATION_TEMPLATE
= \
72 """ virtual gen::%(child_type)s* %(method_name)s() const;""";
74 CONTEXT_VALUE_GETTER_DECLARATION_TEMPLATE
= \
75 """ %(type)s %(method_name)s() const;"""
77 EVENT_HANDLER_DECLARATION_TEMPLATE
= \
78 """ virtual void %s() = 0;"""
81 """// Copyright %(year)d The Chromium Authors. All rights reserved.
82 // Use of this source code is governed by a BSD-style license that can be
83 // found in the LICENSE file.
85 // NOTE: this file is generated from "%(source)s". Do not modify directly.
87 #include "%(header_path)s"
89 #include "base/logging.h"
90 #include "components/webui_generator/view.h"
97 %(class_name)s::FactoryFunction %(class_name)s::factory_function_;
99 %(class_name)s* %(class_name)s::Create(content::BrowserContext* context) {
100 CHECK(factory_function_) << "Factory function for %(class_name)s was not "
102 return factory_function_(context);
105 void %(class_name)s::SetFactory(FactoryFunction factory) {
106 factory_function_ = factory;
109 %(class_name)s::%(class_name)s() {
117 void %(class_name)s::OnEvent(const std::string& event) {
118 %(event_dispatcher_body)s
119 LOG(ERROR) << "Unknown event '" << event << "'";
125 CONTEXT_KEY_DEFINITION_TEMPLATE
= \
126 """const char %(class_name)s::%(name)s[] = "%(value)s";"""
128 CHILD_GETTER_DEFINITION_TEMPLATE
= \
129 """gen::%(child_type)s* %(class_name)s::%(method_name)s() const {
130 return static_cast<gen::%(child_type)s*>(
131 view()->GetChild("%(child_id)s")->GetViewModel());
135 CONTEXT_VALUE_GETTER_DEFINITION_TEMPLATE
= \
136 """%(type)s %(class_name)s::%(method_name)s() const {
137 return context().%(context_getter)s(%(key_constant)s);
141 FIELD_TYPE_TO_GETTER_TYPE
= {
145 'string': 'std::string',
146 'string_list': 'login::StringList'
149 DISPATCH_EVENT_TEMPLATE
= \
150 """ if (event == "%(event_id)s") {
155 def GetCommonSubistitutions(declaration
):
157 subs
['year'] = datetime
.date
.today().year
158 subs
['class_name'] = declaration
.view_model_class
159 subs
['source'] = declaration
.path
162 def FieldNameToConstantName(field_name
):
163 return 'kContextKey' + util
.ToUpperCamelCase(field_name
)
165 def GenContextKeysDeclarations(fields
):
167 (CONTEXT_KEY_DECLARATION_TEMPLATE
% \
168 FieldNameToConstantName(f
.name
) for f
in fields
))
170 def GenChildrenForwardDeclarations(children
):
172 for declaration
in set(children
.itervalues()):
173 lines
.append(CHILD_FORWARD_DECLARATION_TEMPLATE
% {
174 'child_type': declaration
.view_model_class
176 return '\n'.join(lines
)
178 def ChildIdToChildGetterName(id):
179 return 'Get%s' % util
.ToUpperCamelCase(id)
181 def GenChildrenGettersDeclarations(children
):
183 for id, declaration
in children
.iteritems():
184 lines
.append(CHILD_GETTER_DECLARATION_TEMPLATE
% {
185 'child_type': declaration
.view_model_class
,
186 'method_name': ChildIdToChildGetterName(id)
188 return '\n'.join(lines
)
190 def FieldNameToGetterName(field_name
):
191 return 'Get%s' % util
.ToUpperCamelCase(field_name
)
193 def GenContextGettersDeclarations(context_fields
):
195 for field
in context_fields
:
196 lines
.append(CONTEXT_VALUE_GETTER_DECLARATION_TEMPLATE
% {
197 'type': FIELD_TYPE_TO_GETTER_TYPE
[field
.type],
198 'method_name': FieldNameToGetterName(field
.name
)
200 return '\n'.join(lines
)
202 def EventIdToMethodName(event
):
203 return 'On' + util
.ToUpperCamelCase(event
)
205 def GenEventHandlersDeclarations(events
):
208 lines
.append(EVENT_HANDLER_DECLARATION_TEMPLATE
%
209 EventIdToMethodName(event
))
210 return '\n'.join(lines
)
212 def GenHFile(declaration
):
213 subs
= GetCommonSubistitutions(declaration
)
214 subs
['include_guard'] = \
215 util
.PathToIncludeGuard(declaration
.view_model_include_path
)
216 subs
['context_keys'] = GenContextKeysDeclarations(declaration
.fields
)
217 subs
['children_forward_declarations'] = \
218 GenChildrenForwardDeclarations(declaration
.children
)
219 subs
['children_getters'] = \
220 GenChildrenGettersDeclarations(declaration
.children
);
221 subs
['context_getters'] = \
222 GenContextGettersDeclarations(declaration
.fields
);
223 subs
['event_handlers'] = GenEventHandlersDeclarations(declaration
.events
)
224 subs
['export_h_include_path'] = declaration
.export_h_include_path
225 subs
['export_macro'] = declaration
.component_export_macro
226 return H_FILE_TEMPLATE
% subs
228 def GenContextKeysDefinitions(declaration
):
230 for field
in declaration
.fields
:
231 definition
= CONTEXT_KEY_DEFINITION_TEMPLATE
% {
232 'class_name': declaration
.view_model_class
,
233 'name': FieldNameToConstantName(field
.name
),
236 lines
.append(definition
)
237 return '\n'.join(lines
)
239 def GenChildrenIncludes(children
):
241 for declaration
in set(children
.itervalues()):
242 lines
.append('#include "%s"' % declaration
.view_model_include_path
)
243 return '\n'.join(lines
)
245 def GenContextFieldInitialization(field
):
247 key_constant
= FieldNameToConstantName(field
.name
)
248 setter_method
= 'Set' + util
.ToUpperCamelCase(field
.type)
249 if field
.type == 'string_list':
251 lines
.append(' std::vector<std::string> defaults;')
252 for s
in field
.default_value
:
253 lines
.append(' defaults.push_back("%s");' % s
)
254 lines
.append(' context().%s(%s, defaults);' %
255 (setter_method
, key_constant
))
258 setter
= ' context().%s(%s, ' % (setter_method
, key_constant
)
259 if field
.type in ['integer', 'double']:
260 setter
+= str(field
.default_value
)
261 elif field
.type == 'boolean':
262 setter
+= 'true' if field
.default_value
else 'false'
264 assert field
.type == 'string'
265 setter
+= '"%s"' % field
.default_value
268 return '\n'.join(lines
)
270 def GenChildrenGettersDefenitions(declaration
):
272 for id, child
in declaration
.children
.iteritems():
273 lines
.append(CHILD_GETTER_DEFINITION_TEMPLATE
% {
274 'child_type': child
.view_model_class
,
275 'class_name': declaration
.view_model_class
,
276 'method_name': ChildIdToChildGetterName(id),
279 return '\n'.join(lines
)
281 def GenContextGettersDefinitions(declaration
):
283 for field
in declaration
.fields
:
284 lines
.append(CONTEXT_VALUE_GETTER_DEFINITION_TEMPLATE
% {
285 'type': FIELD_TYPE_TO_GETTER_TYPE
[field
.type],
286 'class_name': declaration
.view_model_class
,
287 'method_name': FieldNameToGetterName(field
.name
),
288 'context_getter': 'Get' + util
.ToUpperCamelCase(
290 'key_constant': FieldNameToConstantName(field
.name
)
292 return '\n'.join(lines
)
294 def GenEventDispatcherBody(events
):
297 lines
.append(DISPATCH_EVENT_TEMPLATE
% {
298 'event_id': util
.ToLowerCamelCase(event
),
299 'method_name': EventIdToMethodName(event
)
301 return '\n'.join(lines
)
303 def GenCCFile(declaration
):
304 subs
= GetCommonSubistitutions(declaration
)
305 subs
['header_path'] = declaration
.view_model_include_path
306 subs
['context_keys'] = GenContextKeysDefinitions(declaration
)
307 subs
['children_includes'] = GenChildrenIncludes(declaration
.children
)
308 initializations
= [GenContextFieldInitialization(field
) \
309 for field
in declaration
.fields
]
310 initializations
.append(' base::DictionaryValue diff;');
311 initializations
.append(' context().GetChangesAndReset(&diff);');
312 subs
['constructor_body'] = '\n'.join(initializations
)
313 subs
['children_getters'] = GenChildrenGettersDefenitions(declaration
)
314 subs
['context_getters'] = GenContextGettersDefinitions(declaration
)
315 subs
['event_dispatcher_body'] = GenEventDispatcherBody(declaration
.events
)
316 return CC_FILE_TEMPLATE
% subs
318 def ListOutputs(declaration
, destination
):
319 dirname
= os
.path
.join(destination
, os
.path
.dirname(declaration
.path
))
320 h_file_path
= os
.path
.join(dirname
, declaration
.view_model_h_name
)
321 cc_file_path
= os
.path
.join(dirname
, declaration
.view_model_cc_name
)
322 return [h_file_path
, cc_file_path
]
324 def Gen(declaration
, destination
):
325 h_file_path
, cc_file_path
= ListOutputs(declaration
, destination
)
326 util
.CreateDirIfNotExists(os
.path
.dirname(h_file_path
))
327 open(h_file_path
, 'w').write(GenHFile(declaration
))
328 open(cc_file_path
, 'w').write(GenCCFile(declaration
))