1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 #ifndef SC_CONVUNO_HXX 25 #define SC_CONVUNO_HXX 26 27 #include <algorithm> 28 #include <i18npool/lang.h> 29 #include <com/sun/star/table/CellAddress.hpp> 30 #include <com/sun/star/table/CellRangeAddress.hpp> 31 #include <com/sun/star/lang/Locale.hpp> 32 #include "global.hxx" 33 #include "address.hxx" 34 35 36 class ScUnoConversion 37 { 38 public: 39 static LanguageType GetLanguage( const com::sun::star::lang::Locale& rLocale ); 40 static void FillLocale( com::sun::star::lang::Locale& rLocale, LanguageType eLang ); 41 42 // CellAddress -> ScAddress 43 static inline void FillScAddress( 44 ScAddress& rScAddress, 45 const ::com::sun::star::table::CellAddress& rApiAddress ); 46 // ScAddress -> CellAddress 47 static inline void FillApiAddress( 48 ::com::sun::star::table::CellAddress& rApiAddress, 49 const ScAddress& rScAddress ); 50 // CellRangeAddress -> ScRange 51 static inline void FillScRange( 52 ScRange& rScRange, 53 const ::com::sun::star::table::CellRangeAddress& rApiRange ); 54 // ScRange -> CellRangeAddress 55 static inline void FillApiRange( 56 ::com::sun::star::table::CellRangeAddress& rApiRange, 57 const ScRange& rScRange ); 58 // CellAddress -> CellRangeAddress 59 static inline void FillApiRange( 60 ::com::sun::star::table::CellRangeAddress& rApiRange, 61 const ::com::sun::star::table::CellAddress& rApiAddress ); 62 // CellRangeAddress-Start -> CellAddress 63 static inline void FillApiStartAddress( 64 ::com::sun::star::table::CellAddress& rApiAddress, 65 const ::com::sun::star::table::CellRangeAddress& rApiRange ); 66 // CellRangeAddress-End -> CellAddress 67 static inline void FillApiEndAddress( 68 ::com::sun::star::table::CellAddress& rApiAddress, 69 const ::com::sun::star::table::CellRangeAddress& rApiRange ); 70 71 /** Returns true, if the passed ranges have at least one common cell. */ 72 static inline bool Intersects( 73 const ::com::sun::star::table::CellRangeAddress& rApiARange1, 74 const ::com::sun::star::table::CellRangeAddress& rApiARange2 ); 75 /** Returns true, if the passed address rApiInner is inside the passed range rApiOuter. */ 76 static inline bool Contains( 77 const ::com::sun::star::table::CellRangeAddress& rApiOuter, 78 const ::com::sun::star::table::CellAddress& rApiInner ); 79 /** Returns true, if the passed range rApiInner is completely inside the passed range rApiOuter. */ 80 static inline bool Contains( 81 const ::com::sun::star::table::CellRangeAddress& rApiOuter, 82 const ::com::sun::star::table::CellRangeAddress& rApiInner ); 83 }; 84 85 86 inline void ScUnoConversion::FillScAddress( 87 ScAddress& rScAddress, 88 const ::com::sun::star::table::CellAddress& rApiAddress ) 89 { 90 rScAddress.Set( (SCCOL)rApiAddress.Column, (SCROW)rApiAddress.Row, (SCTAB)rApiAddress.Sheet ); 91 } 92 93 inline void ScUnoConversion::FillApiAddress( 94 ::com::sun::star::table::CellAddress& rApiAddress, 95 const ScAddress& rScAddress ) 96 { 97 rApiAddress.Column = rScAddress.Col(); 98 rApiAddress.Row = rScAddress.Row(); 99 rApiAddress.Sheet = rScAddress.Tab(); 100 } 101 102 inline void ScUnoConversion::FillScRange( 103 ScRange& rScRange, 104 const ::com::sun::star::table::CellRangeAddress& rApiRange ) 105 { 106 rScRange.aStart.Set( (SCCOL)rApiRange.StartColumn, (SCROW)rApiRange.StartRow, (SCTAB)rApiRange.Sheet ); 107 rScRange.aEnd.Set( (SCCOL)rApiRange.EndColumn, (SCROW)rApiRange.EndRow, (SCTAB)rApiRange.Sheet ); 108 } 109 110 inline void ScUnoConversion::FillApiRange( 111 ::com::sun::star::table::CellRangeAddress& rApiRange, 112 const ScRange& rScRange ) 113 { 114 rApiRange.StartColumn = rScRange.aStart.Col(); 115 rApiRange.StartRow = rScRange.aStart.Row(); 116 rApiRange.Sheet = rScRange.aStart.Tab(); 117 rApiRange.EndColumn = rScRange.aEnd.Col(); 118 rApiRange.EndRow = rScRange.aEnd.Row(); 119 } 120 121 inline void ScUnoConversion::FillApiRange( 122 ::com::sun::star::table::CellRangeAddress& rApiRange, 123 const ::com::sun::star::table::CellAddress& rApiAddress ) 124 { 125 rApiRange.StartColumn = rApiRange.EndColumn = rApiAddress.Column; 126 rApiRange.StartRow = rApiRange.EndRow = rApiAddress.Row; 127 rApiRange.Sheet = rApiAddress.Sheet; 128 } 129 130 inline void ScUnoConversion::FillApiStartAddress( 131 ::com::sun::star::table::CellAddress& rApiAddress, 132 const ::com::sun::star::table::CellRangeAddress& rApiRange ) 133 { 134 rApiAddress.Column = rApiRange.StartColumn; 135 rApiAddress.Row = rApiRange.StartRow; 136 rApiAddress.Sheet = rApiRange.Sheet; 137 } 138 139 inline void ScUnoConversion::FillApiEndAddress( 140 ::com::sun::star::table::CellAddress& rApiAddress, 141 const ::com::sun::star::table::CellRangeAddress& rApiRange ) 142 { 143 rApiAddress.Column = rApiRange.EndColumn; 144 rApiAddress.Row = rApiRange.EndRow; 145 rApiAddress.Sheet = rApiRange.Sheet; 146 } 147 148 inline bool ScUnoConversion::Intersects( 149 const ::com::sun::star::table::CellRangeAddress& rApiRange1, 150 const ::com::sun::star::table::CellRangeAddress& rApiRange2 ) 151 { 152 return (rApiRange1.Sheet == rApiRange2.Sheet) && 153 (::std::max( rApiRange1.StartColumn, rApiRange2.StartColumn ) <= ::std::min( rApiRange1.EndColumn, rApiRange2.EndColumn )) && 154 (::std::max( rApiRange1.StartRow, rApiRange2.StartRow ) <= ::std::min( rApiRange1.EndRow, rApiRange2.EndRow )); 155 } 156 157 inline bool ScUnoConversion::Contains( 158 const ::com::sun::star::table::CellRangeAddress& rApiOuter, 159 const ::com::sun::star::table::CellAddress& rApiInner ) 160 { 161 return (rApiOuter.Sheet == rApiInner.Sheet) && 162 (rApiOuter.StartColumn <= rApiInner.Column) && (rApiInner.Column <= rApiOuter.EndColumn) && 163 (rApiOuter.StartRow <= rApiInner.Row) && (rApiInner.Row <= rApiOuter.EndRow); 164 } 165 166 inline bool ScUnoConversion::Contains( 167 const ::com::sun::star::table::CellRangeAddress& rApiOuter, 168 const ::com::sun::star::table::CellRangeAddress& rApiInner ) 169 { 170 return (rApiOuter.Sheet == rApiInner.Sheet) && 171 (rApiOuter.StartColumn <= rApiInner.StartColumn) && (rApiInner.EndColumn <= rApiOuter.EndColumn) && 172 (rApiOuter.StartRow <= rApiInner.StartRow) && (rApiInner.EndRow <= rApiOuter.EndRow); 173 } 174 175 //___________________________________________________________________ 176 177 inline sal_Bool operator==( 178 const ::com::sun::star::table::CellAddress& rApiAddress1, 179 const ::com::sun::star::table::CellAddress& rApiAddress2 ) 180 { 181 return 182 (rApiAddress1.Column == rApiAddress2.Column) && 183 (rApiAddress1.Row == rApiAddress2.Row) && 184 (rApiAddress1.Sheet == rApiAddress2.Sheet); 185 } 186 187 inline sal_Bool operator!=( 188 const ::com::sun::star::table::CellAddress& rApiAddress1, 189 const ::com::sun::star::table::CellAddress& rApiAddress2 ) 190 { 191 return !(rApiAddress1 == rApiAddress2); 192 } 193 194 inline sal_Bool operator==( 195 const ::com::sun::star::table::CellRangeAddress& rApiRange1, 196 const ::com::sun::star::table::CellRangeAddress& rApiRange2 ) 197 { 198 return 199 (rApiRange1.StartColumn == rApiRange2.StartColumn) && 200 (rApiRange1.StartRow == rApiRange2.StartRow) && 201 (rApiRange1.EndColumn == rApiRange2.EndColumn) && 202 (rApiRange1.EndRow == rApiRange2.EndRow) && 203 (rApiRange1.Sheet == rApiRange2.Sheet); 204 } 205 206 inline sal_Bool operator!=( 207 const ::com::sun::star::table::CellRangeAddress& rApiRange1, 208 const ::com::sun::star::table::CellRangeAddress& rApiRange2 ) 209 { 210 return !(rApiRange1 == rApiRange2); 211 } 212 213 #endif 214 215