604 bool defaultCode =
false;
605 QString type = element.attribute(
"type" );
606 QString name = element.attribute(
"name" );
607 QString key = element.attribute(
"key" );
608 QString hidden = element.attribute(
"hidden" );
620 CfgEntry::Choices choices;
628 for ( QDomElement e = element.firstChildElement(); !e.isNull(); e = e.nextSiblingElement() ) {
630 if ( tag ==
"label" ) {
632 labelContext = e.attribute(
"context" );
634 else if ( tag ==
"tooltip" ) {
636 toolTipContext = e.attribute(
"context" );
638 else if ( tag ==
"whatsthis" ) {
639 whatsThis = e.text();
640 whatsThisContext = e.attribute(
"context" );
642 else if ( tag ==
"min" ) minValue = e.text();
643 else if ( tag ==
"max" ) maxValue = e.text();
644 else if ( tag ==
"code" ) code = e.text();
645 else if ( tag ==
"parameter" )
647 param = e.attribute(
"name" );
648 paramType = e.attribute(
"type" );
649 if (
param.isEmpty() ) {
650 cerr <<
"Parameter must have a name: " <<
dumpNode(e) << endl;
653 if ( paramType.isEmpty() ) {
654 cerr <<
"Parameter must have a type: " <<
dumpNode(e) << endl;
657 if ((paramType ==
"Int") || (paramType ==
"UInt"))
660 paramMax = e.attribute(
"max").toInt(&ok);
663 cerr <<
"Integer parameter must have a maximum (e.g. max=\"0\"): "
668 else if (paramType ==
"Enum")
670 for ( QDomElement e2 = e.firstChildElement(); !e2.isNull(); e2 = e2.nextSiblingElement() ) {
671 if (e2.tagName() ==
"values")
673 for ( QDomElement e3 = e2.firstChildElement(); !e3.isNull(); e3 = e3.nextSiblingElement() ) {
674 if (e3.tagName() ==
"value")
676 paramValues.append( e3.text() );
682 if (paramValues.isEmpty())
684 cerr <<
"No values specified for parameter '" <<
param
688 paramMax = paramValues.count()-1;
692 cerr <<
"Parameter '" <<
param <<
"' has type " << paramType
693 <<
" but must be of type int, uint or Enum." << endl;
697 else if ( tag ==
"default" )
699 if (e.attribute(
"param").isEmpty())
702 if (e.attribute(
"code" ) ==
"true")
706 else if ( tag ==
"choices" ) {
707 QString name = e.attribute(
"name" );
710 for( QDomElement e2 = e.firstChildElement(); !e2.isNull(); e2 = e2.nextSiblingElement() ) {
711 if ( e2.tagName() ==
"choice" ) {
712 CfgEntry::Choice choice;
713 choice.name = e2.attribute(
"name" );
714 if ( choice.name.isEmpty() ) {
715 cerr <<
"Tag <choice> requires attribute 'name'." << endl;
717 for( QDomElement e3 = e2.firstChildElement(); !e3.isNull(); e3 = e3.nextSiblingElement() ) {
718 if ( e3.tagName() ==
"label" ) {
719 choice.label = e3.text();
720 choice.context = e3.attribute(
"context" );
722 if ( e3.tagName() ==
"tooltip" ) {
723 choice.toolTip = e3.text();
724 choice.context = e3.attribute(
"context" );
726 if ( e3.tagName() ==
"whatsthis" ) {
727 choice.whatsThis = e3.text();
728 choice.context = e3.attribute(
"context" );
731 chlist.append( choice );
734 choices = CfgEntry::Choices( chlist, name,
prefix );
736 else if ( tag ==
"emit" ) {
739 signal.name = e.attribute(
"signal" );
740 signalList.append( signal);
745 bool nameIsEmpty = name.isEmpty();
746 if ( nameIsEmpty && key.isEmpty() ) {
747 cerr <<
"Entry must have a name or a key: " <<
dumpNode(element) << endl;
751 if ( key.isEmpty() ) {
758 }
else if ( name.contains(
' ' ) ) {
759 cout<<
"Entry '"<<name<<
"' contains spaces! <name> elements can not contain spaces!"<<endl;
763 if (name.contains(
"$("))
767 cerr <<
"Name may not be parameterized: " << name << endl;
773 if (!
param.isEmpty())
775 cerr <<
"Name must contain '$(" <<
param <<
")': " << name << endl;
780 if ( label.isEmpty() ) {
784 if ( type.isEmpty() ) type =
"String";
786 if (!
param.isEmpty())
790 name.remove(
"$("+
param+
')');
792 for(
int i = 0; i <= paramMax; i++)
794 paramDefaultValues.append(
QString());
797 for ( QDomElement e = element.firstChildElement(); !e.isNull(); e = e.nextSiblingElement() ) {
799 if ( tag ==
"default" )
801 QString index = e.attribute(
"param");
806 int i = index.toInt(&ok);
809 i = paramValues.indexOf(index);
812 cerr <<
"Index '" << index <<
"' for default value is unknown." << endl;
817 if ((i < 0) || (i > paramMax))
819 cerr <<
"Index '" << i <<
"' for default value is out of range [0, "<< paramMax<<
"]." << endl;
823 QString tmpDefaultValue = e.text();
825 if (e.attribute(
"code" ) !=
"true")
828 paramDefaultValues[i] = tmpDefaultValue;
836 cerr <<
"The key '" << key <<
"' can not be used as name for the entry because "
837 "it is not a valid name. You need to specify a valid name for this entry." << endl;
839 cerr <<
"The name '" << name <<
"' is not a valid name for an entry." << endl;
846 cerr <<
"The key '" << key <<
"' can not be used as name for the entry because "
847 "it does not result in a unique name. You need to specify a unique name for this entry." << endl;
849 cerr <<
"The name '" << name <<
"' is not unique." << endl;
859 CfgEntry *result =
new CfgEntry( group, type, key, name, labelContext, label, toolTipContext, toolTip, whatsThisContext, whatsThis,
862 if (!
param.isEmpty())
864 result->setParam(
param);
865 result->setParamName(paramName);
866 result->setParamType(paramType);
867 result->setParamValues(paramValues);
868 result->setParamDefaultValues(paramDefaultValues);
869 result->setParamMax(paramMax);
871 result->setMinValue(minValue);
872 result->setMaxValue(maxValue);
1329 QCoreApplication app(argc, argv);
1333 QString directoryName, inputFilename, codegenFilename;
1334 parseArgs(app.arguments(), directoryName, inputFilename, codegenFilename);
1336 QString baseDir = directoryName;
1338 if (!baseDir.endsWith(
'/') && !baseDir.endsWith(
'\\'))
1340 if (!baseDir.endsWith(
'/'))
1342 baseDir.append(
"/");
1344 if (!codegenFilename.endsWith(QLatin1String(
".kcfgc")))
1346 cerr <<
"Codegen options file must have extension .kcfgc" << endl;
1349 QString baseName = QFileInfo(codegenFilename).fileName();
1350 baseName = baseName.left(baseName.length() - 6);
1352 CfgConfig cfg = CfgConfig( codegenFilename );
1354 QFile input( inputFilename );
1360 if ( !doc.setContent( &input, &errorMsg, &errorRow, &errorCol ) ) {
1361 cerr <<
"Unable to load document." << endl;
1362 cerr <<
"Parse error in " << inputFilename <<
", line " << errorRow <<
", col " << errorCol <<
": " << errorMsg << endl;
1366 QDomElement cfgElement = doc.documentElement();
1368 if ( cfgElement.isNull() ) {
1369 cerr <<
"No document in kcfg file" << endl;
1374 bool cfgFileNameArg =
false;
1378 bool hasSignals =
false;
1382 for ( QDomElement e = cfgElement.firstChildElement(); !e.isNull(); e = e.nextSiblingElement() ) {
1385 if ( tag ==
"include" ) {
1386 QString includeFile = e.text();
1387 if (!includeFile.isEmpty())
1388 includes.append(includeFile);
1390 }
else if ( tag ==
"kcfgfile" ) {
1391 cfgFileName = e.attribute(
"name" );
1392 cfgFileNameArg = e.attribute(
"arg" ).toLower() ==
"true";
1393 for( QDomElement e2 = e.firstChildElement(); !e2.isNull(); e2 = e2.nextSiblingElement() ) {
1394 if ( e2.tagName() ==
"parameter" ) {
1396 p.name = e2.attribute(
"name" );
1397 p.type = e2.attribute(
"type" );
1398 if (p.type.isEmpty())
1400 parameters.append( p );
1404 }
else if ( tag ==
"group" ) {
1405 QString group = e.attribute(
"name" );
1406 if ( group.isEmpty() ) {
1407 cerr <<
"Group without name" << endl;
1410 for( QDomElement e2 = e.firstChildElement(); !e2.isNull(); e2 = e2.nextSiblingElement() ) {
1411 if ( e2.tagName() !=
"entry" )
continue;
1412 CfgEntry *entry =
parseEntry( group, e2, cfg );
1413 if ( entry ) entries.append( entry );
1415 cerr <<
"Can not parse entry." << endl;
1420 else if ( tag ==
"signal" ) {
1421 QString signalName = e.attribute(
"name" );
1422 if ( signalName.isEmpty() ) {
1423 cerr <<
"Signal without name." << endl;
1427 theSignal.name = signalName;
1429 for( QDomElement e2 = e.firstChildElement(); !e2.isNull(); e2 = e2.nextSiblingElement() ) {
1430 if ( e2.tagName() ==
"argument") {
1431 SignalArguments argument;
1432 argument.type = e2.attribute(
"type");
1433 if ( argument.type.isEmpty() ) {
1434 cerr <<
"Signal argument without type." << endl;
1437 argument.variableName = e2.text();
1438 theSignal.arguments.append(argument);
1440 else if( e2.tagName() ==
"label") {
1441 theSignal.label = e2.text();
1444 signalList.append(theSignal);
1448 if ( cfg.className.isEmpty() ) {
1449 cerr <<
"Class name missing" << endl;
1453 if ( cfg.singleton && !parameters.isEmpty() ) {
1454 cerr <<
"Singleton class can not have parameters" << endl;
1458 if ( !cfgFileName.isEmpty() && cfgFileNameArg)
1460 cerr <<
"Having both a fixed filename and a filename as argument is not possible." << endl;
1464 if ( entries.isEmpty() ) {
1465 cerr <<
"No entries." << endl;
1470 for( cfg = entries.first(); cfg; cfg = entries.next() ) {
1475 hasSignals = !signalList.empty();
1476 QString headerFileName = baseName +
".h";
1477 QString implementationFileName = baseName +
".cpp";
1478 QString mocFileName = baseName +
".moc";
1481 QFile
header( baseDir + headerFileName );
1482 if ( !
header.open( QIODevice::WriteOnly ) ) {
1483 cerr <<
"Can not open '" << baseDir << headerFileName <<
"for writing." << endl;
1487 QTextStream h( &
header );
1489 h.setCodec(
"utf-8");
1490 h <<
"// This file is generated by kconfig_compiler from " << QFileInfo(inputFilename).fileName() <<
"." << endl;
1491 h <<
"// All changes you do to this file will be lost." << endl;
1493 h <<
"#ifndef " << ( !cfg.nameSpace.isEmpty() ?
QString (
QString(cfg.nameSpace).replace(
"::",
"_" ).toUpper() +
'_') :
"" )
1494 << cfg.className.toUpper() <<
"_H" << endl;
1495 h <<
"#define " << ( !cfg.nameSpace.isEmpty() ?
QString (
QString(cfg.nameSpace).replace(
"::",
"_" ).toUpper() +
'_') :
"" )
1496 << cfg.className.toUpper() <<
"_H" << endl << endl;
1499 QStringList::ConstIterator it;
1500 for( it = cfg.headerIncludes.constBegin(); it != cfg.headerIncludes.constEnd(); ++it ) {
1501 if ( (*it).startsWith(
'"') )
1502 h <<
"#include " << *it << endl;
1504 h <<
"#include <" << *it <<
">" << endl;
1507 if ( cfg.headerIncludes.count() > 0 ) h << endl;
1509 if ( !cfg.singleton && parameters.isEmpty() )
1510 h <<
"#include <kglobal.h>" << endl;
1512 if ( cfg.inherits==
"KCoreConfigSkeleton" ) {
1513 h <<
"#include <kcoreconfigskeleton.h>" << endl;
1515 h <<
"#include <kconfigskeleton.h>" << endl;
1518 h <<
"#include <kdebug.h>" << endl << endl;
1521 for( it = includes.constBegin(); it != includes.constEnd(); ++it ) {
1522 if ( (*it).startsWith(
'"') )
1523 h <<
"#include " << *it << endl;
1525 h <<
"#include <" << *it <<
">" << endl;
1532 h <<
"class " << cfg.className <<
"Private;" << endl << endl;
1535 h <<
"class " << cfg.visibility << cfg.className <<
" : public " << cfg.inherits << endl;
1540 h <<
" Q_OBJECT" << endl;
1541 h <<
" public:" << endl;
1545 for( itEntry = entries.constBegin(); itEntry != entries.constEnd(); ++itEntry ) {
1546 const CfgEntry::Choices &choices = (*itEntry)->choices();
1548 if ( !chlist.isEmpty() ) {
1551 for( itChoice = chlist.constBegin(); itChoice != chlist.constEnd(); ++itChoice ) {
1552 values.append( choices.prefix + (*itChoice).name );
1554 if ( choices.name().isEmpty() ) {
1555 if ( cfg.globalEnums ) {
1556 h <<
" enum " <<
enumName( (*itEntry)->name(), (*itEntry)->choices() ) <<
" { " << values.join(
", " ) <<
" };" << endl;
1559 h <<
" class " <<
enumName( (*itEntry)->name(), (*itEntry)->choices() ) << endl;
1561 h <<
" public:" << endl;
1562 h <<
" enum type { " << values.join(
", " ) <<
", COUNT };" << endl;
1565 }
else if ( !choices.external() ) {
1567 h <<
" enum " <<
enumName( (*itEntry)->name(), (*itEntry)->choices() ) <<
" { " << values.join(
", " ) <<
" };" << endl;
1570 const QStringList values = (*itEntry)->paramValues();
1571 if ( !values.isEmpty() ) {
1572 if ( cfg.globalEnums ) {
1576 h <<
" enum " <<
enumName( (*itEntry)->param() ) <<
" { " << values.join(
", " ) <<
" };" << endl;
1577 h <<
" static const char* const " <<
enumName( (*itEntry)->param() ) <<
"ToString[];" << endl;
1578 cppPreamble +=
"const char* const " + cfg.className +
"::" +
enumName( (*itEntry)->param() ) +
1579 "ToString[] = { \"" + values.join(
"\", \"" ) +
"\" };\n";
1581 h <<
" class " <<
enumName( (*itEntry)->param() ) << endl;
1583 h <<
" public:" << endl;
1584 h <<
" enum type { " << values.join(
", " ) <<
", COUNT };" << endl;
1585 h <<
" static const char* const enumToString[];" << endl;
1587 cppPreamble +=
"const char* const " + cfg.className +
"::" +
enumName( (*itEntry)->param() ) +
1588 "::enumToString[] = { \"" + values.join(
"\", \"" ) +
"\" };\n";
1593 h <<
"\n enum {" << endl;
1596 for ( it = signalList.constBegin(); it != itEnd; val <<= 1) {
1598 cerr <<
"Too many signals to create unique bit masks" << endl;
1601 Signal signal = *it;
1602 h <<
" " <<
signalEnumName(signal.name) <<
" = 0x" << hex << val;
1603 if ( ++it != itEnd )
1607 h <<
" };" << dec << endl;
1611 if ( !cfg.singleton ) {
1612 h <<
" " << cfg.className <<
"(";
1615 if(cfg.forceStringFilename)
1616 h <<
" const QString &cfgfilename"
1617 << (parameters.isEmpty() ?
" = QString()" :
", ");
1619 h <<
" KSharedConfig::Ptr config"
1620 << (parameters.isEmpty() ?
" = KGlobal::config()" :
", ");
1623 it != parameters.constEnd(); ++it)
1625 if (it != parameters.constBegin())
1627 h <<
" " <<
param((*it).type) <<
" " << (*it).name;
1631 h <<
" static " << cfg.className <<
" *self();" << endl;
1634 h <<
" static void instance(const QString& cfgfilename);" << endl;
1639 h <<
" ~" << cfg.className <<
"();" << endl << endl;
1642 if (cfg.staticAccessors)
1647 for( itEntry = entries.constBegin(); itEntry != entries.constEnd(); ++itEntry ) {
1648 QString n = (*itEntry)->name();
1649 QString t = (*itEntry)->type();
1652 if (cfg.allMutators || cfg.mutators.contains(n))
1654 h <<
" /**" << endl;
1655 h <<
" Set " << (*itEntry)->label() << endl;
1657 if (cfg.staticAccessors)
1658 h <<
" static" << endl;
1660 if (!(*itEntry)->param().isEmpty())
1661 h <<
cppType((*itEntry)->paramType()) <<
" i, ";
1662 if (cfg.useEnumTypes && t ==
"Enum")
1663 h <<
enumType(*itEntry, cfg.globalEnums);
1669 if ( !cfg.dpointer )
1671 h << endl <<
" {" << endl;
1682 h <<
" /**" << endl;
1683 h <<
" Get " << (*itEntry)->label() << endl;
1685 if (cfg.staticAccessors)
1686 h <<
" static" << endl;
1688 if (cfg.useEnumTypes && t ==
"Enum")
1689 h <<
enumType(*itEntry, cfg.globalEnums);
1693 if (!(*itEntry)->param().isEmpty())
1694 h <<
" " <<
cppType((*itEntry)->paramType()) <<
" i ";
1698 if ( !cfg.dpointer )
1700 h << endl <<
" {" << endl;
1710 if ((cfg.allDefaultGetters || cfg.defaultGetters.contains(n)) && !(*itEntry)->defaultValue().isEmpty()) {
1712 h <<
" /**" << endl;
1713 h <<
" Get " << (*itEntry)->label() <<
" default value" << endl;
1715 if (cfg.staticAccessors)
1716 h <<
" static" << endl;
1718 if (cfg.useEnumTypes && t ==
"Enum")
1719 h <<
enumType(*itEntry, cfg.globalEnums);
1723 if ( !(*itEntry)->param().isEmpty() )
1724 h <<
" " <<
cppType( (*itEntry)->paramType() ) <<
" i ";
1725 h <<
")" <<
Const << endl;
1728 if (cfg.useEnumTypes && t ==
"Enum")
1729 h <<
"static_cast<" <<
enumType(*itEntry, cfg.globalEnums) <<
">(";
1731 if ( !(*itEntry)->param().isEmpty() )
1734 if (cfg.useEnumTypes && t ==
"Enum")
1741 if ( cfg.itemAccessors ) {
1743 h <<
" /**" << endl;
1744 h <<
" Get Item object corresponding to " << n <<
"()"
1747 h <<
" Item" <<
itemType( (*itEntry)->type() ) <<
" *"
1749 if (!(*itEntry)->param().isEmpty()) {
1750 h <<
" " <<
cppType((*itEntry)->paramType()) <<
" i ";
1753 if ( !cfg.dpointer )
1755 h << endl <<
" {" << endl;
1773 foreach(
const Signal &signal, signalList) {
1775 if ( !signal.label.isEmpty() ) {
1776 h <<
" /**" << endl;
1777 h <<
" " << signal.label << endl;
1780 h <<
" void " << signal.name <<
"(";
1782 for ( it = signal.arguments.constBegin(); it != itEnd; ) {
1783 SignalArguments argument = *it;
1785 if ( cfg.useEnumTypes && argument.type ==
"Enum" ) {
1786 for (
int i = 0, end = entries.count(); i < end; ++i ) {
1787 if ( entries[i]->name() == argument.variableName ) {
1788 type =
enumType(entries[i], cfg.globalEnums);
1793 h << type <<
" " << argument.variableName;
1794 if ( ++it != itEnd ) {
1803 h <<
" protected:" << endl;
1806 if ( cfg.singleton ) {
1807 h <<
" " << cfg.className <<
"(";
1808 if ( cfgFileNameArg )
1809 h <<
"const QString& arg";
1811 h <<
" friend class " << cfg.className <<
"Helper;" << endl << endl;
1815 h <<
" virtual void usrWriteConfig();" << endl;
1819 if ( !cfg.memberVariables.isEmpty() && cfg.memberVariables !=
"private" && cfg.memberVariables !=
"dpointer") {
1820 h <<
" " << cfg.memberVariables <<
":" << endl;
1825 it != parameters.constEnd(); ++it)
1827 h <<
" " <<
cppType((*it).type) <<
" mParam" << (*it).name <<
";" << endl;
1830 if ( cfg.memberVariables !=
"dpointer" )
1833 for( itEntry = entries.constBegin(); itEntry != entries.constEnd(); ++itEntry ) {
1834 if ( (*itEntry)->group() != group ) {
1835 group = (*itEntry)->group();
1837 h <<
" // " << group << endl;
1839 h <<
" " <<
cppType( (*itEntry)->type() ) <<
" " <<
varName( (*itEntry)->name(), cfg );
1840 if ( !(*itEntry)->param().isEmpty() )
1842 h <<
QString(
"[%1]").arg( (*itEntry)->paramMax()+1 );
1846 if ( cfg.allDefaultGetters || cfg.defaultGetters.contains((*itEntry)->name()) )
1849 if (cfg.staticAccessors)
1852 if ( !(*itEntry)->param().isEmpty() )
1853 h <<
" " <<
cppType( (*itEntry)->paramType() ) <<
" i ";
1854 h <<
")" <<
Const <<
";" << endl;
1858 h << endl <<
" private:" << endl;
1859 if ( cfg.itemAccessors ) {
1860 for( itEntry = entries.constBegin(); itEntry != entries.constEnd(); ++itEntry ) {
1861 h <<
" Item" <<
itemType( (*itEntry)->type() ) <<
" *" <<
itemVar( *itEntry, cfg );
1862 if ( !(*itEntry)->param().isEmpty() ) h <<
QString(
"[%1]").arg( (*itEntry)->paramMax()+1 );
1867 h <<
" uint " <<
varName(
"settingsChanged", cfg) <<
";" << endl;
1873 h <<
" private:" << endl;
1874 for( itEntry = entries.constBegin(); itEntry != entries.constEnd(); ++itEntry ) {
1875 if ( cfg.allDefaultGetters || cfg.defaultGetters.contains((*itEntry)->name()) ) {
1877 if (cfg.staticAccessors)
1880 if ( !(*itEntry)->param().isEmpty() )
1881 h <<
" " <<
cppType( (*itEntry)->paramType() ) <<
" i ";
1882 h <<
")" <<
Const <<
";" << endl;
1885 h <<
" " + cfg.className +
"Private *d;" << endl;
1888 if (cfg.customAddons)
1890 h <<
" // Include custom additions" << endl;
1891 h <<
" #include \"" <<
filenameOnly(baseName) <<
"_addons.h\"" <<endl;
1894 h <<
"};" << endl << endl;
1898 h <<
"#endif" << endl << endl;
1903 QFile implementation( baseDir + implementationFileName );
1904 if ( !implementation.open( QIODevice::WriteOnly ) ) {
1905 cerr <<
"Can not open '" << implementationFileName <<
"for writing."
1910 QTextStream cpp( &implementation );
1912 cpp.setCodec(
"utf-8");
1913 cpp <<
"// This file is generated by kconfig_compiler from " << QFileInfo(inputFilename).fileName() <<
"." << endl;
1914 cpp <<
"// All changes you do to this file will be lost." << endl << endl;
1916 cpp <<
"#include \"" << headerFileName <<
"\"" << endl << endl;
1918 for( it = cfg.sourceIncludes.constBegin(); it != cfg.sourceIncludes.constEnd(); ++it ) {
1919 if ( (*it).startsWith(
'"') )
1920 cpp <<
"#include " << *it << endl;
1922 cpp <<
"#include <" << *it <<
">" << endl;
1925 if ( cfg.sourceIncludes.count() > 0 ) cpp << endl;
1927 if ( cfg.setUserTexts ) cpp <<
"#include <klocale.h>" << endl << endl;
1930 if ( cfg.singleton )
1931 cpp <<
"#include <kglobal.h>" << endl <<
"#include <QtCore/QFile>" << endl << endl;
1932 if ( cfg.singleton && cfgFileNameArg )
1933 cpp <<
"#include <kdebug.h>" << endl << endl;
1935 if ( !cfg.nameSpace.isEmpty() )
1936 cpp <<
"using namespace " << cfg.nameSpace <<
";" << endl << endl;
1944 cpp <<
"class " << cfg.className <<
"Private" << endl;
1946 cpp <<
" public:" << endl;
1947 for( itEntry = entries.constBegin(); itEntry != entries.constEnd(); ++itEntry ) {
1948 if ( (*itEntry)->group() != group ) {
1949 group = (*itEntry)->group();
1951 cpp <<
" // " << group << endl;
1953 cpp <<
" " <<
cppType( (*itEntry)->type() ) <<
" " <<
varName( (*itEntry)->name(), cfg );
1954 if ( !(*itEntry)->param().isEmpty() )
1956 cpp <<
QString(
"[%1]").arg( (*itEntry)->paramMax()+1 );
1960 cpp << endl <<
" // items" << endl;
1961 for( itEntry = entries.constBegin(); itEntry != entries.constEnd(); ++itEntry ) {
1962 cpp <<
" "+cfg.inherits+
"::Item" <<
itemType( (*itEntry)->type() ) <<
" *" <<
itemVar( *itEntry, cfg );
1963 if ( !(*itEntry)->param().isEmpty() ) cpp <<
QString(
"[%1]").arg( (*itEntry)->paramMax()+1 );
1967 cpp <<
" uint " <<
varName(
"settingsChanged", cfg) <<
";" << endl;
1970 cpp <<
"};" << endl << endl;
1975 if ( cfg.singleton ) {
1977 cpp <<
"class " << cfg.className <<
"Helper" << endl;
1979 cpp <<
" public:" << endl;
1980 cpp <<
" " << cfg.className <<
"Helper() : q(0) {}" << endl;
1981 cpp <<
" ~" << cfg.className <<
"Helper() { delete q; }" << endl;
1982 cpp <<
" " << cfg.className <<
" *q;" << endl;
1983 cpp <<
"};" << endl;
1985 cpp <<
"K_GLOBAL_STATIC(" << cfg.className <<
"Helper, s_global" << cfg.className <<
")" << endl;
1987 cpp << cfg.className <<
" *" << cfg.className <<
"::self()" << endl;
1989 if ( cfgFileNameArg ) {
1990 cpp <<
" if (!s_global" << cfg.className <<
"->q)" << endl;
1991 cpp <<
" kFatal() << \"you need to call " << cfg.className <<
"::instance before using\";" << endl;
1993 cpp <<
" if (!s_global" << cfg.className <<
"->q) {" << endl;
1994 cpp <<
" new " << cfg.className <<
';' << endl;
1995 cpp <<
" s_global" << cfg.className <<
"->q->readConfig();" << endl;
1996 cpp <<
" }" << endl << endl;
1998 cpp <<
" return s_global" << cfg.className <<
"->q;" << endl;
1999 cpp <<
"}" << endl << endl;
2001 if ( cfgFileNameArg ) {
2002 cpp <<
"void " << cfg.className <<
"::instance(const QString& cfgfilename)" << endl;
2004 cpp <<
" if (s_global" << cfg.className <<
"->q) {" << endl;
2005 cpp <<
" kDebug() << \"" << cfg.className <<
"::instance called after the first use - ignoring\";" << endl;
2006 cpp <<
" return;" << endl;
2007 cpp <<
" }" << endl;
2008 cpp <<
" new " << cfg.className <<
"(cfgfilename);" << endl;
2009 cpp <<
" s_global" << cfg.className <<
"->q->readConfig();" << endl;
2010 cpp <<
"}" << endl << endl;
2014 if ( !cppPreamble.isEmpty() )
2015 cpp << cppPreamble << endl;
2018 cpp << cfg.className <<
"::" << cfg.className <<
"( ";
2019 if ( cfgFileNameArg ) {
2020 if ( !cfg.singleton && ! cfg.forceStringFilename)
2021 cpp <<
" KSharedConfig::Ptr config";
2023 cpp <<
" const QString& config";
2024 cpp << (parameters.isEmpty() ?
" " :
", ");
2028 it != parameters.constEnd(); ++it)
2030 if (it != parameters.constBegin())
2032 cpp <<
" " <<
param((*it).type) <<
" " << (*it).name;
2034 cpp <<
" )" << endl;
2036 cpp <<
" : " << cfg.inherits <<
"(";
2037 if ( !cfgFileName.isEmpty() ) cpp <<
" QLatin1String( \"" << cfgFileName <<
"\" ";
2038 if ( cfgFileNameArg ) cpp <<
" config ";
2039 if ( !cfgFileName.isEmpty() ) cpp <<
") ";
2044 it != parameters.constEnd(); ++it)
2046 cpp <<
" , mParam" << (*it).name <<
"(" << (*it).name <<
")" << endl;
2049 if ( hasSignals && !cfg.dpointer )
2050 cpp <<
" , " <<
varName(
"settingsChanged", cfg) <<
"(0)" << endl;
2056 cpp <<
" d = new " + cfg.className +
"Private;" << endl;
2058 cpp <<
" " <<
varPath(
"settingsChanged", cfg) <<
" = 0;" << endl;
2062 if (cfg.singleton) {
2063 cpp <<
" Q_ASSERT(!s_global" << cfg.className <<
"->q);" << endl;
2064 cpp <<
" s_global" << cfg.className <<
"->q = this;" << endl;
2069 for( itEntry = entries.constBegin(); itEntry != entries.constEnd(); ++itEntry ) {
2070 if ( (*itEntry)->group() != group ) {
2071 if ( !group.isEmpty() ) cpp << endl;
2072 group = (*itEntry)->group();
2073 cpp <<
" setCurrentGroup( " <<
paramString(group, parameters) <<
" );" << endl << endl;
2077 if ( !(*itEntry)->code().isEmpty() ) {
2078 cpp << (*itEntry)->code() << endl;
2080 if ( (*itEntry)->type() ==
"Enum" ) {
2081 cpp <<
" QList<"+cfg.inherits+
"::ItemEnum::Choice2> values"
2082 << (*itEntry)->name() <<
";" << endl;
2085 for( it = choices.constBegin(); it != choices.constEnd(); ++it ) {
2086 cpp <<
" {" << endl;
2087 cpp <<
" "+cfg.inherits+
"::ItemEnum::Choice2 choice;" << endl;
2088 cpp <<
" choice.name = QLatin1String(\"" << (*it).name <<
"\");" << endl;
2089 if ( cfg.setUserTexts ) {
2090 if ( !(*it).label.isEmpty() ) {
2091 cpp <<
" choice.label = ";
2092 if ( !(*it).context.isEmpty() )
2093 cpp <<
"i18nc(" +
quoteString((*it).context) +
", ";
2098 if ( !(*it).toolTip.isEmpty() ) {
2099 cpp <<
" choice.toolTip = ";
2100 if ( !(*it).context.isEmpty() )
2101 cpp <<
"i18nc(" +
quoteString((*it).context) +
", ";
2104 cpp <<
quoteString((*it).toolTip) <<
");" << endl;
2106 if ( !(*it).whatsThis.isEmpty() ) {
2107 cpp <<
" choice.whatsThis = ";
2108 if ( !(*it).context.isEmpty() )
2109 cpp <<
"i18nc(" +
quoteString((*it).context) +
", ";
2112 cpp <<
quoteString((*it).whatsThis) <<
");" << endl;
2115 cpp <<
" values" << (*itEntry)->name() <<
".append( choice );" << endl;
2116 cpp <<
" }" << endl;
2123 if ( (*itEntry)->param().isEmpty() )
2126 cpp <<
" " <<
itemPath( *itEntry, cfg ) <<
" = "
2127 <<
newItem( (*itEntry)->type(), (*itEntry)->name(), key, (*itEntry)->defaultValue(), cfg ) << endl;
2129 if ( !(*itEntry)->minValue().isEmpty() )
2130 cpp <<
" " <<
itemPath( *itEntry, cfg ) <<
"->setMinValue(" << (*itEntry)->minValue() <<
");" << endl;
2131 if ( !(*itEntry)->maxValue().isEmpty() )
2132 cpp <<
" " <<
itemPath( *itEntry, cfg ) <<
"->setMaxValue(" << (*itEntry)->maxValue() <<
");" << endl;
2134 if ( cfg.setUserTexts )
2137 cpp <<
" addItem( " <<
itemPath( *itEntry, cfg );
2138 QString quotedName = (*itEntry)->name();
2140 if ( quotedName != key ) cpp <<
", QLatin1String( \"" << (*itEntry)->name() <<
"\" )";
2141 cpp <<
" );" << endl;
2146 for(
int i = 0; i <= (*itEntry)->paramMax(); i++)
2151 if ( !(*itEntry)->paramDefaultValue(i).isEmpty() )
2152 defaultStr = (*itEntry)->paramDefaultValue(i);
2153 else if ( !(*itEntry)->defaultValue().isEmpty() )
2154 defaultStr =
paramString( (*itEntry)->defaultValue(), (*itEntry), i );
2158 cpp <<
" " << itemVarStr <<
" = "
2159 <<
newItem( (*itEntry)->type(), (*itEntry)->name(),
paramString(key, *itEntry, i), defaultStr,cfg,
QString(
"[%1]").arg(i) )
2162 if ( cfg.setUserTexts )
2169 cpp <<
" addItem( " << itemVarStr <<
", QLatin1String( \"";
2170 if ( (*itEntry)->paramType()==
"Enum" )
2171 cpp << (*itEntry)->paramName().replace(
"$("+(*itEntry)->param()+
')',
"%1").arg((*itEntry)->paramValues()[i] );
2173 cpp << (*itEntry)->paramName().replace(
"$("+(*itEntry)->param()+
')',
"%1").arg(i);
2174 cpp <<
"\" ) );" << endl;
2179 cpp <<
"}" << endl << endl;
2184 for( itEntry = entries.constBegin(); itEntry != entries.constEnd(); ++itEntry ) {
2185 QString n = (*itEntry)->name();
2186 QString t = (*itEntry)->type();
2189 if (cfg.allMutators || cfg.mutators.contains(n))
2191 cpp <<
"void " <<
setFunction(n, cfg.className) <<
"( ";
2192 if ( !(*itEntry)->param().isEmpty() )
2193 cpp <<
cppType( (*itEntry)->paramType() ) <<
" i, ";
2194 if (cfg.useEnumTypes && t ==
"Enum")
2195 cpp <<
enumType(*itEntry, cfg.globalEnums);
2198 cpp <<
" v )" << endl;
2203 cpp <<
"}" << endl << endl;
2207 if (cfg.useEnumTypes && t ==
"Enum")
2208 cpp <<
enumType(*itEntry, cfg.globalEnums);
2211 cpp <<
" " <<
getFunction(n, cfg.className) <<
"(";
2212 if ( !(*itEntry)->param().isEmpty() )
2213 cpp <<
" " <<
cppType( (*itEntry)->paramType() ) <<
" i ";
2214 cpp <<
")" <<
Const << endl;
2219 cpp <<
"}" << endl << endl;
2224 if ( cfg.itemAccessors )
2227 cpp << cfg.inherits+
"::Item" <<
itemType( (*itEntry)->type() ) <<
" *"
2229 if ( !(*itEntry)->param().isEmpty() ) {
2230 cpp <<
" " <<
cppType( (*itEntry)->paramType() ) <<
" i ";
2243 for( itEntry = entries.constBegin(); itEntry != entries.constEnd(); ++itEntry ) {
2244 QString n = (*itEntry)->name();
2245 QString t = (*itEntry)->type();
2248 if (( cfg.allDefaultGetters || cfg.defaultGetters.contains(n) ) && !(*itEntry)->defaultValue().isEmpty() ) {
2250 if ( !(*itEntry)->param().isEmpty() )
2251 cpp <<
" " <<
cppType( (*itEntry)->paramType() ) <<
" i ";
2252 cpp <<
")" <<
Const << endl;
2255 cpp <<
"}" << endl << endl;
2260 cpp << cfg.className <<
"::~" << cfg.className <<
"()" << endl;
2262 if ( cfg.singleton ) {
2264 cpp <<
" delete d;" << endl;
2265 cpp <<
" if (!s_global" << cfg.className <<
".isDestroyed()) {" << endl;
2266 cpp <<
" s_global" << cfg.className <<
"->q = 0;" << endl;
2267 cpp <<
" }" << endl;
2269 cpp <<
"}" << endl << endl;
2272 cpp <<
"void " << cfg.className <<
"::" <<
"usrWriteConfig()" << endl;
2274 cpp <<
" " << cfg.inherits <<
"::usrWriteConfig();" << endl << endl;
2275 foreach(
const Signal &signal, signalList) {
2276 cpp <<
" if ( " <<
varPath(
"settingsChanged", cfg) <<
" & " <<
signalEnumName(signal.name) <<
" ) " << endl;
2277 cpp <<
" emit " << signal.name <<
"(";
2279 for ( it = signal.arguments.constBegin(); it != itEnd; ) {
2280 SignalArguments argument = *it;
2282 if ( cfg.useEnumTypes && argument.type ==
"Enum" ) {
2283 for (
int i = 0, end = entries.count(); i < end; ++i ) {
2284 if ( entries[i]->name() == argument.variableName ) {
2285 cpp <<
"static_cast<" <<
enumType(entries[i], cfg.globalEnums) <<
">(";
2291 cpp <<
varPath(argument.variableName, cfg);
2294 if ( ++it != itEnd )
2297 cpp <<
");" << endl << endl;
2299 cpp <<
" " <<
varPath(
"settingsChanged", cfg) <<
" = 0;" << endl;
2306 cpp <<
"#include \"" << mocFileName <<
"\"" << endl;
2311 qDeleteAll( entries );
2313 implementation.close();