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"