1
0
Fork 0

codepage hex editor (#1062)

* codepage hex editor

* fix
This commit is contained in:
Torusrxxx 2016-09-08 14:55:03 +00:00 committed by Duncan Ogilvie
parent 09561b470f
commit 3fc6ff1d06
5 changed files with 122 additions and 116 deletions

View File

@ -14,8 +14,8 @@ HexEditDialog::HexEditDialog(QWidget* parent) : QDialog(parent), ui(new Ui::HexE
setModal(true); //modal window
//setup text fields
ui->lineEditAscii->setEncoding(HexLineEdit::Encoding::Ascii);
ui->lineEditUnicode->setEncoding(HexLineEdit::Encoding::Unicode);
ui->lineEditAscii->setEncoding(QTextCodec::codecForName("System"));
ui->lineEditUnicode->setEncoding(QTextCodec::codecForName("UTF-16"));
ui->chkEntireBlock->hide();
@ -35,6 +35,7 @@ HexEditDialog::HexEditDialog(QWidget* parent) : QDialog(parent), ui(new Ui::HexE
connect(Bridge::getBridge(), SIGNAL(repaintGui()), this, SLOT(updateStyle()));
updateStyle();
updateCodepage();
}
HexEditDialog::~HexEditDialog()
@ -58,6 +59,24 @@ void HexEditDialog::showKeepSize(bool show)
ui->chkKeepSize->hide();
}
void HexEditDialog::updateCodepage()
{
duint lastCodepage;
auto allCodecs = QTextCodec::availableCodecs();
if(!BridgeSettingGetUint("Misc", "LastCodepage", &lastCodepage) || lastCodepage >= duint(allCodecs.size()))
return;
ui->lineEditCodepage->setEncoding(QTextCodec::codecForName(allCodecs.at(lastCodepage)));
ui->lineEditCodepage->setData(mHexEdit->data());
ui->labelLastCodepage->setText(QString(allCodecs.at(lastCodepage).constData()));
}
void HexEditDialog::updateCodepage(const QByteArray & name)
{
ui->lineEditCodepage->setEncoding(QTextCodec::codecForName(name));
ui->lineEditCodepage->setData(mHexEdit->data());
ui->labelLastCodepage->setText(QString(name));
}
bool HexEditDialog::entireBlock()
{
return ui->chkEntireBlock->isChecked();
@ -68,6 +87,7 @@ void HexEditDialog::updateStyle()
QString style = QString("QLineEdit { border-style: outset; border-width: 1px; border-color: %1; color: %1; background-color: %2 }").arg(ConfigColor("HexEditTextColor").name(), ConfigColor("HexEditBackgroundColor").name());
ui->lineEditAscii->setStyleSheet(style);
ui->lineEditUnicode->setStyleSheet(style);
ui->lineEditCodepage->setStyleSheet(style);
mHexEdit->setTextColor(ConfigColor("HexEditTextColor"));
mHexEdit->setWildcardColor(ConfigColor("HexEditWildcardColor"));
@ -80,6 +100,7 @@ void HexEditDialog::on_chkKeepSize_toggled(bool checked)
mHexEdit->setKeepSize(checked);
ui->lineEditAscii->setKeepSize(checked);
ui->lineEditUnicode->setKeepSize(checked);
ui->lineEditCodepage->setKeepSize(checked);
}
void HexEditDialog::dataChangedSlot()
@ -90,6 +111,7 @@ void HexEditDialog::dataChangedSlot()
QByteArray data = mHexEdit->data();
ui->lineEditAscii->setData(data);
ui->lineEditUnicode->setData(data);
ui->lineEditCodepage->setData(data);
mDataInitialized = true;
}
}
@ -99,6 +121,7 @@ void HexEditDialog::dataEditedSlot()
QByteArray data = mHexEdit->data();
ui->lineEditAscii->setData(data);
ui->lineEditUnicode->setData(data);
ui->lineEditCodepage->setData(data);
}
void HexEditDialog::on_lineEditAscii_dataEdited()
@ -106,6 +129,7 @@ void HexEditDialog::on_lineEditAscii_dataEdited()
QByteArray data = ui->lineEditAscii->data();
data = resizeData(data);
ui->lineEditUnicode->setData(data);
ui->lineEditCodepage->setData(data);
mHexEdit->setData(data);
}
@ -114,6 +138,16 @@ void HexEditDialog::on_lineEditUnicode_dataEdited()
QByteArray data = ui->lineEditUnicode->data();
data = resizeData(data);
ui->lineEditAscii->setData(data);
ui->lineEditCodepage->setData(data);
mHexEdit->setData(data);
}
void HexEditDialog::on_lineEditCodepage_dataEdited()
{
QByteArray data = ui->lineEditCodepage->data();
data = resizeData(data);
ui->lineEditAscii->setData(data);
ui->lineEditUnicode->setData(data);
mHexEdit->setData(data);
}
@ -123,10 +157,11 @@ QByteArray HexEditDialog::resizeData(QByteArray & data)
if(mHexEdit->keepSize())
{
int dataSize = mHexEdit->data().size();
if(dataSize < data.size())
int data_size = data.size();
if(dataSize < data_size)
data.resize(dataSize);
else if(dataSize > data.size())
data.append(QByteArray(dataSize - data.size(), 0));
else if(dataSize > data_size)
data.append(QByteArray(dataSize - data_size, 0));
}
return data;
@ -137,19 +172,5 @@ void HexEditDialog::on_btnCodepage_clicked()
CodepageSelectionDialog codepageDialog(this);
if(codepageDialog.exec() != QDialog::Accepted)
return;
auto textCodec = QTextCodec::codecForName(codepageDialog.getSelectedCodepage());
if(!textCodec)
return;
LineEditDialog lineEdit(this);
lineEdit.setWindowTitle(tr("Enter text to convert..."));
QString oldText;
oldText = textCodec->toUnicode(mHexEdit->data());
for(auto & i : oldText)
if(!i.isPrint())
i = QChar('.');
lineEdit.setText(oldText);
if(lineEdit.exec() != QDialog::Accepted)
return;
mHexEdit->setData(resizeData(textCodec->fromUnicode(lineEdit.editText)));
dataEditedSlot();
updateCodepage(codepageDialog.getSelectedCodepage());
}

View File

@ -19,6 +19,7 @@ public:
void showEntireBlock(bool show);
void showKeepSize(bool show);
void updateCodepage();
bool entireBlock();
@ -31,10 +32,12 @@ private slots:
void dataEditedSlot();
void on_lineEditAscii_dataEdited();
void on_lineEditUnicode_dataEdited();
void on_lineEditCodepage_dataEdited();
void on_btnCodepage_clicked();
private:
Ui::HexEditDialog* ui;
void updateCodepage(const QByteArray & name);
bool mDataInitialized;

View File

@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>381</width>
<height>280</height>
<height>304</height>
</rect>
</property>
<property name="windowTitle">
@ -18,23 +18,10 @@
<normaloff>:/icons/images/document-binary.png</normaloff>:/icons/images/document-binary.png</iconset>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QLabel" name="labelAscii">
<property name="text">
<string>&amp;ASCII:</string>
</property>
<property name="buddy">
<cstring>lineEditAscii</cstring>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="labelUnicode">
<property name="text">
<string>&amp;UNICODE:</string>
</property>
<property name="buddy">
<cstring>lineEditUnicode</cstring>
<item row="5" column="0" colspan="4">
<widget class="HexLineEdit" name="lineEditCodepage">
<property name="styleSheet">
<string notr="true">QLineEdit {border-style: outset; border-width: 1px; border-color: black}</string>
</property>
</widget>
</item>
@ -54,6 +41,23 @@
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="labelAscii">
<property name="text">
<string>&amp;ASCII:</string>
</property>
<property name="buddy">
<cstring>lineEditAscii</cstring>
</property>
</widget>
</item>
<item row="8" column="2">
<widget class="QPushButton" name="btnOk">
<property name="text">
<string>&amp;OK</string>
</property>
</widget>
</item>
<item row="1" column="0" colspan="4">
<widget class="HexLineEdit" name="lineEditAscii">
<property name="styleSheet">
@ -70,7 +74,7 @@
</property>
</widget>
</item>
<item row="4" column="0">
<item row="6" column="0">
<widget class="QLabel" name="labelHex">
<property name="text">
<string>&amp;Hex:</string>
@ -80,21 +84,21 @@
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QCheckBox" name="chkKeepSize">
<item row="8" column="3">
<widget class="QPushButton" name="btnCancel">
<property name="text">
<string>&amp;Keep Size</string>
<string>&amp;Cancel</string>
</property>
</widget>
</item>
<item row="6" column="2">
<widget class="QPushButton" name="btnOk">
<item row="8" column="1">
<widget class="QCheckBox" name="chkEntireBlock">
<property name="text">
<string>&amp;OK</string>
<string>&amp;Entire Block</string>
</property>
</widget>
</item>
<item row="5" column="0" colspan="4">
<item row="7" column="0" colspan="4">
<widget class="QScrollArea" name="scrollArea">
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
@ -111,23 +115,36 @@
<x>0</x>
<y>0</y>
<width>361</width>
<height>116</height>
<height>100</height>
</rect>
</property>
</widget>
</widget>
</item>
<item row="6" column="1">
<widget class="QCheckBox" name="chkEntireBlock">
<item row="2" column="0">
<widget class="QLabel" name="labelUnicode">
<property name="text">
<string>&amp;Entire Block</string>
<string>&amp;UNICODE:</string>
</property>
<property name="buddy">
<cstring>lineEditUnicode</cstring>
</property>
</widget>
</item>
<item row="6" column="3">
<widget class="QPushButton" name="btnCancel">
<item row="8" column="0">
<widget class="QCheckBox" name="chkKeepSize">
<property name="text">
<string>&amp;Cancel</string>
<string>&amp;Keep Size</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="labelLastCodepage">
<property name="text">
<string>Last &amp;Codepage:</string>
</property>
<property name="buddy">
<cstring>lineEditCodepage</cstring>
</property>
</widget>
</item>
@ -146,7 +163,7 @@
</size>
</property>
<property name="text">
<string>&amp;Codepage...</string>
<string>Code&amp;page...</string>
</property>
</widget>
</item>

View File

@ -12,9 +12,9 @@ HexLineEdit::HexLineEdit(QWidget* parent) :
// setup data
mData = QByteArray();
mEncoding = Encoding::Ascii;
mKeepSize = false;
mOverwriteMode = false;
mEncoding = QTextCodec::codecForName("System");
//setup text fields
QFont font("Monospace", 8, QFont::Normal, false);
@ -42,21 +42,13 @@ void HexLineEdit::keyPressEvent(QKeyEvent* event)
if(mOverwriteMode)
{
if(!event->text().isEmpty() && event->text().at(0).isPrint())
QString newText = event->text();
if(!newText.isEmpty() && newText.at(0).isPrint())
{
QString keyText;
switch(mEncoding)
{
case Encoding::Ascii:
keyText = event->text().toLocal8Bit();
break;
case Encoding::Unicode:
keyText = event->text();
break;
}
del();
insert(keyText);
for(int i = 0; i < newText.size(); i++)
del();
QTextCodec::ConverterState converter(QTextCodec::IgnoreHeader);
insert(mEncoding->fromUnicode(newText.constData(), newText.size(), &converter));
event->ignore();
return;
}
@ -68,21 +60,9 @@ void HexLineEdit::keyPressEvent(QKeyEvent* event)
void HexLineEdit::setData(const QByteArray & data)
{
QString text;
switch(mEncoding)
{
case Encoding::Ascii:
text = QString::fromLocal8Bit(data);
break;
text = mEncoding->toUnicode(data);
case Encoding::Unicode:
text = QString::fromUtf16((const ushort*)data.constData());
break;
}
for(auto & i : text)
if(!i.isPrint())
i = QChar(' ');
mData = toEncodedData(text);
mData = data;
setText(text);
}
@ -91,12 +71,21 @@ QByteArray HexLineEdit::data()
return mData;
}
void HexLineEdit::setEncoding(const HexLineEdit::Encoding encoding)
/**
* @brief HexLineEdit::setEncoding Set the encoding of the line edit.
* @param encoding The codec for the line edit.
* @remarks the parameter passed in will be managed by the widget. You must use a new codec.
*/
void HexLineEdit::setEncoding(QTextCodec* encoding)
{
mEncoding = encoding;
}
HexLineEdit::Encoding HexLineEdit::encoding()
/**
* @brief HexLineEdit::encoding Get the encoding of the line edit.
* @return the codec instance of the line edit.
*/
QTextCodec* HexLineEdit::encoding()
{
return mEncoding;
}
@ -108,16 +97,8 @@ void HexLineEdit::setKeepSize(const bool enabled)
{
int dataSize = mData.size();
int charSize;
switch(mEncoding)
{
case Encoding::Ascii:
charSize = sizeof(char);
break;
case Encoding::Unicode:
charSize = sizeof(wchar_t);
break;
}
QTextCodec::ConverterState converter(QTextCodec::IgnoreHeader);
charSize = mEncoding->fromUnicode(QString("A").constData(), 1, &converter).size(); // "A\0"
setMaxLength((dataSize / charSize) + (dataSize % charSize));
}
@ -152,17 +133,6 @@ void HexLineEdit::updateData(const QString & arg1)
QByteArray HexLineEdit::toEncodedData(const QString & text)
{
QByteArray data;
switch(mEncoding)
{
case Encoding::Ascii:
data = text.toLocal8Bit();
break;
case Encoding::Unicode:
data = QTextCodec::codecForName("UTF-16")->makeEncoder(QTextCodec::IgnoreHeader)->fromUnicode(text);
break;
}
return data;
QTextCodec::ConverterState converter(QTextCodec::IgnoreHeader);
return mEncoding->fromUnicode(text.constData(), text.size(), &converter);
}

View File

@ -13,11 +13,6 @@ class HexLineEdit : public QLineEdit
Q_OBJECT
public:
enum class Encoding
{
Ascii,
Unicode
};
explicit HexLineEdit(QWidget* parent = 0);
~HexLineEdit();
@ -27,8 +22,8 @@ public:
void setData(const QByteArray & data);
QByteArray data();
void setEncoding(const Encoding encoding);
Encoding encoding();
void setEncoding(QTextCodec* encoding);
QTextCodec* encoding();
void setKeepSize(const bool enabled);
bool keepSize();
@ -46,7 +41,7 @@ private:
Ui::HexLineEdit* ui;
QByteArray mData;
Encoding mEncoding;
QTextCodec* mEncoding;
bool mKeepSize;
bool mOverwriteMode;