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