diff -r 000000000000 -r f58d6ec98e88 aknlayoutcompiler/src/CppWriter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/aknlayoutcompiler/src/CppWriter.cpp Thu Dec 17 09:14:18 2009 +0200 @@ -0,0 +1,709 @@ +/* +* 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: +* +* +*/ + + +#include "CppWriter.h" +#include "layoutcompilererr.h" +#include "CodeGenConsts.h" +#include "UsefulDefinitions.h" + +#include + +#include +#include +#include // !!! for debug output only + +using namespace CdlCompilerToolkit; + +string whiteSpace = " \t\r\n"; + +const string KTextOutputOrder[] = {"C", "l", "r", "B", "W", "J", "Font"}; +const string KTextOutputOrderMirrored[] = {"C", "r", "l", "B", "W", "J", "Font"}; +const int KTextOutputOrderSize = ARRAY_LEN(KTextOutputOrder); + +const string KWindowOutputOrder[] = {"C", "l", "t", "r", "b", "W", "H"}; +const string KWindowOutputOrderMirrored[] = {"C", "r", "t", "l", "b", "W", "H"}; +const int KWindowOutputOrderSize = ARRAY_LEN(KWindowOutputOrder); + +// class TValuesCppWriter +void TValuesCppWriter::WriteCpp(ostream& aCpp) + { + for (TValues::const_iterator it = iValues.begin(); it != iValues.end(); ++it) + { + if (it != iValues.begin()) + aCpp << ", "; + aCpp << TValues::CppValue(*it); + } + } + + +// class TLayoutLineCppWriter + +void TLayoutLineCppWriter::WriteCpp(ostream& aCpp) + { + // write line structure + WriteLineClassName(aCpp); + aCpp << Name() << " = { "; + WriteCppData(aCpp); + aCpp << " };" << endl << endl; + } + + +void TLayoutLineCppWriter::WriteCppData(ostream& aCpp) + { + if (iLine.iNeedsIndex) + WriteVarCppData(aCpp); + else + WriteFixedCppData(aCpp); + } + + +int TLayoutLineCppWriter::WriteParamList(ostream& aLag, const vector& aParams) + { + int written = 0; + if (aParams.size() > 0) + { + written = 2*aParams.size(); + aLag << "("; + for (vector::const_iterator pParam = aParams.begin(); pParam != aParams.end(); ++pParam) + { + if (pParam != aParams.begin()) + aLag << ", "; + aLag << *pParam; + written += pParam->size(); + } + aLag << ")"; + } + return written; + } + +int TLayoutLineCppWriter::ValCount() + { + int count = 0; + for (TLayoutLine::const_iterator pVal = iLine.begin(); pVal != iLine.end(); ++pVal) + { + if (TLayoutTable::IsValueColumn(pVal->first)) + count += pVal->second.size(); + } + return count; + } + + +// class TWindowLineCppWriter + +string TWindowLineCppWriter::Name() + { + if (iLine.iIsUnique) + return CdlTkUtil::ToCpp(iLine.Name()); + else + return CdlTkUtil::ToCpp(iLine.TableName()); + } + +void TWindowLineCppWriter::WriteLineClassName(ostream& aCpp) + { + if (iLine.iNeedsIndex) + { + aCpp << "const SVarWindowLine<" << ValCount() << "> "; + } + else + { + aCpp << "const SFixedWindowLine "; + } + } + +void TWindowLineCppWriter::WriteVarCppData(ostream& aCpp) + { + aCpp << " { "; // suppress the first offset + + int offset = 0; + for (int i=0; i0) + aCpp << ", "; + TValuesCppWriter writer(iLine[KWindowOutputOrder[i]]); + writer.WriteCpp(aCpp); + } + } + +void TWindowLineCppWriter::FillParamLists(vector& aDef, vector& aCtor) + { + if (iLine.iNeedsP) + { + aDef.push_back(KParamParentRect); + aCtor.push_back(KParamParentRect); + } + + if (iLine.iNeedsIndex) + { + aCtor.push_back(CdlTkUtil::IntToString(iLine.iIsMirroredHorizontally)); + + for (int i=0; i def_params; + vector ctor_params; + ctor_params.push_back(CdlTkUtil::IntToString(iLine.iGlobalIndex)); + + FillParamLists(def_params, ctor_params); + + aLag << "#define AKN_LAYOUT_WINDOW_" << Name(); + WriteParamList(aLag, def_params); + aLag << "\t" << KTypeWindowLineLayout; + WriteParamList(aLag, ctor_params); + aLag << endl; + } + + +// class TTextLineCppWriter + +string TTextLineCppWriter::Name() + { + return CdlTkUtil::ToCpp(iLine.TableName()); + } + +void TTextLineCppWriter::FillParamLists(vector& aDef, vector& aCtor) + { + iBaseLineVariation = false; + + if (iLine.iNeedsP) + { + aDef.push_back(KParamParentRect); + aCtor.push_back(KParamParentRect); + } + + if (iLine.iNeedsIndex) + { + aCtor.push_back(CdlTkUtil::IntToString(iLine.iIsMirroredHorizontally)); + + for (int i=0; i def_params; + vector ctor_params; + ctor_params.push_back(CdlTkUtil::IntToString(iLine.iGlobalIndex)); + + FillParamLists(def_params, ctor_params); + + aLag << "#define AKN_LAYOUT_TEXT_" << Name(); + WriteParamList(aLag, def_params); + aLag << "\t" << KTypeTextLineLayout; + WriteParamList(aLag, ctor_params); + aLag << endl; + +// Also write out a multiline_text if there are more than one Baselines supplied. Number of lines is always user-supplied + vector multiline_def_params; + vector multiline_ctor_params; + + if ( iBaseLineVariation ) + { + multiline_ctor_params.push_back(CdlTkUtil::IntToString(iLine.iGlobalIndex)); + + if (iLine.iNeedsP) + { + multiline_def_params.push_back(KParamParentRect); + multiline_ctor_params.push_back(KParamParentRect); + } + + if (iLine.iNeedsIndex) // this condition has already been tested when setting iBaseLineVariation, but check again here for completeness + { + multiline_ctor_params.push_back(CdlTkUtil::IntToString(iLine.iIsMirroredHorizontally)); + } + + for (int i=0; i "; + } + else + { + aCpp << "const SFixedTextLine "; + } + } + +void TTextLineCppWriter::WriteVarCppData(ostream& aCpp) + { + aCpp << " { "; // ! Do not write out the first 0 + + int offset = 0; + for (int i=0; i 0 ) + aCpp << ", "; + TValuesCppWriter writer(iLine[KTextOutputOrder[i]]); + writer.WriteCpp(aCpp); + } + } + +void TTextLineCppWriter::WriteMultiLineTextParamList(ostream& aLag, const vector& aParams) + { + if (aParams.size() > 0) + { + aLag << "("; + for (vector::const_iterator pParam = aParams.begin(); pParam != aParams.end(); ++pParam) + { + if (pParam != aParams.begin()) + aLag << ", "; + aLag << *pParam; + } + aLag << ", " << KParamNameNumberOfLinesShown; + aLag << ")"; + } + } + + +// class TLayoutTableCppWriter + +void TLayoutTableCppWriter::WriteCppLineData(ostream& aCpp) + { + for (TLayoutTable::iterator it = iTable.begin(); it != iTable.end(); ++it) + { + TLayoutLineCppWriter* writer = CreateLayoutLineCppWriter(**it, iTable); + writer->WriteCpp(aCpp); + delete writer; + } + } + +void TLayoutTableCppWriter::WriteCppTableData(ostream& aCpp) + { + } + +void TLayoutTableCppWriter::WriteLag(ostream& aLag) + { + aLag << endl; + int count=0; + for (TLayoutTable::TLayoutSubTables::iterator it = iTable.iSubTables.begin(); it != iTable.iSubTables.end(); ++it) + { + WriteLagSubTable(**it, count++, aLag); + } + } + + +void TLayoutTableCppWriter::WriteLagSubTable(const TLayoutTable::TLayoutSubTable& aSubTable, int aCount, ostream& aLag) + { + // normal version + string macro = "#define AKN_LAYOUT_TABLE_"; + macro = macro + CdlTkUtil::ToCpp(iTable.Name()); + if (aSubTable.size() != iTable.size()) + { + macro = macro + "_SUB_TABLE_" + CdlTkUtil::IntToString(aCount); + aLag << "// Sub table for " << iTable.Name() << ". Valid line indices are "; + for (TLayoutTable::TLayoutSubTable::const_iterator pNum = aSubTable.begin(); pNum != aSubTable.end(); ++pNum) + { + if (pNum != aSubTable.begin()) + aLag << ", "; + aLag << CdlTkUtil::IntToString(*pNum); + } + aLag << endl; + } + + aLag << macro; + + int lineSet = 0; + for (TLayoutTable::TLayoutSubTable::const_iterator pNum = aSubTable.begin(); pNum != aSubTable.end(); ++pNum) + { + if (*pNum < 32) + lineSet |= (1 << *pNum); + } + + vector def_params; + def_params.push_back(KParamLineIndex); + vector ctor_params; + ctor_params.push_back(CdlTkUtil::IntToString(iTable.iFirstLineGlobalIndex)); + ctor_params.push_back(KParamLineIndex); + ctor_params.push_back(CdlTkUtil::IntToHexString(lineSet)); + + TLayoutLineCppWriter* writer = CreateLayoutLineCppWriter(*iTable[aSubTable[0]], iTable); + writer->FillParamLists(def_params, ctor_params); + int paramSize = writer->WriteParamList(aLag, def_params); + + // some maths to make bigger tabulation + int numTabs = 6-(((paramSize+macro.size())/4)%6); + for (int i=0; iWriteParamList(aLag, ctor_params); + aLag << endl; + + delete writer; + } + +TLayoutLineCppWriter* TLayoutTableCppWriter::CreateLayoutLineCppWriter(TLayoutLine& aLine, TLayoutTable& aTable) + { + if (aTable.iType == TLayoutTable::EWindowTable) + return new TWindowLineCppWriter(aLine); + else + return new TTextLineCppWriter(aLine); + } + + +// class TLayoutCppWriter + +void TLayoutCppWriter::WriteCppLineData(ostream& aCpp) + { + for (TLayout::iterator it = iLayout.begin(); it != iLayout.end(); ++it) + { + TLayoutTableCppWriter writer(**it); + writer.WriteCppLineData(aCpp); + } + } + +void TLayoutCppWriter::WriteCppTableData(ostream& aCpp) + { + } + +void TLayoutCppWriter::WriteLag(ostream& aLag) + { + aLag << endl << endl << "// Layout MACROs for indexed table access" << endl; + // write the macros + for (TLayout::iterator it = iLayout.begin(); it != iLayout.end(); ++it) + { + TLayoutTable& table = **it; + if (table.IsWorthATableIndex()) + { + TLayoutTableCppWriter writer(table); + writer.WriteLag(aLag); + } + } + + aLag << endl << "#endif " << endl; + } + + +// class TLayoutLineTable + +void TLayoutLineTable::WriteCpp(ostream& aCpp) + { + aCpp << "const TAny* const KTheLineTable[] =" << endl << "\t{" << endl << "\t"; + int index = 0; + for (iterator it = begin(); it != end(); ++it) + { + TLayoutLine& line = **it; + TLayoutTable& table = *line.iTable; + if (table.iFirstLineGlobalIndex == -1) + table.iFirstLineGlobalIndex = index; + TLayoutLineCppWriter* writer = TLayoutTableCppWriter::CreateLayoutLineCppWriter(line, table); + if (it != begin()) + aCpp << "," << endl << "\t"; + aCpp << "&" << writer->Name(); + delete writer; + index++; + } + aCpp << endl << "\t};" << endl; + } + +void TLayoutLineTable::WriteLag(ostream& aLag) + { + string current_table_name = ""; + + for (iterator it = begin(); it != end(); ++it) + { + TLayoutLine& line = **it; + + if ( current_table_name != line.iTable->Name() ) + { + aLag << endl << "//" << " Layout MACROs for LAF Table : " << line.iTable->Name() << endl ; + current_table_name = line.iTable->Name(); + } + + TLayoutLineCppWriter* writer = TLayoutTableCppWriter::CreateLayoutLineCppWriter(line, *line.iTable); + writer->WriteMacro(aLag); + delete writer; + } + } + + +// class TLayoutLineTable + +TCppWriter::TCppWriter(TLayout& aLayout, const std::string& aName) +: TLayWriterBase(aLayout, aName) + { + } + +void TCppWriter::Write(const std::string& aLayName) + { + std::string lay = aLayName.substr(aLayName.find_last_of('\\')+1); + lay = lay.substr(0, lay.find_first_of('.')); + + iShortName = iName.substr(iName.find_last_of('\\')+1); + iName = iName.substr(0, iName.find_first_of('.')) + lay; + + BuildLayoutLineTable(); + CCdlTkFileCleanup temp(iName+".lag"); + Output(iName+".cpp", iName+".lag", lay); + CdlTkUtil::ExportFile(temp, KDirEpocSysHeader+iShortName+".lag"); + } + +void TCppWriter::Output(const string& aCpp, const string& aLag, const string& aLayName) + { + cout << "writing cpp " << aCpp << endl; + ofstream cpp(aCpp.c_str()); + WriteCppHeader(cpp); + TLayoutCppWriter writer(iLayout); + writer.WriteCppLineData(cpp); + iLineTable.WriteCpp(cpp); + writer.WriteCppTableData(cpp); + WriteCppFooter(cpp, aLayName); + cpp.close(); + + cout << "writing header " << aLag << endl; + ofstream lag(aLag.c_str()); + WriteLagHeader(lag); + iLineTable.WriteLag(lag); + writer.WriteLag(lag); + lag.close(); + } + +void TCppWriter::BuildLayoutLineTable() + { + int globalIndex = 0; + for (TLayout::const_iterator pTab = iLayout.begin(); pTab != iLayout.end(); ++pTab) + { + for (TLayoutTable::const_iterator pLine = (*pTab)->begin(); pLine != (*pTab)->end(); ++pLine) + { + (*pLine)->iGlobalIndex = globalIndex++; + iLineTable.push_back(*pLine); + } + } + } + +void TCppWriter::WriteCppHeader(ostream& aCpp) + { + aCpp << "/*" << endl; + aCpp << "* ============================================================================" << endl; + aCpp << "* Name : " << iShortName << ".cpp" << endl; + aCpp << "* Part of : Avkon" << endl; + aCpp << "*" << endl; + aCpp << "* Description: This file is automatically generated layout data file." << endl; + aCpp << "*" << endl; + aCpp << "* Version :" << endl; + aCpp << "*" << endl; + aCpp << "* Copyright © 2002-2004 Nokia Corporation." << endl; + aCpp << "* This material, including documentation and any related" << endl; + aCpp << "* computer programs, is protected by copyright controlled by" << endl; + aCpp << "* Nokia Corporation. All rights are reserved. Copying,"<< endl; + aCpp << "* including reproducing, storing, adapting or translating, any" << endl; + aCpp << "* or all of this material requires the prior written consent of" << endl; + aCpp << "* Nokia Corporation. This material also contains confidential" << endl; + aCpp << "* information which may not be disclosed to others without the" << endl; + aCpp << "* prior written consent of Nokia Corporation." << endl; + aCpp << "* ============================================================================" << endl; + aCpp << "*/" << endl << endl; + aCpp << "#include \"aknlayoutdatadef.h\"" << endl << endl; + } + +void TCppWriter::WriteCppFooter(ostream& aCpp, const string& aLayName) + { + aCpp << endl << "const TAny* GetData_" << aLayName << "(" << KTypeInt << " aLineId) { return KTheLineTable[aLineId]; }" << endl; + } + +void TCppWriter::WriteLagHeader(ostream& aLag) + { + aLag << "/*" << endl; + aLag << "* ============================================================================" << endl; + aLag << "* Name : " << iShortName << ".lag" << endl; + aLag << "* Part of : Avkon" << endl; + aLag << "*" << endl; + aLag << "* Description: This file is automatically generated layout file." << endl; + aLag << "*" << endl; + aLag << "* Version :" << endl; + aLag << "*" << endl; + aLag << "* Copyright © 2002-2004 Nokia Corporation." << endl; + aLag << "* This material, including documentation and any related" << endl; + aLag << "* computer programs, is protected by copyright controlled by" << endl; + aLag << "* Nokia Corporation. All rights are reserved. Copying,"<< endl; + aLag << "* including reproducing, storing, adapting or translating, any" << endl; + aLag << "* or all of this material requires the prior written consent of" << endl; + aLag << "* Nokia Corporation. This material also contains confidential" << endl; + aLag << "* information which may not be disclosed to others without the" << endl; + aLag << "* ============================================================================" << endl; + aLag << "*/" << endl << endl; + aLag << "#if !defined(__" << iShortName << "_LAG__)" << endl; + aLag << "#define __" << iShortName << "_LAG__" << endl; + aLag << "#include " << endl << endl; + } + +// End of File