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