1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
|
/*
* Copyright (C) 2010 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 <http://www.gnu.org/licenses/>.
*/
#ifndef SELECTION_H
#define SELECTION_H
#include "abstractlogdata.h"
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 );
// Crop selection so that in fit in the range ending with the line passed.
void crop( int last_line );
// 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<int> getLines() const;
// Returns wether the line passed is selected (entirely).
bool isLineSelected( int line ) 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.
void getNextPosition( int* line, int* column ) const;
void getPreviousPosition( int* line, int* column ) const;
private:
// Line number currently selected, or -1 if none selected
int selectedLine_;
struct SelectedPartial {
int line;
int startColumn;
int endColumn;
};
struct SelectedRange {
int startLine;
int endLine;
};
struct SelectedPartial selectedPartial_;
struct SelectedRange selectedRange_;
};
#endif
|