1 /* -*- Mode: C++; c-default-style: "k&r"; indent-tabs-mode: nil; tab-width: 2; c-basic-offset: 2 -*- */ 2 3 /* libmwaw 4 * Version: MPL 2.0 / LGPLv2+ 5 * 6 * The contents of this file are subject to the Mozilla Public License Version 7 * 2.0 (the "License"); you may not use this file except in compliance with 8 * the License or as specified alternatively below. You may obtain a copy of 9 * the License at http://www.mozilla.org/MPL/ 10 * 11 * Software distributed under the License is distributed on an "AS IS" basis, 12 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 13 * for the specific language governing rights and limitations under the 14 * License. 15 * 16 * Major Contributor(s): 17 * Copyright (C) 2002 William Lachance (wrlach@gmail.com) 18 * Copyright (C) 2002,2004 Marc Maurer (uwog@uwog.net) 19 * Copyright (C) 2004-2006 Fridrich Strba (fridrich.strba@bluewin.ch) 20 * Copyright (C) 2006, 2007 Andrew Ziem 21 * Copyright (C) 2011, 2012 Alonso Laurent (alonso@loria.fr) 22 * 23 * 24 * All Rights Reserved. 25 * 26 * For minor contributions see the git repository. 27 * 28 * Alternatively, the contents of this file may be used under the terms of 29 * the GNU Lesser General Public License Version 2 or later (the "LGPLv2+"), 30 * in which case the provisions of the LGPLv2+ are applicable 31 * instead of those above. 32 */ 33 34 #ifndef MWAW_SECTION_H 35 #define MWAW_SECTION_H 36 37 #include <iostream> 38 #include <vector> 39 40 #include <librevenge/librevenge.h> 41 42 #include "libmwaw_internal.hxx" 43 44 /** a class which stores section properties */ 45 class MWAWSection 46 { 47 public: 48 struct Column; 49 //! constructor MWAWSection()50 MWAWSection() 51 : m_columns() 52 , m_width(0) 53 , m_columnSeparator() 54 , m_balanceText(false) 55 , m_backgroundColor(MWAWColor::white()) 56 { 57 m_columnSeparator.m_style=MWAWBorder::None; 58 } 59 MWAWSection(MWAWSection const &)=default; 60 MWAWSection &operator=(MWAWSection const &)=default; 61 MWAWSection &operator=(MWAWSection &&)=default; 62 //! destructor 63 virtual ~MWAWSection(); 64 65 /** a function which sets n uniform columns 66 67 \note: this erases previous columns and border if there are some 68 */ 69 void setColumns(int num, double width, librevenge::RVNGUnit widthUnit, double colSep=0); 70 //! returns the number of columns numColumns() const71 int numColumns() const 72 { 73 return m_columns.empty() ? 1 : int(m_columns.size()); 74 } 75 //! returns the true if the section has only one columns hasSingleColumns() const76 bool hasSingleColumns() const 77 { 78 return m_columns.size() <= 1; 79 } 80 //! add to the propList 81 void addTo(librevenge::RVNGPropertyList &propList) const; 82 //! add tabs to the propList 83 void addColumnsTo(librevenge::RVNGPropertyListVector &propList) const; 84 //! operator << 85 friend std::ostream &operator<<(std::ostream &o, MWAWSection const &sec); 86 //! operator!= operator !=(MWAWSection const & sec) const87 bool operator!=(MWAWSection const &sec) const 88 { 89 if (m_columns.size()!=sec.m_columns.size()) 90 return true; 91 for (size_t c=0; c < m_columns.size(); c++) { 92 if (m_columns[c] != sec.m_columns[c]) 93 return true; 94 } 95 if (m_columnSeparator != sec.m_columnSeparator) 96 return true; 97 if (m_balanceText!=sec.m_balanceText || m_backgroundColor!=sec.m_backgroundColor) 98 return true; 99 return false; 100 } 101 //! operator== operator ==(MWAWSection const & sec) const102 bool operator==(MWAWSection const &sec) const 103 { 104 return !operator!=(sec); 105 } 106 107 //! the different column 108 std::vector<Column> m_columns; 109 //! the total section width ( if set ) 110 double m_width; 111 /** the vertical separator between columns */ 112 MWAWBorder m_columnSeparator; 113 //! true if the text is balanced between different columns 114 bool m_balanceText; 115 //! the background color 116 MWAWColor m_backgroundColor; 117 118 public: 119 /** struct to store the columns properties */ 120 struct Column { 121 //! constructor ColumnMWAWSection::Column122 Column() 123 : m_width(0) 124 , m_widthUnit(librevenge::RVNG_INCH) 125 { 126 for (auto &margin : m_margins) margin=0; 127 } 128 //! add a column to the propList 129 bool addTo(librevenge::RVNGPropertyList &propList) const; 130 //! operator << 131 friend std::ostream &operator<<(std::ostream &o, Column const &column); 132 //! operator!= operator !=MWAWSection::Column133 bool operator!=(Column const &col) const 134 { 135 if (m_width<col.m_width || m_width>col.m_width || m_widthUnit!=col.m_widthUnit) 136 return true; 137 for (int i = 0; i < 4; i++) { 138 if (m_margins[i]<col.m_margins[i] || m_margins[i]>col.m_margins[i]) 139 return true; 140 } 141 return false; 142 } 143 //! operator== operator ==MWAWSection::Column144 bool operator==(Column const &col) const 145 { 146 return !operator!=(col); 147 } 148 149 //! the columns width 150 double m_width; 151 /** the width unit (default inches) */ 152 librevenge::RVNGUnit m_widthUnit; 153 //! the margins in inches using libmwaw::Position orders 154 double m_margins[4]; 155 }; 156 }; 157 #endif 158 // vim: set filetype=cpp tabstop=2 shiftwidth=2 cindent autoindent smartindent noexpandtab: 159