#include "searchwidget.h"

#include <QDebug>
#include <QKeyEvent>
#include <QKeySequence>

SearchWidget::SearchWidget(QWidget *parent)
    : QWidget(parent)
{
    m_ui.setupUi(this);

    m_ui.notFoundLabel->hide();
    m_origPalette = m_ui.lineEdit->palette();

    connect(m_ui.nextButton, SIGNAL(clicked()),
            SLOT(slotSearchNext()));
    connect(m_ui.prevButton, SIGNAL(clicked()),
            SLOT(slotSearchPrev()));
    connect(m_ui.closeButton, SIGNAL(clicked()),
            SLOT(slotCancel()));
    connect(m_ui.lineEdit, SIGNAL(returnPressed()),
            SLOT(slotSearchNext()));

    m_ui.nextButton->setShortcut(
        QKeySequence::FindNext);
    m_ui.prevButton->setShortcut(
        QKeySequence::FindPrevious);

    installEventFilter(this);
}

void SearchWidget::slotSearchNext()
{
    QString txt = m_ui.lineEdit->text();
    if (!txt.isEmpty())
        emit searchNext(txt, caseSensitivity(), regexEnabled());
}

void SearchWidget::slotSearchPrev()
{
    QString txt = m_ui.lineEdit->text();
    if (!txt.isEmpty())
        emit searchPrev(txt, caseSensitivity(), regexEnabled());
}

void SearchWidget::slotCancel()
{
    hide();
}

void SearchWidget::showEvent(QShowEvent *event)
{
    return QWidget::showEvent(event);
}

Qt::CaseSensitivity SearchWidget::caseSensitivity() const
{
    if (m_ui.caseSensitiveBox->isChecked())
        return Qt::CaseSensitive;
    else
        return Qt::CaseInsensitive;
}

bool SearchWidget::regexEnabled() const
{
    return m_ui.regexBox->isChecked();
}

bool SearchWidget::eventFilter(QObject *object, QEvent* event)
{
    if (event->type() == QEvent::KeyPress) {
        if ((static_cast<QKeyEvent*>(event))->key() == Qt::Key_Escape) {
            hide();
        }
    }
    return QWidget::eventFilter(object, event);
}

void SearchWidget::setFound(bool found)
{
    QPalette pal = m_origPalette;
    pal.setColor(QPalette::Active, QPalette::Base,
                 found ? Qt::white : QColor(255, 102, 102));
    m_ui.lineEdit->setPalette(pal);
    m_ui.notFoundLabel->setVisible(!found);
}

void SearchWidget::show()
{
    QWidget::show();
    m_ui.lineEdit->selectAll();
    m_ui.lineEdit->setFocus(Qt::ShortcutFocusReason);
    m_ui.lineEdit->setPalette(m_origPalette);
}
