| 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 | } |