PageRenderTime 64ms CodeModel.GetById 27ms RepoModel.GetById 1ms app.codeStats 0ms

/binfilter/bf_sc/source/filter/xml/sc_XMLStylesExportHelper.cxx

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