/*
* Copyright (C) 2009, 2010, 2011, 2013, 2014, 2015 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 .
*/
#ifndef CRAWLERWIDGET_H
#define CRAWLERWIDGET_H
#include
#include
#include
#include
#include
#include
#include
#include
#include "logmainview.h"
#include "filteredview.h"
#include "data/logdata.h"
#include "data/logfiltereddata.h"
#include "viewinterface.h"
#include "signalmux.h"
#include "overview.h"
#include "loadingstatus.h"
class InfoLine;
class QuickFindPattern;
class SavedSearches;
class QStandardItemModel;
class OverviewWidget;
// Implements the central widget of the application.
// It includes both windows, the search line, the info
// lines and various buttons.
class CrawlerWidget : public QSplitter,
public QuickFindMuxSelectorInterface, public ViewInterface,
public MuxableDocumentInterface
{
Q_OBJECT
public:
CrawlerWidget( QWidget *parent=0 );
// Get the line number of the first line displayed.
int getTopLine() const;
// Get the selected text as a string (from the main window)
QString getSelectedText() const;
// Display the QFB at the bottom, remembering where the focus was
void displayQuickFindBar( QuickFindMux::QFDirection direction );
// Instructs the widget to select all the text in the window the user
// is interacting with
void selectAll();
enum Encoding {
ENCODING_AUTO = 0,
ENCODING_ISO_8859_1,
ENCODING_UTF8,
ENCODING_MAX,
};
Encoding encodingSetting() const;
// Returns whether follow is enabled in this crawler
bool isFollowEnabled() const;
// Get the text description of the encoding effectively used,
// suitable to display to the user.
QString encodingText() const;
public slots:
// Stop the asynchoronous loading of the file if one is in progress
// The file is identified by the view attached to it.
void stopLoading();
// Reload the displayed file
void reload();
// Set the encoding
void setEncoding( Encoding encoding );
protected:
// Implementation of the ViewInterface functions
virtual void doSetData(
std::shared_ptr log_data,
std::shared_ptr filtered_data );
virtual void doSetQuickFindPattern(
std::shared_ptr qfp );
virtual void doSetSavedSearches(
std::shared_ptr saved_searches );
virtual void doSetViewContext( const char* view_context );
virtual std::shared_ptr
doGetViewContext( void ) const;
// Implementation of the mux selector interface
// (for dispatching QuickFind to the right widget)
virtual SearchableWidgetInterface* doGetActiveSearchable() const;
virtual std::vector doGetAllSearchables() const;
// Implementation of the MuxableDocumentInterface
virtual void doSendAllStateSignals();
signals:
// Sent to signal the client load has progressed,
// passing the completion percentage.
void loadingProgressed( int progress );
// Sent to the client when the loading has finished
// weither succesfull or not.
void loadingFinished( LoadingStatus status );
// Sent when follow mode is enabled/disabled
void followSet( bool checked );
// Sent up to the MainWindow to enable/disable the follow mode
void followModeChanged( bool follow );
// Sent up when the current line number is updated
void updateLineNumber( int line );
// "auto-refresh" check has been changed
void searchRefreshChanged( int state );
// "ignore case" check has been changed
void ignoreCaseChanged( int state );
// Sent when the data status (whether new not seen data are
// available) has changed
void dataStatusChanged( DataStatus status );
private slots:
// Instructs the widget to start a search using the current search line.
void startNewSearch();
// Stop the currently ongoing search (if one exists)
void stopSearch();
// Instructs the widget to reconfigure itself because Config() has changed.
void applyConfiguration();
// QuickFind is being entered, save the focus for incremental qf.
void enteringQuickFind();
// QuickFind is being closed.
void exitingQuickFind();
// Called when new data must be displayed in the filtered window.
void updateFilteredView( int nbMatches, int progress );
// Called when a new line has been selected in the filtered view,
// to instruct the main view to jump to the matching line.
void jumpToMatchingLine( int filteredLineNb );
// Called when the main view is on a new line number
void updateLineNumberHandler( int line );
// Mark a line that has been clicked on the main (top) view.
void markLineFromMain( qint64 line );
// Mark a line that has been clicked on the filtered (bottom) view.
void markLineFromFiltered( qint64 line );
void loadingFinishedHandler( LoadingStatus status );
// Manages the info lines to inform the user the file has changed.
void fileChangedHandler( LogData::MonitoredFileStatus );
void searchForward();
void searchBackward();
// Called when the checkbox for search auto-refresh is changed
void searchRefreshChangedHandler( int state );
// Called when the text on the search line is modified
void searchTextChangeHandler();
// Called when the user change the visibility combobox
void changeFilteredViewVisibility( int index );
// Called when the user add the string to the search
void addToSearch( const QString& string );
// Called when a match is hovered on in the filtered view
void mouseHoveredOverMatch( qint64 line );
// Called when there was activity in the views
void activityDetected();
private:
// State machine holding the state of the search, used to allow/disallow
// auto-refresh and inform the user via the info line.
class SearchState {
public:
enum State {
NoSearch,
Static,
Autorefreshing,
FileTruncated,
TruncatedAutorefreshing,
};
SearchState() { state_ = NoSearch; autoRefreshRequested_ = false; }
// Reset the state (no search active)
void resetState();
// The user changed auto-refresh request
void setAutorefresh( bool refresh );
// The file has been truncated (stops auto-refresh)
void truncateFile();
// The expression has been changed (stops auto-refresh)
void changeExpression();
// The search has been stopped (stops auto-refresh)
void stopSearch();
// The search has been started (enable auto-refresh)
void startSearch();
// Get the state in order to display the proper message
State getState() const { return state_; }
// Is auto-refresh allowed
bool isAutorefreshAllowed() const
{ return ( state_ == Autorefreshing || state_ == TruncatedAutorefreshing ); }
bool isFileTruncated() const
{ return ( state_ == FileTruncated || state_ == TruncatedAutorefreshing ); }
private:
State state_;
bool autoRefreshRequested_;
};
// Private functions
void setup();
void replaceCurrentSearch( const QString& searchText );
void updateSearchCombo();
AbstractLogView* activeView() const;
void printSearchInfoMessage( int nbMatches = 0 );
void changeDataStatus( DataStatus status );
void updateEncoding();
// Palette for error notification (yellow background)
static const QPalette errorPalette;
LogMainView* logMainView;
QWidget* bottomWindow;
QLabel* searchLabel;
QComboBox* searchLineEdit;
QToolButton* searchButton;
QToolButton* stopButton;
FilteredView* filteredView;
QComboBox* visibilityBox;
InfoLine* searchInfoLine;
QCheckBox* ignoreCaseCheck;
QCheckBox* searchRefreshCheck;
OverviewWidget* overviewWidget_;
QVBoxLayout* bottomMainLayout;
QHBoxLayout* searchLineLayout;
QHBoxLayout* searchInfoLineLayout;
// Default palette to be remembered
QPalette searchInfoLineDefaultPalette;
std::shared_ptr savedSearches_;
// Reference to the QuickFind Pattern (not owned)
std::shared_ptr quickFindPattern_;
LogData* logData_;
LogFilteredData* logFilteredData_;
qint64 logFileSize_;
QWidget* qfSavedFocus_;
// Search state (for auto-refresh and truncation)
SearchState searchState_;
// Matches overview
Overview overview_;
// Model for the visibility selector
QStandardItemModel* visibilityModel_;
// Last main line number received
qint64 currentLineNumber_;
// Are we loading something?
// Set to false when we receive a completion message from the LogData
bool loadingInProgress_;
// Is it not the first time we are loading something?
bool firstLoadDone_;
// Current number of matches
int nbMatches_;
// the current dataStatus (whether we have new, not seen, data)
DataStatus dataStatus_;
// Current encoding setting;
Encoding encodingSetting_ = ENCODING_AUTO;
QString encoding_text_;
};
#endif