1 /*
2 * Copyright (C) 2011, 2012 Nicolas Bonnefon and other contributors
3 *
4 * This file is part of glogg.
5 *
6 * glogg is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * glogg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with glogg. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20 // This file implements the Overview class.
21 // It provides support for drawing the match overview sidebar but
22 // the actual drawing is done in AbstractLogView which uses this class.
23
24 #include "log.h"
25
26 #include "data/logfiltereddata.h"
27
28 #include "overview.h"
29
Overview()30 Overview::Overview() : matchLines_(), markLines_()
31 {
32 logFilteredData_ = NULL;
33 linesInFile_ = 0;
34 topLine_ = 0;
35 nbLines_ = 0;
36 height_ = 0;
37 dirty_ = true;
38 visible_ = false;
39 }
40
~Overview()41 Overview::~Overview()
42 {
43 }
44
setFilteredData(const LogFilteredData * logFilteredData)45 void Overview::setFilteredData( const LogFilteredData* logFilteredData )
46 {
47 logFilteredData_ = logFilteredData;
48 }
49
updateData(int totalNbLine)50 void Overview::updateData( int totalNbLine )
51 {
52 LOG(logDEBUG) << "OverviewWidget::updateData " << totalNbLine;
53
54 linesInFile_ = totalNbLine;
55 dirty_ = true;
56 }
57
updateView(int height)58 void Overview::updateView( int height )
59 {
60 // We don't touch the cache if the height hasn't changed
61 if ( ( height != height_ ) || ( dirty_ == true ) ) {
62 height_ = height;
63
64 recalculatesLines();
65 }
66 }
67
getMatchLines() const68 const QVector<Overview::WeightedLine>* Overview::getMatchLines() const
69 {
70 return &matchLines_;
71 }
72
getMarkLines() const73 const QVector<Overview::WeightedLine>* Overview::getMarkLines() const
74 {
75 return &markLines_;
76 }
77
getViewLines() const78 std::pair<int,int> Overview::getViewLines() const
79 {
80 int top = 0;
81 int bottom = height_ - 1;
82
83 if ( linesInFile_ > 0 ) {
84 top = (int)((qint64)topLine_ * height_ / linesInFile_);
85 bottom = (int)((qint64)top + nbLines_ * height_ / linesInFile_);
86 }
87
88 return std::pair<int,int>(top, bottom);
89 }
90
fileLineFromY(int position) const91 int Overview::fileLineFromY( int position ) const
92 {
93 int line = (int)((qint64)position * linesInFile_ / height_);
94
95 return line;
96 }
97
yFromFileLine(int file_line) const98 int Overview::yFromFileLine( int file_line ) const
99 {
100 int position = 0;
101
102 if ( linesInFile_ > 0 )
103 position = (int)((qint64)file_line * height_ / linesInFile_);
104
105 return position;
106 }
107
108 // Update the internal cache
recalculatesLines()109 void Overview::recalculatesLines()
110 {
111 LOG(logDEBUG) << "OverviewWidget::recalculatesLines";
112
113 if ( logFilteredData_ != NULL ) {
114 matchLines_.clear();
115 markLines_.clear();
116
117 if ( linesInFile_ > 0 ) {
118 for ( int i = 0; i < logFilteredData_->getNbLine(); i++ ) {
119 LogFilteredData::FilteredLineType line_type =
120 logFilteredData_->filteredLineTypeByIndex( i );
121 int line = (int) logFilteredData_->getMatchingLineNumber( i );
122 int position = (int)( (qint64)line * height_ / linesInFile_ );
123 if ( line_type == LogFilteredData::Match ) {
124 if ( ( ! matchLines_.isEmpty() ) && matchLines_.last().position() == position ) {
125 // If the line is already there, we increase its weight
126 matchLines_.last().load();
127 }
128 else {
129 // If not we just add it
130 matchLines_.append( WeightedLine( position ) );
131 }
132 }
133 else {
134 if ( ( ! markLines_.isEmpty() ) && markLines_.last().position() == position ) {
135 // If the line is already there, we increase its weight
136 markLines_.last().load();
137 }
138 else {
139 // If not we just add it
140 markLines_.append( WeightedLine( position ) );
141 }
142 }
143 }
144 }
145 }
146 else
147 LOG(logDEBUG) << "Overview::recalculatesLines: logFilteredData_ == NULL";
148
149 dirty_ = false;
150 }
151