diff -r 000000000000 -r fb279309251b uidesigner/com.nokia.sdt.series60.componentlibrary/components/dataModelGenLibrary.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uidesigner/com.nokia.sdt.series60.componentlibrary/components/dataModelGenLibrary.js Fri Apr 03 23:33:03 2009 +0100 @@ -0,0 +1,146 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ +// Routines to help generate C/C++ data model code + +/** + * Declare accessors for the given instance, which is + * expected to have an attribute data-model-cpp-type representing + * the C/C++ type (e.g. "int", "TBool"), which dictates how + * its code is generated. Note that "TDes" is the expected + * type for generic string access and underneath "TBuf<...>" is + * used for mutable storage; a property "maxLength" should appear on the + * instance to describe the maximum length. + * @param contribs the contrib list to append + * @param instance the instance + * @param dataModelClassName the name of the generated class + * @param methodPhase the phase receiving method declarations + * @param memberPhase the phase receiving member declarations + * @param constantsPhase the phase receiving constant declarations + * @param mainPhase the phase receiving the main *.cpp file contributions + */ +function setupDataModelAccessors(contribs, instance, dataModelClassName, methodPhase, memberPhase, constantsPhase, mainPhase) { + var type = getDataModelItemType(instance); + var memberName = "i"+titleCase(instance.name); + + var contrib; + + var getterName = getDataModelGetterMethodName(instance); + var setterName = getDataModelSetterMethodName(instance); + var storageType; + var paramType; + var returnType; + var setterCode; + if (type != "TDes") { + storageType = type; + paramType = type; + returnType = type; + setterCode = "\t" + memberName + " = aValue;\n"; + } else { + var constName = "K" + titleCase(instance.name) + "MaxLength"; + contrib = Engine.createContributionForPhase(constantsPhase); + contrib.setFormattedText("const int {0} = {1};\n", + [ constName, + instance.properties.maxLength ]); + contribs.add(contrib); + paramType = "TDesC"; + returnType = "TDes"; + storageType = "TBuf<" + constName + ">"; + setterCode = + "\tif ( aValue.Length() < " + constName + ")\n"+ + "\t\t" + memberName + ".Copy( aValue );\n"+ + "\telse\n"+ + "\t\t" + memberName + ".Copy( aValue.Ptr(), " + constName + ");\n"; + } + contrib = Engine.createContributionForPhase(memberPhase); + contrib.setFormattedText("{0} {1};\n", [ storageType, memberName ]); + contribs.add(contrib); + + contrib = Engine.createContributionForPhase(methodPhase); + contrib.setFormattedText("{0}& {1}();\n", [ returnType, getterName ]); + contribs.add(contrib); + + contrib = Engine.createContributionForPhase(mainPhase); + contrib.setFormattedText( + "{0}& {2}::{1}()\n"+ + "\t'{'\n"+ + "\treturn {3};\n"+ + "\t'}'\n"+ + "\n", + [ returnType, getterName, dataModelClassName, memberName ]); + contribs.add(contrib); + + contrib = Engine.createContributionForPhase(methodPhase); + contrib.setFormattedText("void {1}(const {0}& aValue);\n", + [ paramType, setterName ]); + contribs.add(contrib); + + contrib = Engine.createContributionForPhase(mainPhase); + contrib.setFormattedText( + "void {2}::{1}(const {0}& aValue)\n"+ + "\t'{'\n"+ + setterCode + + "\t'}'\n"+ + "\n", + [ paramType, setterName, dataModelClassName ]); + contribs.add(contrib); + +} + +/** + * Get the name of the getter method for an item. + */ +function getDataModelGetterMethodName(instance) { + return titleCase(instance.name); +} + +/** + * Get the name of the setter method for an item. + */ +function getDataModelSetterMethodName(instance) { + return "Set" + titleCase(instance.name); +} + +/** + * Get the name of the C/C++ parameter type of an item. + */ +function getDataModelItemType(instance) { + if (instance.component != null) + return instance.component.attributes["data-model-cpp-type"]; + return null; +} + +/** + * Generate a call that sets the data model item value. + * @param contribs the contribution list to append + * @param indent indentation adjustment + * @param phaseName name of phase to use + * @param formName the form to use + * @param modelName the name of the model object (or null for this) + * @param instance the instance + * @param valueName the name of the value to set (expression) + */ +function generateDataModelItemInitializer(contribs, indent, phaseName, formName, modelName, instance, valueName) { + var setterName = getDataModelSetterMethodName(instance); + var contrib = Engine.createContributionForPhase(phaseName); + contrib.setFormattedText("{0}{1}( {2} );\n", + [modelName != null ? modelName + "." : "", + setterName, + valueName]); + contrib.setForm(formName); + contrib.indentAdjust(indent); + contribs.add(contrib); +}