xref: /glogg/src/crawlerwidget.h (revision 74d66bf473e291335504e45e0cf472565f7db196)
1 /*
2  * Copyright (C) 2009, 2010, 2011, 2013, 2014 Nicolas Bonnefon
3  * and other contributors
4  *
5  * This file is part of glogg.
6  *
7  * glogg is free software: you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation, either version 3 of the License, or
10  * (at your option) any later version.
11  *
12  * glogg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with glogg.  If not, see <http://www.gnu.org/licenses/>.
19  */
20 
21 #ifndef CRAWLERWIDGET_H
22 #define CRAWLERWIDGET_H
23 
24 #include <QSplitter>
25 #include <QComboBox>
26 #include <QPushButton>
27 #include <QCheckBox>
28 #include <QToolButton>
29 #include <QVBoxLayout>
30 #include <QHBoxLayout>
31 #include <QLabel>
32 
33 #include "logmainview.h"
34 #include "filteredview.h"
35 #include "data/logdata.h"
36 #include "data/logfiltereddata.h"
37 #include "viewinterface.h"
38 #include "signalmux.h"
39 #include "overview.h"
40 #include "loadingstatus.h"
41 
42 class InfoLine;
43 class QuickFindPattern;
44 class SavedSearches;
45 class QStandardItemModel;
46 class OverviewWidget;
47 
48 // Implements the central widget of the application.
49 // It includes both windows, the search line, the info
50 // lines and various buttons.
51 class CrawlerWidget : public QSplitter,
52     public QuickFindMuxSelectorInterface, public ViewInterface,
53     public MuxableDocumentInterface
54 {
55   Q_OBJECT
56 
57   public:
58     CrawlerWidget( QWidget *parent=0 );
59 
60     // Get the line number of the first line displayed.
61     int getTopLine() const;
62     // Get the selected text as a string (from the main window)
63     QString getSelectedText() const;
64 
65     // Display the QFB at the bottom, remembering where the focus was
66     void displayQuickFindBar( QuickFindMux::QFDirection direction );
67 
68     // Instructs the widget to select all the text in the window the user
69     // is interacting with
70     void selectAll();
71 
72   public slots:
73     // Stop the asynchoronous loading of the file if one is in progress
74     // The file is identified by the view attached to it.
75     void stopLoading();
76     // Reload the displayed file
77     void reload();
78 
79   protected:
80     // Implementation of the ViewInterface functions
81     virtual void doSetData(
82             std::shared_ptr<LogData> log_data,
83             std::shared_ptr<LogFilteredData> filtered_data );
84     virtual void doSetQuickFindPattern(
85             std::shared_ptr<QuickFindPattern> qfp );
86     virtual void doSetSavedSearches(
87             std::shared_ptr<SavedSearches> saved_searches );
88     virtual void doSetViewContext( const char* view_context );
89     virtual std::shared_ptr<const ViewContextInterface>
90         doGetViewContext( void ) const;
91 
92     // Implementation of the mux selector interface
93     // (for dispatching QuickFind to the right widget)
94     virtual SearchableWidgetInterface* doGetActiveSearchable() const;
95     virtual std::vector<QObject*> doGetAllSearchables() const;
96 
97     // Implementation of the MuxableDocumentInterface
98     virtual void doSendAllStateSignals();
99 
100   signals:
101     // Sent to signal the client load has progressed,
102     // passing the completion percentage.
103     void loadingProgressed( int progress );
104     // Sent to the client when the loading has finished
105     // weither succesfull or not.
106     void loadingFinished( LoadingStatus status );
107     // Sent when follow mode is enabled/disabled
108     void followSet( bool checked );
109     // Sent up to the MainWindow to disable the follow mode
110     void followDisabled();
111     // Sent up when the current line number is updated
112     void updateLineNumber( int line );
113 
114     // "auto-refresh" check has been changed
115     void searchRefreshChanged( int state );
116     // "ignore case" check has been changed
117     void ignoreCaseChanged( int state );
118 
119   private slots:
120     // Instructs the widget to start a search using the current search line.
121     void startNewSearch();
122     // Stop the currently ongoing search (if one exists)
123     void stopSearch();
124     // Instructs the widget to reconfigure itself because Config() has changed.
125     void applyConfiguration();
126     // QuickFind is being entered, save the focus for incremental qf.
127     void enteringQuickFind();
128     // QuickFind is being closed.
129     void exitingQuickFind();
130     // Called when new data must be displayed in the filtered window.
131     void updateFilteredView( int nbMatches, int progress );
132     // Called when a new line has been selected in the filtered view,
133     // to instruct the main view to jump to the matching line.
134     void jumpToMatchingLine( int filteredLineNb );
135     // Called when the main view is on a new line number
136     void updateLineNumberHandler( int line );
137     // Mark a line that has been clicked on the main (top) view.
138     void markLineFromMain( qint64 line );
139     // Mark a line that has been clicked on the filtered (bottom) view.
140     void markLineFromFiltered( qint64 line );
141 
142     void loadingFinishedHandler( LoadingStatus status );
143     // Manages the info lines to inform the user the file has changed.
144     void fileChangedHandler( LogData::MonitoredFileStatus );
145 
146     void searchForward();
147     void searchBackward();
148 
149     // Called when the checkbox for search auto-refresh is changed
150     void searchRefreshChangedHandler( int state );
151 
152     // Called when the text on the search line is modified
153     void searchTextChangeHandler();
154 
155     // Called when the user change the visibility combobox
156     void changeFilteredViewVisibility( int index );
157 
158     // Called when the user add the string to the search
159     void addToSearch( const QString& string );
160 
161     // Called when a match is hovered on in the filtered view
162     void mouseHoveredOverMatch( qint64 line );
163 
164   private:
165     // State machine holding the state of the search, used to allow/disallow
166     // auto-refresh and inform the user via the info line.
167     class SearchState {
168       public:
169         enum State {
170             NoSearch,
171             Static,
172             Autorefreshing,
173             FileTruncated,
174             TruncatedAutorefreshing,
175         };
176 
177         SearchState() { state_ = NoSearch; autoRefreshRequested_ = false; }
178 
179         // Reset the state (no search active)
180         void resetState();
181         // The user changed auto-refresh request
182         void setAutorefresh( bool refresh );
183         // The file has been truncated (stops auto-refresh)
184         void truncateFile();
185         // The expression has been changed (stops auto-refresh)
186         void changeExpression();
187         // The search has been stopped (stops auto-refresh)
188         void stopSearch();
189         // The search has been started (enable auto-refresh)
190         void startSearch();
191 
192         // Get the state in order to display the proper message
193         State getState() const { return state_; }
194         // Is auto-refresh allowed
195         bool isAutorefreshAllowed() const
196         { return ( state_ == Autorefreshing || state_ == TruncatedAutorefreshing ); }
197         bool isFileTruncated() const
198         { return ( state_ == FileTruncated || state_ == TruncatedAutorefreshing ); }
199 
200       private:
201         State state_;
202         bool autoRefreshRequested_;
203     };
204 
205     // Private functions
206     void setup();
207     void replaceCurrentSearch( const QString& searchText );
208     void updateSearchCombo();
209     AbstractLogView* activeView() const;
210     void printSearchInfoMessage( int nbMatches = 0 );
211 
212     // Palette for error notification (yellow background)
213     static const QPalette errorPalette;
214 
215     LogMainView*    logMainView;
216     QWidget*        bottomWindow;
217     QLabel*         searchLabel;
218     QComboBox*      searchLineEdit;
219     QToolButton*    searchButton;
220     QToolButton*    stopButton;
221     FilteredView*   filteredView;
222     QComboBox*      visibilityBox;
223     InfoLine*       searchInfoLine;
224     QCheckBox*      ignoreCaseCheck;
225     QCheckBox*      searchRefreshCheck;
226     OverviewWidget* overviewWidget_;
227 
228     QVBoxLayout*    bottomMainLayout;
229     QHBoxLayout*    searchLineLayout;
230     QHBoxLayout*    searchInfoLineLayout;
231 
232     // Default palette to be remembered
233     QPalette        searchInfoLineDefaultPalette;
234 
235     std::shared_ptr<SavedSearches> savedSearches_;
236 
237     // Reference to the QuickFind Pattern (not owned)
238     std::shared_ptr<QuickFindPattern> quickFindPattern_;
239 
240     LogData*        logData_;
241     LogFilteredData* logFilteredData_;
242 
243     qint64          logFileSize_;
244 
245     QWidget*        qfSavedFocus_;
246 
247     // Search state (for auto-refresh and truncation)
248     SearchState     searchState_;
249 
250     // Matches overview
251     Overview        overview_;
252 
253     // Model for the visibility selector
254     QStandardItemModel* visibilityModel_;
255 
256     // Last main line number received
257     qint64 currentLineNumber_;
258 
259     // Are we loading something?
260     // Set to false when we receive a completion message from the LogData
261     bool            loadingInProgress_;
262 };
263 
264 #endif
265