aknlayoutcompiler/src/Lay2MLInst.cpp
changeset 0 f58d6ec98e88
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/aknlayoutcompiler/src/Lay2MLInst.cpp	Thu Dec 17 09:14:18 2009 +0200
@@ -0,0 +1,329 @@
+/*
+* 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:  
+*
+*/
+
+
+// disable "identifier was truncated to '255' characters in the browser information" warning
+#pragma warning (disable:4786)
+
+#include "lay2MLInst.h"
+#include "LayoutParse.h"
+#include "LayoutCompilerErr.h"
+
+#include <fstream>
+#include <iostream>
+#include <algorithm>
+#include "MLInstWriter.h"
+//#include "MLInstParse.h"
+
+string TextOutputOrder(int aIndex, bool aMirrored);
+string WindowOutputOrder(int aIndex, bool aMirrored);
+
+using namespace std;
+
+class LayoutToMLInstArgsErr : public LayoutCompilerErr
+	{
+	void Show(ostream& aStream) const;
+	};
+
+void LayoutToMLInstArgsErr::Show(ostream& stream) const
+	{
+	LayoutToMLInst::ShowHelp(stream);
+	}
+
+string LayoutToMLInst::InterfaceName(const string& aFileName)
+	{
+	return aFileName.substr(0,aFileName.find_last_of('.'));
+	}
+
+int LayoutToMLInst::Process(const vector<string>& args)
+	{
+	if (args.size() != 4)
+		throw LayoutToMLInstArgsErr();
+
+	// first read in the lay file
+	string layoutName = args[2];
+	auto_ptr<TLayParseLayout> layoutParse(TLayParseLayout::Parse(layoutName));
+
+	// then convert it to internal structure format
+	auto_ptr<TMLInst> mlInst(LayoutToInst(*layoutParse));
+
+	// finally write out the structure XML
+	string xmlName = args[3];
+	cout << "writing XML file " << xmlName << endl;
+	TMLInstWriter writer(*mlInst, xmlName);
+	writer.Write(layoutName);
+	return 0;
+	}
+
+void LayoutToMLInst::ShowHelp(ostream& stream)
+	{
+	stream << "Lay2MLInst <layoutName> <instXmlName>" << endl;
+	}
+
+auto_ptr<TMLInst> LayoutToMLInst::LayoutToInst(const TLayout& aLayout)
+	{
+	auto_ptr<TMLInst> mlInst(new TMLInst);
+
+	for (TLayout::const_iterator pTab = aLayout.begin(); pTab != aLayout.end(); ++pTab)
+		{
+		AddTableToInst(*mlInst, **pTab);
+		}
+	
+	return mlInst;
+	}
+
+void LayoutToMLInst::AddTableToInst(TMLInst& aInst, TLayoutTable& aTable)
+	{
+	TMLInstTable* instTable = new TMLInstTable(&aInst, aTable);
+
+	for (TLayoutTable::iterator pLine = aTable.begin(); pLine != aTable.end(); ++pLine)
+		{
+		if (aTable.iType == TLayoutTable::EWindowTable)
+			AddWindowLineToInstTable(*instTable, **pLine);
+		else
+			AddTextLineToInstTable(*instTable, **pLine);
+		}
+
+/*
+	int tableNum = 0;
+	for (TLayoutTable::TLayoutSubTables::const_iterator pSub = aTable.iSubTables.begin(); pSub != aTable.iSubTables.end(); ++pSub)
+		{
+		AddTableLimitsToInterface(aInterface, aTable, **pSub, tableNum);
+		if (aTable.iType == TLayoutTable::EWindowTable)
+			AddSubTableToInterface("TAknWindowLineLayout", aInterface, aTable, **pSub, tableNum);
+		else
+			AddSubTableToInterface("TAknTextLineLayout", aInterface, aTable, **pSub, tableNum);
+		tableNum++;
+		}
+*/
+	aInst.push_back(instTable);
+	}
+
+void LayoutToMLInst::AddWindowLineToInstTable(TMLInstTable& aInstTable, TLayoutLine& aLine)
+	{
+	TMLInstLine* instLine = new TMLInstLine(&aInstTable, aLine);
+/*
+	CCdlTkApi* api = CreateGenericApi(aInterface, aLine);
+	api->SetName(LineApiName(aLine));
+	api->SetReturnType("TAknWindowLineLayout");
+	aInterface.ApiList().push_back(api);
+*/
+
+
+	// add a value for each top level cell
+	for (int i=0; i<7; i++)
+		{
+		string cellName = WindowOutputOrder(i, false);
+//		WriteCell(line, cellName, aLine[cellName]);
+		AddParamToLine(*instLine, aLine[cellName]);
+		}
+
+/*
+	for(TLayoutLine::iterator pValue = aLine.begin(); pValue != aLine.end(); ++pValue)
+		{
+		AddParamToLine(instLine, *pValue);
+		}
+*/
+	aInstTable.push_back(instLine);
+	}
+
+void LayoutToMLInst::AddTextLineToInstTable(TMLInstTable& aInstTable, TLayoutLine& aLine)
+	{
+	TMLInstLine* instLine = new TMLInstLine(&aInstTable, aLine);
+
+/*
+	CCdlTkApi* api = CreateGenericApi(aInterface, aLine);
+
+	api->SetName(LineApiName(aLine));
+	api->SetReturnType("TAknTextLineLayout");
+
+	aInterface.ApiList().push_back(api);
+*/
+
+	for (int i=0; i<6; i++)
+		{
+		string cellName = TextOutputOrder(i, false);
+//		WriteCell(line, cellName, aLine[cellName]);
+		AddParamToLine(*instLine, aLine[cellName]);
+		}
+
+/*
+	for(TLayoutLine::iterator pValue = aLine.begin(); pValue != aLine.end(); ++pValue)
+		{
+		AddParamToLine(instLine, *pValue);
+		}
+*/
+	aInstTable.push_back(instLine);
+
+
+/*
+	TValues& v = aLine["B"];
+	if (v.size()>1)
+		{
+		CCdlTkFunctionApi* multiline = static_cast<CCdlTkFunctionApi*>(CreateGenericApi(aInterface, aLine));
+		CCdlTkApiParams& params = multiline->Params();
+		CCdlTkApiParams::iterator pParam = params.FindByName("aIndex_B");
+		if (pParam != params.end())
+			params.erase(pParam);
+		params.push_back(CCdlTkApiParam("TInt", "aNumberOfLinesShown"));
+
+		multiline->SetName(string("Multiline_") + LineApiName(aLine));
+		multiline->SetReturnType("TAknMultiLineTextLayout");
+
+		aInterface.ApiList().push_back(multiline);
+		}
+*/
+	}
+
+/*
+string LayoutToMLInst::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_" + IntToString(aSubTableNum);
+	}
+
+string LayoutToMLInst::LineApiName(TLayoutLine& aLine)
+	{
+	if (aLine.iTable->iType == TLayoutTable::EWindowTable)
+		{
+		TWindowLineCppWriter writer(aLine);
+		return writer.Name();
+		}
+	else
+		{
+		TTextLineCppWriter writer(aLine);
+		return writer.Name();
+		}
+	}
+
+void LayoutToMLInst::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("TInt", "aLineIndex"));
+	AddParamsToFunc(line, *api);
+
+	api->SetReturnType(aType);
+
+	api->SetName(TableApiName(aTable, aSubTable, aSubTableNum));
+
+	aInterface.ApiList().push_back(api);
+	}
+
+void LayoutToMLInst::AddTableLimitsToInterface(CCdlTkInterface& aInterface, TLayoutTable& aTable, TLayoutTable::TLayoutSubTable& aSubTable, int aSubTableNum)
+	{
+	CCdlTkFunctionApi* api = new CCdlTkFunctionApi(aInterface);
+	api->SetReturnType("TAknLayoutTableLimits");
+	api->SetName(TableApiName(aTable, aSubTable, aSubTableNum)+"_Limits");
+	aInterface.ApiList().push_back(api);
+	}
+
+CCdlTkApi* LayoutToMLInst::CreateGenericApi(CCdlTkInterface& aInterface, TLayoutLine& aLine)
+	{
+	CCdlTkFunctionApi* func = new CCdlTkFunctionApi(aInterface);
+	AddParamsToFunc(aLine, *func);
+	return func;
+	}
+
+void LayoutToMLInst::AddParamsToFunc(TLayoutLine& aLine, CCdlTkFunctionApi& aFunc)
+	{
+	CCdlTkApiParams& params = aFunc.Params();
+
+	if (aLine.iNeedsP)
+		params.push_back(CCdlTkApiParam("const TRect&", "aParentRect"));
+
+	if (aLine.iNeedsIndex)
+		{
+		const string* KParams;
+		int count;
+		if (aLine.iTable->iType == TLayoutTable::EWindowTable)
+			{
+			KParams = KWindowOutputOrder;
+			count = KWindowOutputOrderSize;
+			}
+		else
+			{
+			KParams = KTextOutputOrder;
+			count = KTextOutputOrderSize;
+			}
+
+		for (int i=0; i<count; i++)
+			{
+			const string& name = KParams[i];
+
+			const TValues& defValues = aLine[name];
+			if (defValues.iNeedsIndex)
+				{
+				CCdlTkApiParam param("TInt", CdlTkUtil::ToCpp(defValues.ParamName()));
+				if (params.FindByName(param.Name()) == params.end())
+					params.push_back(param);
+				}
+			}
+		}
+	}
+
+*/
+
+void LayoutToMLInst::AddParamToLine(TMLInstLine& aInstLine, TValues& aValue)
+	{
+//	CCdlTkApiParams& params = aFunc.Params();
+
+	TMLInstParam* instLine = new TMLInstParam(&aInstLine, aValue);
+
+	for(TValues::iterator pInt = aValue.begin(); pInt != aValue.end(); ++pInt)
+		{
+		instLine->iValues.push_back(*pInt);
+		}
+
+/*
+	if (aLine.iNeedsP)
+		params.push_back(CCdlTkApiParam("const TRect&", "aParentRect"));
+
+	if (aLine.iNeedsIndex)
+		{
+		const string* KParams;
+		int count;
+		if (aLine.iTable->iType == TLayoutTable::EWindowTable)
+			{
+			KParams = KWindowOutputOrder;
+			count = KWindowOutputOrderSize;
+			}
+		else
+			{
+			KParams = KTextOutputOrder;
+			count = KTextOutputOrderSize;
+			}
+
+		for (int i=0; i<count; i++)
+			{
+			const string& name = KParams[i];
+
+			const TValues& defValues = aLine[name];
+			if (defValues.iNeedsIndex)
+				{
+				CCdlTkApiParam param("TInt", CdlTkUtil::ToCpp(defValues.ParamName()));
+				if (params.FindByName(param.Name()) == params.end())
+					params.push_back(param);
+				}
+			}
+		}
+*/
+
+	aInstLine.push_back(instLine);
+	}