diff -r 000000000000 -r f58d6ec98e88 aknlayoutcompiler/src/Lay2Cdl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/aknlayoutcompiler/src/Lay2Cdl.cpp Thu Dec 17 09:14:18 2009 +0200 @@ -0,0 +1,263 @@ +/* +* Copyright (c) 2002-2004 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "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: +* Defines the entry point for the console application +* +*/ + + + +// disable "identifier was truncated to '255' characters in the browser information" warning +#pragma warning (disable:4786) + +#include "Lay2Cdl.h" +#include "LayoutParse.h" +#include "LayoutCompilerErr.h" +#include +#include +#include +#include +#include "CppWriter.h" +#include "CodeGenConsts.h" + +using namespace std; + +typedef LayoutProcessArgsErr LayoutToCdlArgsErr; + +const int KGeneratedInterfaceMajorVer = 1; +const int KGeneratedInterfaceMinorVer = 0; + +string LayoutToCdl::InterfaceName(const string& aFileName) + { + return aFileName.substr(0,aFileName.find_last_of('.')); + } + +int LayoutToCdl::Process(const vector& args) + { + if (args.size() != 5) + throw LayoutToCdlArgsErr(); + + string layoutName = args[2]; + auto_ptr layout(TLayParseLayout::Parse(layoutName)); + + string cdlName = args[3]; + int uid = CdlTkUtil::ParseInt(args[4]); + auto_ptr iface(LayoutToInterface(*layout)); + + SetHeaders(*iface, cdlName, uid); + + CCdlTkWriteCdlFile writer(*iface); + cout << "writing CDL file " << cdlName << endl; + writer.Process(); + return 0; + } + +void LayoutToCdl::ShowHelp(ostream& stream) + { + stream << "Lay2Cdl " << endl; + } + +auto_ptr LayoutToCdl::LayoutToInterface(const TLayout& aLayout) + { + auto_ptr iface(new CCdlTkInterface); + + for (TLayout::const_iterator pTab = aLayout.begin(); pTab != aLayout.end(); ++pTab) + { + AddTableToInterface(*iface, **pTab); + } + + return iface; + } + +void LayoutToCdl::AddTableToInterface(CCdlTkInterface& aInterface, TLayoutTable& aTable) + { + for (TLayoutTable::iterator pLine = aTable.begin(); pLine != aTable.end(); ++pLine) + { + if (aTable.iType == TLayoutTable::EWindowTable) + AddWindowLineToInterface(aInterface, **pLine); + else + AddTextLineToInterface(aInterface, **pLine); + + if (pLine == aTable.begin()) + { + CCdlTkApi& api = **aInterface.ApiList().rbegin(); + api.SetComment(string("// LAF Table : ") + aTable.Name() + "\n"); + } + } + + int tableNum = 0; + for (TLayoutTable::TLayoutSubTables::const_iterator pSub = aTable.iSubTables.begin(); pSub != aTable.iSubTables.end(); ++pSub) + { + AddTableLimitsToInterface(aInterface, aTable, **pSub, tableNum); + string tableType = KTypeTextLineLayout; + if (aTable.iType == TLayoutTable::EWindowTable) + tableType == KTypeWindowLineLayout; + AddSubTableToInterface(tableType, aInterface, aTable, **pSub, tableNum); + tableNum++; + } + } + +void LayoutToCdl::AddWindowLineToInterface(CCdlTkInterface& aInterface, TLayoutLine& aLine) + { + CCdlTkApi* api = CreateGenericApi(aInterface, aLine); + + api->SetName(LineApiName(aLine)); + api->SetReturnType(KTypeWindowLineLayout); + + aInterface.ApiList().push_back(api); + } + +void LayoutToCdl::AddTextLineToInterface(CCdlTkInterface& aInterface, TLayoutLine& aLine) + { + CCdlTkApi* api = CreateGenericApi(aInterface, aLine); + + api->SetName(LineApiName(aLine)); + api->SetReturnType(KTypeTextLineLayout); + + aInterface.ApiList().push_back(api); + + TValues& v = aLine["B"]; + if (v.size()>1) + { + CCdlTkFunctionApi* multiline = static_cast(CreateGenericApi(aInterface, aLine)); + CCdlTkApiParams& params = multiline->Params(); + CCdlTkApiParams::iterator pParam = params.FindByName(KParamNameB); + if (pParam != params.end()) + params.erase(pParam); + params.push_back(CCdlTkApiParam(KTypeInt, KParamNameNumberOfLinesShown)); + + multiline->SetName(KFuncMultiline + LineApiName(aLine)); + multiline->SetReturnType(KTypeMultiLineTextLayout); + + aInterface.ApiList().push_back(multiline); + } + } + +string LayoutToCdl::TableApiName(TLayoutTable& aTable, TLayoutTable::TLayoutSubTable& aSubTable, int aSubTableNum) + { + if (aTable.size() == aSubTable.size()) + return CdlTkUtil::ToCpp(aTable.Name()); + else + return CdlTkUtil::ToCpp(aTable.Name()) + "_SUB_TABLE_" + CdlTkUtil::IntToString(aSubTableNum); + } + +string LayoutToCdl::LineApiName(TLayoutLine& aLine) + { + if (aLine.iTable->iType == TLayoutTable::EWindowTable) + { + TWindowLineCppWriter writer(aLine); + return writer.Name(); + } + else + { + TTextLineCppWriter writer(aLine); + return writer.Name(); + } + } + +void LayoutToCdl::AddSubTableToInterface(const string& aType, CCdlTkInterface& aInterface, TLayoutTable& aTable, TLayoutTable::TLayoutSubTable& aSubTable, int aSubTableNum) + { + TLayoutLine& line = *aTable[aSubTable[0]]; + CCdlTkFunctionApi* api = new CCdlTkFunctionApi(aInterface); + api->Params().push_back(CCdlTkApiParam(KTypeInt, KParamLineIndex)); + AddParamsToFunc(line, *api); + + api->SetReturnType(aType); + + api->SetName(TableApiName(aTable, aSubTable, aSubTableNum)); + + aInterface.ApiList().push_back(api); + } + +void LayoutToCdl::AddTableLimitsToInterface(CCdlTkInterface& aInterface, TLayoutTable& aTable, TLayoutTable::TLayoutSubTable& aSubTable, int aSubTableNum) + { + CCdlTkFunctionApi* api = new CCdlTkFunctionApi(aInterface); + api->SetReturnType(KTypeLayoutTableLimits); + api->SetName(TableApiName(aTable, aSubTable, aSubTableNum)+KFuncLimitsSuffix); + aInterface.ApiList().push_back(api); + } + +CCdlTkApi* LayoutToCdl::CreateGenericApi(CCdlTkInterface& aInterface, TLayoutLine& aLine) + { + CCdlTkFunctionApi* func = new CCdlTkFunctionApi(aInterface); + AddParamsToFunc(aLine, *func); + return func; + } + +void LayoutToCdl::AddParamsToFunc(TLayoutLine& aLine, CCdlTkFunctionApi& aFunc) + { + CCdlTkApiParams& params = aFunc.Params(); + + bool mirrored = aLine.iIsMirroredHorizontally; + + if (aLine.iNeedsP) + params.push_back(CCdlTkApiParam(KTypeRect, KParamParentRect)); + + if (aLine.iNeedsIndex) + { + const string* KParams; + int count; + if (aLine.iTable->iType == TLayoutTable::EWindowTable) + { + if (mirrored) + KParams = KWindowOutputOrderMirrored; + else + KParams = KWindowOutputOrder; + count = KWindowOutputOrderSize; + } + else + { + if (mirrored) + KParams = KTextOutputOrderMirrored; + else + KParams = KTextOutputOrder; + count = KTextOutputOrderSize; + } + + for (int i=0; i"); + } +