File indexing completed on 2024-06-23 05:48:53

0001 /*
0002     This file is part of the Okteta Kasten module, made within the KDE community.
0003 
0004     SPDX-FileCopyrightText: 2007-2009 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 #ifndef KASTEN_BYTEARRAYFRAMERENDERER_HPP
0010 #define KASTEN_BYTEARRAYFRAMERENDERER_HPP
0011 
0012 // lib
0013 #include "abstractcolumnframerenderer.hpp"
0014 // Okteta gui
0015 #include <Okteta/OffsetFormat>
0016 // Okteta core
0017 #include <Okteta/OktetaCore>
0018 #include <Okteta/Address>
0019 #include <Okteta/Size>
0020 // Qt
0021 #include <QFont>
0022 
0023 namespace Okteta {
0024 class OffsetColumnRenderer;
0025 class BorderColumnRenderer;
0026 class ValueByteArrayColumnRenderer;
0027 class CharByteArrayColumnRenderer;
0028 class ByteArrayTableLayout;
0029 class ByteArrayTableRanges;
0030 class PrintColumnStylist;
0031 }
0032 namespace Okteta {
0033 class AbstractByteArrayModel;
0034 class ValueCodec;
0035 class CharCodec;
0036 }
0037 
0038 enum LayoutStyle
0039 {
0040     FixedLayoutStyle = 0,
0041     WrapOnlyByteGroupsLayoutStyle = 1,
0042     FullSizeLayoutStyle = 2,
0043     LastUserLayout = 0xFF
0044 };
0045 
0046 class ByteArrayFrameRenderer : public AbstractColumnFrameRenderer
0047 {
0048 public:
0049     enum DataColumnId
0050     {
0051         ValueCodingId = 1,
0052         CharCodingId = 2
0053     };
0054 
0055 public:
0056     ByteArrayFrameRenderer();
0057     ~ByteArrayFrameRenderer() override;
0058 
0059 public: // AbstractColumnFrameRenderer API
0060 //     virtual void drawColumns( QPainter *painter, int cx, int cy, int cw, int ch );
0061 
0062 public: // AbstractFrameRenderer API
0063     // make this flags?
0064 //     virtual bool hasFixedWidth() const;
0065 //     virtual bool hasFixedHeight() const;
0066     int height() const override;
0067     int width() const override;
0068 //     virtual QSize sizeHint( const QSize &maxSize ) const;
0069 
0070     void prepare() override;
0071     void renderFrame(QPainter* painter, int frameIndex) override;
0072 
0073 public: // AbstractSerialFramePrinter
0074     // only vertical for now...
0075     virtual int framesCount() const;
0076 
0077 public:
0078     Okteta::AbstractByteArrayModel* byteArrayModel() const;
0079     Okteta::Address offset() const;
0080     Okteta::Size length() const;
0081 
0082     int noOfBytesPerLine() const;
0083     Okteta::Address firstLineOffset() const;
0084     Okteta::Address startOffset() const;
0085     LayoutStyle layoutStyle() const;
0086     Okteta::ValueCoding valueCoding() const;
0087     Okteta::PixelX byteSpacingWidth() const;
0088     int noOfGroupedBytes() const;
0089     Okteta::PixelX groupSpacingWidth() const;
0090     Okteta::PixelX binaryGapWidth() const;
0091     bool showsNonprinting() const;
0092     QChar substituteChar() const;
0093     QChar undefinedChar() const;
0094     Okteta::CharCoding charCoding() const;
0095     QString charCodingName() const;
0096 
0097     bool offsetColumnVisible() const;
0098     Okteta::OffsetFormat::Format offsetCoding() const;
0099 
0100     int visibleByteArrayCodings() const;
0101 
0102 public:
0103     void setByteArrayModel(Okteta::AbstractByteArrayModel* byteArrayModel, Okteta::Address offset = 0, Okteta::Size length = -1);
0104     void setHeight(int height);
0105     void setWidth(int width);
0106     void setFont(const QFont& font);
0107     void setFirstLineOffset(Okteta::Address firstLineOffset);
0108     void setStartOffset(Okteta::Address startOffset);
0109     void setBufferSpacing(Okteta::PixelX byteSpacing, int noOfGroupedBytes, Okteta::PixelX groupSpacing);
0110     void setValueCoding(Okteta::ValueCoding valueCoding);
0111     void setLayoutStyle(LayoutStyle style);
0112     void setNoOfBytesPerLine(int noOfBytesPerLine);
0113     void setByteSpacingWidth(Okteta::PixelX byteSpacingWidth);
0114     void setNoOfGroupedBytes(int noOfGroupedBytes);
0115     void setGroupSpacingWidth(Okteta::PixelX groupSpacingWidth);
0116     void setBinaryGapWidth(Okteta::PixelX binaryGapWidth);
0117     void setSubstituteChar(QChar substituteChar);
0118     void setUndefinedChar(QChar undefinedChar);
0119     void setShowsNonprinting(bool showsNonprinting);
0120     void setCharCoding(Okteta::CharCoding charCoding);
0121     void setCharCoding(const QString& charCodingName);
0122     void showByteArrayColumns(int newColumns);
0123     void showOffsetColumn(bool visible);
0124     void setOffsetCoding(Okteta::OffsetFormat::Format offsetCoding);
0125 
0126 protected: // AbstractColumnFrameRenderer API
0127 //     virtual void setNoOfLines( int newNoOfLines );
0128 
0129 private:
0130     void adjustToWidth();
0131     void adjustLayoutToSize();
0132     void adjustToLayoutNoOfBytesPerLine();
0133 
0134 private:
0135     int fittingBytesPerLine() const;
0136 
0137 private:
0138     int mHeight;
0139     int mWidth;
0140     QFont mFont;
0141 
0142     Okteta::AbstractByteArrayModel* mByteArrayModel = nullptr;
0143 
0144 private:
0145     /** holds the logical layout */
0146     Okteta::ByteArrayTableLayout* mLayout;
0147     Okteta::ByteArrayTableRanges* mTableRanges;
0148 
0149 private:
0150     Okteta::OffsetColumnRenderer*         mOffsetColumnRenderer;
0151     Okteta::BorderColumnRenderer*         mFirstBorderColumnRenderer;
0152     Okteta::ValueByteArrayColumnRenderer* mValueColumnRenderer;
0153     Okteta::BorderColumnRenderer*         mSecondBorderColumnRenderer;
0154     Okteta::CharByteArrayColumnRenderer*  mCharColumnRenderer;
0155     Okteta::PrintColumnStylist* mStylist;
0156 
0157 private:
0158     /** */
0159     Okteta::ValueCodec* mValueCodec;
0160     /** */
0161     Okteta::ValueCoding mValueCoding;
0162     /** */
0163     Okteta::CharCodec* mCharCodec = nullptr;
0164     /** */
0165     Okteta::CharCoding mCharCoding;
0166 
0167 private: // parameters
0168     LayoutStyle mResizeStyle;
0169 };
0170 
0171 #endif