File indexing completed on 2024-05-12 03:47:47

0001 /*
0002     File                 : Matrix.h
0003     Project              : Matrix
0004     Description          : Spreadsheet with a MxN matrix data model
0005     --------------------------------------------------------------------
0006     SPDX-FileCopyrightText: 2008-2009 Tilman Benkert <thzs@gmx.net>
0007     SPDX-FileCopyrightText: 2015-2017 Alexander Semke <alexander.semke@web.de>
0008     SPDX-FileCopyrightText: 2017 Stefan Gerlach <stefan.gerlach@uni.kn>
0009     SPDX-License-Identifier: GPL-2.0-or-later
0010 */
0011 
0012 #ifndef MATRIX_H
0013 #define MATRIX_H
0014 
0015 #include "backend/datasources/AbstractDataSource.h"
0016 #include "backend/datasources/filters/AbstractFileFilter.h"
0017 #include "backend/lib/macros.h"
0018 
0019 class MatrixPrivate;
0020 class MatrixModel;
0021 class MatrixView;
0022 
0023 class Matrix : public AbstractDataSource {
0024     Q_OBJECT
0025     Q_ENUMS(HeaderFormat)
0026 
0027 public:
0028     enum class HeaderFormat { HeaderRowsColumns, HeaderValues, HeaderRowsColumnsValues };
0029 
0030     explicit Matrix(const QString& name, bool loading = false, const AbstractColumn::ColumnMode = AbstractColumn::ColumnMode::Double);
0031     Matrix(int rows, int cols, const QString& name, const AbstractColumn::ColumnMode = AbstractColumn::ColumnMode::Double);
0032     ~Matrix() override;
0033 
0034     QIcon icon() const override;
0035     QMenu* createContextMenu() override;
0036     QWidget* view() const override;
0037 
0038     bool exportView() const override;
0039     bool printView() override;
0040     bool printPreview() const override;
0041 
0042     void* data() const;
0043     void setData(void*);
0044 
0045     QVector<AspectType> dropableOn() const override;
0046 
0047     BASIC_D_ACCESSOR_DECL(AbstractColumn::ColumnMode, mode, Mode)
0048     BASIC_D_ACCESSOR_DECL(int, rowCount, RowCount)
0049     BASIC_D_ACCESSOR_DECL(int, columnCount, ColumnCount)
0050     BASIC_D_ACCESSOR_DECL(char, numericFormat, NumericFormat)
0051     BASIC_D_ACCESSOR_DECL(int, precision, Precision)
0052     BASIC_D_ACCESSOR_DECL(HeaderFormat, headerFormat, HeaderFormat)
0053     BASIC_D_ACCESSOR_DECL(double, xStart, XStart)
0054     BASIC_D_ACCESSOR_DECL(double, xEnd, XEnd)
0055     BASIC_D_ACCESSOR_DECL(double, yStart, YStart)
0056     BASIC_D_ACCESSOR_DECL(double, yEnd, YEnd)
0057     CLASS_D_ACCESSOR_DECL(QString, formula, Formula)
0058 
0059     void setSuppressDataChangedSignal(bool);
0060     void setChanged();
0061 
0062     int rowHeight(int row) const;
0063     void setRowHeight(int row, int height);
0064     int columnWidth(int col) const;
0065     void setColumnWidth(int col, int width);
0066 
0067     void setDimensions(int rows, int cols);
0068     void setCoordinates(double x1, double x2, double y1, double y2);
0069 
0070     void insertColumns(int before, int count);
0071     void appendColumns(int count);
0072     void removeColumns(int first, int count);
0073     void clearColumn(int);
0074 
0075     void insertRows(int before, int count);
0076     void appendRows(int count);
0077     void removeRows(int first, int count);
0078     void clearRow(int);
0079 
0080     template<typename T>
0081     T cell(int row, int col) const;
0082     template<typename T>
0083     QString text(int row, int col);
0084     template<typename T>
0085     void setCell(int row, int col, T value);
0086     void clearCell(int row, int col);
0087 
0088     template<typename T>
0089     QVector<T> columnCells(int col, int first_row, int last_row);
0090     template<typename T>
0091     void setColumnCells(int col, int first_row, int last_row, const QVector<T>& values);
0092     template<typename T>
0093     QVector<T> rowCells(int row, int first_column, int last_column);
0094     template<typename T>
0095     void setRowCells(int row, int first_column, int last_column, const QVector<T>& values);
0096 
0097     void copy(Matrix* other);
0098 
0099     void save(QXmlStreamWriter*) const override;
0100     bool load(XmlStreamReader*, bool preview) override;
0101 
0102     int prepareImport(std::vector<void*>& dataContainer,
0103                       AbstractFileFilter::ImportMode,
0104                       int rows,
0105                       int cols,
0106                       QStringList colNameList,
0107                       QVector<AbstractColumn::ColumnMode>,
0108                       bool initializeDataContainer) override;
0109     void finalizeImport(size_t columnOffset, size_t startColumn, size_t endColumn, const QString& dateTimeFormat, AbstractFileFilter::ImportMode) override;
0110 
0111     typedef MatrixPrivate Private;
0112 
0113 public Q_SLOTS:
0114     void clear();
0115     void transpose();
0116     void mirrorVertically();
0117     void mirrorHorizontally();
0118 
0119     void addColumns();
0120     void addRows();
0121     void duplicate();
0122 
0123 Q_SIGNALS:
0124     void requestProjectContextMenu(QMenu*);
0125     void columnsAboutToBeInserted(int before, int count);
0126     void columnsInserted(int first, int count);
0127     void columnsAboutToBeRemoved(int first, int count);
0128     void columnsRemoved(int first, int count);
0129     void rowsAboutToBeInserted(int before, int count);
0130     void rowsInserted(int first, int count);
0131     void rowsAboutToBeRemoved(int first, int count);
0132     void rowsRemoved(int first, int count);
0133     void dataChanged(int top, int left, int bottom, int right);
0134     void coordinatesChanged();
0135 
0136     void rowCountChanged(int);
0137     void columnCountChanged(int);
0138 
0139     void xStartChanged(double);
0140     void xEndChanged(double);
0141     void yStartChanged(double);
0142     void yEndChanged(double);
0143 
0144     void numericFormatChanged(char);
0145     void precisionChanged(int);
0146     void headerFormatChanged(Matrix::HeaderFormat);
0147 
0148 private:
0149     void init();
0150 
0151     Q_DECLARE_PRIVATE(Matrix)
0152     MatrixPrivate* const d_ptr;
0153 
0154     mutable MatrixModel* m_model{nullptr};
0155     mutable MatrixView* m_view{nullptr};
0156 
0157     friend class MatrixPrivate;
0158 };
0159 
0160 #endif