diff -r 000000000000 -r f58d6ec98e88 aknlayoutcompiler/src/MasterLayoutPack.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/aknlayoutcompiler/src/MasterLayoutPack.cpp Thu Dec 17 09:14:18 2009 +0200 @@ -0,0 +1,332 @@ +/* +* Copyright (c) 2002-2005 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 "MasterLayoutPack.h" +#include "ZoomLevelNames.h" +#include "LayoutCompilerErr.h" +#include "CodeGenConsts.h" + +#include +#include +#include +#include + +using namespace std; +using namespace CdlCompilerToolkit; + +typedef LayoutProcessArgsErr MasterLayoutPackageArgsErr; + +const string KMasterLayoutPackCdlFile = "MasterLayoutPack.cdl"; + +typedef vector PackageInfoLine; + +class MasterLayoutIndex + { +public: + MasterLayoutIndex(list packageInfo, CZoomLevelNames& zoomLevelName, const string& fileName); + void BuildAndWrite(); + +private: + enum InfoArgPositions + { + EPackNameArg = 0, + EWidthArg = 1, + EHeightArg = 2, + EVariantArg = 3, + EFirstContentArg = 4 + }; + + struct PkgSize + { + string iW; + string iH; + bool operator==(const PkgSize& aRhs) + { return iW == aRhs.iW && iH == aRhs.iH; } + }; + +private: + void BuildOptionsVectors(); + void CreateTemplateInstance(); + void SetSizes(); + void SetVariants(); + void SetZooms(); + void SetContents(); + void WriteInstance(); + void Implement(const string& aApi, const string& aTarget, const string& aReplace); + void AddPkg(PackageInfoLine& aLine, const string& aZoom, string& aExtra, string& aImpl); + PackageInfoLine* FindLine(const PkgSize& aSize, const string& aVariant); + +private: + list iPackageInfo; + CZoomLevelNames& iZooms; + const string& iInstName; + vector iSizes; + vector iVariants; + auto_ptr iIface; + auto_ptr iInst; + }; + + +int MasterLayoutPackage::Process(vector& args) + { + CZoomLevelNames zoomLevelNames; + zoomLevelNames.ProcessOptions(args); + + if (args.size() != 2) + throw MasterLayoutPackageArgsErr(); + + string& fileName = args[1]; + ifstream in; + CdlTkUtil::OpenInput(in, fileName); + + list packageInfo; + string line; + while (!in.eof()) + { + getline(in, line); + PackageInfoLine words; + CdlTkUtil::Tokenize(line, back_insert_iterator(words)); + if (words.size()) + packageInfo.push_back(words); + } + in.close(); + + MasterLayoutIndex index(packageInfo, zoomLevelNames, fileName.substr(0,fileName.find_first_of('.'))); + index.BuildAndWrite(); + + return 0; + } + +void MasterLayoutPackage::ShowHelp(ostream& stream) + { + stream << "MasterLayPkg [-z] " << endl; + stream << " Creates CDL package according to MasterLayoutPack.cdl containing" << endl; + stream << " all of the packages described in ." << endl; + stream << " The should contain lines with the following contents:" << endl; + stream << " *" << endl; + stream << " If -z is specified, then instances for zoom factors" << endl; + stream << " (in the form \"n,string\") appearing in the file will be generated, " << endl; + stream << " by replacing the keyword $ZOOM in the package definitions." << endl; + } + +void MasterLayoutPackage_Process( + const string& aName, + const string& aWidth, + const string& aHeight, + const string& aId, + vector::const_iterator aBegin, + vector::const_iterator aEnd, + const string& aZoomName) + { + CCdlTkCdlFileParser parser(KDirDomainSysHeader+KMasterLayoutPackCdlFile); + auto_ptr iface(parser.LoadAndParse(true)); + CCdlTkInstance pkg(*iface); + pkg.TemplateAllImplementations(); + + string zoomName = CdlTkUtil::Replace("$ZOOM", aZoomName, aName); + string zoomIdName = "EAknUiZoom" + aZoomName; + + pkg.SetName(zoomName); + +/* Implement(pkg, "name", "\"\"", string("\"")+zoomName+"\""); + Implement(pkg, "size", "?width", aWidth); + Implement(pkg, "size", "?height", aHeight); + Implement(pkg, "id", "?value", aId); + Implement(pkg, "zoom", "?value", zoomIdName); +*/ + cout << zoomName << endl; + + for (; aBegin != aEnd; ++aBegin) + { + string zoomContent = CdlTkUtil::Replace("$ZOOM", aZoomName, *aBegin); +// pkg.AddLocalContent(zoomContent); + cout << zoomContent << endl; + } + + CCdlTkWriteInstance writer(pkg); + writer.Process(); + } + + +MasterLayoutIndex::MasterLayoutIndex(list packageInfo, CZoomLevelNames& zoomLevelName, const string& fileName) +: iPackageInfo(packageInfo), iZooms(zoomLevelName), iInstName(fileName) + { + } + +void MasterLayoutIndex::BuildAndWrite() + { + BuildOptionsVectors(); + CreateTemplateInstance(); + SetSizes(); + SetVariants(); + SetZooms(); + SetContents(); + WriteInstance(); + } + +void MasterLayoutIndex::BuildOptionsVectors() + { + for (list::iterator pLine=iPackageInfo.begin(); pLine!=iPackageInfo.end(); ++pLine) + { + if (pLine->size() < EFirstContentArg) + throw GeneralErr((*pLine)[EPackNameArg] + " package info has too few arguments"); + + PkgSize size; + size.iW = (*pLine)[EWidthArg]; + size.iH = (*pLine)[EHeightArg]; + if (find(iSizes.begin(), iSizes.end(), size) == iSizes.end()) + iSizes.push_back(size); + + string variant = (*pLine)[EVariantArg]; + if (find(iVariants.begin(), iVariants.end(), variant) == iVariants.end()) + iVariants.push_back(variant); + } + } + +void MasterLayoutIndex::CreateTemplateInstance() + { + CCdlTkCdlFileParser parser(KDirDomainSysHeader+KMasterLayoutPackCdlFile); + iIface = parser.LoadAndParse(true); + iInst = auto_ptr(new CCdlTkInstance(*iIface)); + iInst->TemplateAllImplementations(); + iInst->SetName(iInstName); + // This master index should be the first in the DLL, so write it first. + cout << iInstName << endl; + } + +void MasterLayoutIndex::SetSizes() + { + string impl; + for (vector::iterator pSize = iSizes.begin(); pSize != iSizes.end(); ++pSize) + { + CdlTkUtil::AppendString(impl, "\t{ "); + CdlTkUtil::AppendString(impl, pSize->iW); + CdlTkUtil::AppendString(impl, ", "); + CdlTkUtil::AppendString(impl, pSize->iW); + CdlTkUtil::AppendString(impl, " },\n"); + } + Implement("sizes", "?array_contents", impl); + } + +void MasterLayoutIndex::SetVariants() + { + string impl; + for (vector::iterator pVar = iVariants.begin(); pVar != iVariants.end(); ++pVar) + { + CdlTkUtil::AppendString(impl, "\t"); + CdlTkUtil::AppendString(impl, *pVar); + CdlTkUtil::AppendString(impl, ",\n"); + } + Implement("variants", "?array_contents", impl); + } + +void MasterLayoutIndex::SetZooms() + { + string impl; + for (CZoomLevelNames::iterator pZoom = iZooms.begin(); pZoom != iZooms.end(); ++pZoom) + { + CdlTkUtil::AppendString(impl, "\tEAknUiZoom"); + CdlTkUtil::AppendString(impl, pZoom->second); + CdlTkUtil::AppendString(impl, ",\n"); + } + Implement("zooms", "?array_contents", impl); + } + +void MasterLayoutIndex::SetContents() + { + string extra; + string impl; + for (vector::iterator pSize = iSizes.begin(); pSize != iSizes.end(); ++pSize) + { + for (vector::iterator pVar = iVariants.begin(); pVar != iVariants.end(); ++pVar) + { + PackageInfoLine* line = FindLine(*pSize, *pVar); + for (CZoomLevelNames::iterator pZoom = iZooms.begin(); pZoom != iZooms.end(); ++pZoom) + { + if (line == NULL) + CdlTkUtil::AppendString(impl, "\tNULL,\n"); + else + AddPkg(*line, pZoom->second, extra, impl); + } + } + } + Implement("contents", "?array_contents", impl); + iInst->SetExtraCpp(extra); + } + +void MasterLayoutIndex::WriteInstance() + { + CCdlTkWriteInstance writer(*iInst); + writer.Process(); + } + +void MasterLayoutIndex::Implement(const string& aApi, const string& aTarget, const string& aReplace) + { + CCdlTkImplementation* impl = iInst->Impl().Find(aApi); + if (!impl) + throw NotFoundErr(aApi + " in MasterLayoutPack.cdl"); + CdlTkUtil::CReplaceSet implSet; + implSet.Add(aTarget, aReplace); + implSet.Add(" //TODO: Initialise this data.", ""); + impl->SetDefinition(CdlTkUtil::MultiReplace(implSet, impl->Definition())); + } + +void MasterLayoutIndex::AddPkg(PackageInfoLine& aLine, const string& aZoom, string& aExtra, string& aImpl) + { + string impl = "&"; + string extra; + + string pkgName = CdlTkUtil::Replace("$ZOOM", aZoom, aLine[EPackNameArg]); + impl+=pkgName; + + string refs; + for (int refPos = EFirstContentArg; refPos < aLine.size(); ++refPos) + { + string refName = CdlTkUtil::Replace("$ZOOM", aZoom, aLine[refPos]); + CdlTkUtil::AppendString(refs, CdlTkUtil::Replace("$NAME",refName,"\tLOCAL_CDL_REF($NAME),\n")); + } + + CCdlTkDataTypeTranslations& translations = iIface->DataTypeTranslations(); + string temp; + extra = translations.Find("TCdlArray", temp)->Definition(); + CdlTkUtil::CReplaceSet defnSet; + defnSet.Add("aType", temp); + defnSet.Add("aName", pkgName); + defnSet.Add("?array_contents", refs); + extra = CdlTkUtil::MultiReplace(defnSet, extra); + + CdlTkUtil::AppendString(aImpl, impl); + CdlTkUtil::AppendString(aExtra, extra); + } + +PackageInfoLine* MasterLayoutIndex::FindLine(const PkgSize& aSize, const string& aVariant) + { + for (list::iterator pLine=iPackageInfo.begin(); pLine!=iPackageInfo.end(); ++pLine) + { + if (aSize.iW == (*pLine)[EWidthArg] && + aSize.iH == (*pLine)[EHeightArg] && + aVariant == (*pLine)[EVariantArg]) + return &*pLine; + } + return NULL; + } +