1 |
#include "xmltoolsinterfacecommandpreview.h" |
2 |
#include "ui_xmltoolsinterfacecommandpreview.h" |
3 |
|
4 |
XmlToolsInterfaceCommandPreview::XmlToolsInterfaceCommandPreview(const QString ¤tFileLocation, const QString &previewFileLocation, QWidget *parent) : |
5 |
QMainWindow(parent), |
6 |
ui(new Ui::XmlToolsInterfaceCommandPreview) |
7 |
{ |
8 |
ui->setupUi(this); |
9 |
this->setAttribute(Qt::WA_DeleteOnClose, true); //destroy itself once finished. |
10 |
|
11 |
QFile currentFile(currentFileLocation); |
12 |
currentFile.open(QIODevice::ReadOnly); |
13 |
|
14 |
this->currentText = currentFile.readAll(); |
15 |
|
16 |
ui->teCurrentFileText->setText(this->currentText); |
17 |
|
18 |
QFile previewFile(previewFileLocation); |
19 |
previewFile.open(QIODevice::ReadOnly); |
20 |
|
21 |
this->previewText = previewFile.readAll(); |
22 |
|
23 |
ui->tePreviewFileText->setText(this->previewText); |
24 |
|
25 |
highlighterCurrentFile.setDocument(ui->teCurrentFileText->document()); |
26 |
highlighterPreviewFile.setDocument(ui->tePreviewFileText->document()); |
27 |
|
28 |
previewFile.close(); |
29 |
currentFile.close(); |
30 |
|
31 |
// Split and trim text of current and preview file |
32 |
this->currentTextRows = this->currentText.split("\n"); |
33 |
this->previewTextRows = this->previewText.split("\n"); |
34 |
|
35 |
for(QString ¤tTextRow : this->currentTextRows){ |
36 |
currentTextRow = currentTextRow.trimmed(); |
37 |
} |
38 |
for(QString &previewTextRow : this->previewTextRows){ |
39 |
previewTextRow = previewTextRow.trimmed(); |
40 |
} |
41 |
|
42 |
|
43 |
QString currentTextRowNumbers; |
44 |
QString previewTextRowNumbers; |
45 |
|
46 |
for(int i=0; i<this->currentTextRows.size(); i++){ |
47 |
currentTextRowNumbers += QString::number(i); |
48 |
if(i < this->currentTextRows.size()-1){ |
49 |
currentTextRowNumbers += "\n"; |
50 |
} |
51 |
} |
52 |
|
53 |
for(int i=0; i<this->previewTextRows.size(); i++){ |
54 |
previewTextRowNumbers += QString::number(i); |
55 |
if(i < this->previewTextRows.size()-1){ |
56 |
previewTextRowNumbers += "\n"; |
57 |
} |
58 |
} |
59 |
|
60 |
// Create line numbers QTextEdits |
61 |
this->lineNumberDisplayCurrentFile = new LineNumberDisplay(ui->teCurrentFileText,this); |
62 |
this->lineNumberDisplayPreviewFile = new LineNumberDisplay(ui->tePreviewFileText,this); |
63 |
|
64 |
// Make line numbers background transparent (http://www.qtcentre.org/threads/12148-how-QTextEdit-transparent-to-his-parent-window) |
65 |
this->lineNumberDisplayCurrentFile->viewport()->setAutoFillBackground(false); |
66 |
this->lineNumberDisplayPreviewFile->viewport()->setAutoFillBackground(false); |
67 |
|
68 |
// Add line numbers (at beginning of the horizontal layout) |
69 |
this->ui->hlCurrentFileText->insertWidget(0,lineNumberDisplayCurrentFile); |
70 |
this->ui->hlPreviewFileText->insertWidget(0,lineNumberDisplayPreviewFile); |
71 |
|
72 |
// Save the default background color (OS dependent) |
73 |
this->textEditDefaultBackgroundColor = QTextCursor(this->lineNumberDisplayCurrentFile->document()).charFormat().background(); |
74 |
|
75 |
highlightDifferences(); |
76 |
|
77 |
// Vertical scrollbars |
78 |
connect(ui->teCurrentFileText->verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(verticalScrollbarMoved(int))); |
79 |
connect(ui->tePreviewFileText->verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(verticalScrollbarMoved(int))); |
80 |
|
81 |
// Horizontal scrollbars |
82 |
connect(ui->teCurrentFileText->horizontalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(horizontalScrollbarMoved(int))); |
83 |
connect(ui->tePreviewFileText->horizontalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(horizontalScrollbarMoved(int))); |
84 |
} |
85 |
|
86 |
void XmlToolsInterfaceCommandPreview::verticalScrollbarMoved(int value) |
87 |
{ |
88 |
if(ui->cbVerticalScrollbarsSynchronized->isChecked()){ |
89 |
if(ui->teCurrentFileText->verticalScrollBar()->sliderPosition() != value){ |
90 |
ui->teCurrentFileText->verticalScrollBar()->setSliderPosition(value); |
91 |
} |
92 |
else{ |
93 |
ui->tePreviewFileText->verticalScrollBar()->setSliderPosition(value); |
94 |
} |
95 |
} |
96 |
} |
97 |
|
98 |
void XmlToolsInterfaceCommandPreview::horizontalScrollbarMoved(int value) |
99 |
{ |
100 |
if(ui->cbHorizontalScrollbarsSynchronized->isChecked()){ |
101 |
if(ui->teCurrentFileText->horizontalScrollBar()->sliderPosition() != value){ |
102 |
ui->teCurrentFileText->horizontalScrollBar()->setSliderPosition(value); |
103 |
} |
104 |
else{ |
105 |
ui->tePreviewFileText->horizontalScrollBar()->setSliderPosition(value); |
106 |
} |
107 |
} |
108 |
} |
109 |
|
110 |
void XmlToolsInterfaceCommandPreview::on_cbWrapText_toggled(bool checked) |
111 |
{ |
112 |
QTextEdit::LineWrapMode wrappingMode; |
113 |
|
114 |
if(checked){ |
115 |
wrappingMode = QTextEdit::WidgetWidth; |
116 |
this->lineNumberDisplayCurrentFile->hide(); |
117 |
this->lineNumberDisplayPreviewFile->hide(); |
118 |
} |
119 |
else{ |
120 |
wrappingMode = QTextEdit::NoWrap; |
121 |
this->lineNumberDisplayCurrentFile->show(); |
122 |
this->lineNumberDisplayPreviewFile->show(); |
123 |
} |
124 |
|
125 |
ui->teCurrentFileText->setLineWrapMode(wrappingMode); |
126 |
ui->tePreviewFileText->setLineWrapMode(wrappingMode); |
127 |
} |
128 |
|
129 |
void XmlToolsInterfaceCommandPreview::highlightDifferences(){ |
130 |
|
131 |
QTextCharFormat fmt; |
132 |
QTextCursor cursor; |
133 |
|
134 |
for(int i=0; i<currentTextRows.size(); i++){ |
135 |
if(i < this->previewTextRows.size()){ |
136 |
if(this->currentTextRows.at(i) != this->previewTextRows.at(i)){ |
137 |
fmt.setBackground(QColor(0xFFC864)); // orange color |
138 |
|
139 |
cursor = QTextCursor(ui->teCurrentFileText->document()); |
140 |
cursor.setPosition(ui->teCurrentFileText->document()->findBlockByLineNumber(i).position()); |
141 |
cursor.select(QTextCursor::LineUnderCursor); |
142 |
cursor.setCharFormat(fmt); |
143 |
|
144 |
fmt.setBackground(Qt::yellow); |
145 |
|
146 |
cursor = QTextCursor(ui->tePreviewFileText->document()); |
147 |
cursor.setPosition(ui->tePreviewFileText->document()->findBlockByLineNumber(i).position()); |
148 |
cursor.select(QTextCursor::LineUnderCursor); |
149 |
cursor.setCharFormat(fmt); |
150 |
} |
151 |
} |
152 |
else{ // if we have more rows in the current file than in the preview file we highlight the the extra rows in the current file |
153 |
fmt.setBackground(QColor(0xFFC864)); // orange color |
154 |
|
155 |
QTextCursor cursor(ui->teCurrentFileText->document()); |
156 |
cursor.setPosition(ui->teCurrentFileText->document()->findBlockByLineNumber(i).position()); |
157 |
cursor.select(QTextCursor::LineUnderCursor); |
158 |
cursor.setCharFormat(fmt); |
159 |
} |
160 |
} |
161 |
|
162 |
// if we have less rows in the current file than in the preview file we highlight the the extra rows in the preview file |
163 |
if(this->currentTextRows.size() < this->previewTextRows.size()){ |
164 |
for(int i=this->currentTextRows.size(); i<this->previewTextRows.size(); i++){ |
165 |
fmt.setBackground(Qt::yellow); |
166 |
|
167 |
cursor = QTextCursor(ui->tePreviewFileText->document()); |
168 |
cursor.setPosition(ui->tePreviewFileText->document()->findBlockByLineNumber(i).position()); |
169 |
cursor.select(QTextCursor::LineUnderCursor); |
170 |
cursor.setCharFormat(fmt); |
171 |
} |
172 |
} |
173 |
|
174 |
highlighterPreviewFile.rehighlight(); |
175 |
highlighterCurrentFile.rehighlight(); |
176 |
} |
177 |
|
178 |
XmlToolsInterfaceCommandPreview::~XmlToolsInterfaceCommandPreview() |
179 |
{ |
180 |
delete this->lineNumberDisplayCurrentFile; |
181 |
delete this->lineNumberDisplayPreviewFile; |
182 |
delete this->ui; |
183 |
} |
184 |
|
185 |
|
186 |
|
187 |
void XmlToolsInterfaceCommandPreview::on_checkBox_toggled(bool checked) |
188 |
{ |
189 |
if(checked){ |
190 |
highlightDifferences(); |
191 |
} |
192 |
else{ |
193 |
QTextCursor cursor(ui->teCurrentFileText->document()); |
194 |
QTextCharFormat fmt; |
195 |
fmt.setBackground(this->textEditDefaultBackgroundColor); |
196 |
|
197 |
cursor.select(QTextCursor::Document); |
198 |
cursor.setCharFormat(fmt); |
199 |
|
200 |
cursor = QTextCursor(ui->tePreviewFileText->document()); |
201 |
cursor.select(QTextCursor::Document); |
202 |
cursor.setCharFormat(fmt); |
203 |
} |
204 |
} |