/****************************************************************************
**
** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
** This file is part of the demonstration applications of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** No Commercial Usage
** This file contains pre-release code and may not be distributed.
** You may use this file in accordance with the terms and conditions
** contained in the Technology Preview License Agreement accompanying
** this package.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** If you have questions regarding the use of this file, please contact
** Nokia at qt-info@nokia.com.
**
**
**
**
**
**
**
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include "examplecontent.h"
#include "colors.h"
#include "menumanager.h"
#include "imageitem.h"
#include "headingitem.h"
ExampleContent::ExampleContent(const QString &name, QGraphicsScene *scene, QGraphicsItem *parent)
: DemoItem(scene, parent)
{
this->name = name;
this->heading = 0;
this->description = 0;
this->screenshot = 0;
}
void ExampleContent::prepare()
{
if (!this->prepared){
this->prepared = true;
this->createContent();
}
}
void ExampleContent::animationStopped(int id)
{
if (id == DemoItemAnimation::ANIM_OUT){
// Free up some memory:
delete this->heading;
delete this->description;
delete this->screenshot;
this->heading = 0;
this->description = 0;
this->screenshot = 0;
this->prepared = false;
}
}
QString ExampleContent::loadDescription()
{
QByteArray ba = MenuManager::instance()->getHtml(this->name);
QString errorMsg;
int errorLine, errorColumn;
QDomDocument exampleDoc;
if (!exampleDoc.setContent(ba, false, &errorMsg, &errorLine, &errorColumn)) {
qDebug() << errorMsg << errorLine << errorColumn;
}
QDomNodeList paragraphs = exampleDoc.elementsByTagName("p");
if (paragraphs.length() < 1 && Colors::verbose)
qDebug() << "- ExampleContent::loadDescription(): Could not load description:"
<< MenuManager::instance()->info[this->name]["docfile"];
QString description = Colors::contentColor +
QLatin1String("Could not load description. Ensure that the documentation for Qt is built.");
for (int p = 0; p < int(paragraphs.length()); ++p) {
description = this->extractTextFromParagraph(paragraphs.item(p));
if (this->isSummary(description)) {
break;
}
}
return Colors::contentColor + description;
}
bool ExampleContent::isSummary(const QString &text)
{
return (!text.contains("[") &&
text.indexOf(QRegExp(QString("(In )?((The|This) )?(%1 )?.*(tutorial|example|demo|application)").arg(this->name),
Qt::CaseInsensitive)) != -1);
}
QString ExampleContent::extractTextFromParagraph(const QDomNode &parentNode)
{
QString description;
QDomNode node = parentNode.firstChild();
while (!node.isNull()) {
QString beginTag;
QString endTag;
if (node.isText())
description += Colors::contentColor + node.nodeValue();
else if (node.hasChildNodes()) {
if (node.nodeName() == "b") {
beginTag = "";
endTag = "";
} else if (node.nodeName() == "a") {
beginTag = Colors::contentColor;
endTag = "";
} else if (node.nodeName() == "i") {
beginTag = "";
endTag = "";
} else if (node.nodeName() == "tt") {
beginTag = "";
endTag = "";
}
description += beginTag + this->extractTextFromParagraph(node) + endTag;
}
node = node.nextSibling();
}
return description;
}
void ExampleContent::createContent()
{
// Create the items:
this->heading = new HeadingItem(this->name, this->scene(), this);
this->description = new DemoTextItem(this->loadDescription(), Colors::contentFont(),
Colors::heading, 500, this->scene(), this);
int imgHeight = 340 - int(this->description->boundingRect().height()) + 50;
this->screenshot = new ImageItem(QImage::fromData(MenuManager::instance()->getImage(this->name)),
550, imgHeight, this->scene(), this);
// Place the items on screen:
this->heading->setPos(0, 3);
this->description->setPos(0, this->heading->pos().y() + this->heading->boundingRect().height() + 10);
this->screenshot->setPos(0, this->description->pos().y() + this->description->boundingRect().height() + 10);
}
QRectF ExampleContent::boundingRect() const
{
return QRectF(0, 0, 500, 100);
}