File indexing completed on 2024-05-26 05:56:26
0001 /* 0002 This file is part of the Okteta Kasten module, made within the KDE community. 0003 0004 SPDX-FileCopyrightText: 2007-2008 Friedrich W. H. Kossebau <kossebau@kde.org> 0005 0006 SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 0007 */ 0008 0009 #include "bytetabletool.hpp" 0010 0011 // controller 0012 #include "bytetablemodel.hpp" 0013 // Okteta Kasten gui 0014 #include <Kasten/Okteta/ByteArrayView> 0015 // Okteta Kasten core 0016 #include <Kasten/Okteta/ByteArrayDocument> 0017 // Okteta core 0018 #include <Okteta/Character> 0019 #include <Okteta/CharCodec> 0020 #include <Okteta/AbstractByteArrayModel> 0021 #include <Okteta/ChangesDescribable> 0022 // KF 0023 #include <KLocalizedString> 0024 0025 namespace Kasten { 0026 0027 ByteTableTool::ByteTableTool() 0028 : mByteTableModel(new ByteTableModel(this)) 0029 { 0030 setObjectName(QStringLiteral("ByteTable")); 0031 } 0032 0033 ByteTableTool::~ByteTableTool() = default; 0034 0035 QString ByteTableTool::title() const { return i18nc("@title:window", "Value/Char Table"); } 0036 ByteTableModel* ByteTableTool::byteTableModel() const { return mByteTableModel; } 0037 bool ByteTableTool::hasWriteable() const 0038 { 0039 return (mByteArrayView && mByteArrayModel) ? !mByteArrayView->isReadOnly() : false; 0040 } 0041 0042 void ByteTableTool::setTargetModel(AbstractModel* model) 0043 { 0044 if (mByteArrayView) { 0045 mByteArrayView->disconnect(mByteTableModel); 0046 mByteArrayView->disconnect(this); 0047 } 0048 0049 mByteArrayView = model ? qobject_cast<ByteArrayView*>(model) : nullptr; 0050 0051 ByteArrayDocument* document = 0052 mByteArrayView ? qobject_cast<ByteArrayDocument*>(mByteArrayView->baseModel()) : nullptr; 0053 mByteArrayModel = document ? document->content() : nullptr; 0054 0055 const bool hasView = (mByteArrayView && mByteArrayModel); 0056 if (hasView) { 0057 mByteTableModel->setCharCodec(mByteArrayView->charCodingName()); 0058 mByteTableModel->setSubstituteChar(mByteArrayView->substituteChar()); 0059 mByteTableModel->setUndefinedChar(mByteArrayView->undefinedChar()); 0060 connect(mByteArrayView, &ByteArrayView::charCodecChanged, 0061 mByteTableModel, &ByteTableModel::setCharCodec); 0062 connect(mByteArrayView, &ByteArrayView::substituteCharChanged, 0063 mByteTableModel, &ByteTableModel::setSubstituteChar); 0064 connect(mByteArrayView, &ByteArrayView::undefinedCharChanged, 0065 mByteTableModel, &ByteTableModel::setUndefinedChar); 0066 0067 connect(mByteArrayView, &ByteArrayView::readOnlyChanged, 0068 this, &ByteTableTool::onReadOnlyChanged); 0069 } else { 0070 // TODO: use default view profile chars and char codec 0071 mByteTableModel->setSubstituteChar(QChar()); 0072 mByteTableModel->setUndefinedChar(QChar()); 0073 } 0074 0075 const bool isWriteable = (hasView && !mByteArrayView->isReadOnly()); 0076 0077 Q_EMIT hasWriteableChanged(isWriteable); 0078 } 0079 0080 void ByteTableTool::insert(unsigned char byte, int count) 0081 { 0082 const QByteArray data(count, byte); 0083 0084 Okteta::ChangesDescribable* changesDescribable = 0085 qobject_cast<Okteta::ChangesDescribable*>(mByteArrayModel); 0086 0087 if (changesDescribable) { 0088 // TODO: how to note the byte? charcoding might change... 0089 const QString changeDescription = 0090 i18np("Inserted 1 Byte", "Inserted %1 Bytes", count); 0091 0092 changesDescribable->openGroupedChange(changeDescription); 0093 } 0094 0095 mByteArrayView->insert(data); 0096 0097 if (changesDescribable) { 0098 changesDescribable->closeGroupedChange(); 0099 } 0100 // void ByteTableController::fill( const QByteArray &Data ) 0101 // { 0102 // if( HexEdit && ByteArray ) 0103 // ByteArray->insert( HexEdit->cursorPosition(), Data ); 0104 // } 0105 mByteArrayView->setFocus(); 0106 } 0107 0108 void ByteTableTool::onReadOnlyChanged(bool isReadOnly) 0109 { 0110 const bool isWriteable = !isReadOnly; 0111 0112 Q_EMIT hasWriteableChanged(isWriteable); 0113 } 0114 0115 } 0116 0117 #include "moc_bytetabletool.cpp"