You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

102 lines
3.6 KiB

/*
Copyright 2006-2008 by Robert Knight <robertknight@gmail.com>
Copyright 2009 by Thomas Dreibholz <dreibh@iem.uni-due.de>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.
*/
#ifndef SEARCHHISTORYTASK_H
#define SEARCHHISTORYTASK_H
#include <QPointer>
#include <QMap>
#include <QRegularExpression>
#include "session/SessionTask.h"
#include "Enumeration.h"
#include "ScreenWindow.h"
#include "session/Session.h"
namespace Konsole
{
//class SearchHistoryThread;
/**
* A task which searches through the output of sessions for matches for a given regular expression.
* SearchHistoryTask operates on ScreenWindow instances rather than sessions added by addSession().
* A screen window can be added to the list to search using addScreenWindow()
*
* When execute() is called, the search begins in the direction specified by searchDirection(),
* starting at the position of the current selection.
*
* FIXME - This is not a proper implementation of SessionTask, in that it ignores sessions specified
* with addSession()
*
* TODO - Implementation requirements:
* May provide progress feedback to the user when searching very large output logs.
*/
class SearchHistoryTask : public SessionTask
{
Q_OBJECT
public:
/**
* Constructs a new search task.
*/
explicit SearchHistoryTask(QObject *parent = nullptr);
/** Adds a screen window to the list to search when execute() is called. */
void addScreenWindow(Session *session, ScreenWindow *searchWindow);
/** Sets the regular expression which is searched for when execute() is called */
void setRegExp(const QRegularExpression &expression);
/** Returns the regular expression which is searched for when execute() is called */
QRegularExpression regExp() const;
/** Specifies the direction to search in when execute() is called. */
void setSearchDirection(Enum::SearchDirection direction);
/** Returns the current search direction. See setSearchDirection(). */
Enum::SearchDirection searchDirection() const;
/** The line from which the search will be done **/
void setStartLine(int line);
/**
* Performs a search through the session's history, starting at the position
* of the current selection, in the direction specified by setSearchDirection().
*
* If it finds a match, the ScreenWindow specified in the constructor is
* scrolled to the position where the match occurred and the selection
* is set to the matching text. execute() then returns immediately.
*
* To continue the search looking for further matches, call execute() again.
*/
void execute() override;
private:
using ScreenWindowPtr = QPointer<ScreenWindow>;
void executeOnScreenWindow(const QPointer<Session> &session, const ScreenWindowPtr& window);
void highlightResult(const ScreenWindowPtr& window, int findPos);
QMap< QPointer<Session>, ScreenWindowPtr > _windows;
QRegularExpression _regExp;
Enum::SearchDirection _direction;
int _startLine;
};
}
#endif