1bdcd7bb9e2aa01c4c4378cf0b090c8974e42c11
[profile/ivi/qtxmlpatterns.git] / examples / xmlpatterns / recipes / querymainwindow.cpp
1 /****************************************************************************
2 **
3 ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/
5 **
6 ** This file is part of the examples of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:BSD$
9 ** You may use this file under the terms of the BSD license as follows:
10 **
11 ** "Redistribution and use in source and binary forms, with or without
12 ** modification, are permitted provided that the following conditions are
13 ** met:
14 **   * Redistributions of source code must retain the above copyright
15 **     notice, this list of conditions and the following disclaimer.
16 **   * Redistributions in binary form must reproduce the above copyright
17 **     notice, this list of conditions and the following disclaimer in
18 **     the documentation and/or other materials provided with the
19 **     distribution.
20 **   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
21 **     the names of its contributors may be used to endorse or promote
22 **     products derived from this software without specific prior written
23 **     permission.
24 **
25 ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26 ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27 ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28 ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29 ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30 ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31 ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35 ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
36 **
37 ** $QT_END_LICENSE$
38 **
39 ****************************************************************************/
40
41 #include <QMessageBox>
42 #include <QFileDialog>
43 #include <QtXmlPatterns>
44
45 #include "querymainwindow.h"
46 #include "xmlsyntaxhighlighter.h"
47
48 //! [0]
49 QueryMainWindow::QueryMainWindow() : ui_defaultQueries(0)
50 {
51     setupUi(this);
52
53     new XmlSyntaxHighlighter(findChild<QTextEdit*>("inputTextEdit")->document());
54     new XmlSyntaxHighlighter(findChild<QTextEdit*>("outputTextEdit")->document());
55
56     ui_defaultQueries = findChild<QComboBox*>("defaultQueries");
57     QMetaObject::connectSlotsByName(this);
58     connect(ui_defaultQueries, SIGNAL(currentIndexChanged(int)), SLOT(displayQuery(int)));
59
60     loadInputFile();
61     const QStringList queries(QDir(":/files/", "*.xq").entryList());
62     int len = queries.count();
63     for(int i = 0; i < len; ++i)
64         ui_defaultQueries->addItem(queries.at(i));
65 }
66 //! [0]
67
68
69 //! [1]
70 void QueryMainWindow::displayQuery(int index)
71 {
72     QFile queryFile(QString(":files/") + ui_defaultQueries->itemText(index));
73     queryFile.open(QIODevice::ReadOnly);
74     const QString query(QString::fromLatin1(queryFile.readAll()));
75     findChild<QTextEdit*>("queryTextEdit")->setPlainText(query);
76
77     evaluate(query);
78 }
79 //! [1]
80
81
82 void QueryMainWindow::loadInputFile()
83 {
84     QFile forView;
85     forView.setFileName(":/files/cookbook.xml");
86     if (!forView.open(QIODevice::ReadOnly)) {
87         QMessageBox::information(this,
88             tr("Unable to open file"), forView.errorString());
89         return;
90     }
91
92     QTextStream in(&forView);
93     QString inputDocument = in.readAll();
94     findChild<QTextEdit*>("inputTextEdit")->setPlainText(inputDocument);
95 }
96
97
98 //! [2]
99 void QueryMainWindow::evaluate(const QString &str)
100 {
101     QFile sourceDocument;
102     sourceDocument.setFileName(":/files/cookbook.xml");
103     sourceDocument.open(QIODevice::ReadOnly);
104
105     QByteArray outArray;
106     QBuffer buffer(&outArray);
107     buffer.open(QIODevice::ReadWrite);
108
109     QXmlQuery query;
110     query.bindVariable("inputDocument", &sourceDocument);
111     query.setQuery(str);
112     if (!query.isValid())
113         return;
114
115     QXmlFormatter formatter(query, &buffer);
116     if (!query.evaluateTo(&formatter))
117         return;
118
119     buffer.close();
120     findChild<QTextEdit*>("outputTextEdit")->setPlainText(QString::fromUtf8(outArray.constData()));
121
122 }
123 //! [2]
124