/*
* Copyright (C) 2010, 2013 Nicolas Bonnefon and other contributors
*
* This file is part of glogg.
*
* glogg is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* glogg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with glogg. If not, see .
*/
#include "log.h"
#include
#include
#include
#include
#include
#include
#include "configuration.h"
#include "qfnotifications.h"
#include "quickfindwidget.h"
const int QuickFindWidget::NOTIFICATION_TIMEOUT = 5000;
const QString QFNotification::REACHED_EOF = "Reached end of file, no occurence found.";
const QString QFNotification::REACHED_BOF = "Reached beginning of file, no occurence found.";
QuickFindWidget::QuickFindWidget( QWidget* parent ) : QWidget( parent )
{
// ui_.setupUi( this );
// setFocusProxy(ui_.findEdit);
// setProperty("topBorder", true);
QHBoxLayout *layout = new QHBoxLayout( this );
layout->setMargin( 0 );
layout->setSpacing( 6 );
closeButton_ = setupToolButton(
QLatin1String(""), QLatin1String( ":/images/darkclosebutton.png" ) );
layout->addWidget( closeButton_ );
editQuickFind_ = new QLineEdit( this );
// FIXME: set MinimumSize might be to constraining
editQuickFind_->setMinimumSize( QSize( 150, 0 ) );
layout->addWidget( editQuickFind_ );
ignoreCaseCheck_ = new QCheckBox( "Ignore &case" );
layout->addWidget( ignoreCaseCheck_ );
previousButton_ = setupToolButton( QLatin1String("Previous"),
QLatin1String( ":/images/arrowup.png" ) );
layout->addWidget( previousButton_ );
nextButton_ = setupToolButton( QLatin1String("Next"),
QLatin1String( ":/images/arrowdown.png" ) );
layout->addWidget( nextButton_ );
notificationText_ = new QLabel( "" );
// FIXME: set MinimumSize might be too constraining
int width = QFNotification::maxWidth( notificationText_ );
notificationText_->setMinimumSize( width, 0 );
layout->addWidget( notificationText_ );
setMinimumWidth( minimumSizeHint().width() );
// Behaviour
connect( closeButton_, SIGNAL( clicked() ), SLOT( closeHandler() ) );
connect( editQuickFind_, SIGNAL( textEdited( QString ) ),
this, SLOT( textChanged() ) );
connect( ignoreCaseCheck_, SIGNAL( stateChanged( int ) ),
this, SLOT( textChanged() ) );
/*
connect( editQuickFind_. SIGNAL( textChanged( QString ) ), this,
SLOT( updateButtons() ) );
*/
connect( editQuickFind_, SIGNAL( returnPressed() ),
this, SLOT( returnHandler() ) );
connect( previousButton_, SIGNAL( clicked() ),
this, SLOT( doSearchBackward() ) );
connect( nextButton_, SIGNAL( clicked() ),
this, SLOT( doSearchForward() ) );
// Notification timer:
notificationTimer_ = new QTimer( this );
notificationTimer_->setSingleShot( true );
connect( notificationTimer_, SIGNAL( timeout() ),
this, SLOT( notificationTimeout() ) );
}
void QuickFindWidget::userActivate()
{
userRequested_ = true;
QWidget::show();
editQuickFind_->setFocus( Qt::ShortcutFocusReason );
}
//
// SLOTS
//
void QuickFindWidget::changeDisplayedPattern( const QString& newPattern )
{
editQuickFind_->setText( newPattern );
}
void QuickFindWidget::notify( const QFNotification& message )
{
LOG(logDEBUG) << "QuickFindWidget::notify()";
notificationText_->setText( message.message() );
QWidget::show();
notificationTimer_->start( NOTIFICATION_TIMEOUT );
// Poor man's asynchronous op.: check for events!
QCoreApplication::processEvents();
}
void QuickFindWidget::clearNotification()
{
LOG(logDEBUG) << "QuickFindWidget::clearNotification()";
notificationText_->setText( "" );
}
// User clicks forward arrow
void QuickFindWidget::doSearchForward()
{
LOG(logDEBUG) << "QuickFindWidget::doSearchForward()";
// The user has clicked on a button, so we assume she wants
// the widget to stay visible.
userRequested_ = true;
emit patternConfirmed( editQuickFind_->text(), isIgnoreCase() );
emit searchForward();
}
// User clicks backward arrow
void QuickFindWidget::doSearchBackward()
{
LOG(logDEBUG) << "QuickFindWidget::doSearchBackward()";
// The user has clicked on a button, so we assume she wants
// the widget to stay visible.
userRequested_ = true;
emit patternConfirmed( editQuickFind_->text(), isIgnoreCase() );
emit searchBackward();
}
// Close and search when the user presses Return
void QuickFindWidget::returnHandler()
{
emit patternConfirmed( editQuickFind_->text(), isIgnoreCase() );
// Close the widget
userRequested_ = false;
this->hide();
emit close();
}
// Close and reset flag when the user clicks 'close'
void QuickFindWidget::closeHandler()
{
userRequested_ = false;
this->hide();
emit close();
emit cancelSearch();
}
void QuickFindWidget::notificationTimeout()
{
// We close the widget if the user hasn't explicitely requested it.
if ( userRequested_ == false )
this->hide();
}
void QuickFindWidget::textChanged()
{
emit patternUpdated( editQuickFind_->text(), isIgnoreCase() );
}
//
// Private functions
//
QToolButton* QuickFindWidget::setupToolButton(
const QString &text, const QString &icon)
{
QToolButton *toolButton = new QToolButton(this);
toolButton->setText(text);
toolButton->setAutoRaise(true);
toolButton->setIcon(QIcon(icon));
toolButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
return toolButton;
}
bool QuickFindWidget::isIgnoreCase() const
{
return ( ignoreCaseCheck_->checkState() == Qt::Checked );
}