PageRenderTime 78ms CodeModel.GetById 21ms RepoModel.GetById 1ms app.codeStats 0ms

/libreoffice-3.6.0.2/binfilter/bf_sc/source/filter/xml/sc_XMLStylesExportHelper.cxx

#
C++ | 1188 lines | 1076 code | 73 blank | 39 comment | 208 complexity | 7a61e4c3233c7ad8e4dbe4c2977a5482 MD5 | raw file
Possible License(s): MPL-2.0-no-copyleft-exception, LGPL-2.1, AGPL-1.0, BSD-3-Clause-No-Nuclear-License-2014, GPL-3.0, LGPL-3.0
  1. /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
  2. /*************************************************************************
  3. *
  4. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  5. *
  6. * Copyright 2000, 2010 Oracle and/or its affiliates.
  7. *
  8. * OpenOffice.org - a multi-platform office productivity suite
  9. *
  10. * This file is part of OpenOffice.org.
  11. *
  12. * OpenOffice.org is free software: you can redistribute it and/or modify
  13. * it under the terms of the GNU Lesser General Public License version 3
  14. * only, as published by the Free Software Foundation.
  15. *
  16. * OpenOffice.org is distributed in the hope that it will be useful,
  17. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  19. * GNU Lesser General Public License version 3 for more details
  20. * (a copy is included in the LICENSE file that accompanied this code).
  21. *
  22. * You should have received a copy of the GNU Lesser General Public License
  23. * version 3 along with OpenOffice.org. If not, see
  24. * <http://www.openoffice.org/license.html>
  25. * for a copy of the LGPLv3 License.
  26. *
  27. ************************************************************************/
  28. #ifdef _MSC_VER
  29. #pragma hdrstop
  30. #endif
  31. // INCLUDE ---------------------------------------------------------------
  32. #include "XMLStylesExportHelper.hxx"
  33. #include "unonames.hxx"
  34. #include "XMLConverter.hxx"
  35. #include "xmlexprt.hxx"
  36. #include "document.hxx"
  37. #include <bf_xmloff/xmlnmspe.hxx>
  38. #include <bf_xmloff/XMLEventExport.hxx>
  39. #include <tools/debug.hxx>
  40. #include <com/sun/star/uno/Reference.h>
  41. #include <com/sun/star/sheet/XSheetCondition.hpp>
  42. #include <algorithm>
  43. namespace binfilter {
  44. using namespace ::com::sun::star;
  45. using namespace xmloff::token;
  46. ScMyValidation::ScMyValidation()
  47. : sName(),
  48. sErrorMessage(),
  49. sErrorTitle(),
  50. sImputMessage(),
  51. sImputTitle(),
  52. sFormula1(),
  53. sFormula2(),
  54. bShowErrorMessage(sal_False),
  55. bShowImputMessage(sal_False),
  56. bIgnoreBlanks(sal_False)
  57. {
  58. }
  59. ScMyValidation::~ScMyValidation()
  60. {
  61. }
  62. sal_Bool ScMyValidation::IsEqual(const ScMyValidation& aVal) const
  63. {
  64. if (aVal.bIgnoreBlanks == bIgnoreBlanks &&
  65. aVal.bShowImputMessage == bShowImputMessage &&
  66. aVal.bShowErrorMessage == bShowErrorMessage &&
  67. aVal.aBaseCell.Sheet == aBaseCell.Sheet &&
  68. aVal.aBaseCell.Column == aBaseCell.Column &&
  69. aVal.aBaseCell.Row == aBaseCell.Row &&
  70. aVal.aAlertStyle == aAlertStyle &&
  71. aVal.aValidationType == aValidationType &&
  72. aVal.aOperator == aOperator &&
  73. aVal.sErrorTitle == sErrorTitle &&
  74. aVal.sImputTitle == sImputTitle &&
  75. aVal.sErrorMessage == sErrorMessage &&
  76. aVal.sImputMessage == sImputMessage &&
  77. aVal.sFormula1 == sFormula1 &&
  78. aVal.sFormula2 == sFormula2)
  79. return sal_True;
  80. else
  81. return sal_False;
  82. }
  83. ScMyValidationsContainer::ScMyValidationsContainer()
  84. : aValidationVec(),
  85. sEmptyString(),
  86. sERRALSTY(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_ERRALSTY)),
  87. sIGNOREBL(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_IGNOREBL)),
  88. sTYPE(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_TYPE)),
  89. sSHOWINP(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_SHOWINP)),
  90. sSHOWERR(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_SHOWERR)),
  91. sINPTITLE(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_INPTITLE)),
  92. sINPMESS(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_INPMESS)),
  93. sERRTITLE(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_ERRTITLE)),
  94. sERRMESS(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_ERRMESS)),
  95. sOnError(RTL_CONSTASCII_USTRINGPARAM("OnError")),
  96. sEventType(RTL_CONSTASCII_USTRINGPARAM("EventType")),
  97. sStarBasic(RTL_CONSTASCII_USTRINGPARAM("StarBasic")),
  98. sLibrary(RTL_CONSTASCII_USTRINGPARAM("Library")),
  99. sMacroName(RTL_CONSTASCII_USTRINGPARAM("MacroName"))
  100. {
  101. }
  102. ScMyValidationsContainer::~ScMyValidationsContainer()
  103. {
  104. }
  105. sal_Bool ScMyValidationsContainer::AddValidation(const uno::Any& aTempAny,
  106. sal_Int32& nValidationIndex)
  107. {
  108. sal_Bool bAdded(sal_False);
  109. uno::Reference<beans::XPropertySet> xPropertySet;
  110. if (aTempAny >>= xPropertySet)
  111. {
  112. uno::Any aAny = xPropertySet->getPropertyValue(sERRMESS);
  113. ::rtl::OUString sErrorMessage;
  114. aAny >>= sErrorMessage;
  115. aAny = xPropertySet->getPropertyValue(sERRTITLE);
  116. ::rtl::OUString sErrorTitle;
  117. aAny >>= sErrorTitle;
  118. aAny = xPropertySet->getPropertyValue(sINPMESS);
  119. ::rtl::OUString sImputMessage;
  120. aAny >>= sImputMessage;
  121. aAny = xPropertySet->getPropertyValue(sINPTITLE);
  122. ::rtl::OUString sImputTitle;
  123. aAny >>= sImputTitle;
  124. aAny = xPropertySet->getPropertyValue(sSHOWERR);
  125. sal_Bool bShowErrorMessage(sal_False);
  126. aAny >>= bShowErrorMessage;
  127. aAny = xPropertySet->getPropertyValue(sSHOWINP);
  128. sal_Bool bShowImputMessage(sal_False);
  129. aAny >>= bShowImputMessage;
  130. aAny = xPropertySet->getPropertyValue(sTYPE);
  131. sheet::ValidationType aValidationType;
  132. aAny >>= aValidationType;
  133. if (bShowErrorMessage || bShowImputMessage || aValidationType != sheet::ValidationType_ANY ||
  134. sErrorMessage.getLength() || sErrorTitle.getLength() || sImputMessage.getLength() || sImputTitle.getLength())
  135. {
  136. ScMyValidation aValidation;
  137. aValidation.sErrorMessage = sErrorMessage;
  138. aValidation.sErrorTitle = sErrorTitle;
  139. aValidation.sImputMessage = sImputMessage;
  140. aValidation.sImputTitle = sImputTitle;
  141. aValidation.bShowErrorMessage = bShowErrorMessage;
  142. aValidation.bShowImputMessage = bShowImputMessage;
  143. aValidation.aValidationType = aValidationType;
  144. aAny = xPropertySet->getPropertyValue(sIGNOREBL);
  145. sal_Bool bIgnoreBlanks(sal_False);
  146. aAny >>= bIgnoreBlanks;
  147. aValidation.bIgnoreBlanks = bIgnoreBlanks;
  148. aAny = xPropertySet->getPropertyValue(sERRALSTY);
  149. aAny >>= aValidation.aAlertStyle;
  150. uno::Reference<sheet::XSheetCondition> xCondition(xPropertySet, uno::UNO_QUERY);
  151. if (xCondition.is())
  152. {
  153. aValidation.sFormula1 = xCondition->getFormula1();
  154. aValidation.sFormula2 = xCondition->getFormula2();
  155. aValidation.aOperator = xCondition->getOperator();
  156. aValidation.aBaseCell = xCondition->getSourcePosition();
  157. }
  158. //ScMyValidationRange aValidationRange;
  159. sal_Bool bEqualFound(sal_False);
  160. sal_Int32 i = 0;
  161. sal_Int32 nCount = aValidationVec.size();
  162. while (i < nCount && !bEqualFound)
  163. {
  164. bEqualFound = aValidationVec[i].IsEqual(aValidation);
  165. if (!bEqualFound)
  166. i++;
  167. }
  168. if (bEqualFound)
  169. nValidationIndex = i;
  170. else
  171. {
  172. sal_Int32 nNameIndex = nCount + 1;
  173. ::rtl::OUString sCount = ::rtl::OUString::valueOf(nNameIndex);
  174. ::rtl::OUString sPrefix(RTL_CONSTASCII_USTRINGPARAM("val"));
  175. aValidation.sName += sPrefix;
  176. aValidation.sName += sCount;
  177. aValidationVec.push_back(aValidation);
  178. nValidationIndex = nCount;
  179. bAdded = sal_True;
  180. }
  181. }
  182. }
  183. return bAdded;
  184. }
  185. rtl::OUString ScMyValidationsContainer::GetCondition(const ScMyValidation& aValidation)
  186. {
  187. ::rtl::OUString sCondition;
  188. if (aValidation.aValidationType != sheet::ValidationType_ANY)
  189. {
  190. switch (aValidation.aValidationType)
  191. {
  192. //case sheet::ValidationType_CUSTOM
  193. case sheet::ValidationType_DATE :
  194. sCondition += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("cell-content-is-date()"));
  195. break;
  196. case sheet::ValidationType_DECIMAL :
  197. sCondition += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("cell-content-is-decimal-number()"));
  198. break;
  199. //case sheet::ValidationType_LIST :
  200. case sheet::ValidationType_TEXT_LEN :
  201. if (aValidation.aOperator != sheet::ConditionOperator_BETWEEN &&
  202. aValidation.aOperator != sheet::ConditionOperator_NOT_BETWEEN)
  203. sCondition += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("cell-content-text-length()"));
  204. break;
  205. case sheet::ValidationType_TIME :
  206. sCondition += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("cell-content-is-time()"));
  207. break;
  208. case sheet::ValidationType_WHOLE :
  209. sCondition += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("cell-content-is-whole-number()"));
  210. break;
  211. default :
  212. break;
  213. }
  214. if (aValidation.sFormula1.getLength() ||
  215. (aValidation.aOperator == sheet::ConditionOperator_BETWEEN &&
  216. aValidation.aOperator == sheet::ConditionOperator_NOT_BETWEEN &&
  217. aValidation.sFormula2.getLength()))
  218. {
  219. if (aValidation.aValidationType != sheet::ValidationType_TEXT_LEN)
  220. sCondition += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" and "));
  221. if (aValidation.aOperator != sheet::ConditionOperator_BETWEEN &&
  222. aValidation.aOperator != sheet::ConditionOperator_NOT_BETWEEN)
  223. {
  224. if (aValidation.aValidationType != sheet::ValidationType_TEXT_LEN)
  225. sCondition += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("cell-content()"));
  226. switch (aValidation.aOperator)
  227. {
  228. case sheet::ConditionOperator_EQUAL :
  229. sCondition += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("="));
  230. break;
  231. case sheet::ConditionOperator_GREATER :
  232. sCondition += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(">"));
  233. break;
  234. case sheet::ConditionOperator_GREATER_EQUAL :
  235. sCondition += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(">="));
  236. break;
  237. case sheet::ConditionOperator_LESS :
  238. sCondition += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("<"));
  239. break;
  240. case sheet::ConditionOperator_LESS_EQUAL :
  241. sCondition += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("<="));
  242. break;
  243. case sheet::ConditionOperator_NOT_EQUAL :
  244. sCondition += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("!="));
  245. break;
  246. default :
  247. break;
  248. }
  249. sCondition += aValidation.sFormula1;
  250. }
  251. else
  252. {
  253. if (aValidation.aValidationType == sheet::ValidationType_TEXT_LEN)
  254. {
  255. if (aValidation.aOperator == sheet::ConditionOperator_BETWEEN)
  256. sCondition += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("cell-content-text-length-is-between("));
  257. else
  258. sCondition += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("cell-content-text-length-is-not-between("));
  259. }
  260. else
  261. {
  262. if (aValidation.aOperator == sheet::ConditionOperator_BETWEEN)
  263. sCondition += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("cell-content-is-between("));
  264. else
  265. sCondition += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("cell-content-is-not-between("));
  266. }
  267. sCondition += aValidation.sFormula1;
  268. sCondition += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(","));
  269. sCondition += aValidation.sFormula2;
  270. sCondition += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(")"));
  271. }
  272. }
  273. else
  274. if (aValidation.aValidationType == sheet::ValidationType_TEXT_LEN)
  275. sCondition = ::rtl::OUString();
  276. }
  277. return sCondition;
  278. }
  279. rtl::OUString ScMyValidationsContainer::GetBaseCellAddress(ScDocument* pDoc, const table::CellAddress& aCell)
  280. {
  281. ::rtl::OUString sAddress;
  282. ScXMLConverter::GetStringFromAddress( sAddress, aCell, pDoc );
  283. return sAddress;
  284. }
  285. void ScMyValidationsContainer::WriteMessage(ScXMLExport& rExport,
  286. const ::rtl::OUString& sTitle, const ::rtl::OUString& sOUMessage,
  287. const sal_Bool bShowMessage, const sal_Bool bIsHelpMessage)
  288. {
  289. if (sTitle.getLength())
  290. rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_TITLE, sTitle);
  291. if (bShowMessage)
  292. rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DISPLAY, XML_TRUE);
  293. else
  294. rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DISPLAY, XML_FALSE);
  295. SvXMLElementExport* pMessage = NULL;
  296. if (bIsHelpMessage)
  297. pMessage = new SvXMLElementExport(rExport, XML_NAMESPACE_TABLE, XML_HELP_MESSAGE, sal_True, sal_True);
  298. else
  299. pMessage = new SvXMLElementExport(rExport, XML_NAMESPACE_TABLE, XML_ERROR_MESSAGE, sal_True, sal_True);
  300. if (sOUMessage.getLength())
  301. {
  302. sal_Int32 i = 0;
  303. ::rtl::OUStringBuffer sTemp;
  304. ::rtl::OUString sText(convertLineEnd(sOUMessage, LINEEND_LF));
  305. sal_Bool bPrevCharWasSpace(sal_True);
  306. while(i < sText.getLength())
  307. {
  308. if ((sText[i] == '\n'))
  309. {
  310. SvXMLElementExport aElemP(rExport, XML_NAMESPACE_TEXT, XML_P, sal_True, sal_False);
  311. rExport.GetTextParagraphExport()->exportText(sTemp.makeStringAndClear(), bPrevCharWasSpace);
  312. }
  313. else
  314. sTemp.append(sText[i]);
  315. i++;
  316. }
  317. if (sTemp.getLength())
  318. {
  319. SvXMLElementExport aElemP(rExport, XML_NAMESPACE_TEXT, XML_P, sal_True, sal_False);
  320. rExport.GetTextParagraphExport()->exportText(sTemp.makeStringAndClear(), bPrevCharWasSpace);
  321. }
  322. }
  323. if (pMessage)
  324. delete pMessage;
  325. }
  326. void ScMyValidationsContainer::WriteValidations(ScXMLExport& rExport)
  327. {
  328. if (!aValidationVec.empty())
  329. {
  330. SvXMLElementExport aElemVs(rExport, XML_NAMESPACE_TABLE, XML_CONTENT_VALIDATIONS, sal_True, sal_True);
  331. ScMyValidationVec::iterator aItr = aValidationVec.begin();
  332. while (aItr != aValidationVec.end())
  333. {
  334. rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_NAME, aItr->sName);
  335. ::rtl::OUString sCondition = GetCondition(*aItr);
  336. if (sCondition.getLength())
  337. {
  338. rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_CONDITION, sCondition);
  339. if (aItr->bIgnoreBlanks)
  340. rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_ALLOW_EMPTY_CELL, XML_FALSE);
  341. else
  342. rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_ALLOW_EMPTY_CELL, XML_TRUE);
  343. }
  344. rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_BASE_CELL_ADDRESS, GetBaseCellAddress(rExport.GetDocument(), aItr->aBaseCell));
  345. SvXMLElementExport aElemV(rExport, XML_NAMESPACE_TABLE, XML_CONTENT_VALIDATION, sal_True, sal_True);
  346. if (aItr->bShowImputMessage || aItr->sImputMessage.getLength() || aItr->sImputTitle.getLength())
  347. {
  348. WriteMessage(rExport, aItr->sImputTitle, aItr->sImputMessage, aItr->bShowImputMessage, sal_True);
  349. }
  350. if (aItr->bShowErrorMessage || aItr->sErrorMessage.getLength() || aItr->sErrorTitle.getLength())
  351. {
  352. switch (aItr->aAlertStyle)
  353. {
  354. case sheet::ValidationAlertStyle_INFO :
  355. {
  356. rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_MESSAGE_TYPE, XML_INFORMATION);
  357. WriteMessage(rExport, aItr->sErrorTitle, aItr->sErrorMessage, aItr->bShowErrorMessage, sal_False);
  358. }
  359. break;
  360. case sheet::ValidationAlertStyle_WARNING :
  361. {
  362. rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_MESSAGE_TYPE, XML_WARNING);
  363. WriteMessage(rExport, aItr->sErrorTitle, aItr->sErrorMessage, aItr->bShowErrorMessage, sal_False);
  364. }
  365. break;
  366. case sheet::ValidationAlertStyle_STOP :
  367. {
  368. rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_MESSAGE_TYPE, XML_STOP);
  369. WriteMessage(rExport, aItr->sErrorTitle, aItr->sErrorMessage, aItr->bShowErrorMessage, sal_False);
  370. }
  371. break;
  372. case sheet::ValidationAlertStyle_MACRO :
  373. {
  374. rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_NAME, aItr->sErrorTitle);
  375. if (aItr->bShowErrorMessage)
  376. rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_EXECUTE, XML_TRUE);
  377. else
  378. rExport.AddAttribute(XML_NAMESPACE_TABLE, XML_EXECUTE, XML_FALSE);
  379. SvXMLElementExport(rExport, XML_NAMESPACE_TABLE, XML_ERROR_MACRO, sal_True, sal_True);
  380. {
  381. uno::Sequence<beans::PropertyValue> aSeq(3);
  382. beans::PropertyValue* pArr = aSeq.getArray();
  383. pArr[0].Name = sEventType;
  384. pArr[0].Value <<= sStarBasic;
  385. pArr[1].Name = sLibrary;
  386. pArr[1].Value <<= sEmptyString;
  387. pArr[2].Name = sMacroName;
  388. pArr[2].Value <<= aItr->sErrorTitle;
  389. // 2) export the sequence
  390. rExport.GetEventExport().ExportSingleEvent( aSeq, sOnError);
  391. }
  392. }
  393. break;
  394. default :
  395. break;
  396. }
  397. }
  398. ++aItr;
  399. }
  400. }
  401. }
  402. const ::rtl::OUString& ScMyValidationsContainer::GetValidationName(const sal_Int32 nIndex)
  403. {
  404. DBG_ASSERT( static_cast<sal_uInt32>(nIndex) < aValidationVec.size(), "out of range" );
  405. return aValidationVec[nIndex].sName;
  406. }
  407. //==============================================================================
  408. sal_Int32 ScMyDefaultStyles::GetStyleNameIndex(const ScFormatRangeStyles* pCellStyles,
  409. const sal_uInt16 nTable, const sal_Int32 nPos,
  410. const sal_Int32 i, const sal_Bool bRow, sal_Bool& bIsAutoStyle)
  411. {
  412. if (bRow)
  413. return pCellStyles->GetStyleNameIndex(nTable, nPos, i,
  414. bIsAutoStyle);
  415. else
  416. return pCellStyles->GetStyleNameIndex(nTable, i, nPos,
  417. bIsAutoStyle);
  418. }
  419. void ScMyDefaultStyles::FillDefaultStyles(const sal_uInt16 nTable,
  420. const sal_Int32 nLastRow, const sal_Int32 nLastCol,
  421. const ScFormatRangeStyles* pCellStyles, ScDocument* pDoc,
  422. const sal_Bool bRow)
  423. {
  424. if (pDoc)
  425. {
  426. sal_uInt16 nPos;
  427. sal_Int32 nLast;
  428. ScMyDefaultStyleList* pDefaults;
  429. if (bRow)
  430. {
  431. pDefaults = pRowDefaults;
  432. nLast = nLastRow;
  433. }
  434. else
  435. {
  436. pDefaults = pColDefaults;
  437. nLast = nLastCol;
  438. }
  439. sal_Bool bPrevAutoStyle;
  440. sal_Bool bIsAutoStyle;
  441. sal_Bool bResult;
  442. sal_Int32 nPrevIndex(0);
  443. sal_Int32 nIndex;
  444. sal_Int32 nRepeat(0);
  445. sal_Int32 nEmptyRepeat(0);
  446. for (sal_Int32 i = nLast; i >= 0; i--)
  447. {
  448. if (bRow)
  449. bResult = FALSE;
  450. else
  451. bResult = pDoc->GetColDefault(nTable,
  452. static_cast<sal_uInt16>(i), static_cast<sal_uInt16>(nLastRow), nPos);
  453. if (bResult)
  454. {
  455. nEmptyRepeat = 0;
  456. if (!nRepeat)
  457. {
  458. nPrevIndex = GetStyleNameIndex(pCellStyles, nTable, static_cast<sal_Int32>(nPos), i,
  459. bRow, bPrevAutoStyle);
  460. (*pDefaults)[i].nIndex = nPrevIndex;
  461. (*pDefaults)[i].bIsAutoStyle = bPrevAutoStyle;
  462. nRepeat = 1;
  463. }
  464. else
  465. {
  466. nIndex = GetStyleNameIndex(pCellStyles, nTable, static_cast<sal_Int32>(nPos), i,
  467. bRow, bIsAutoStyle);
  468. if ((nIndex != nPrevIndex) || (bIsAutoStyle != bPrevAutoStyle))
  469. {
  470. nRepeat = 1;
  471. nPrevIndex = GetStyleNameIndex(pCellStyles, nTable, static_cast<sal_Int32>(nPos), i,
  472. bRow, bPrevAutoStyle);
  473. (*pDefaults)[i].nIndex = nPrevIndex;
  474. (*pDefaults)[i].bIsAutoStyle = bPrevAutoStyle;
  475. }
  476. else
  477. {
  478. (*pDefaults)[i].nIndex = nPrevIndex;
  479. (*pDefaults)[i].bIsAutoStyle = bPrevAutoStyle;
  480. nRepeat++;
  481. if (nRepeat > 1)
  482. (*pDefaults)[i].nRepeat = nRepeat;
  483. }
  484. }
  485. }
  486. else
  487. {
  488. nRepeat = 0;
  489. if (!nEmptyRepeat)
  490. nEmptyRepeat = 1;
  491. else
  492. {
  493. nEmptyRepeat++;
  494. if (nEmptyRepeat > 1)
  495. (*pDefaults)[i].nRepeat = nEmptyRepeat;
  496. }
  497. }
  498. }
  499. }
  500. }
  501. void ScMyDefaultStyles::FillDefaultStyles(const sal_uInt16 nTable,
  502. const sal_Int32 nLastRow, const sal_Int32 nLastCol,
  503. const ScFormatRangeStyles* pCellStyles, ScDocument* pDoc)
  504. {
  505. if (pRowDefaults)
  506. delete pRowDefaults;
  507. pRowDefaults = new ScMyDefaultStyleList(nLastRow + 1);
  508. FillDefaultStyles(nTable, nLastRow, nLastCol, pCellStyles, pDoc, sal_True);
  509. if (pColDefaults)
  510. delete pColDefaults;
  511. pColDefaults = new ScMyDefaultStyleList(nLastCol + 1);
  512. FillDefaultStyles(nTable, nLastRow, nLastCol, pCellStyles, pDoc, sal_False);
  513. }
  514. ScMyDefaultStyles::~ScMyDefaultStyles()
  515. {
  516. if (pRowDefaults)
  517. delete pRowDefaults;
  518. if (pColDefaults)
  519. delete pColDefaults;
  520. }
  521. ScMyRowFormatRange::ScMyRowFormatRange()
  522. : nStartColumn(0),
  523. nRepeatColumns(0),
  524. nRepeatRows(0),
  525. nIndex(-1),
  526. nValidationIndex(-1),
  527. bIsAutoStyle(sal_True)
  528. {
  529. }
  530. sal_Bool ScMyRowFormatRange::operator< (const ScMyRowFormatRange& rRange) const
  531. {
  532. return (nStartColumn < rRange.nStartColumn);
  533. }
  534. ScRowFormatRanges::ScRowFormatRanges()
  535. : aRowFormatRanges()
  536. , pRowDefaults(NULL)
  537. , pColDefaults(NULL)
  538. , nSize(0)
  539. {
  540. }
  541. ScRowFormatRanges::ScRowFormatRanges(const ScRowFormatRanges* pRanges)
  542. : aRowFormatRanges(pRanges->aRowFormatRanges)
  543. , pRowDefaults(pRanges->pRowDefaults)
  544. , pColDefaults(pRanges->pColDefaults)
  545. , nSize(pRanges->nSize)
  546. {
  547. }
  548. ScRowFormatRanges::~ScRowFormatRanges()
  549. {
  550. }
  551. void ScRowFormatRanges::Clear()
  552. {
  553. aRowFormatRanges.clear();
  554. nSize = 0;
  555. }
  556. void ScRowFormatRanges::AddRange(const sal_Int32 nPrevStartCol, const sal_Int32 nRepeat, const sal_Int32 nPrevIndex,
  557. const sal_Bool bPrevAutoStyle, const ScMyRowFormatRange& rFormatRange)
  558. {
  559. sal_Int32 nIndex(-1);
  560. if ((nPrevIndex != rFormatRange.nIndex) ||
  561. (bPrevAutoStyle != rFormatRange.bIsAutoStyle))
  562. nIndex = rFormatRange.nIndex;
  563. sal_Bool bInserted(sal_False);
  564. if (!aRowFormatRanges.empty())
  565. {
  566. ScMyRowFormatRange* pRange = &aRowFormatRanges.back();
  567. if (pRange)
  568. {
  569. if ((nPrevStartCol == (pRange->nStartColumn + pRange->nRepeatColumns)) &&
  570. (pRange->bIsAutoStyle == rFormatRange.bIsAutoStyle) &&
  571. (pRange->nIndex == nIndex) &&
  572. (pRange->nValidationIndex == rFormatRange.nValidationIndex))
  573. {
  574. if (rFormatRange.nRepeatRows < pRange->nRepeatRows)
  575. pRange->nRepeatRows = rFormatRange.nRepeatRows;
  576. pRange->nRepeatColumns += nRepeat;
  577. bInserted = sal_True;
  578. }
  579. }
  580. }
  581. if (!bInserted)
  582. {
  583. ScMyRowFormatRange aRange;
  584. aRange.nStartColumn = nPrevStartCol;
  585. aRange.nRepeatColumns = nRepeat;
  586. aRange.nRepeatRows = rFormatRange.nRepeatRows;
  587. aRange.nValidationIndex = rFormatRange.nValidationIndex;
  588. aRange.bIsAutoStyle = rFormatRange.bIsAutoStyle;
  589. aRange.nIndex = nIndex;
  590. aRowFormatRanges.push_back(aRange);
  591. nSize++;
  592. }
  593. }
  594. void ScRowFormatRanges::AddRange(ScMyRowFormatRange& rFormatRange,
  595. const sal_Int32 nRow)
  596. {
  597. DBG_ASSERT(pRowDefaults, "no row defaults");
  598. DBG_ASSERT(pColDefaults, "no column defaults");
  599. sal_uInt32 nEnd (rFormatRange.nRepeatRows + nRow - 1);
  600. sal_Int32 nPrevIndex((*pRowDefaults)[nRow].nIndex);
  601. sal_Bool bPrevAutoStyle((*pRowDefaults)[nRow].bIsAutoStyle);
  602. sal_uInt32 i(nRow + 1);
  603. sal_Bool bReady(sal_False);
  604. while ((i < nEnd) && !bReady && (i < pRowDefaults->size()))
  605. {
  606. if ((nPrevIndex != (*pRowDefaults)[i].nIndex) ||
  607. (bPrevAutoStyle != (*pRowDefaults)[i].bIsAutoStyle))
  608. bReady = sal_True;
  609. else
  610. i += (*pRowDefaults)[i].nRepeat;
  611. }
  612. if (i > nEnd)
  613. i = nEnd;
  614. if (bReady)
  615. rFormatRange.nRepeatRows = i - nRow + 1;
  616. if (nPrevIndex == -1)
  617. {
  618. nPrevIndex = (*pColDefaults)[rFormatRange.nStartColumn].nIndex;
  619. bPrevAutoStyle = (*pColDefaults)[rFormatRange.nStartColumn].bIsAutoStyle;
  620. sal_uInt32 nPrevStartCol(rFormatRange.nStartColumn);
  621. sal_uInt32 nRepeat((*pColDefaults)[rFormatRange.nStartColumn].nRepeat);
  622. nEnd = rFormatRange.nStartColumn + rFormatRange.nRepeatColumns;
  623. for(i = nPrevStartCol + nRepeat; i < nEnd; i += (*pColDefaults)[i].nRepeat)
  624. {
  625. DBG_ASSERT(sal_uInt32(nPrevStartCol + nRepeat) <= nEnd, "something wents wrong");
  626. if ((nPrevIndex != (*pColDefaults)[i].nIndex) ||
  627. (bPrevAutoStyle != (*pColDefaults)[i].bIsAutoStyle))
  628. {
  629. AddRange(nPrevStartCol, nRepeat, nPrevIndex, bPrevAutoStyle, rFormatRange);
  630. nPrevStartCol = i;
  631. nRepeat = (*pColDefaults)[i].nRepeat;
  632. nPrevIndex = (*pColDefaults)[i].nIndex;
  633. bPrevAutoStyle = (*pColDefaults)[i].bIsAutoStyle;
  634. }
  635. else
  636. nRepeat += (*pColDefaults)[i].nRepeat;
  637. }
  638. if (sal_uInt32(nPrevStartCol + nRepeat) > nEnd)
  639. nRepeat = nEnd - nPrevStartCol;
  640. AddRange(nPrevStartCol, nRepeat, nPrevIndex, bPrevAutoStyle, rFormatRange);
  641. }
  642. else if ((nPrevIndex == rFormatRange.nIndex) &&
  643. (bPrevAutoStyle == rFormatRange.bIsAutoStyle))
  644. {
  645. rFormatRange.nIndex = -1;
  646. aRowFormatRanges.push_back(rFormatRange);
  647. nSize++;
  648. }
  649. }
  650. sal_Bool ScRowFormatRanges::GetNext(ScMyRowFormatRange& aFormatRange)
  651. {
  652. ScMyRowFormatRangesList::iterator aItr = aRowFormatRanges.begin();
  653. if (aItr != aRowFormatRanges.end())
  654. {
  655. aFormatRange = (*aItr);
  656. aRowFormatRanges.erase(aItr);
  657. nSize--;
  658. return sal_True;
  659. }
  660. return sal_False;
  661. }
  662. sal_Int32 ScRowFormatRanges::GetMaxRows()
  663. {
  664. ScMyRowFormatRangesList::iterator aItr = aRowFormatRanges.begin();
  665. sal_Int32 nMaxRows = MAXROW + 1;
  666. if (aItr != aRowFormatRanges.end())
  667. while (aItr != aRowFormatRanges.end())
  668. {
  669. if ((*aItr).nRepeatRows < nMaxRows)
  670. nMaxRows = (*aItr).nRepeatRows;
  671. ++aItr;
  672. }
  673. else
  674. OSL_FAIL("no ranges found");
  675. return nMaxRows;
  676. }
  677. sal_Int32 ScRowFormatRanges::GetSize()
  678. {
  679. return nSize;
  680. }
  681. void ScRowFormatRanges::Sort()
  682. {
  683. aRowFormatRanges.sort();
  684. }
  685. // ============================================================================
  686. ScMyFormatRange::ScMyFormatRange()
  687. : nStyleNameIndex(-1),
  688. nValidationIndex(-1),
  689. bIsAutoStyle(sal_True)
  690. {
  691. }
  692. sal_Bool ScMyFormatRange::operator<(const ScMyFormatRange& rRange) const
  693. {
  694. if (aRangeAddress.StartRow < rRange.aRangeAddress.StartRow)
  695. return sal_True;
  696. else
  697. if (aRangeAddress.StartRow == rRange.aRangeAddress.StartRow)
  698. return (aRangeAddress.StartColumn < rRange.aRangeAddress.StartColumn);
  699. else
  700. return sal_False;
  701. }
  702. ScFormatRangeStyles::ScFormatRangeStyles()
  703. : aTables(),
  704. aStyleNames(),
  705. aAutoStyleNames()
  706. {
  707. }
  708. ScFormatRangeStyles::~ScFormatRangeStyles()
  709. {
  710. ScMyOUStringVec::iterator i = aStyleNames.begin();
  711. while (i != aStyleNames.end())
  712. {
  713. delete *i;
  714. ++i;
  715. }
  716. i = aAutoStyleNames.begin();
  717. while (i != aAutoStyleNames.end())
  718. {
  719. delete *i;
  720. ++i;
  721. }
  722. ScMyFormatRangeListVec::iterator j = aTables.begin();
  723. while (j != aTables.end())
  724. {
  725. delete *j;
  726. ++j;
  727. }
  728. }
  729. void ScFormatRangeStyles::AddNewTable(const sal_Int16 nTable)
  730. {
  731. sal_Int16 nSize = aTables.size() - 1;
  732. if (nTable > nSize)
  733. for (sal_Int16 i = nSize; i < nTable; i++)
  734. {
  735. ScMyFormatRangeAddresses* aRangeAddresses = new ScMyFormatRangeAddresses;
  736. aTables.push_back(aRangeAddresses);
  737. }
  738. }
  739. sal_Bool ScFormatRangeStyles::AddStyleName(::rtl::OUString* rpString, sal_Int32& rIndex, const sal_Bool bIsAutoStyle)
  740. {
  741. if (bIsAutoStyle)
  742. {
  743. aAutoStyleNames.push_back(rpString);
  744. rIndex = aAutoStyleNames.size() - 1;
  745. return sal_True;
  746. }
  747. else
  748. {
  749. sal_Int32 nCount = aStyleNames.size();
  750. sal_Bool bFound(sal_False);
  751. sal_Int32 i = nCount - 1;
  752. while ((i >= 0) && (!bFound))
  753. {
  754. if (aStyleNames.at(i)->equals(*rpString))
  755. bFound = sal_True;
  756. else
  757. i--;
  758. }
  759. if (bFound)
  760. {
  761. rIndex = i;
  762. return sal_False;
  763. }
  764. else
  765. {
  766. aStyleNames.push_back(rpString);
  767. rIndex = aStyleNames.size() - 1;
  768. return sal_True;
  769. }
  770. }
  771. }
  772. sal_Int32 ScFormatRangeStyles::GetIndexOfStyleName(const ::rtl::OUString& rString, const ::rtl::OUString& rPrefix, sal_Bool& bIsAutoStyle)
  773. {
  774. sal_Int32 nPrefixLength = rPrefix.getLength();
  775. ::rtl::OUString sTemp = rString.copy(nPrefixLength);
  776. sal_Int32 nIndex = sTemp.toInt32();
  777. if (aAutoStyleNames.at(nIndex - 1)->equals(rString))
  778. {
  779. bIsAutoStyle = sal_True;
  780. return nIndex - 1;
  781. }
  782. else
  783. {
  784. sal_Int32 i = 0;
  785. sal_Bool bFound(sal_False);
  786. while (!bFound && static_cast<sal_uInt32>(i) < aStyleNames.size())
  787. {
  788. if (aStyleNames[i]->equals(rString))
  789. bFound = sal_True;
  790. else
  791. i++;
  792. }
  793. if (bFound)
  794. {
  795. bIsAutoStyle = sal_False;
  796. return i;
  797. }
  798. else
  799. {
  800. i = 0;
  801. while (!bFound && static_cast<sal_uInt32>(i) < aAutoStyleNames.size())
  802. {
  803. if (aAutoStyleNames[i]->equals(rString))
  804. bFound = sal_True;
  805. else
  806. i++;
  807. }
  808. if (bFound)
  809. {
  810. bIsAutoStyle = sal_True;
  811. return i;
  812. }
  813. else
  814. return -1;
  815. }
  816. }
  817. }
  818. sal_Int32 ScFormatRangeStyles::GetStyleNameIndex(const sal_uInt16 nTable,
  819. const sal_Int32 nColumn, const sal_Int32 nRow, sal_Bool& bIsAutoStyle) const
  820. {
  821. DBG_ASSERT(static_cast<sal_uInt32>(nTable) < aTables.size(), "wrong table");
  822. ScMyFormatRangeAddresses* pFormatRanges = aTables[nTable];
  823. ScMyFormatRangeAddresses::iterator aItr = pFormatRanges->begin();
  824. while (aItr != pFormatRanges->end())
  825. {
  826. if (((*aItr).aRangeAddress.StartColumn <= nColumn) &&
  827. ((*aItr).aRangeAddress.EndColumn >= nColumn) &&
  828. ((*aItr).aRangeAddress.StartRow <= nRow) &&
  829. ((*aItr).aRangeAddress.EndRow >= nRow))
  830. {
  831. bIsAutoStyle = aItr->bIsAutoStyle;
  832. return (*aItr).nStyleNameIndex;
  833. }
  834. else
  835. ++aItr;
  836. }
  837. return -1;
  838. }
  839. sal_Int32 ScFormatRangeStyles::GetStyleNameIndex(const sal_uInt16 nTable, const sal_Int32 nColumn, const sal_Int32 nRow,
  840. sal_Bool& bIsAutoStyle, sal_Int32& nValidationIndex, sal_Int32& nNumberFormat, const sal_Bool bRemoveRange)
  841. {
  842. DBG_ASSERT(static_cast<sal_uInt32>(nTable) < aTables.size(), "wrong table");
  843. ScMyFormatRangeAddresses* pFormatRanges = aTables[nTable];
  844. ScMyFormatRangeAddresses::iterator aItr = pFormatRanges->begin();
  845. while (aItr != pFormatRanges->end())
  846. {
  847. if (((*aItr).aRangeAddress.StartColumn <= nColumn) &&
  848. ((*aItr).aRangeAddress.EndColumn >= nColumn) &&
  849. ((*aItr).aRangeAddress.StartRow <= nRow) &&
  850. ((*aItr).aRangeAddress.EndRow >= nRow))
  851. {
  852. bIsAutoStyle = aItr->bIsAutoStyle;
  853. nValidationIndex = aItr->nValidationIndex;
  854. nNumberFormat = aItr->nNumberFormat;
  855. if (((*pRowDefaults)[nRow].nIndex != -1))
  856. {
  857. if (((*pRowDefaults)[nRow].nIndex == (*aItr).nStyleNameIndex) &&
  858. ((*pRowDefaults)[nRow].bIsAutoStyle == (*aItr).bIsAutoStyle))
  859. return -1;
  860. else
  861. return (*aItr).nStyleNameIndex;
  862. }
  863. else if (((*pColDefaults)[nColumn].nIndex != -1) &&
  864. ((*pColDefaults)[nColumn].nIndex == (*aItr).nStyleNameIndex) &&
  865. ((*pColDefaults)[nColumn].bIsAutoStyle == (*aItr).bIsAutoStyle))
  866. return -1;
  867. else
  868. return (*aItr).nStyleNameIndex;
  869. }
  870. else
  871. {
  872. if (bRemoveRange && (*aItr).aRangeAddress.EndRow < nRow)
  873. aItr = pFormatRanges->erase(aItr);
  874. else
  875. ++aItr;
  876. }
  877. }
  878. return -1;
  879. }
  880. void ScFormatRangeStyles::GetFormatRanges(const sal_Int32 nStartColumn, const sal_Int32 nEndColumn, const sal_Int32 nRow,
  881. const sal_Int16 nTable, ScRowFormatRanges* pRowFormatRanges)
  882. {
  883. sal_Int32 nTotalColumns = nEndColumn - nStartColumn + 1;
  884. DBG_ASSERT(static_cast<sal_uInt32>(nTable) < aTables.size(), "wrong table");
  885. ScMyFormatRangeAddresses* pFormatRanges = aTables[nTable];
  886. ScMyFormatRangeAddresses::iterator aItr = pFormatRanges->begin();
  887. sal_Int32 nColumns = 0;
  888. while (aItr != pFormatRanges->end() && nColumns < nTotalColumns)
  889. {
  890. if (((*aItr).aRangeAddress.StartRow <= nRow) &&
  891. ((*aItr).aRangeAddress.EndRow >= nRow))
  892. {
  893. if ((((*aItr).aRangeAddress.StartColumn <= nStartColumn) &&
  894. ((*aItr).aRangeAddress.EndColumn >= nStartColumn)) ||
  895. (((*aItr).aRangeAddress.StartColumn <= nEndColumn) &&
  896. ((*aItr).aRangeAddress.EndColumn >= nEndColumn)) ||
  897. (((*aItr).aRangeAddress.StartColumn >= nStartColumn) &&
  898. ((*aItr).aRangeAddress.EndColumn <= nEndColumn)))
  899. {
  900. ScMyRowFormatRange aRange;
  901. aRange.nIndex = aItr->nStyleNameIndex;
  902. aRange.nValidationIndex = aItr->nValidationIndex;
  903. aRange.bIsAutoStyle = aItr->bIsAutoStyle;
  904. if ((aItr->aRangeAddress.StartColumn < nStartColumn) &&
  905. (aItr->aRangeAddress.EndColumn >= nStartColumn))
  906. {
  907. if (aItr->aRangeAddress.EndColumn >= nEndColumn)
  908. aRange.nRepeatColumns = nTotalColumns;
  909. else
  910. aRange.nRepeatColumns = aItr->aRangeAddress.EndColumn - nStartColumn + 1;
  911. aRange.nStartColumn = nStartColumn;
  912. }
  913. else if ((aItr->aRangeAddress.StartColumn >= nStartColumn) &&
  914. (aItr->aRangeAddress.EndColumn <= nEndColumn))
  915. {
  916. aRange.nRepeatColumns = aItr->aRangeAddress.EndColumn - aItr->aRangeAddress.StartColumn + 1;
  917. aRange.nStartColumn = aItr->aRangeAddress.StartColumn;
  918. }
  919. else if ((aItr->aRangeAddress.StartColumn >= nStartColumn) &&
  920. (aItr->aRangeAddress.StartColumn <= nEndColumn) &&
  921. (aItr->aRangeAddress.EndColumn > nEndColumn))
  922. {
  923. aRange.nRepeatColumns = nEndColumn - aItr->aRangeAddress.StartColumn + 1;
  924. aRange.nStartColumn = aItr->aRangeAddress.StartColumn;
  925. }
  926. aRange.nRepeatRows = aItr->aRangeAddress.EndRow - nRow + 1;
  927. pRowFormatRanges->AddRange(aRange, nRow);
  928. nColumns += aRange.nRepeatColumns;
  929. }
  930. ++aItr;
  931. }
  932. else
  933. {
  934. if(aItr->aRangeAddress.EndRow < nRow)
  935. aItr = pFormatRanges->erase(aItr);
  936. else
  937. ++aItr;
  938. }
  939. }
  940. pRowFormatRanges->Sort();
  941. }
  942. void ScFormatRangeStyles::AddRangeStyleName(const table::CellRangeAddress aCellRangeAddress,
  943. const sal_Int32 nStringIndex, const sal_Bool bIsAutoStyle, const sal_Int32 nValidationIndex,
  944. const sal_Int32 nNumberFormat)
  945. {
  946. ScMyFormatRange aFormatRange;
  947. aFormatRange.aRangeAddress = aCellRangeAddress;
  948. aFormatRange.nStyleNameIndex = nStringIndex;
  949. aFormatRange.nValidationIndex = nValidationIndex;
  950. aFormatRange.nNumberFormat = nNumberFormat;
  951. aFormatRange.bIsAutoStyle = bIsAutoStyle;
  952. DBG_ASSERT(static_cast<sal_uInt32>(aCellRangeAddress.Sheet) < aTables.size(), "wrong table");
  953. ScMyFormatRangeAddresses* pFormatRanges = aTables[aCellRangeAddress.Sheet];
  954. pFormatRanges->push_back(aFormatRange);
  955. }
  956. rtl::OUString* ScFormatRangeStyles::GetStyleNameByIndex(const sal_Int32 nIndex, const sal_Bool bIsAutoStyle)
  957. {
  958. if (bIsAutoStyle)
  959. return aAutoStyleNames[nIndex];
  960. else
  961. return aStyleNames[nIndex];
  962. }
  963. void ScFormatRangeStyles::Sort()
  964. {
  965. sal_Int16 nTables = aTables.size();
  966. for (sal_Int16 i = 0; i < nTables; i++)
  967. if (!aTables[i]->empty())
  968. aTables[i]->sort();
  969. }
  970. //===========================================================================
  971. ScColumnRowStylesBase::ScColumnRowStylesBase()
  972. : aStyleNames()
  973. {
  974. }
  975. ScColumnRowStylesBase::~ScColumnRowStylesBase()
  976. {
  977. ScMyOUStringVec::iterator i = aStyleNames.begin();
  978. while (i != aStyleNames.end())
  979. {
  980. delete *i;
  981. ++i;
  982. }
  983. }
  984. sal_Int32 ScColumnRowStylesBase::AddStyleName(::rtl::OUString* pString)
  985. {
  986. aStyleNames.push_back(pString);
  987. return aStyleNames.size() - 1;
  988. }
  989. sal_Int32 ScColumnRowStylesBase::GetIndexOfStyleName(const ::rtl::OUString& rString, const ::rtl::OUString& rPrefix)
  990. {
  991. sal_Int32 nPrefixLength = rPrefix.getLength();
  992. ::rtl::OUString sTemp = rString.copy(nPrefixLength);
  993. sal_Int32 nIndex = sTemp.toInt32();
  994. if (aStyleNames.at(nIndex - 1)->equals(rString))
  995. return nIndex - 1;
  996. else
  997. {
  998. sal_Int32 i = 0;
  999. sal_Bool bFound(sal_False);
  1000. while (!bFound && static_cast<sal_uInt32>(i) < aStyleNames.size())
  1001. {
  1002. if (aStyleNames.at(i)->equals(rString))
  1003. bFound = sal_True;
  1004. else
  1005. i++;
  1006. }
  1007. if (bFound)
  1008. return i;
  1009. else
  1010. return -1;
  1011. }
  1012. }
  1013. rtl::OUString* ScColumnRowStylesBase::GetStyleNameByIndex(const sal_Int32 nIndex)
  1014. {
  1015. if ( nIndex < 0 || nIndex >= (sal_Int32)aStyleNames.size() )
  1016. {
  1017. // #i61888# should no longer happen, use first style then
  1018. DBG_ERRORFILE("GetStyleNameByIndex: invalid index");
  1019. return aStyleNames[0];
  1020. }
  1021. return aStyleNames[nIndex];
  1022. }
  1023. //===========================================================================
  1024. ScColumnStyles::ScColumnStyles()
  1025. : ScColumnRowStylesBase(),
  1026. aTables()
  1027. {
  1028. }
  1029. ScColumnStyles::~ScColumnStyles()
  1030. {
  1031. }
  1032. void ScColumnStyles::AddNewTable(const sal_Int16 nTable, const sal_Int32 nFields)
  1033. {
  1034. sal_Int16 nSize = aTables.size() - 1;
  1035. if (nTable > nSize)
  1036. for (sal_Int32 i = nSize; i < nTable; i++)
  1037. {
  1038. ScMyColumnStyleVec aFieldsVec(nFields + 1, ScColumnStyle());
  1039. aTables.push_back(aFieldsVec);
  1040. }
  1041. }
  1042. sal_Int32 ScColumnStyles::GetStyleNameIndex(const sal_Int16 nTable, const sal_Int32 nField,
  1043. sal_Bool& bIsVisible)
  1044. {
  1045. DBG_ASSERT(static_cast<sal_uInt32>(nTable) < aTables.size(), "wrong table");
  1046. if (static_cast<sal_uInt32>(nField) < aTables[nTable].size())
  1047. {
  1048. bIsVisible = aTables[nTable][nField].bIsVisible;
  1049. return aTables[nTable][nField].nIndex;
  1050. }
  1051. else
  1052. {
  1053. bIsVisible = aTables[nTable][aTables[nTable].size() - 1].bIsVisible;
  1054. return aTables[nTable][aTables[nTable].size() - 1].nIndex;
  1055. }
  1056. }
  1057. void ScColumnStyles::AddFieldStyleName(const sal_Int16 nTable, const sal_Int32 nField,
  1058. const sal_Int32 nStringIndex, const sal_Bool bIsVisible)
  1059. {
  1060. DBG_ASSERT(static_cast<sal_uInt32>(nTable) < aTables.size(), "wrong table");
  1061. DBG_ASSERT(aTables[nTable].size() >= static_cast<sal_uInt32>(nField), "wrong field");
  1062. ScColumnStyle aStyle;
  1063. aStyle.nIndex = nStringIndex;
  1064. aStyle.bIsVisible = bIsVisible;
  1065. if (aTables[nTable].size() == static_cast<sal_uInt32>(nField))
  1066. aTables[nTable].push_back(aStyle);
  1067. aTables[nTable][nField] = aStyle;
  1068. }
  1069. rtl::OUString* ScColumnStyles::GetStyleName(const sal_Int16 nTable, const sal_Int32 nField)
  1070. {
  1071. sal_Bool bTemp;
  1072. return GetStyleNameByIndex(GetStyleNameIndex(nTable, nField, bTemp));
  1073. }
  1074. //===========================================================================
  1075. ScRowStyles::ScRowStyles()
  1076. : ScColumnRowStylesBase(),
  1077. aTables()
  1078. {
  1079. }
  1080. ScRowStyles::~ScRowStyles()
  1081. {
  1082. }
  1083. void ScRowStyles::AddNewTable(const sal_Int16 nTable, const sal_Int32 nFields)
  1084. {
  1085. sal_Int16 nSize = aTables.size() - 1;
  1086. if (nTable > nSize)
  1087. for (sal_Int32 i = nSize; i < nTable; i++)
  1088. {
  1089. ScMysalInt32Vec aFieldsVec(nFields + 1, -1);
  1090. aTables.push_back(aFieldsVec);
  1091. }
  1092. }
  1093. sal_Int32 ScRowStyles::GetStyleNameIndex(const sal_Int16 nTable, const sal_Int32 nField)
  1094. {
  1095. DBG_ASSERT(static_cast<sal_uInt32>(nTable) < aTables.size(), "wrong table");
  1096. if (static_cast<sal_uInt32>(nField) < aTables[nTable].size())
  1097. return aTables[nTable][nField];
  1098. else
  1099. return aTables[nTable][aTables[nTable].size() - 1];
  1100. }
  1101. void ScRowStyles::AddFieldStyleName(const sal_Int16 nTable, const sal_Int32 nField,
  1102. const sal_Int32 nStringIndex)
  1103. {
  1104. DBG_ASSERT(static_cast<sal_uInt32>(nTable) < aTables.size(), "wrong table");
  1105. DBG_ASSERT(aTables[nTable].size() >= static_cast<sal_uInt32>(nField), "wrong field");
  1106. if (aTables[nTable].size() == static_cast<sal_uInt32>(nField))
  1107. aTables[nTable].push_back(nStringIndex);
  1108. aTables[nTable][nField] = nStringIndex;
  1109. }
  1110. rtl::OUString* ScRowStyles::GetStyleName(const sal_Int16 nTable, const sal_Int32 nField)
  1111. {
  1112. return GetStyleNameByIndex(GetStyleNameIndex(nTable, nField));
  1113. }
  1114. }
  1115. /* vim:set shiftwidth=4 softtabstop=4 expandtab: */