1 /*
2     This file is part of the Okteta Kasten module, made within the KDE community.
3 
4     SPDX-FileCopyrightText: 2003, 2008 Friedrich W. H. Kossebau <kossebau@kde.org>
5 
6     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
7 */
8 
9 #include "valuebytearraycolumntextrenderer.hpp"
10 
11 // Okteta core
12 #include <Okteta/ValueCodec>
13 #include <Okteta/AbstractByteArrayModel>
14 // Qt
15 #include <QTextStream>
16 
17 namespace Kasten {
18 
ValueByteArrayColumnTextRenderer(const Okteta::AbstractByteArrayModel * byteArrayModel,Okteta::Address offset,const Okteta::CoordRange & coordRange,int noOfBytesPerLine,int byteSpacingWidth,int noOfGroupedBytes,Okteta::ValueCoding valueCoding)19 ValueByteArrayColumnTextRenderer::ValueByteArrayColumnTextRenderer(
20     const Okteta::AbstractByteArrayModel* byteArrayModel, Okteta::Address offset,
21     const Okteta::CoordRange& coordRange,
22     int noOfBytesPerLine, int byteSpacingWidth, int noOfGroupedBytes,
23     Okteta::ValueCoding valueCoding)
24     : AbstractByteArrayColumnTextRenderer(byteArrayModel, offset, coordRange,
25         noOfBytesPerLine)
26     , mValueCodec(Okteta::ValueCodec::createCodec(valueCoding))
27 {
28     setWidths(mValueCodec->encodingWidth(), byteSpacingWidth, noOfGroupedBytes);
29 }
30 
~ValueByteArrayColumnTextRenderer()31 ValueByteArrayColumnTextRenderer::~ValueByteArrayColumnTextRenderer()
32 {
33     delete mValueCodec;
34 }
35 
renderLine(QTextStream * stream,bool isSubline) const36 void ValueByteArrayColumnTextRenderer::renderLine(QTextStream* stream, bool isSubline) const
37 {
38     Q_UNUSED(isSubline)
39 
40     int p = 0;
41     int pEnd = mNoOfBytesPerLine;
42     // correct boundaries
43     if (mRenderLine == mCoordRange.start().line()) {
44         p = mCoordRange.start().pos();
45     }
46     if (mRenderLine == mCoordRange.end().line()) {
47         pEnd = mCoordRange.end().pos() + 1;
48     }
49 
50     QString E;
51     E.resize(mValueCodec->encodingWidth());
52     // draw individual chars
53     uint e = 0;
54     for (; p < pEnd; ++p, ++mOffset) {
55         // get next position
56         const uint t = mLinePositions[p];
57         // clear spacing
58         *stream << whiteSpace(t - e);
59         mValueCodec->encode(&E, 0, mByteArrayModel->byte(mOffset));
60         *stream << E;
61         e = t + mValueCodec->encodingWidth();
62     }
63 
64     *stream << whiteSpace(mNoOfCharsPerLine - e);
65     ++mRenderLine;
66 }
67 
68 }
69