LCOV - code coverage report
Current view: top level - libreoffice/sc/source/filter/orcus - interface.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 0 191 0.0 %
Date: 2012-12-27 Functions: 0 60 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  */
       9             : 
      10             : #include "orcusinterface.hxx"
      11             : 
      12             : #include "document.hxx"
      13             : #include "cell.hxx"
      14             : #include "rangenam.hxx"
      15             : #include "tokenarray.hxx"
      16             : #include <formula/token.hxx>
      17             : 
      18             : 
      19             : using orcus::spreadsheet::row_t;
      20             : using orcus::spreadsheet::col_t;
      21             : using orcus::spreadsheet::formula_grammar_t;
      22             : 
      23           0 : ScOrcusFactory::ScOrcusFactory(ScDocument& rDoc) : mrDoc(rDoc) {}
      24             : 
      25           0 : orcus::spreadsheet::iface::import_sheet* ScOrcusFactory::append_sheet(const char* sheet_name, size_t sheet_name_length)
      26             : {
      27           0 :     OUString aTabName(sheet_name, sheet_name_length, RTL_TEXTENCODING_UTF8);
      28           0 :     if (!mrDoc.InsertTab(SC_TAB_APPEND, aTabName))
      29           0 :         return NULL;
      30             : 
      31           0 :     SCTAB nTab = mrDoc.GetTableCount() - 1;
      32           0 :     maSheets.push_back(new ScOrcusSheet(mrDoc, nTab, maSharedStrings));
      33           0 :     return &maSheets.back();
      34             : }
      35             : 
      36             : class FindSheetByIndex : std::unary_function<ScOrcusSheet, bool>
      37             : {
      38             :     SCTAB mnTab;
      39             : public:
      40           0 :     FindSheetByIndex(SCTAB nTab) : mnTab(nTab) {}
      41           0 :     bool operator() (const ScOrcusSheet& rSheet) const
      42             :     {
      43           0 :         return rSheet.getIndex() == mnTab;
      44             :     }
      45             : };
      46             : 
      47           0 : orcus::spreadsheet::iface::import_sheet* ScOrcusFactory::get_sheet(const char* sheet_name, size_t sheet_name_length)
      48             : {
      49           0 :     OUString aTabName(sheet_name, sheet_name_length, RTL_TEXTENCODING_UTF8);
      50           0 :     SCTAB nTab = -1;
      51           0 :     if (!mrDoc.GetTable(aTabName, nTab))
      52             :         // Sheet by that name not found.
      53           0 :         return NULL;
      54             : 
      55             :     // See if we already have an orcus sheet instance by that index.
      56             :     boost::ptr_vector<ScOrcusSheet>::iterator it =
      57           0 :         std::find_if(maSheets.begin(), maSheets.end(), FindSheetByIndex(nTab));
      58             : 
      59           0 :     if (it != maSheets.end())
      60             :         // We already have one. Return it.
      61           0 :         return &(*it);
      62             : 
      63             :     // Create a new orcus sheet instance for this.
      64           0 :     maSheets.push_back(new ScOrcusSheet(mrDoc, nTab, maSharedStrings));
      65           0 :     return &maSheets.back();
      66             : }
      67             : 
      68           0 : orcus::spreadsheet::iface::import_shared_strings* ScOrcusFactory::get_shared_strings()
      69             : {
      70           0 :     return &maSharedStrings;
      71             : }
      72             : 
      73           0 : orcus::spreadsheet::iface::import_styles* ScOrcusFactory::get_styles()
      74             : {
      75             :     // We don't support it yet.
      76           0 :     return new ScOrcusStyles;
      77             : }
      78             : 
      79           0 : ScOrcusSheet::ScOrcusSheet(ScDocument& rDoc, SCTAB nTab, ScOrcusSharedStrings& rSharedStrings) :
      80           0 :     mrDoc(rDoc), mnTab(nTab), mrSharedStrings(rSharedStrings) {}
      81             : 
      82           0 : void ScOrcusSheet::set_auto(row_t row, col_t col, const char* p, size_t n)
      83             : {
      84           0 :     OUString aVal(p, n, RTL_TEXTENCODING_UTF8);
      85           0 :     mrDoc.SetString(col, row, mnTab, aVal);
      86           0 : }
      87             : 
      88           0 : void ScOrcusSheet::set_format(row_t /*row*/, col_t /*col*/, size_t /*xf_index*/)
      89             : {
      90           0 : }
      91             : 
      92             : namespace {
      93             : 
      94           0 : formula::FormulaGrammar::Grammar getCalcGrammarFromOrcus( formula_grammar_t grammar )
      95             : {
      96           0 :     formula::FormulaGrammar::Grammar eGrammar = formula::FormulaGrammar::GRAM_ODFF;
      97           0 :     switch(grammar)
      98             :     {
      99             :         case orcus::spreadsheet::ods:
     100           0 :             eGrammar = formula::FormulaGrammar::GRAM_ODFF;
     101           0 :             break;
     102             :         case orcus::spreadsheet::xlsx_2007:
     103             :         case orcus::spreadsheet::xlsx_2010:
     104           0 :             eGrammar = formula::FormulaGrammar::GRAM_ENGLISH_XL_A1;
     105           0 :             break;
     106             :         case orcus::spreadsheet::gnumeric:
     107           0 :             eGrammar = formula::FormulaGrammar::GRAM_ENGLISH_XL_A1;
     108           0 :             break;
     109             :     }
     110             : 
     111           0 :     return eGrammar;
     112             : }
     113             : 
     114             : }
     115             : 
     116           0 : void ScOrcusSheet::set_formula(
     117             :     row_t row, col_t col, formula_grammar_t grammar, const char* p, size_t n)
     118             : {
     119           0 :     OUString aFormula(p, n, RTL_TEXTENCODING_UTF8);
     120           0 :     formula::FormulaGrammar::Grammar eGrammar = getCalcGrammarFromOrcus( grammar );
     121             : 
     122           0 :     ScFormulaCell* pCell = new ScFormulaCell(&mrDoc, ScAddress(col, row, mnTab), aFormula, eGrammar);
     123           0 :     mrDoc.PutCell(col, row, mnTab, pCell);
     124           0 : }
     125             : 
     126           0 : void ScOrcusSheet::set_formula_result(row_t row, col_t col, const char* p, size_t n)
     127             : {
     128             :     ScBaseCell* pCell;
     129           0 :     mrDoc.GetCell( col, row, mnTab, pCell );
     130           0 :     if(!pCell || pCell->GetCellType() != CELLTYPE_FORMULA)
     131             :     {
     132             :         SAL_WARN("sc", "trying to set formula result for non formula \
     133             :                 cell! Col: " << col << ";Row: " << row << ";Tab: " << mnTab);
     134           0 :         return;
     135             :     }
     136           0 :     OUString aResult( p, n, RTL_TEXTENCODING_UTF8);
     137           0 :     static_cast<ScFormulaCell*>(pCell)->SetHybridString(aResult);
     138             : }
     139             : 
     140           0 : void ScOrcusSheet::set_shared_formula(
     141             :     row_t row, col_t col, formula_grammar_t grammar, size_t sindex,
     142             :     const char* p_formula, size_t n_formula)
     143             : {
     144           0 :     OUString aFormula( p_formula, n_formula, RTL_TEXTENCODING_UTF8 );
     145           0 :     formula::FormulaGrammar::Grammar eGrammar =  getCalcGrammarFromOrcus( grammar );
     146           0 :     ScRangeName* pRangeName = mrDoc.GetRangeName();
     147             : 
     148           0 :     OUString aName("shared_");
     149           0 :     aName += OUString::valueOf(sal_Int32(pRangeName->size()));
     150           0 :     ScRangeData* pSharedFormula = new ScRangeData( &mrDoc, aName, aFormula, ScAddress(col, row, mnTab), RT_SHARED, eGrammar);
     151           0 :     if(pRangeName->insert(pSharedFormula))
     152             :     {
     153           0 :         maSharedFormulas.insert( std::pair<size_t, ScRangeData*>(sindex, pSharedFormula) );
     154           0 :         ScTokenArray aArr;
     155           0 :         aArr.AddToken( formula::FormulaIndexToken( ocName, pSharedFormula->GetIndex() ) );
     156           0 :         ScFormulaCell* pCell = new ScFormulaCell( &mrDoc, ScAddress( row, col, mnTab ), &aArr );
     157           0 :         mrDoc.PutCell( col, row, mnTab, pCell );
     158           0 :     }
     159           0 : }
     160             : 
     161           0 : void ScOrcusSheet::set_shared_formula(
     162             :     row_t row, col_t col, formula_grammar_t grammar, size_t sindex,
     163             :     const char* p_formula, size_t n_formula, const char* /*p_range*/, size_t /*n_range*/)
     164             : {
     165           0 :     OUString aFormula( p_formula, n_formula, RTL_TEXTENCODING_UTF8 );
     166           0 :     formula::FormulaGrammar::Grammar eGrammar = getCalcGrammarFromOrcus( grammar );
     167           0 :     ScRangeName* pRangeName = mrDoc.GetRangeName();
     168             : 
     169           0 :     OUString aName("shared_");
     170           0 :     aName += OUString::valueOf(sal_Int32(pRangeName->size()));
     171           0 :     ScRangeData* pSharedFormula = new ScRangeData( &mrDoc, aName, aFormula, ScAddress(col, row, mnTab), RT_SHARED, eGrammar);
     172           0 :     if(pRangeName->insert(pSharedFormula))
     173             :     {
     174           0 :         maSharedFormulas.insert( std::pair<size_t, ScRangeData*>(sindex, pSharedFormula) );
     175           0 :         ScTokenArray aArr;
     176           0 :         aArr.AddToken( formula::FormulaIndexToken( ocName, pSharedFormula->GetIndex() ) );
     177           0 :         ScFormulaCell* pCell = new ScFormulaCell( &mrDoc, ScAddress( row, col, mnTab ), &aArr );
     178           0 :         mrDoc.PutCell( col, row, mnTab, pCell );
     179           0 :     }
     180           0 : }
     181             : 
     182           0 : void ScOrcusSheet::set_shared_formula(row_t row, col_t col, size_t sindex)
     183             : {
     184           0 :     if(maSharedFormulas.find(sindex) == maSharedFormulas.end())
     185           0 :         return;
     186             : 
     187           0 :     ScRangeData* pSharedFormula = maSharedFormulas.find(sindex)->second;
     188           0 :     ScTokenArray aArr;
     189           0 :     aArr.AddToken( formula::FormulaIndexToken( ocName, pSharedFormula->GetIndex() ) );
     190           0 :     ScFormulaCell* pCell = new ScFormulaCell( &mrDoc, ScAddress( row, col, mnTab ), &aArr );
     191           0 :     mrDoc.PutCell( col, row, mnTab, pCell );
     192             : }
     193             : 
     194           0 : void ScOrcusSheet::set_string(row_t row, col_t col, size_t sindex)
     195             : {
     196             :     // Calc does not yet support shared strings so we have to
     197             :     // workaround by importing shared strings into a temporary
     198             :     // shared string container and writing into calc model as
     199             :     // normal string
     200             : 
     201           0 :     const OUString& rSharedString = mrSharedStrings.getByIndex(sindex);
     202           0 :     ScBaseCell* pCell = ScBaseCell::CreateTextCell( rSharedString, &mrDoc );
     203           0 :     mrDoc.PutCell(col, row, mnTab, pCell);
     204           0 : }
     205             : 
     206           0 : void ScOrcusSheet::set_value(row_t row, col_t col, double value)
     207             : {
     208           0 :     mrDoc.SetValue( col, row, mnTab, value );
     209           0 : }
     210             : 
     211           0 : size_t ScOrcusSharedStrings::append(const char* s, size_t n)
     212             : {
     213           0 :     OUString aNewString(s, n, RTL_TEXTENCODING_UTF8);
     214           0 :     maSharedStrings.push_back(aNewString);
     215             : 
     216           0 :     return maSharedStrings.size() - 1;
     217             : }
     218             : 
     219           0 : size_t ScOrcusSharedStrings::add(const char* s, size_t n)
     220             : {
     221           0 :     OUString aNewString(s, n, RTL_TEXTENCODING_UTF8);
     222           0 :     maSharedStrings.push_back(aNewString);
     223             : 
     224           0 :     return maSharedStrings.size() - 1;
     225             : }
     226             : 
     227           0 : const OUString& ScOrcusSharedStrings::getByIndex(size_t nIndex) const
     228             : {
     229           0 :     if(nIndex < maSharedStrings.size())
     230           0 :         return maSharedStrings[nIndex];
     231             : 
     232           0 :     throw std::exception();
     233             : }
     234             : 
     235           0 : void ScOrcusSharedStrings::set_segment_bold(bool /*b*/)
     236             : {
     237           0 : }
     238           0 : void ScOrcusSharedStrings::set_segment_italic(bool /*b*/)
     239             : {
     240           0 : }
     241           0 : void ScOrcusSharedStrings::set_segment_font_name(const char* /*s*/, size_t /*n*/)
     242             : {
     243           0 : }
     244           0 : void ScOrcusSharedStrings::set_segment_font_size(double /*point*/)
     245             : {
     246           0 : }
     247           0 : void ScOrcusSharedStrings::append_segment(const char* /*s*/, size_t /*n*/)
     248             : {
     249           0 : }
     250             : 
     251           0 : size_t ScOrcusSharedStrings::commit_segments()
     252             : {
     253           0 :     return 0;
     254             : }
     255             : 
     256           0 : void ScOrcusStyles::set_font_count(size_t /*n*/)
     257             : {
     258             :     // needed at all?
     259           0 : }
     260             : 
     261           0 : void ScOrcusStyles::set_font_bold(bool /*b*/)
     262             : {
     263           0 : }
     264             : 
     265           0 : void ScOrcusStyles::set_font_italic(bool /*b*/)
     266             : {
     267           0 : }
     268             : 
     269           0 : void ScOrcusStyles::set_font_name(const char* /*s*/, size_t /*n*/)
     270             : {
     271           0 : }
     272             : 
     273           0 : void ScOrcusStyles::set_font_size(double /*point*/)
     274             : {
     275           0 : }
     276             : 
     277           0 : void ScOrcusStyles::set_font_underline(orcus::spreadsheet::underline_t /*e*/)
     278             : {
     279           0 : }
     280             : 
     281           0 : size_t ScOrcusStyles::commit_font()
     282             : {
     283           0 :     return 0;
     284             : }
     285             : 
     286             : 
     287             : // fill
     288             : 
     289           0 : void ScOrcusStyles::set_fill_count(size_t /*n*/)
     290             : {
     291             :     // needed at all?
     292           0 : }
     293             : 
     294           0 : void ScOrcusStyles::set_fill_pattern_type(const char* /*s*/, size_t /*n*/)
     295             : {
     296           0 : }
     297             : 
     298           0 : void ScOrcusStyles::set_fill_fg_color(orcus::spreadsheet::color_elem_t /*alpha*/, orcus::spreadsheet::color_elem_t /*red*/, orcus::spreadsheet::color_elem_t /*green*/, orcus::spreadsheet::color_elem_t /*blue*/)
     299             : {
     300           0 : }
     301             : 
     302           0 : void ScOrcusStyles::set_fill_bg_color(orcus::spreadsheet::color_elem_t /*alpha*/, orcus::spreadsheet::color_elem_t /*red*/, orcus::spreadsheet::color_elem_t /*green*/, orcus::spreadsheet::color_elem_t /*blue*/)
     303             : {
     304           0 : }
     305             : 
     306           0 : size_t ScOrcusStyles::commit_fill()
     307             : {
     308           0 :     return 0;
     309             : }
     310             : 
     311             : 
     312             : // border
     313             : 
     314           0 : void ScOrcusStyles::set_border_count(size_t /*n*/)
     315             : {
     316             :     // needed at all?
     317           0 : }
     318             : 
     319           0 : void ScOrcusStyles::set_border_style(orcus::spreadsheet::border_direction_t /*dir*/, const char* /*s*/, size_t /*n*/)
     320             : {
     321             :     // implement later
     322           0 : }
     323             : 
     324           0 : size_t ScOrcusStyles::commit_border()
     325             : {
     326           0 :     return 0;
     327             : }
     328             : 
     329             : 
     330             : // cell protection
     331           0 : void ScOrcusStyles::set_cell_hidden(bool /*b*/)
     332             : {
     333           0 : }
     334             : 
     335           0 : void ScOrcusStyles::set_cell_locked(bool /*b*/)
     336             : {
     337           0 : }
     338             : 
     339           0 : size_t ScOrcusStyles::commit_cell_protection()
     340             : {
     341           0 :     return 0;
     342             : }
     343             : 
     344             : 
     345             : // cell style xf
     346             : 
     347           0 : void ScOrcusStyles::set_cell_style_xf_count(size_t /*n*/)
     348             : {
     349             :     // needed at all?
     350           0 : }
     351             : 
     352           0 : size_t ScOrcusStyles::commit_cell_style_xf()
     353             : {
     354           0 :     return 0;
     355             : }
     356             : 
     357             : 
     358             : // cell xf
     359             : 
     360           0 : void ScOrcusStyles::set_cell_xf_count(size_t /*n*/)
     361             : {
     362             :     // needed at all?
     363           0 : }
     364             : 
     365           0 : size_t ScOrcusStyles::commit_cell_xf()
     366             : {
     367           0 :     return 0;
     368             : }
     369             : 
     370             : 
     371             : // xf (cell format) - used both by cell xf and cell style xf.
     372             : 
     373           0 : void ScOrcusStyles::set_xf_number_format(size_t /*index*/)
     374             : {
     375             :     // no number format interfaces implemented yet
     376           0 : }
     377             : 
     378           0 : void ScOrcusStyles::set_xf_font(size_t /*index*/)
     379             : {
     380           0 : }
     381             : 
     382           0 : void ScOrcusStyles::set_xf_fill(size_t /*index*/)
     383             : {
     384           0 : }
     385             : 
     386           0 : void ScOrcusStyles::set_xf_border(size_t /*index*/)
     387             : {
     388           0 : }
     389             : 
     390           0 : void ScOrcusStyles::set_xf_protection(size_t /*index*/)
     391             : {
     392           0 : }
     393             : 
     394           0 : void ScOrcusStyles::set_xf_style_xf(size_t /*index*/)
     395             : {
     396           0 : }
     397             : 
     398             : 
     399             : // cell style entry
     400             : // not needed for now for gnumeric
     401             : 
     402           0 : void ScOrcusStyles::set_cell_style_count(size_t /*n*/)
     403             : {
     404             :     // needed at all?
     405           0 : }
     406             : 
     407           0 : void ScOrcusStyles::set_cell_style_name(const char* /*s*/, size_t /*n*/)
     408             : {
     409           0 : }
     410             : 
     411           0 : void ScOrcusStyles::set_cell_style_xf(size_t /*index*/)
     412             : {
     413           0 : }
     414             : 
     415           0 : void ScOrcusStyles::set_cell_style_builtin(size_t /*index*/)
     416             : {
     417             :     // not needed for gnumeric
     418           0 : }
     419             : 
     420           0 : size_t ScOrcusStyles::commit_cell_style()
     421             : {
     422           0 :     return 0;
     423             : }
     424             : 
     425             : 
     426             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10