File indexing completed on 2024-12-08 12:56:11

0001 /*
0002  *  Copyright (c) 2010 Carlos Licea <carlos@kdab.com>
0003  *
0004  *  This library is free software; you can redistribute it and/or modify
0005  *  it under the terms of the GNU Lesser General Public License as published
0006  *  by the Free Software Foundation; either version 2.1 of the License, or
0007  *  (at your option) any later version.
0008  *
0009  *  This library is distributed in the hope that it will be useful,
0010  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
0011  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0012  *  GNU Lesser General Public License for more details.
0013  *
0014  *  You should have received a copy of the GNU Lesser General Public License
0015  *  along with this program; if not, write to the Free Software
0016  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
0017  */
0018 
0019 #include "KoTable.h"
0020 #include "KoColumn.h"
0021 #include "KoRow.h"
0022 #include "KoCell.h"
0023 
0024 #include <KoXmlWriter.h>
0025 
0026 KOSTYLE_DECLARE_SHARED_POINTER_IMPL(KoTable)
0027 
0028 KoTable::KoTable()
0029 : m_columns()
0030 , m_rows()
0031 , m_cells()
0032 , m_rowCount()
0033 , m_columnCount()
0034 , m_style(0)
0035 , m_printable(true)
0036 , m_name()
0037 , m_protected(false)
0038 , m_protectionKey()
0039 {
0040 }
0041 
0042 KoTable::~KoTable()
0043 {
0044 }
0045 
0046 KoCell* KoTable::cellAt(int row, int column)
0047 {
0048     const QPair<int,int> key(row,column);
0049     KoCell* cell = m_cells.value(key);
0050 
0051     if(!cell) {
0052         cell = new KoCell();
0053         m_cells.insert(key, cell);
0054         m_columnCount = qMax(column+1, m_columnCount);
0055         m_rowCount = qMax(row+1, m_rowCount);
0056     }
0057 
0058     return cell;
0059 }
0060 
0061 KoColumn* KoTable::columnAt(int column)
0062 {
0063     KoColumn* columnAt = m_columns.value(column);
0064 
0065     if(!columnAt) {
0066         columnAt = new KoColumn();
0067         if(column >= m_columns.size()) {
0068             m_columns.resize(column+1);
0069         }
0070         m_columns.insert(column, columnAt);
0071         m_columnCount = qMax(column+1, m_columnCount);
0072     }
0073 
0074     return columnAt;
0075 }
0076 
0077 KoRow* KoTable::rowAt(int row)
0078 {
0079     KoRow* rowAt = m_rows.value(row);
0080 
0081     if(!rowAt) {
0082         rowAt = new KoRow();
0083         if(row >= m_rows.size()) {
0084             m_rows.resize(row+1);
0085         }
0086         m_rows.replace(row, rowAt);
0087         m_rowCount = qMax(row+1, m_rowCount);
0088     }
0089 
0090     return rowAt;
0091 }
0092 
0093 int KoTable::columnCount() const
0094 {
0095     return m_columnCount;
0096 }
0097 
0098 int KoTable::rowCount() const
0099 {
0100     return m_rowCount;
0101 }
0102 
0103 void KoTable::saveOdf(KoXmlWriter& writer, KoGenStyles& styles)
0104 {
0105     writer.startElement("table:table");
0106 
0107     writer.addAttribute("table:name", m_name);
0108     writer.addAttribute("table:protected", m_protected ? "true" : "false" );
0109     if(!m_protectionKey.isEmpty()) {
0110         writer.addAttribute("table:protection-key", m_protectionKey);
0111     }
0112     if(!m_protectionAlgorithm.isEmpty()) {
0113         writer.addAttribute("table:protection-key-digest-algorithm", m_protectionAlgorithm);
0114     }
0115 
0116     if(m_style) {
0117         m_style->setName(m_style->saveOdf(styles));
0118         writer.addAttribute("table:style-name", m_style->name());
0119     }
0120 
0121     {
0122         KoColumn defaultColumn;
0123         for(int c = 0; c < columnCount(); ++c) {
0124             KoColumn* column = m_columns.value(c);
0125             if(column) {
0126                 column->saveOdf(writer, styles);
0127             }
0128             else {
0129                 defaultColumn.saveOdf(writer, styles);
0130             }
0131         }
0132     }
0133 
0134     {
0135         KoRow defaultRow;
0136         for(int r = 0; r < rowCount(); ++r) {
0137             KoRow* row = m_rows.value(r);
0138             if(row) {
0139                 row->saveOdf(writer, styles);
0140 
0141                 KoCell defaultCell;
0142                 for(int c = 0; c < columnCount(); ++c) {
0143                     KoCell* cell = m_cells.value(QPair<int,int>(r,c));
0144                     if(cell) {
0145                         cell->saveOdf(writer, styles);
0146                     }
0147                     else {
0148                         defaultCell.saveOdf(writer, styles);
0149                     }
0150                 }
0151 
0152                 row->finishSaveOdf(writer, styles);
0153             }
0154             else {
0155                 defaultRow.saveOdf(writer, styles);
0156 
0157                 KoCell defaultCell;
0158                 for(int c = 0; c < columnCount(); ++c) {
0159                     KoCell* cell = m_cells.value(QPair<int,int>(r,c));
0160                     if(cell) {
0161                         cell->saveOdf(writer, styles);
0162                     }
0163                     else {
0164                         defaultCell.saveOdf(writer, styles);
0165                     }
0166                 }
0167 
0168                 defaultRow.finishSaveOdf(writer, styles);
0169             }
0170         }
0171     }
0172 
0173     writer.endElement();// table:table
0174 }
0175 
0176 void KoTable::setName(const QString& name)
0177 {
0178     m_name = name;
0179 }
0180 
0181 QString KoTable::name() const
0182 {
0183     return m_name;
0184 }
0185 
0186 void KoTable::setPrintable(bool printable)
0187 {
0188     m_printable = printable;
0189 }
0190 
0191 bool KoTable::printable() const
0192 {
0193     return m_printable;
0194 }
0195 
0196 void KoTable::setTableStyle(KoTblStyle::Ptr style)
0197 {
0198     m_style = style;
0199 }
0200 
0201 KoTblStyle::Ptr KoTable::tableStyle()
0202 {
0203     return m_style;
0204 }
0205 
0206 void KoTable::setProtected(bool isProtected)
0207 {
0208     m_protected = isProtected;
0209 }
0210 
0211 void KoTable::setProtectionKey(const QString &password, const QString &protectionAlgorithmUri)
0212 {
0213     m_protectionKey = password;
0214     m_protectionAlgorithm = protectionAlgorithmUri;
0215 }
0216 
0217 QString KoTable::protectionKey() const
0218 {
0219     return m_protectionKey;
0220 }
0221 
0222 QString KoTable::protectionalgorithm() const
0223 {
0224     return m_protectionAlgorithm;
0225 }
0226 
0227 bool KoTable::isPprotected() const
0228 {
0229     return m_protected;
0230 }
0231