/*************************************************************************** ** ** This file is part of Qt Creator ** ** Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). ** ** Contact: Qt Software Information (qt-info@nokia.com) ** ** ** Non-Open Source Usage ** ** Licensees may use this file in accordance with the Qt Beta Version ** License Agreement, Agreement version 2.2 provided with the Software or, ** alternatively, in accordance with the terms contained in a written ** agreement between you and Nokia. ** ** GNU General Public License Usage ** ** Alternatively, this file may be used under the terms of the GNU General ** Public License versions 2.0 or 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the packaging ** of this file. Please review the following information to ensure GNU ** General Public Licensing requirements will be met: ** ** http://www.fsf.org/licensing/licenses/info/GPLv2.html and ** http://www.gnu.org/copyleft/gpl.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt GPL Exception version ** 1.2, included in the file GPL_EXCEPTION.txt in this package. ** ***************************************************************************/ #include "proitems.h" #include "prowriter.h" #include using namespace Qt4ProjectManager::Internal; bool ProWriter::write(ProFile *profile, const QString &fileName) { QFile data(fileName); if (!data.open(QFile::WriteOnly|QFile::Text)) return false; m_writeState = 0; m_comment.clear(); m_out.setDevice(&data); writeItem(profile, QString()); data.close(); return true; } QString ProWriter::contents(ProFile *profile) { QString result; m_writeState = 0; m_comment.clear(); m_out.setString(&result, QIODevice::WriteOnly); writeItem(profile, QString()); return result; } QString ProWriter::fixComment(const QString &comment, const QString &indent) const { QString result = comment; result = result.replace(QLatin1Char('\n'), QLatin1Char('\n') + indent + QLatin1String("# ")); return QLatin1String("# ") + result; } void ProWriter::writeValue(ProValue *value, const QString &indent) { if (m_writeState & NewLine) { m_out << indent << QLatin1String(" "); m_writeState &= ~NewLine; } m_out << value->value(); if (!(m_writeState & LastItem)) m_out << QLatin1String(" \\"); if (!value->comment().isEmpty()) m_out << QLatin1Char(' ') << fixComment(value->comment(), indent); m_out << endl; m_writeState |= NewLine; } void ProWriter::writeOther(ProItem *item, const QString &indent) { if (m_writeState & NewLine) { m_out << indent; m_writeState &= ~NewLine; } if (item->kind() == ProItem::FunctionKind) { ProFunction *v = static_cast(item); m_out << v->text(); } else if (item->kind() == ProItem::ConditionKind) { ProCondition *v = static_cast(item); m_out << v->text(); } else if (item->kind() == ProItem::OperatorKind) { ProOperator *v = static_cast(item); if (v->operatorKind() == ProOperator::OrOperator) m_out << QLatin1Char('|'); else m_out << QLatin1Char('!'); } if (!item->comment().isEmpty()) { if (!m_comment.isEmpty()) m_comment += QLatin1Char('\n'); m_comment += item->comment(); } } void ProWriter::writeBlock(ProBlock *block, const QString &indent) { if (m_writeState & NewLine) { m_out << indent; m_writeState &= ~NewLine; } if (!block->comment().isEmpty()) { if (!(m_writeState & FirstItem)) m_out << endl << indent; m_out << fixComment(block->comment(), indent) << endl << indent; } QString newindent = indent; if (block->blockKind() & ProBlock::VariableKind) { ProVariable *v = static_cast(block); m_out << v->variable(); switch(v->variableOperator()) { case ProVariable::AddOperator: m_out << QLatin1String(" += "); break; case ProVariable::RemoveOperator: m_out << QLatin1String(" -= "); break; case ProVariable::ReplaceOperator: m_out << QLatin1String(" ~= "); break; case ProVariable::SetOperator: m_out << QLatin1String(" = "); break; case ProVariable::UniqueAddOperator: m_out << QLatin1String(" *= "); break; } } else if (block->blockKind() & ProBlock::ScopeContentsKind) { if (block->items().count() > 1) { newindent = indent + QLatin1String(" "); m_out << QLatin1String(" { "); if (!m_comment.isEmpty()) { m_out << fixComment(m_comment, indent); m_comment.clear(); } m_out << endl; m_writeState |= NewLine; } else { m_out << QLatin1Char(':'); } } QList items = block->items(); for (int i=0; iblockKind() & ProBlock::ScopeContentsKind) && (block->items().count() > 1)) { if (m_writeState & NewLine) { m_out << indent; m_writeState &= ~NewLine; } m_out << QLatin1Char('}'); } if (!m_comment.isEmpty()) { m_out << fixComment(m_comment, indent); m_out << endl; m_writeState |= NewLine; m_comment.clear(); } if (!(m_writeState & NewLine)) { m_out << endl; m_writeState |= NewLine; } } void ProWriter::writeItem(ProItem *item, const QString &indent) { if (item->kind() == ProItem::ValueKind) { writeValue(static_cast(item), indent); } else if (item->kind() == ProItem::BlockKind) { writeBlock(static_cast(item), indent); } else { writeOther(item, indent); } }