xref: /glogg/src/crawlerwidget.h (revision 05467f52d72e282658c219cc889ed6bc08e5dc01)
1 /*
2  * Copyright (C) 2009, 2010, 2011, 2013, 2014, 2015 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     enum Encoding {
73         ENCODING_AUTO = 0,
74         ENCODING_ISO_8859_1,
75         ENCODING_UTF8,
76         ENCODING_UTF16LE,
77         ENCODING_UTF16BE,
78         ENCODING_MAX,
79     };
80 
81     Encoding encodingSetting() const;
82 
83     // Returns whether follow is enabled in this crawler
84     bool isFollowEnabled() const;
85 
86     // Get the text description of the encoding effectively used,
87     // suitable to display to the user.
88     QString encodingText() const;
89 
90   public slots:
91     // Stop the asynchoronous loading of the file if one is in progress
92     // The file is identified by the view attached to it.
93     void stopLoading();
94     // Reload the displayed file
95     void reload();
96     // Set the encoding
97     void setEncoding( Encoding encoding );
98 
99   protected:
100     // Implementation of the ViewInterface functions
101     virtual void doSetData(
102             std::shared_ptr<LogData> log_data,
103             std::shared_ptr<LogFilteredData> filtered_data );
104     virtual void doSetQuickFindPattern(
105             std::shared_ptr<QuickFindPattern> qfp );
106     virtual void doSetSavedSearches(
107             std::shared_ptr<SavedSearches> saved_searches );
108     virtual void doSetViewContext( const char* view_context );
109     virtual std::shared_ptr<const ViewContextInterface>
110         doGetViewContext( void ) const;
111 
112     // Implementation of the mux selector interface
113     // (for dispatching QuickFind to the right widget)
114     virtual SearchableWidgetInterface* doGetActiveSearchable() const;
115     virtual std::vector<QObject*> doGetAllSearchables() const;
116 
117     // Implementation of the MuxableDocumentInterface
118     virtual void doSendAllStateSignals();
119 
120     virtual void keyPressEvent( QKeyEvent* keyEvent );
121 
122   signals:
123     // Sent to signal the client load has progressed,
124     // passing the completion percentage.
125     void loadingProgressed( int progress );
126     // Sent to the client when the loading has finished
127     // weither succesfull or not.
128     void loadingFinished( LoadingStatus status );
129     // Sent when follow mode is enabled/disabled
130     void followSet( bool checked );
131     // Sent up to the MainWindow to enable/disable the follow mode
132     void followModeChanged( bool follow );
133     // Sent up when the current line number is updated
134     void updateLineNumber( int line );
135 
136     // "auto-refresh" check has been changed
137     void searchRefreshChanged( int state );
138     // "ignore case" check has been changed
139     void ignoreCaseChanged( int state );
140 
141     // Sent when the data status (whether new not seen data are
142     // available) has changed
143     void dataStatusChanged( DataStatus status );
144 
145   private slots:
146     // Instructs the widget to start a search using the current search line.
147     void startNewSearch();
148     // Stop the currently ongoing search (if one exists)
149     void stopSearch();
150     // Instructs the widget to reconfigure itself because Config() has changed.
151     void applyConfiguration();
152     // QuickFind is being entered, save the focus for incremental qf.
153     void enteringQuickFind();
154     // QuickFind is being closed.
155     void exitingQuickFind();
156     // Called when new data must be displayed in the filtered window.
157     void updateFilteredView( int nbMatches, int progress );
158     // Called when a new line has been selected in the filtered view,
159     // to instruct the main view to jump to the matching line.
160     void jumpToMatchingLine( int filteredLineNb );
161     // Called when the main view is on a new line number
162     void updateLineNumberHandler( int line );
163     // Mark a line that has been clicked on the main (top) view.
164     void markLineFromMain( qint64 line );
165     // Mark a line that has been clicked on the filtered (bottom) view.
166     void markLineFromFiltered( qint64 line );
167 
168     void loadingFinishedHandler( LoadingStatus status );
169     // Manages the info lines to inform the user the file has changed.
170     void fileChangedHandler( LogData::MonitoredFileStatus );
171 
172     void searchForward();
173     void searchBackward();
174 
175     // Called when the checkbox for search auto-refresh is changed
176     void searchRefreshChangedHandler( int state );
177 
178     // Called when the text on the search line is modified
179     void searchTextChangeHandler();
180 
181     // Called when the user change the visibility combobox
182     void changeFilteredViewVisibility( int index );
183 
184     // Called when the user add the string to the search
185     void addToSearch( const QString& string );
186 
187     // Called when a match is hovered on in the filtered view
188     void mouseHoveredOverMatch( qint64 line );
189 
190     // Called when there was activity in the views
191     void activityDetected();
192 
193   private:
194     // State machine holding the state of the search, used to allow/disallow
195     // auto-refresh and inform the user via the info line.
196     class SearchState {
197       public:
198         enum State {
199             NoSearch,
200             Static,
201             Autorefreshing,
202             FileTruncated,
203             TruncatedAutorefreshing,
204         };
205 
206         SearchState() { state_ = NoSearch; autoRefreshRequested_ = false; }
207 
208         // Reset the state (no search active)
209         void resetState();
210         // The user changed auto-refresh request
211         void setAutorefresh( bool refresh );
212         // The file has been truncated (stops auto-refresh)
213         void truncateFile();
214         // The expression has been changed (stops auto-refresh)
215         void changeExpression();
216         // The search has been stopped (stops auto-refresh)
217         void stopSearch();
218         // The search has been started (enable auto-refresh)
219         void startSearch();
220 
221         // Get the state in order to display the proper message
222         State getState() const { return state_; }
223         // Is auto-refresh allowed
224         bool isAutorefreshAllowed() const
225         { return ( state_ == Autorefreshing || state_ == TruncatedAutorefreshing ); }
226         bool isFileTruncated() const
227         { return ( state_ == FileTruncated || state_ == TruncatedAutorefreshing ); }
228 
229       private:
230         State state_;
231         bool autoRefreshRequested_;
232     };
233 
234     // Private functions
235     void setup();
236     void replaceCurrentSearch( const QString& searchText );
237     void updateSearchCombo();
238     AbstractLogView* activeView() const;
239     void printSearchInfoMessage( int nbMatches = 0 );
240     void changeDataStatus( DataStatus status );
241     void updateEncoding();
242     void changeTopViewSize( int32_t delta );
243 
244     // Palette for error notification (yellow background)
245     static const QPalette errorPalette;
246 
247     LogMainView*    logMainView;
248     QWidget*        bottomWindow;
249     QLabel*         searchLabel;
250     QComboBox*      searchLineEdit;
251     QToolButton*    searchButton;
252     QToolButton*    stopButton;
253     FilteredView*   filteredView;
254     QComboBox*      visibilityBox;
255     InfoLine*       searchInfoLine;
256     QCheckBox*      ignoreCaseCheck;
257     QCheckBox*      searchRefreshCheck;
258     OverviewWidget* overviewWidget_;
259 
260     QVBoxLayout*    bottomMainLayout;
261     QHBoxLayout*    searchLineLayout;
262     QHBoxLayout*    searchInfoLineLayout;
263 
264     // Default palette to be remembered
265     QPalette        searchInfoLineDefaultPalette;
266 
267     std::shared_ptr<SavedSearches> savedSearches_;
268 
269     // Reference to the QuickFind Pattern (not owned)
270     std::shared_ptr<QuickFindPattern> quickFindPattern_;
271 
272     LogData*        logData_;
273     LogFilteredData* logFilteredData_;
274 
275     qint64          logFileSize_;
276 
277     QWidget*        qfSavedFocus_;
278 
279     // Search state (for auto-refresh and truncation)
280     SearchState     searchState_;
281 
282     // Matches overview
283     Overview        overview_;
284 
285     // Model for the visibility selector
286     QStandardItemModel* visibilityModel_;
287 
288     // Last main line number received
289     qint64 currentLineNumber_;
290 
291     // Are we loading something?
292     // Set to false when we receive a completion message from the LogData
293     bool            loadingInProgress_;
294 
295     // Is it not the first time we are loading something?
296     bool            firstLoadDone_;
297 
298     // Current number of matches
299     int             nbMatches_;
300 
301     // the current dataStatus (whether we have new, not seen, data)
302     DataStatus      dataStatus_;
303 
304     // Current encoding setting;
305     Encoding        encodingSetting_ = ENCODING_AUTO;
306     QString         encoding_text_;
307 };
308 
309 #endif
310