/****************************************************************************
**
** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
** This file is part of the documentation 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 <QtGui>
#include <QApplication>
#include <stdio.h>

class Widget : public QWidget
{
public:
    Widget(QWidget *parent = 0);

    void constCharPointer();
    void constCharArray();
    void characterReference();
    void atFunction();
    void stringLiteral();
    void modify();
    void index();
    QString boolToString(bool b);
    void nullVsEmpty();

    void appendFunction();
    void argFunction();
    void chopFunction();
    void compareFunction();
    void compareSensitiveFunction();
    void containsFunction();
    void countFunction();
    void dataFunction();
    void endsWithFunction();
    void fillFunction();
    void fromRawDataFunction();

    void indexOfFunction();
    void firstIndexOfFunction();
    void insertFunction();
    void isNullFunction();
    void isEmptyFunction();
    void lastIndexOfFunction();
    void leftFunction();
    void leftJustifiedFunction();
    void leftRefFunction();
    void midFunction();
    void midRefFunction();
    void numberFunction();

    void prependFunction();
    void removeFunction();
    void replaceFunction();
    void reserveFunction();
    void resizeFunction();
    void rightFunction();
    void rightJustifiedFunction();
    void rightRefFunction();
    void sectionFunction();
    void setNumFunction();
    void simplifiedFunction();

    void sizeFunction();
    void splitFunction();
    void splitCaseSensitiveFunction();
    void sprintfFunction();
    void startsWithFunction();
    void toDoubleFunction();
    void toFloatFunction();
    void toIntFunction();
    void toLongFunction();
    void toLongLongFunction();

    void toLowerFunction();
    void toShortFunction();
    void toUIntFunction();
    void toULongFunction();
    void toULongLongFunction();
    void toUShortFunction();
    void toUpperFunction();
    void trimmedFunction();
    void truncateFunction();

    void plusEqualOperator();
    void arrayOperator();
};

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
}

void Widget::constCharPointer()
{
//! [0]
    QString str = "Hello";
//! [0]
}

void Widget::constCharArray()
{
//! [1]
    static const QChar data[4] = { 0x0055, 0x006e, 0x10e3, 0x03a3 };
    QString str(data, 4);
//! [1]
}

void Widget::characterReference()
{
//! [2]
    QString str;
    str.resize(4);

    str[0] = QChar('U');
    str[1] = QChar('n');
    str[2] = QChar(0x10e3);
    str[3] = QChar(0x03a3);
//! [2]
}

void Widget::atFunction()
{
//! [3]
    QString str;

    for (int i = 0; i < str.size(); ++i) {
        if (str.at(i) >= QChar('a') && str.at(i) <= QChar('f'))
            qDebug() << "Found character in range [a-f]";
    }
//! [3]
}

void Widget::stringLiteral()
{
//! [4]
    QString str;

    if (str == "auto" || str == "extern"
            || str == "static" || str == "register") {
        // ...
    }
//! [4]
}

void Widget::modify()
{
//! [5]
    QString str = "and";
    str.prepend("rock ");     // str == "rock and"
    str.append(" roll");        // str == "rock and roll"
    str.replace(5, 3, "&");   // str == "rock & roll"
//! [5]
}

void Widget::index()
{
//! [6]
    QString str = "We must be <b>bold</b>, very <b>bold</b>";
    int j = 0;

    while ((j = str.indexOf("<b>", j)) != -1) {
        qDebug() << "Found <b> tag at index position" << j;
        ++j;
    }
//! [6]
}

//! [7]
    QString Widget::boolToString(bool b)
    {
        QString result;
        if (b)
            result = "True";
        else
            result = "False";
        return result;
    }
//! [7]


void Widget::nullVsEmpty()
{
//! [8]
    QString().isNull();               // returns true
    QString().isEmpty();              // returns true

    QString("").isNull();             // returns false
    QString("").isEmpty();            // returns true

    QString("abc").isNull();          // returns false
    QString("abc").isEmpty();         // returns false
//! [8]
}

void Widget::appendFunction()
{
//! [9]
    QString x = "free";
    QString y = "dom";

    x.append(y);
    // x == "freedom"
//! [9]

//! [10]
    x.insert(x.size(), y);
//! [10]
}

void Widget::argFunction()
{
//! [11]
    QString i;           // current file's number
    QString total;       // number of files to process
    QString fileName;    // current file's name

    QString status = QString("Processing file %1 of %2: %3")
                    .arg(i).arg(total).arg(fileName);
//! [11]

//! [12] //! [13]
    QString str;
//! [12]
    str = "%1 %2";

    str.arg("%1f", "Hello");        // returns "%1f Hello"
    str.arg("%1f").arg("Hello");    // returns "Hellof %2"
//! [13]

//! [14]
    str = QString("Decimal 63 is %1 in hexadecimal")
            .arg(63, 0, 16);
    // str == "Decimal 63 is 3f in hexadecimal"

    QLocale::setDefault(QLocale(QLocale::English, QLocale::UnitedStates));
    str = QString("%1 %L2 %L3")
            .arg(12345)
            .arg(12345)
            .arg(12345, 0, 16);
    // str == "12345 12,345 3039"
//! [14]
}

void Widget::chopFunction()
{
//! [15]
    QString str("LOGOUT\r\n");
    str.chop(2);
    // str == "LOGOUT"
//! [15]
}

void Widget::compareFunction()
{
    int x = QString::compare("auto", "auto");   // x == 0
    int y = QString::compare("auto", "car");    // y < 0
    int z = QString::compare("car", "auto");    // z > 0
}

void Widget::compareSensitiveFunction()
{
//! [16]
    int x = QString::compare("aUtO", "AuTo", Qt::CaseInsensitive);  // x == 0
    int y = QString::compare("auto", "Car", Qt::CaseSensitive);     // y > 0
    int z = QString::compare("auto", "Car", Qt::CaseInsensitive);   // z < 0
//! [16]
}

void Widget::containsFunction()
{
//! [17]
    QString str = "Peter Pan";
    str.contains("peter", Qt::CaseInsensitive);    // returns true
//! [17]
}

void Widget::countFunction()
{
//! [18]
    QString str = "banana and panama";
    str.count(QRegExp("a[nm]a"));    // returns 4
//! [18]
}

void Widget::dataFunction()
{
//! [19]
    QString str = "Hello world";
    QChar *data = str.data();
    while (!data->isNull()) {
        qDebug() << data->unicode();
        ++data;
    }
//! [19]
}

void Widget::endsWithFunction()
{
//! [20]
    QString str = "Bananas";
    str.endsWith("anas");         // returns true
    str.endsWith("pple");         // returns false
//! [20]
}

void Widget::fillFunction()
{
//! [21]
    QString str = "Berlin";
    str.fill('z');
    // str == "zzzzzz"

    str.fill('A', 2);
    // str == "AA"
//! [21]
}

void Widget::fromRawDataFunction()
{
//! [22]
     QRegExp pattern;
     static const QChar unicode[] = {
             0x005A, 0x007F, 0x00A4, 0x0060,
             0x1009, 0x0020, 0x0020};
     int size = sizeof(unicode) / sizeof(QChar);

     QString str = QString::fromRawData(unicode, size);
     if (str.contains(QRegExp(pattern))) {
         // ...
//! [22] //! [23]
     }
//! [23]
}

void Widget::indexOfFunction()
{
//! [24]
    QString x = "sticky question";
    QString y = "sti";
    x.indexOf(y);               // returns 0
    x.indexOf(y, 1);            // returns 10
    x.indexOf(y, 10);           // returns 10
    x.indexOf(y, 11);           // returns -1
//! [24]
}

void Widget::firstIndexOfFunction()
{
//! [25]
    QString str = "the minimum";
    str.indexOf(QRegExp("m[aeiou]"), 0);       // returns 4
//! [25]
}

void Widget::insertFunction()
{
//! [26]
    QString str = "Meal";
    str.insert(1, QString("ontr"));
    // str == "Montreal"
//! [26]
}

void Widget::isEmptyFunction()
{
//! [27]
    QString().isEmpty();            // returns true
    QString("").isEmpty();          // returns true
    QString("x").isEmpty();         // returns false
    QString("abc").isEmpty();       // returns false
//! [27]
}

void Widget::isNullFunction()
{
//! [28]
    QString().isNull();             // returns true
    QString("").isNull();           // returns false
    QString("abc").isNull();        // returns false
//! [28]
}

void Widget::lastIndexOfFunction()
{
//! [29]
    QString x = "crazy azimuths";
    QString y = "az";
    x.lastIndexOf(y);           // returns 6
    x.lastIndexOf(y, 6);        // returns 6
    x.lastIndexOf(y, 5);        // returns 2
    x.lastIndexOf(y, 1);        // returns -1
//! [29]

//! [30]
    QString str = "the minimum";
    str.lastIndexOf(QRegExp("m[aeiou]"));      // returns 8
//! [30]
}

void Widget::leftFunction()
{
//! [31]
    QString x = "Pineapple";
    QString y = x.left(4);      // y == "Pine"
//! [31]
}

void Widget::leftJustifiedFunction()
{
//! [32]
    QString s = "apple";
    QString t = s.leftJustified(8, '.');    // t == "apple..."
//! [32]

//! [33]
    QString str = "Pineapple";
    str = str.leftJustified(5, '.', true);    // str == "Pinea"
//! [33]
}

void Widget::midFunction()
{
//! [34]
    QString x = "Nine pineapples";
    QString y = x.mid(5, 4);            // y == "pine"
    QString z = x.mid(5);               // z == "pineapples"
//! [34]
}

void Widget::numberFunction()
{
//! [35]
    long a = 63;
    QString s = QString::number(a, 16);             // s == "3f"
    QString t = QString::number(a, 16).toUpper();     // t == "3F"
//! [35]
}

void Widget::prependFunction()
{
//! [36]
    QString x = "ship";
    QString y = "air";
    x.prepend(y);
    // x == "airship"
//! [36]
}

void Widget::removeFunction()
{
//! [37]
    QString s = "Montreal";
    s.remove(1, 4);
    // s == "Meal"
//! [37]

//! [38]
    QString t = "Ali Baba";
    t.remove(QChar('a'), Qt::CaseInsensitive);
    // t == "li Bb"
//! [38]

//! [39]
    QString r = "Telephone";
    r.remove(QRegExp("[aeiou]."));
    // r == "The"
//! [39]
}

void Widget::replaceFunction()
{
//! [40]
    QString x = "Say yes!";
    QString y = "no";
    x.replace(4, 3, y);
    // x == "Say no!"
//! [40]

//! [41]
    QString str = "colour behaviour flavour neighbour";
    str.replace(QString("ou"), QString("o"));
    // str == "color behavior flavor neighbor"
//! [41]

//! [42]
    QString s = "Banana";
    s.replace(QRegExp("a[mn]"), "ox");
    // s == "Boxoxa"
//! [42]

//! [43]
    QString t = "A <i>bon mot</i>.";
    t.replace(QRegExp("<i>([^<]*)</i>"), "\\emph{\\1}");
    // t == "A \\emph{bon mot}."
//! [43]

//! [86]
    QString equis = "xxxxxx";
    equis.replace("xx", "x");
    // equis == "xxx"    
//! [86]
}

void Widget::reserveFunction()
{
//! [44]
    QString result;
    int maxSize;
    bool condition;
    QChar nextChar;

    result.reserve(maxSize);

    while (condition)
        result.append(nextChar);

    result.squeeze();
//! [44]
}

void Widget::resizeFunction()
{
//! [45]
    QString s = "Hello world";
    s.resize(5);
    // s == "Hello"

    s.resize(8);
    // s == "Hello???" (where ? stands for any character)
//! [45]

//! [46]
    QString t = "Hello";
    t += QString(10, 'X');
    // t == "HelloXXXXXXXXXX"
//! [46]

//! [47]
    QString r = "Hello";
    r = r.leftJustified(10, ' ');
    // r == "Hello     "
//! [47]
}

void Widget::rightFunction()
{
//! [48]
    QString x = "Pineapple";
    QString y = x.right(5);      // y == "apple"
//! [48]
}

void Widget::rightJustifiedFunction()
{
//! [49]
    QString s = "apple";
    QString t = s.rightJustified(8, '.');    // t == "...apple"
//! [49]

//! [50]
    QString str = "Pineapple";
    str = str.rightJustified(5, '.', true);    // str == "Pinea"
//! [50]
}

void Widget::sectionFunction()
{
//! [51] //! [52]
    QString str;
//! [51]
    QString csv = "forename,middlename,surname,phone";
    QString path = "/usr/local/bin/myapp"; // First field is empty
    QString::SectionFlag flag = QString::SectionSkipEmpty;


    str = csv.section(',', 2, 2);   // str == "surname"
    str = path.section('/', 3, 4);  // str == "bin/myapp"
    str = path.section('/', 3, 3, flag); // str == "myapp"
//! [52]

//! [53]
    str = csv.section(',', -3, -2);  // str == "middlename,surname"
    str = path.section('/', -1); // str == "myapp"
//! [53]

//! [54]
    QString data = "forename**middlename**surname**phone";

    str = data.section("**", 2, 2); // str == "surname"
    str = data.section("**", -3, -2); // str == "middlename**surname"
//! [54]

//! [55]
    QString line = "forename\tmiddlename  surname \t \t phone";
    QRegExp sep("\\s+");
    str = line.section(sep, 2, 2); // s == "surname"
    str = line.section(sep, -3, -2); // s == "middlename  surname"
//! [55]
}

void Widget::setNumFunction()
{
//! [56]
    QString str;
    str.setNum(1234);       // str == "1234"
//! [56]
}

void Widget::simplifiedFunction()
{
//! [57]
    QString str = "  lots\t of\nwhitespace\r\n ";
    str = str.simplified();
    // str == "lots of whitespace";
//! [57]
}

void Widget::sizeFunction()
{
//! [58]
    QString str = "World";
    int n = str.size();         // n == 5
    str.data()[0];              // returns 'W'
    str.data()[4];              // returns 'd'
    str.data()[5];              // returns '\0'
//! [58]
}

void Widget::splitFunction()
{
//! [59]
    QString str;
    QStringList list;

    str = "Some  text\n\twith  strange whitespace.";
    list = str.split(QRegExp("\\s+"));
    // list: [ "Some", "text", "with", "strange", "whitespace." ]
//! [59]

//! [60]
    str = "This time, a normal English sentence.";
    list = str.split(QRegExp("\\W+"), QString::SkipEmptyParts);
    // list: [ "This", "time", "a", "normal", "English", "sentence" ]
//! [60]

//! [61]
    str = "Now: this sentence fragment.";
    list = str.split(QRegExp("\\b"));
    // list: [ "", "Now", ": ", "this", " ", "sentence", " ", "fragment", "." ]
//! [61]
}

void Widget::splitCaseSensitiveFunction()
{
//! [62]
    QString str = "a,,b,c";

    QStringList list1 = str.split(",");
    // list1: [ "a", "", "b", "c" ]

    QStringList list2 = str.split(",", QString::SkipEmptyParts);
    // list2: [ "a", "b", "c" ]
//! [62]
}

void Widget::sprintfFunction()
{
//! [63]
    size_t BufSize;
    char buf[BufSize];

    ::snprintf(buf, BufSize, "%lld", 123456789LL);
    QString str = QString::fromAscii(buf);
//! [63]

//! [64]
    QString result;
    QTextStream(&result) << "pi = " << 3.14;
    // result == "pi = 3.14"
//! [64]
}

void Widget::startsWithFunction()
{
//! [65]
    QString str = "Bananas";
    str.startsWith("Ban");     // returns true
    str.startsWith("Car");     // returns false
//! [65]
}

void Widget::toDoubleFunction()
{
//! [66]
    QString str = "1234.56";
    double val = str.toDouble();   // val == 1234.56
//! [66]

//! [67]
    bool ok;
    double d;

    d = QString( "1234.56e-02" ).toDouble(&ok); // ok == true, d == 12.3456
//! [67]

//! [68] //! [69]
    QLocale::setDefault(QLocale::C);
    d = QString( "1234,56" ).toDouble(&ok); // ok == false
//! [68]
    d = QString( "1234.56" ).toDouble(&ok); // ok == true, d == 1234.56

//! [69] //! [70]
    QLocale::setDefault(QLocale::German);
    d = QString( "1234,56" ).toDouble(&ok); // ok == true, d == 1234.56
    d = QString( "1234.56" ).toDouble(&ok); // ok == true, d == 1234.56

//! [70]
    QLocale::setDefault(QLocale::C);
    d = QString( "1,234,567.89" ).toDouble(&ok); // ok == false
}

void Widget::toFloatFunction()
{
//! [71]
    QString str1 = "1234.56";
    str1.toFloat();             // returns 1234.56

    bool ok;
    QString str2 = "R2D2";
    str2.toFloat(&ok);          // returns 0.0, sets ok to false
//! [71]
}

void Widget::toIntFunction()
{
//! [72]
    QString str = "FF";
    bool ok;
    int hex = str.toInt(&ok, 16);       // hex == 255, ok == true
    int dec = str.toInt(&ok, 10);       // dec == 0, ok == false
//! [72]
}

void Widget::toLongFunction()
{
//! [73]
    QString str = "FF";
    bool ok;

    long hex = str.toLong(&ok, 16);     // hex == 255, ok == true
    long dec = str.toLong(&ok, 10);     // dec == 0, ok == false
//! [73]
}

void Widget::toLongLongFunction()
{
//! [74]
    QString str = "FF";
    bool ok;

    qint64 hex = str.toLongLong(&ok, 16);      // hex == 255, ok == true
    qint64 dec = str.toLongLong(&ok, 10);      // dec == 0, ok == false
//! [74]
}

void Widget::toLowerFunction()
{
//! [75]
    QString str = "Qt by NOKIA";
    str = str.toLower();        // str == "qy by nokia"
//! [75]
}

void Widget::toShortFunction()
{
//! [76]
    QString str = "FF";
    bool ok;

    short hex = str.toShort(&ok, 16);   // hex == 255, ok == true
    short dec = str.toShort(&ok, 10);   // dec == 0, ok == false
//! [76]
}

void Widget::toUIntFunction()
{
//! [77]
    QString str = "FF";
    bool ok;

    uint hex = str.toUInt(&ok, 16);     // hex == 255, ok == true
    uint dec = str.toUInt(&ok, 10);     // dec == 0, ok == false
//! [77]
}

void Widget::toULongFunction()
{
//! [78]
    QString str = "FF";
    bool ok;

    ulong hex = str.toULong(&ok, 16);   // hex == 255, ok == true
    ulong dec = str.toULong(&ok, 10);   // dec == 0, ok == false
//! [78]
}

void Widget::toULongLongFunction()
{
//! [79]
    QString str = "FF";
    bool ok;

    quint64 hex = str.toULongLong(&ok, 16);    // hex == 255, ok == true
    quint64 dec = str.toULongLong(&ok, 10);    // dec == 0, ok == false
//! [79]
}

void Widget::toUShortFunction()
{
//! [80]
    QString str = "FF";
    bool ok;

    ushort hex = str.toUShort(&ok, 16);     // hex == 255, ok == true
    ushort dec = str.toUShort(&ok, 10);     // dec == 0, ok == false
//! [80]
}

void Widget::toUpperFunction()
{
//! [81]
    QString str = "TeXt";
    str = str.toUpper();        // str == "TEXT"
//! [81]
}

void Widget::trimmedFunction()
{
//! [82]
    QString str = "  lots\t of\nwhitespace\r\n ";
    str = str.trimmed();
    // str == "lots\t of\nwhitespace"
//! [82]
}

void Widget::truncateFunction()
{
//! [83]
    QString str = "Vladivostok";
    str.truncate(4);
    // str == "Vlad"
//! [83]
}

void Widget::plusEqualOperator()
{
//! [84]
    QString x = "free";
    QString y = "dom";
    x += y;
    // x == "freedom"
//! [84]
}

void Widget::arrayOperator()
{
//! [85]
    QString str;

    if (str[0] == QChar('?'))
        str[0] = QChar('_');
//! [85]
}

void Widget::midRefFunction()
{
//! [midRef]
    QString x = "Nine pineapples";
    QStringRef y = x.midRef(5, 4);      // y == "pine"
    QStringRef z = x.midRef(5);         // z == "pineapples"
//! [midRef]
}

void Widget::leftRefFunction()
{
//! [leftRef]
    QString x = "Pineapple";
    QStringRef y = x.leftRef(4);        // y == "Pine"
//! [leftRef]
}

void Widget::rightRefFunction()
{
//! [rightRef]
    QString x = "Pineapple";
    QStringRef y = x.rightRef(5);       // y == "apple"
//! [rightRef]
}


int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    Widget widget;
    widget.show();
    return app.exec();
}
