summaryrefslogtreecommitdiff
path: root/qhexedit2/example/mainwindow.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'qhexedit2/example/mainwindow.cpp')
-rw-r--r--qhexedit2/example/mainwindow.cpp433
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());
+}