xref: /glogg/src/crawlerwidget.h (revision 039481acd3250c79a914161903e50a979998e1cb)
1 /*
2  * Copyright (C) 2009, 2010, 2011, 2013 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 "quickfindwidget.h"
38 #include "quickfindmux.h"
39 #include "viewinterface.h"
40 
41 class InfoLine;
42 class QuickFindPattern;
43 class QuickFindWidget;
44 class SavedSearches;
45 class Overview;
46 class QStandardItemModel;
47 class OverviewWidget;
48 
49 // Implements the central widget of the application.
50 // It includes both windows, the search line, the info
51 // lines and various buttons.
52 class CrawlerWidget : public QSplitter,
53     public QuickFindMuxSelectorInterface, public ViewInterface
54 {
55   Q_OBJECT
56 
57   public:
58     CrawlerWidget( SavedSearches* searches, QWidget *parent=0 );
59 
60     // Loads the passed file and reports success.
61     bool readFile( const QString& fileName, int topLine );
62     // Stop the loading of the file if one is in progress
63     void stopLoading();
64     // Get the size (in bytes) and number of lines in the current file.
65     void getFileInfo( qint64* fileSize, int* fileNbLine,
66        QDateTime* lastModified ) const;
67     // Get the line number of the first line displayed.
68     int getTopLine() const;
69     // Get the selected text as a string (from the main window)
70     QString getSelectedText() const;
71 
72     // Display the QFB at the bottom, remembering where the focus was
73     void displayQuickFindBar( QuickFindMux::QFDirection direction );
74 
75     // Instructs the widget to select all the text in the window the user
76     // is interacting with
77     void selectAll();
78 
79     // Implementation on the mux selector interface
80     // (for dispatching QuickFind to the right widget)
81     virtual SearchableWidgetInterface* getActiveSearchable() const;
82 
83   protected:
84     void keyPressEvent( QKeyEvent* keyEvent );
85 
86     // Implementation of the ViewInterface functions
87     virtual void doSetData(
88             std::shared_ptr<LogData> log_data,
89             std::shared_ptr<LogFilteredData> filtered_data );
90 
91   signals:
92     // Sent to signal the client load has progressed,
93     // passing the completion percentage.
94     void loadingProgressed( int progress );
95     // Sent to the client when the loading has finished
96     // weither succesfull or not.
97     void loadingFinished( bool success );
98     // Sent when follow mode is enabled/disabled
99     void followSet( bool checked );
100     // Sent up to the MainWindow to disable the follow mode
101     void followDisabled();
102     // Sent up when the current line number is updated
103     void updateLineNumber( int line );
104 
105   private slots:
106     // Instructs the widget to start a search using the current search line.
107     void startNewSearch();
108     // Stop the currently ongoing search (if one exists)
109     void stopSearch();
110     // Instructs the widget to reconfigure itself because Config() has changed.
111     void applyConfiguration();
112     // Called when new data must be displayed in the filtered window.
113     void updateFilteredView( int nbMatches, int progress );
114     // Called when a new line has been selected in the filtered view,
115     // to instruct the main view to jump to the matching line.
116     void jumpToMatchingLine( int filteredLineNb );
117     // Mark a line that has been clicked on the main (top) view.
118     void markLineFromMain( qint64 line );
119     // Mark a line that has been clicked on the filtered (bottom) view.
120     void markLineFromFiltered( qint64 line );
121 
122     void loadingFinishedHandler( bool success );
123     // Manages the info lines to inform the user the file has changed.
124     void fileChangedHandler( LogData::MonitoredFileStatus );
125 
126     void hideQuickFindBar();
127 
128     // Instructs the widget to change the pattern in the QuickFind widget
129     // and confirm it.
130     void changeQFPattern( const QString& newPattern );
131 
132     void searchForward();
133     void searchBackward();
134 
135     // Called when the checkbox for search auto-refresh is changed
136     void searchRefreshChangedHandler( int state );
137 
138     // Called when the text on the search line is modified
139     void searchTextChangeHandler();
140 
141     // Called when the user change the visibility combobox
142     void changeFilteredViewVisibility( int index );
143 
144     // Called when the user add the string to the search
145     void addToSearch( const QString& string );
146 
147     // Called when a match is hovered on in the filtered view
148     void mouseHoveredOverMatch( qint64 line );
149 
150   private:
151     // State machine holding the state of the search, used to allow/disallow
152     // auto-refresh and inform the user via the info line.
153     class SearchState {
154       public:
155         enum State {
156             NoSearch,
157             Static,
158             Autorefreshing,
159             FileTruncated,
160         };
161 
162         SearchState() { state_ = NoSearch; autoRefreshRequested_ = false; }
163 
164         // Reset the state (no search active)
165         void resetState();
166         // The user changed auto-refresh request
167         void setAutorefresh( bool refresh );
168         // The file has been truncated (stops auto-refresh)
169         void truncateFile();
170         // The expression has been changed (stops auto-refresh)
171         void changeExpression();
172         // The search has been stopped (stops auto-refresh)
173         void stopSearch();
174         // The search has been started (enable auto-refresh)
175         void startSearch();
176 
177         // Get the state in order to display the proper message
178         State getState() const { return state_; }
179         // Is auto-refresh allowed
180         bool isAutorefreshAllowed() const
181             { return ( state_ == Autorefreshing ); }
182 
183       private:
184         State state_;
185         bool autoRefreshRequested_;
186     };
187 
188     // Private functions
189     void setup();
190     void replaceCurrentSearch( const QString& searchText );
191     void updateSearchCombo();
192     AbstractLogView* activeView() const;
193     void printSearchInfoMessage( int nbMatches = 0 );
194 
195     // Palette for error notification (yellow background)
196     static const QPalette errorPalette;
197 
198     LogMainView*    logMainView;
199     QWidget*        bottomWindow;
200     QLabel*         searchLabel;
201     QComboBox*      searchLineEdit;
202     QToolButton*    searchButton;
203     QToolButton*    stopButton;
204     FilteredView*   filteredView;
205     QComboBox*      visibilityBox;
206     InfoLine*       searchInfoLine;
207     QCheckBox*      ignoreCaseCheck;
208     QCheckBox*      searchRefreshCheck;
209     QuickFindWidget* quickFindWidget_;
210     OverviewWidget* overviewWidget_;
211 
212     QVBoxLayout*    bottomMainLayout;
213     QHBoxLayout*    searchLineLayout;
214     QHBoxLayout*    searchInfoLineLayout;
215 
216     // Default palette to be remembered
217     QPalette        searchInfoLineDefaultPalette;
218 
219     SavedSearches*  savedSearches;
220 
221     QuickFindMux*   quickFindMux_;
222 
223     LogData*        logData_;
224     LogFilteredData* logFilteredData_;
225 
226     qint64          logFileSize_;
227 
228     QWidget*        qfSavedFocus_;
229 
230     // Search state (for auto-refresh and truncation)
231     SearchState     searchState_;
232 
233     // Matches overview
234     Overview*       overview_;
235 
236     // Model for the visibility selector
237     QStandardItemModel* visibilityModel_;
238 };
239 
240 #endif
241