/* * Copyright (C) 2010, 2013 Nicolas Bonnefon and other contributors * * This file is part of glogg. * * glogg 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 3 of the License, or * (at your option) any later version. * * glogg 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 glogg. If not, see . */ #ifndef SELECTION_H #define SELECTION_H #include #include #include "utils.h" class AbstractLogData; class Portion { public: Portion() { line_ = -1; } Portion( int line, int start_column, int end_column ) { line_ = line; startColumn_ = start_column; endColumn_ = end_column; } int line() const { return line_; } int startColumn() const { return startColumn_; } int endColumn() const { return endColumn_; } bool isValid() const { return ( line_ != -1 ); } private: int line_; int startColumn_; int endColumn_; }; // Represents a selection in an AbstractLogView class Selection { public: // Construct an empty selection Selection(); // Clear the selection void clear() { selectedPartial_.line = -1; selectedLine_ = -1; }; // Select one line void selectLine( int line ) { selectedPartial_.line = -1; selectedRange_.startLine = -1; selectedLine_ = line; }; // Select a portion of line (both start and end included) void selectPortion( int line, int start_column, int end_column ); void selectPortion( Portion selection ) { selectPortion( selection.line(), selection.startColumn(), selection.endColumn() ); } // Select a range of lines (both start and end included) void selectRange( int start_line, int end_line ); // Select a range from the previously selected line or beginning // of range (shift+click behaviour) void selectRangeFromPrevious( int line ); // Crop selection so that in fit in the range ending with the line passed. void crop( int last_line ); // Returns whether the selection is empty bool isEmpty() const { return ( selectedPartial_.line == -1 ) && ( selectedLine_ == -1 ); } // Returns whether the selection is a single line bool isSingleLine() const { return ( selectedLine_ != -1 ); } // Returns whether the selection is a portion of line bool isPortion() const { return ( selectedPartial_.line != -1 ); } // Returns whether a portion is selected or not on the passed line. // If so, returns the portion position. bool getPortionForLine( int line, int* start_column, int* end_column ) const; // Get a list of selected line(s), in order. QList getLines() const; // Returns wether the line passed is selected (entirely). bool isLineSelected( int line ) const; // Returns the line selected or -1 if not a single line selection qint64 selectedLine() const; // Returns the text selected from the passed AbstractLogData QString getSelectedText( const AbstractLogData* logData ) const; // Return the position immediately after the current selection // (used for searches). // This is the next character or the start of the next line. FilePosition getNextPosition() const; // Idem from the position immediately before selection. FilePosition getPreviousPosition() const; private: // Line number currently selected, or -1 if none selected int selectedLine_; struct SelectedPartial { int line; int startColumn; int endColumn; }; struct SelectedRange { // The limits of the range, sorted int startLine; int endLine; // The line selected first, used for shift+click int firstLine; }; struct SelectedPartial selectedPartial_; struct SelectedRange selectedRange_; }; #endif