package MainWindow;

use strict;
use warnings;
use QtCore4;
use QtGui4;
use QtXmlPatterns4;
use Ui_MainWindow;
use QObjectXmlModel;
use QtCore4::isa qw( Qt::MainWindow );
use QtCore4::slots
    on_actionAbout_triggered => [];

use lib '../shared';
#use XmlSyntaxHighlighter;

sub ui() {
    return this->{ui};
}

sub NEW
{
    my ($class) = @_;
    $class->SUPER::NEW();
    this->{ui} = Ui_MainWindow->setupUi(this);

    #XmlSyntaxHighlighter(ui->wholeTreeOutput->document());

    # Setup the font.
    {
        my $font = Qt::Font('Courier');
        $font->setFixedPitch(1);

        ui->wholeTree->setFont($font);
        ui->wholeTreeOutput->setFont($font);
        ui->htmlQueryEdit->setFont($font);
    }

    my $namePool = Qt::XmlNamePool();
    my $qObjectModel = QObjectXmlModel(this, $namePool);
    my $query = Qt::XmlQuery($namePool);

    # The Qt::Object tree as XML view. 
    {
        $query->bindVariable('root', Qt::XmlItem($qObjectModel->root()));
        $query->setQuery(Qt::Url('qrc:/queries/wholeTree.xq'));

        die '$query is invalid' unless $query->isValid();
        my $output = Qt::ByteArray();
        my $buffer = Qt::Buffer($output);
        $buffer->open(Qt::IODevice::WriteOnly());

        # Let's the use the formatter, so it's a bit easier to read. 
        my $serializer = Qt::XmlFormatter($query, $buffer);

        $query->evaluateTo($serializer);
        $buffer->close();

        {
            my $queryFile = Qt::File(':/queries/wholeTree.xq');
            $queryFile->open(Qt::IODevice::ReadOnly());
            ui()->wholeTree->setPlainText($queryFile->readAll()->constData());
            ui()->wholeTreeOutput->setPlainText($output->constData());
        }
    }

    # The Qt::Object occurrence statistics as HTML view. 
    {
        $query->setQuery(Qt::Url('qrc:/queries/statisticsInHTML.xq'));
        die '$query is invalid' unless $query->isValid();

        my $output = Qt::ByteArray();
        my $buffer = Qt::Buffer($output);
        $buffer->open(Qt::IODevice::WriteOnly());

        # Let's the use the serializer, so we gain a bit of speed. 
        my $serializer = Qt::XmlSerializer($query, $buffer);

        $query->evaluateTo($serializer);
        $buffer->close();

        {
            my $queryFile = Qt::File(':/queries/statisticsInHTML.xq');
            $queryFile->open(Qt::IODevice::ReadOnly());
            ui()->htmlQueryEdit->setPlainText($queryFile->readAll()->constData());
            ui()->htmlOutput->setHtml($output->constData());
        }
    }
}

sub on_actionAbout_triggered
{
    Qt::MessageBox::about(this,
                       this->tr('About Qt::Object XML Model'),
                       this->tr('<p>The <b>Qt::Object XML Model</b> example shows ' .
                          'how to use XQuery on top of data of your choice ' .
                          'without converting it to an XML document.</p>' .
                          '<p>In this example a Qt::SimpleXmlNodeModel subclass ' .
                          'makes it possible to query a Qt::Object tree using ' .
                          'XQuery and retrieve the result as pointers to ' .
                          'Qt::Objects, or as XML.</p>' .
                          '<p>A possible use case of this could be to write ' .
                          'an application that tests a graphical interface ' .
                          'against Human Interface Guidelines, or that ' .
                          'queries an application\'s data which is modeled ' .
                          'using a Qt::Object tree and dynamic properties.'));
}

1;