diff --git a/README.md b/README.md index e0805fa..9de8076 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ Windows:[![Build status](https://ci.appveyor.com/api/projects/status/je31oh7roigybhsx?svg=true)](https://ci.appveyor.com/project/ozkanpakdil/big-file-editor) Linux&OSX:[![Build Status](https://travis-ci.org/ozkanpakdil/big-file-editor.svg?branch=master)](https://travis-ci.org/ozkanpakdil/big-file-editor) -this project's aim is to help who needs to open up a big file and -have to browse on it mostly on windows or ofcourse you may use it under linux :) +this project's aim is to help who needs to open up a big/large file (bigger then GB) and +have to browse on it mostly on windows, or you may use it under linux :) simple demo from linux machine. http://youtu.be/nYun58jPUtw @@ -12,12 +12,13 @@ https://github.com/ozkanpakdil/big-file-editor/releases Implemented Tasks -- open very big file. -- mouse wheel and go down in the file. -- Ctrl+L and go to line. this ability can be improved. -- catch page up page down or arrow keys for reading file line by line or pageSize pageSize. -- go to end of file. -- change file and save it. -- search in the file. +- Ctrl+O open a very big/large file. +- mouse wheel and scroll down in the file. +- Ctrl+L and go to line(this ability can be improved). +- PageUp key PageDown key or arrow keys for reading file line by line or pageSize pageSize. +- Ctrl+Shift+F go to end of file. +- Change file and save it. +- Ctrl+F search in the file. +- Ctrl+Shift+H replace in the file. -now I need tests.... +How to compile in windows check [here](./.appveyor.yml). \ No newline at end of file diff --git a/mainwindow.cpp b/mainwindow.cpp index 44c4cb1..41919db 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -13,7 +13,7 @@ #include #include -MainWindow::MainWindow(QWidget *parent) : +MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), ui(new Ui::MainWindow) { @@ -25,23 +25,24 @@ MainWindow::MainWindow(QWidget *parent) : connect(ui->textEdit, SIGNAL(goToEOF()), this, SLOT(goToEOF())); connect(ui->textEdit, SIGNAL(cursorPositionChanged()), this, SLOT(cursorPositionChanged())); - currentFileLineNumber=0; - + currentFileLineNumber = 0; } MainWindow::~MainWindow() { - if(!file){ + if (!file) + { file->close(); delete file; } delete ui; } -void MainWindow::changeEvent(QEvent *e) +void MainWindow::changeEvent(QEvent* e) { QMainWindow::changeEvent(e); - switch (e->type()) { + switch (e->type()) + { case QEvent::LanguageChange: ui->retranslateUi(this); break; @@ -57,51 +58,58 @@ void MainWindow::on_actionQuit_triggered() void MainWindow::on_actionAbout_triggered() { - QMessageBox::about(this,"Big File Editor","Opens big files mostly more then GBs
for any problem feel free to contact via my site"); + QMessageBox::about(this, "Big File Editor", + "Opens big files mostly more then GBs
for any problem feel free to contact via my site"); } void MainWindow::on_actionOpen_triggered() { QFontMetrics fm(ui->textEdit->font()); QString tmpFileName = QFileDialog::getOpenFileName(this, - tr("Open File"), "~", tr("Any File (*.*)")); + tr("Open File"), "~", tr("Any File (*.*)")); - if(tmpFileName=="~" || tmpFileName=="") + if (tmpFileName == "~" || tmpFileName == "") return; - fileName=tmpFileName; + fileName = tmpFileName; ui->textEdit->clear(); - pageSize=this->height()/(fm.height()); + pageSize = this->height() / (fm.height()); - file= new QFile(fileName); - qDebug()<<"file opened:"<open(QIODevice::ReadOnly | QIODevice::Text); - currentFileLineNumber=0; + file = new QFile(fileName); + qDebug() << "file opened:" << file->open(QIODevice::ReadOnly | QIODevice::Text); + currentFileLineNumber = 0; - for(int i=0;itextEdit->appendPlainText(this->readLineFromFile()); } - qDebug()<<"file:"< lineIndex){ + if (lineNumberFromWheel > lineIndex) + { //NOTE:scrolling up - - }else{ + } + else + { //scrolling down } - lineNumberFromWheel=lineIndex; + lineNumberFromWheel = lineIndex; //qDebug()<<"line index:"<atEnd()){ - QString line=file->readLine(); +QString MainWindow::readLineFromFile() +{ + if (!file->atEnd()) + { + QString line = file->readLine(); line.chop(1); currentFileLineNumber++; return line; @@ -109,229 +117,292 @@ QString MainWindow::readLineFromFile(){ return ""; } -void MainWindow::goLine(int sign){ - qDebug()<<"goLine:"<textEdit->textCursor().atEnd()) - if(sign==1){//key arrow down - ui->textEdit->appendPlainText(this->readLineFromFile()); + if (ui->textEdit->textCursor().atEnd()) + { + if (sign == 1) + { + //key arrow down + ui->textEdit->moveCursor(QTextCursor::End); + auto chars = this->readLineFromFile(); + if (chars.length() > 0) + ui->textEdit->appendPlainText(chars); } - if(sign==-1){//key arrow up + } + if (sign == -1) + { + //key arrow up } } -void MainWindow::goPage(int sign){ - qDebug()<<"goPage:"<textEdit->textCursor().atEnd()) - if(sign==1){//page down - for(int i=0;itextEdit->textCursor().atEnd()) + if (sign == 1) + { + //page down + for (int i = 0; i < pageSize; i++) ui->textEdit->appendPlainText(this->readLineFromFile()); } - if(sign==-1){//page up + if (sign == -1) + { + //page up } } -void MainWindow::wheelEvent(QWheelEvent *turning){ - if(fileName.trimmed()=="") +void MainWindow::wheelEvent(QWheelEvent* turning) +{ + if (!isFileOpened()) return; //qDebug()<<"wheel:"<delta(); - if(turning->delta()>0){ + if (turning->delta() > 0) + { //mouse wheel up - }else{ + } + else + { //mouse wheel down - if(ui->textEdit->textCursor().atEnd()) - for(int i=0;itextEdit->appendPlainText(this->readLineFromFile()); + ui->textEdit->setDisabled(true); + + if (ui->textEdit->textCursor().atEnd()) + { + for (int i = 0; i < pageSize; i++) + { + QString s = this->readLineFromFile(); + if (s.length() > 0) + { + ui->textEdit->appendPlainText(s); + } + } + } + + ui->textEdit->setDisabled(false); + qApp->processEvents(); } //qDebug()<<"pos:"<< file->pos(); } void MainWindow::on_actionGo_to_line_triggered() { - if(!isFileOpened()){ - QMessageBox::warning(this,"Open File First","You need to open a file first."); + if (!isFileOpened()) + { + QMessageBox::warning(this, "Open File First", "You need to open a file first."); return; } bool ok; int gotoLineNumber = QInputDialog::getInt(this, tr("Input Line Number"), - tr("Line Number:"), 25, 0, 100, 1,&ok); - if(ok && gotoLineNumber>ui->textEdit->document()->lineCount()){ + tr("Line Number:"), 25, 0, 100, 1, &ok); + if (ok && gotoLineNumber > ui->textEdit->document()->lineCount()) + { ui->textEdit->setVisible(false); ui->textEdit->clear(); QString bufferim; - for(int i=ui->textEdit->document()->lineCount();iatEnd()){ - bufferim.append( file->readLine() ); + for (int i = ui->textEdit->document()->lineCount(); i < gotoLineNumber; i++) + { + if (!file->atEnd()) + { + bufferim.append(file->readLine()); currentFileLineNumber++; } - if(currentFileLineNumber%10000==0){ + if (currentFileLineNumber % 10000 == 0) + { ui->textEdit->clear(); ui->textEdit->appendPlainText(bufferim); bufferim.clear(); qApp->processEvents(); } } - if(bufferim!=""){ + if (bufferim != "") + { ui->textEdit->appendPlainText(bufferim); qApp->processEvents(); } ui->textEdit->setVisible(true); } - if(ok && gotoLineNumbertextEdit->document()->lineCount()){ - int pos = ui->textEdit->document()->findBlockByLineNumber(gotoLineNumber-1).position(); + if (ok && gotoLineNumber < ui->textEdit->document()->lineCount()) + { + int pos = ui->textEdit->document()->findBlockByLineNumber(gotoLineNumber - 1).position(); QTextCursor cursor = ui->textEdit->textCursor(); cursor.setPosition(pos); ui->textEdit->setTextCursor(cursor); - qDebug()<<"gone:"<pos(); + +long MainWindow::findTotalFileLineNumbers() +{ + qint64 pozisyon = file->pos(); file->seek(0); - long sayac=0; - while(!file->atEnd()){ + long sayac = 0; + while (!file->atEnd()) + { file->readLine(); sayac++; - if(sayac%10000){ + if (sayac % 10000) + { qApp->processEvents(); } } file->seek(pozisyon); return sayac; } -void MainWindow::goToEOF(){ - if(!isFileOpened()) + +void MainWindow::goToEOF() +{ + if (!isFileOpened()) return; ui->textEdit->setVisible(false); - long i=0; + long i = 0; QString bufferim; - while(!file->atEnd()){ - bufferim.append( file->readLine() ); + while (!file->atEnd()) + { + bufferim.append(file->readLine()); i++; - if(i%10000==0){ + if (i % 10000 == 0) + { ui->textEdit->clear(); ui->textEdit->appendPlainText(bufferim); bufferim.clear(); qApp->processEvents(); - qDebug()<<"date:"<textEdit->appendPlainText(bufferim); - qDebug()<<"file line:"<textEdit->setVisible(true); } -void MainWindow::cursorPositionChanged(){ - long currentLineInTheEditor=ui->textEdit->textCursor().blockNumber(); +void MainWindow::cursorPositionChanged() +{ + long currentLineInTheEditor = ui->textEdit->textCursor().blockNumber(); - ui->statusBar->showMessage("current line in editor:" + QString::number( currentLineInTheEditor ) +" in file:" + - QString::number(currentFileLineNumber)); + ui->statusBar->showMessage("current line in editor:" + QString::number(currentLineInTheEditor) + " in file:" + + QString::number(currentFileLineNumber)); } void MainWindow::on_actionSave_triggered() { - if(!isFileOpened()){ - QMessageBox::warning(this,"Open File First","You need to open a file first."); + if (!isFileOpened()) + { + QMessageBox::warning(this, "Open File First", "You need to open a file first."); return; } ui->textEdit->setVisible(false); - QString saveFileName = QFileDialog::getSaveFileName(this, tr("Save File"), fileName+".out", tr("Any File (*.*)")); + QString saveFileName = QFileDialog::getSaveFileName(this, tr("Save File"), fileName + ".out", tr("Any File (*.*)")); if (saveFileName.isEmpty()) - return; - qDebug()<<"saveFileName:"<textEdit->textCursor().blockNumber()"<textEdit->textCursor().blockNumber() - ; + return; + qDebug() << "saveFileName:" << saveFileName << "currentFileLineNumber:" << currentFileLineNumber + << "ui->textEdit->textCursor().blockNumber()" << ui->textEdit->textCursor().blockNumber(); QString plainTextEditContents = ui->textEdit->toPlainText(); QStringList lines = plainTextEditContents.split("\n"); - qDebug()<<"lines:"<pos(); + qDebug() << "lines:" << lines.size(); + qint64 pozisyon = file->pos(); - if(currentFileLineNumber != lines.size()){ + if (currentFileLineNumber != lines.size()) + { //NOTE:user is at the end of file and we need to do some preprocess //for(QTextBlock block = document()->begin(); block.isValid(); block = block.next()) {} QFile fileSave(saveFileName); - if (!fileSave.open(QIODevice::WriteOnly)) { - QMessageBox::information(this, tr("Unable to open file"),fileSave.errorString()); + if (!fileSave.open(QIODevice::WriteOnly)) + { + QMessageBox::information(this, tr("Unable to open file"), fileSave.errorString()); return; } - qDebug()<<"file opened."; + qDebug() << "file opened."; QTextStream out(&fileSave); file->seek(0); - long totalLineCount=this->findTotalFileLineNumbers(); - ui->statusBar->showMessage("please wait until save done... total lines:"+QString::number(totalLineCount)); + long totalLineCount = this->findTotalFileLineNumbers(); + ui->statusBar->showMessage("please wait until save done... total lines:" + QString::number(totalLineCount)); - int sayac=0; + int sayac = 0; - while(sayacreadLine(); + while (sayac < currentFileLineNumber - lines.size()) + { + out << file->readLine(); sayac++; - if(sayac%1000){ + if (sayac % 1000) + { qApp->processEvents(); } } - foreach(QString line,lines){ - out<readLine(); sayac++; - if(sayac%1000){ + if (sayac % 1000) + { qApp->processEvents(); } } - while(!file->atEnd()){ - out<readLine(); + while (!file->atEnd()) + { + out << file->readLine(); sayac++; - if(sayac%1000){ + if (sayac % 1000) + { qApp->processEvents(); } } - qDebug()<<"file closed."; + qDebug() << "file closed."; fileSave.close(); - - }else{ + } + else + { //NOTE:editor and file is sync so we just need to save all editor to the file and add if there is anymore line //from opened file. QFile fileSave(saveFileName); - if (!fileSave.open(QIODevice::WriteOnly)) { - QMessageBox::information(this, tr("Unable to open file"),fileSave.errorString()); + if (!fileSave.open(QIODevice::WriteOnly)) + { + QMessageBox::information(this, tr("Unable to open file"), fileSave.errorString()); return; } - qDebug()<<"file opened."; + qDebug() << "file opened."; QTextStream out(&fileSave); ui->statusBar->showMessage("please wait until save done..."); file->seek(0); - int sayac=0; - foreach(QString line,lines){ - out<readLine(); sayac++; - if(sayac%1000){ + if (sayac % 1000) + { qApp->processEvents(); } } - while(!file->atEnd()){ - out<readLine(); + while (!file->atEnd()) + { + out << file->readLine(); sayac++; - if(sayac%1000){ + if (sayac % 1000) + { qApp->processEvents(); } } - qDebug()<<"file closed."; + qDebug() << "file closed."; fileSave.close(); } file->seek(pozisyon); @@ -340,46 +411,53 @@ void MainWindow::on_actionSave_triggered() void MainWindow::on_actionSearch_triggered() { - if(!isFileOpened()) + if (!isFileOpened()) return; bool ok; QString searchWord = QInputDialog::getText(this, tr("Input Search Phrase"), - tr("Word:"), QLineEdit::Normal, - "hele",&ok); + tr("Word:"), QLineEdit::Normal, + "hele", &ok); - if (ok && !searchWord.isEmpty()){ + if (ok && !searchWord.isEmpty()) + { ui->textEdit->setVisible(false); file->seek(0); - long i=0; + long i = 0; QString bufferim; - while(!file->atEnd()){ - bufferim.append( file->readLine() ); + while (!file->atEnd()) + { + bufferim.append(file->readLine()); i++; - if(i%10000==0){ + if (i % 10000 == 0) + { ui->textEdit->clear(); ui->textEdit->appendPlainText(bufferim); bufferim.clear(); qApp->processEvents(); - qDebug()<<"date:"<textEdit->document()->find(searchWord,Qt::CaseInsensitive).isNull()){ - qDebug()<<"found the word"; + qDebug() << "date:" << QTime::currentTime() << "file line:" << i; + currentFileLineNumber = i; + if (!ui->textEdit->document()->find(searchWord, Qt::CaseInsensitive).isNull()) + { + qDebug() << "found the word"; break; } } } - currentFileLineNumber=i; - if(!bufferim.isEmpty()){ + currentFileLineNumber = i; + if (!bufferim.isEmpty()) + { ui->textEdit->appendPlainText(bufferim); - if(!ui->textEdit->document()->find(searchWord,Qt::CaseInsensitive).isNull()){ - qDebug()<<"found the word"; + if (!ui->textEdit->document()->find(searchWord, Qt::CaseInsensitive).isNull()) + { + qDebug() << "found the word"; } } ui->textEdit->setVisible(true); - if(!ui->textEdit->document()->find(searchWord,Qt::CaseInsensitive).isNull()){ - QTextCursor cursor = ui->textEdit->document()->find(searchWord,Qt::CaseInsensitive); + if (!ui->textEdit->document()->find(searchWord, Qt::CaseInsensitive).isNull()) + { + QTextCursor cursor = ui->textEdit->document()->find(searchWord, Qt::CaseInsensitive); cursor.beginEditBlock(); cursor.movePosition(QTextCursor::EndOfWord, QTextCursor::KeepAnchor); cursor.endEditBlock(); diff --git a/mainwindow.h b/mainwindow.h index 98496c3..ec0a8ab 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -13,10 +13,9 @@ class MainWindow : public QMainWindow { public: MainWindow(QWidget *parent = 0); ~MainWindow(); - bool isFileOpened(){ - if(fileName.trimmed()=="") - return false; - return true; + bool isFileOpened() + { + return (fileName.trimmed() != ""); } protected: diff --git a/mainwindow.ui b/mainwindow.ui index e8d4123..3ea782b 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -14,7 +14,7 @@ - Big File Editor by mascix.com + Big File Editor by ozkanpakdil