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