diff options
Diffstat (limited to 'qhexedit2/example/mainwindow.cpp')
-rw-r--r-- | qhexedit2/example/mainwindow.cpp | 433 |
1 files changed, 433 insertions, 0 deletions
diff --git a/qhexedit2/example/mainwindow.cpp b/qhexedit2/example/mainwindow.cpp new file mode 100644 index 0000000..fcfce71 --- /dev/null +++ b/qhexedit2/example/mainwindow.cpp @@ -0,0 +1,433 @@ +#include <QFileDialog> +#include <QMessageBox> +#include <QApplication> +#include <QStatusBar> +#include <QLabel> +#include <QAction> +#include <QMenuBar> +#include <QToolBar> +#include <QColorDialog> +#include <QFontDialog> +#include <QDragEnterEvent> +#include <QDropEvent> + +#include "mainwindow.h" + +/*****************************************************************************/ +/* Public methods */ +/*****************************************************************************/ +MainWindow::MainWindow() +{ + setAcceptDrops( true ); + init(); + setCurrentFile(""); +} + +/*****************************************************************************/ +/* Protected methods */ +/*****************************************************************************/ +void MainWindow::closeEvent(QCloseEvent *) +{ + writeSettings(); +} + + +void MainWindow::dragEnterEvent(QDragEnterEvent *event) +{ + if (event->mimeData()->hasUrls()) + event->accept(); +} + + +void MainWindow::dropEvent(QDropEvent *event) +{ + if (event->mimeData()->hasUrls()) + { + QList<QUrl> urls = event->mimeData()->urls(); + QString filePath = urls.at(0).toLocalFile(); + loadFile(filePath); + event->accept(); + } +} + +/*****************************************************************************/ +/* Private Slots */ +/*****************************************************************************/ +void MainWindow::about() +{ + QMessageBox::about(this, tr("About QHexEdit"), + tr("The QHexEdit example is a short Demo of the QHexEdit Widget.")); +} + +void MainWindow::dataChanged() +{ + setWindowModified(hexEdit->isModified()); +} + +void MainWindow::open() +{ + QString fileName = QFileDialog::getOpenFileName(this); + if (!fileName.isEmpty()) { + loadFile(fileName); + } +} + +void MainWindow::optionsAccepted() +{ + writeSettings(); + readSettings(); +} + +void MainWindow::findNext() +{ + searchDialog->findNext(); +} + +bool MainWindow::save() +{ + if (isUntitled) { + return saveAs(); + } else { + return saveFile(curFile); + } +} + +bool MainWindow::saveAs() +{ + QString fileName = QFileDialog::getSaveFileName(this, tr("Save As"), + curFile); + if (fileName.isEmpty()) + return false; + + return saveFile(fileName); +} + +void MainWindow::saveSelectionToReadableFile() +{ + QString fileName = QFileDialog::getSaveFileName(this, tr("Save To Readable File")); + if (!fileName.isEmpty()) + { + QFile file(fileName); + if (!file.open(QFile::WriteOnly | QFile::Text)) { + QMessageBox::warning(this, tr("QHexEdit"), + tr("Cannot write file %1:\n%2.") + .arg(fileName) + .arg(file.errorString())); + return; + } + + QApplication::setOverrideCursor(Qt::WaitCursor); + file.write(hexEdit->selectionToReadableString().toLatin1()); + QApplication::restoreOverrideCursor(); + + statusBar()->showMessage(tr("File saved"), 2000); + } +} + +void MainWindow::saveToReadableFile() +{ + QString fileName = QFileDialog::getSaveFileName(this, tr("Save To Readable File")); + if (!fileName.isEmpty()) + { + QFile file(fileName); + if (!file.open(QFile::WriteOnly | QFile::Text)) { + QMessageBox::warning(this, tr("QHexEdit"), + tr("Cannot write file %1:\n%2.") + .arg(fileName) + .arg(file.errorString())); + return; + } + + QApplication::setOverrideCursor(Qt::WaitCursor); + file.write(hexEdit->toReadableString().toLatin1()); + QApplication::restoreOverrideCursor(); + + statusBar()->showMessage(tr("File saved"), 2000); + } +} + +void MainWindow::setAddress(qint64 address) +{ + lbAddress->setText(QString("%1").arg(address, 1, 16)); +} + +void MainWindow::setOverwriteMode(bool mode) +{ + QSettings settings; + settings.setValue("OverwriteMode", mode); + if (mode) + lbOverwriteMode->setText(tr("Overwrite")); + else + lbOverwriteMode->setText(tr("Insert")); +} + +void MainWindow::setSize(qint64 size) +{ + lbSize->setText(QString("%1").arg(size)); +} + +void MainWindow::showOptionsDialog() +{ + optionsDialog->show(); +} + +void MainWindow::showSearchDialog() +{ + searchDialog->show(); +} + +/*****************************************************************************/ +/* Private Methods */ +/*****************************************************************************/ +void MainWindow::init() +{ + setAttribute(Qt::WA_DeleteOnClose); + optionsDialog = new OptionsDialog(this); + connect(optionsDialog, SIGNAL(accepted()), this, SLOT(optionsAccepted())); + isUntitled = true; + + hexEdit = new QHexEdit; + setCentralWidget(hexEdit); + connect(hexEdit, SIGNAL(overwriteModeChanged(bool)), this, SLOT(setOverwriteMode(bool))); + connect(hexEdit, SIGNAL(dataChanged()), this, SLOT(dataChanged())); + searchDialog = new SearchDialog(hexEdit, this); + + createActions(); + createMenus(); + createToolBars(); + createStatusBar(); + + readSettings(); + + setUnifiedTitleAndToolBarOnMac(true); +} + +void MainWindow::createActions() +{ + openAct = new QAction(QIcon(":/images/open.png"), tr("&Open..."), this); + openAct->setShortcuts(QKeySequence::Open); + openAct->setStatusTip(tr("Open an existing file")); + connect(openAct, SIGNAL(triggered()), this, SLOT(open())); + + saveAct = new QAction(QIcon(":/images/save.png"), tr("&Save"), this); + saveAct->setShortcuts(QKeySequence::Save); + saveAct->setStatusTip(tr("Save the document to disk")); + connect(saveAct, SIGNAL(triggered()), this, SLOT(save())); + + saveAsAct = new QAction(tr("Save &As..."), this); + saveAsAct->setShortcuts(QKeySequence::SaveAs); + saveAsAct->setStatusTip(tr("Save the document under a new name")); + connect(saveAsAct, SIGNAL(triggered()), this, SLOT(saveAs())); + + saveReadable = new QAction(tr("Save &Readable..."), this); + saveReadable->setStatusTip(tr("Save document in readable form")); + connect(saveReadable, SIGNAL(triggered()), this, SLOT(saveToReadableFile())); + + exitAct = new QAction(tr("E&xit"), this); + exitAct->setShortcuts(QKeySequence::Quit); + exitAct->setStatusTip(tr("Exit the application")); + connect(exitAct, SIGNAL(triggered()), qApp, SLOT(closeAllWindows())); + + undoAct = new QAction(QIcon(":/images/undo.png"), tr("&Undo"), this); + undoAct->setShortcuts(QKeySequence::Undo); + connect(undoAct, SIGNAL(triggered()), hexEdit, SLOT(undo())); + + redoAct = new QAction(QIcon(":/images/redo.png"), tr("&Redo"), this); + redoAct->setShortcuts(QKeySequence::Redo); + connect(redoAct, SIGNAL(triggered()), hexEdit, SLOT(redo())); + + saveSelectionReadable = new QAction(tr("&Save Selection Readable..."), this); + saveSelectionReadable->setStatusTip(tr("Save selection in readable form")); + connect(saveSelectionReadable, SIGNAL(triggered()), this, SLOT(saveSelectionToReadableFile())); + + aboutAct = new QAction(tr("&About"), this); + aboutAct->setStatusTip(tr("Show the application's About box")); + connect(aboutAct, SIGNAL(triggered()), this, SLOT(about())); + + aboutQtAct = new QAction(tr("About &Qt"), this); + aboutQtAct->setStatusTip(tr("Show the Qt library's About box")); + connect(aboutQtAct, SIGNAL(triggered()), qApp, SLOT(aboutQt())); + + findAct = new QAction(QIcon(":/images/find.png"), tr("&Find/Replace"), this); + findAct->setShortcuts(QKeySequence::Find); + findAct->setStatusTip(tr("Show the Dialog for finding and replacing")); + connect(findAct, SIGNAL(triggered()), this, SLOT(showSearchDialog())); + + findNextAct = new QAction(tr("Find &next"), this); + findNextAct->setShortcuts(QKeySequence::FindNext); + findNextAct->setStatusTip(tr("Find next occurrence of the searched pattern")); + connect(findNextAct, SIGNAL(triggered()), this, SLOT(findNext())); + + optionsAct = new QAction(tr("&Options"), this); + optionsAct->setStatusTip(tr("Show the Dialog to select applications options")); + connect(optionsAct, SIGNAL(triggered()), this, SLOT(showOptionsDialog())); +} + +void MainWindow::createMenus() +{ + fileMenu = menuBar()->addMenu(tr("&File")); + fileMenu->addAction(openAct); + fileMenu->addAction(saveAct); + fileMenu->addAction(saveAsAct); + fileMenu->addAction(saveReadable); + fileMenu->addSeparator(); + fileMenu->addAction(exitAct); + + editMenu = menuBar()->addMenu(tr("&Edit")); + editMenu->addAction(undoAct); + editMenu->addAction(redoAct); + editMenu->addAction(saveSelectionReadable); + editMenu->addSeparator(); + editMenu->addAction(findAct); + editMenu->addAction(findNextAct); + editMenu->addSeparator(); + editMenu->addAction(optionsAct); + + helpMenu = menuBar()->addMenu(tr("&Help")); + helpMenu->addAction(aboutAct); + helpMenu->addAction(aboutQtAct); +} + +void MainWindow::createStatusBar() +{ + // Address Label + lbAddressName = new QLabel(); + lbAddressName->setText(tr("Address:")); + statusBar()->addPermanentWidget(lbAddressName); + lbAddress = new QLabel(); + lbAddress->setFrameShape(QFrame::Panel); + lbAddress->setFrameShadow(QFrame::Sunken); + lbAddress->setMinimumWidth(70); + statusBar()->addPermanentWidget(lbAddress); + connect(hexEdit, SIGNAL(currentAddressChanged(qint64)), this, SLOT(setAddress(qint64))); + + // Size Label + lbSizeName = new QLabel(); + lbSizeName->setText(tr("Size:")); + statusBar()->addPermanentWidget(lbSizeName); + lbSize = new QLabel(); + lbSize->setFrameShape(QFrame::Panel); + lbSize->setFrameShadow(QFrame::Sunken); + lbSize->setMinimumWidth(70); + statusBar()->addPermanentWidget(lbSize); + connect(hexEdit, SIGNAL(currentSizeChanged(qint64)), this, SLOT(setSize(qint64))); + + // Overwrite Mode Label + lbOverwriteModeName = new QLabel(); + lbOverwriteModeName->setText(tr("Mode:")); + statusBar()->addPermanentWidget(lbOverwriteModeName); + lbOverwriteMode = new QLabel(); + lbOverwriteMode->setFrameShape(QFrame::Panel); + lbOverwriteMode->setFrameShadow(QFrame::Sunken); + lbOverwriteMode->setMinimumWidth(70); + statusBar()->addPermanentWidget(lbOverwriteMode); + setOverwriteMode(hexEdit->overwriteMode()); + + statusBar()->showMessage(tr("Ready"), 2000); +} + +void MainWindow::createToolBars() +{ + fileToolBar = addToolBar(tr("File")); + fileToolBar->addAction(openAct); + fileToolBar->addAction(saveAct); + editToolBar = addToolBar(tr("Edit")); + editToolBar->addAction(undoAct); + editToolBar->addAction(redoAct); + editToolBar->addAction(findAct); +} + +void MainWindow::loadFile(const QString &fileName) +{ + file.setFileName(fileName); + if (!hexEdit->setData(file)) { + QMessageBox::warning(this, tr("QHexEdit"), + tr("Cannot read file %1:\n%2.") + .arg(fileName) + .arg(file.errorString())); + return; + } + setCurrentFile(fileName); + statusBar()->showMessage(tr("File loaded"), 2000); +} + +void MainWindow::readSettings() +{ + QSettings settings; + QPoint pos = settings.value("pos", QPoint(200, 200)).toPoint(); + QSize size = settings.value("size", QSize(610, 460)).toSize(); + move(pos); + resize(size); + + hexEdit->setAddressArea(settings.value("AddressArea").toBool()); + hexEdit->setAsciiArea(settings.value("AsciiArea").toBool()); + hexEdit->setHighlighting(settings.value("Highlighting").toBool()); + hexEdit->setOverwriteMode(settings.value("OverwriteMode").toBool()); + hexEdit->setReadOnly(settings.value("ReadOnly").toBool()); + + hexEdit->setHighlightingColor(settings.value("HighlightingColor").value<QColor>()); + hexEdit->setAddressAreaColor(settings.value("AddressAreaColor").value<QColor>()); + hexEdit->setSelectionColor(settings.value("SelectionColor").value<QColor>()); + hexEdit->setFont(settings.value("WidgetFont").value<QFont>()); + hexEdit->setAddressFontColor(settings.value("AddressFontColor").value<QColor>()); + hexEdit->setAsciiAreaColor(settings.value("AsciiAreaColor").value<QColor>()); + hexEdit->setAsciiFontColor(settings.value("AsciiFontColor").value<QColor>()); + hexEdit->setHexFontColor(settings.value("HexFontColor").value<QColor>()); + + hexEdit->setAddressWidth(settings.value("AddressAreaWidth").toInt()); + hexEdit->setBytesPerLine(settings.value("BytesPerLine").toInt()); + hexEdit->setHexCaps(settings.value("HexCaps", true).toBool()); +} + +bool MainWindow::saveFile(const QString &fileName) +{ + QString tmpFileName = fileName + ".~tmp"; + + QApplication::setOverrideCursor(Qt::WaitCursor); + QFile file(tmpFileName); + bool ok = hexEdit->write(file); + if (QFile::exists(fileName)) + ok = QFile::remove(fileName); + if (ok) + { + file.setFileName(tmpFileName); + ok = file.copy(fileName); + if (ok) + ok = QFile::remove(tmpFileName); + } + QApplication::restoreOverrideCursor(); + + if (!ok) { + QMessageBox::warning(this, tr("QHexEdit"), + tr("Cannot write file %1.") + .arg(fileName)); + return false; + } + + setCurrentFile(fileName); + statusBar()->showMessage(tr("File saved"), 2000); + return true; +} + +void MainWindow::setCurrentFile(const QString &fileName) +{ + curFile = QFileInfo(fileName).canonicalFilePath(); + isUntitled = fileName.isEmpty(); + setWindowModified(false); + if (fileName.isEmpty()) + setWindowFilePath("QHexEdit"); + else + setWindowFilePath(curFile + " - QHexEdit"); +} + +QString MainWindow::strippedName(const QString &fullFileName) +{ + return QFileInfo(fullFileName).fileName(); +} + +void MainWindow::writeSettings() +{ + QSettings settings; + settings.setValue("pos", pos()); + settings.setValue("size", size()); +} |