/*
 * Copyright (c) 2015, University of Kaiserslautern
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 *
 * 1. Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * 3. Neither the name of the copyright holder nor the names of its
 *    contributors may be used to endorse or promote products derived from
 *    this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * Authors:
 *    Janik Schlemminger
 *    Robert Gernhardt
 *    Matthias Jung
 */

#include "tracefiletab.h"
#include "ui_tracefiletab.h"
#include "queryeditor.h"
#include "QFileInfo"
#include "qmessagebox.h"
#include <iostream>

TraceFileTab::TraceFileTab(QWidget *parent, const QString &path) :
    QWidget(parent), ui(new Ui::TraceFileTab), savingChangesToDB(false)
{
    ui->setupUi(this);
    this->path = path;

    std::cout << "Opening new tab for \"" << path.toStdString() << "\"" <<
              std::endl;

    initNavigatorAndItsDependentWidgets(path);
    setUpFileWatcher(path);
    ui->fileDescriptionEdit->setPlainText(
        navigator->GeneralTraceInfo().description);
    tracefileChanged();
}

TraceFileTab::~TraceFileTab()
{
    delete ui;
}

void TraceFileTab::commitChangesToDB()
{
    savingChangesToDB = true;
    navigator->commitChangesToDB();
}

void TraceFileTab::initNavigatorAndItsDependentWidgets(QString path)
{
    navigator = new TraceNavigator(path, this);

    ui->traceplot->init(navigator);

    ui->pornoTraceScroller->init(navigator, ui->traceplot);
    connect(this, SIGNAL(colorGroupingChanged(ColorGrouping)),
            ui->pornoTraceScroller, SLOT(colorGroupingChanged(ColorGrouping)));

    ui->selectedTransactionTree->init(navigator);
    //ui->debugMessages->init(navigator,ui->traceplot);
    ui->commentTree->init(navigator);

}

void TraceFileTab::setUpFileWatcher(QString path)
{
    fileWatcher = new QFileSystemWatcher(QStringList(path), this);
    QObject::connect(fileWatcher, SIGNAL(fileChanged(QString)), this,
                     SLOT(tracefileChanged()));
}

void TraceFileTab::tracefileChanged()
{
    if (savingChangesToDB == true) {
        // Database has changed due to user action (e.g., saving comments).
        // No need to disable the "Save changes to DB" menu.
        savingChangesToDB = false;
        Q_EMIT statusChanged(QString("Changes saved "), true);
    } else {
        // External event changed the database file (e.g., the database file
        // was overwritten when running a new test).
        // The "Save changes to DB" menu must be disabled to avoid saving
        // changes to a corrupted or inconsistent file.
        Q_EMIT statusChanged(QString("At least one database has changed on disk "),
                             false);
    }
    navigator->refreshData();
}

