summaryrefslogtreecommitdiff
path: root/sc/inc/dpcachetable.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'sc/inc/dpcachetable.hxx')
-rw-r--r--sc/inc/dpcachetable.hxx205
1 files changed, 205 insertions, 0 deletions
diff --git a/sc/inc/dpcachetable.hxx b/sc/inc/dpcachetable.hxx
new file mode 100644
index 000000000000..9c6353d0b51a
--- /dev/null
+++ b/sc/inc/dpcachetable.hxx
@@ -0,0 +1,205 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef SC_DPCACHETABLE_HXX
+#define SC_DPCACHETABLE_HXX
+
+#include "sal/types.h"
+#include "osl/mutex.hxx"
+#include "global.hxx"
+#include "collect.hxx"
+
+#include <vector>
+#include <boost/unordered_set.hpp>
+#include <boost/shared_ptr.hpp>
+#include <com/sun/star/uno/Reference.hxx>
+
+namespace com { namespace sun { namespace star {
+ namespace sdbc {
+ class XRowSet;
+ }
+ namespace sheet {
+ struct DataPilotFieldFilter;
+ }
+}}}
+
+class Date;
+class ScDPItemData;
+class ScDPCache;
+class ScDocument;
+class ScRange;
+struct ScDPValueData;
+struct ScQueryParam;
+
+class SC_DLLPUBLIC ScDPCacheTable
+{
+ struct RowFlag
+ {
+ bool mbShowByFilter:1;
+ bool mbShowByPage:1;
+ bool isActive() const;
+ RowFlag();
+ };
+public:
+ /** individual filter item used in SingleFilter and GroupFilter. */
+ struct FilterItem
+ {
+ String maString;
+ double mfValue;
+ bool mbHasValue;
+
+ FilterItem();
+ bool match( const ScDPItemData& rCellData ) const;
+ };
+
+ /** interface class used for filtering of rows. */
+ class FilterBase
+ {
+ public:
+ /** returns true if the matching condition is met for a single cell
+ value, or false otherwise. */
+ virtual bool match( const ScDPItemData& rCellData ) const = 0;
+ };
+
+ /** ordinary single-item filter. */
+ class SingleFilter : public FilterBase
+ {
+ public:
+ explicit SingleFilter(String aString, double fValue, bool bHasValue);
+ virtual ~SingleFilter() {}
+
+ virtual bool match(const ScDPItemData& rCellData) const;
+
+ const String& getMatchString();
+ double getMatchValue() const;
+ bool hasValue() const;
+
+ private:
+ explicit SingleFilter();
+
+ FilterItem maItem;
+ };
+
+ /** multi-item (group) filter. */
+ class GroupFilter : public FilterBase
+ {
+ public:
+ GroupFilter();
+ virtual ~GroupFilter() {}
+ virtual bool match( const ScDPItemData& rCellData ) const;
+ void addMatchItem(const String& rStr, double fVal, bool bHasValue);
+ size_t getMatchItemCount() const;
+
+ private:
+ ::std::vector<FilterItem> maItems;
+ };
+
+ /** single filtering criterion. */
+ struct Criterion
+ {
+ sal_Int32 mnFieldIndex;
+ ::boost::shared_ptr<FilterBase> mpFilter;
+
+ Criterion();
+ };
+
+ ScDPCacheTable(const ScDPCache* pCache);
+ ~ScDPCacheTable();
+
+ sal_Int32 getRowSize() const;
+ sal_Int32 getColSize() const;
+
+ const ScDPCache* getCache() const;
+
+ /** Fill the internal table from the cell range provided. This function
+ assumes that the first row is the column header. */
+ void fillTable( const ScQueryParam& rQuery, bool* pSpecial,
+ bool bIgnoreEmptyRows, bool bRepeatIfEmpty );
+
+ /** Fill the internal table from database connection object. This function
+ assumes that the first row is the column header. */
+ void fillTable();
+
+ /** Check whether a specified row is active or not. When a row is active,
+ it is used in calculation of the results data. A row becomes inactive
+ when it is filtered out by page field. */
+ bool isRowActive(sal_Int32 nRow) const;
+
+ /** Set filter on/off flag to each row to control visibility. The caller
+ must ensure that the table is filled before calling this function. */
+ void filterByPageDimension(const ::std::vector<Criterion>& rCriteria, const ::boost::unordered_set<sal_Int32>& rRepeatIfEmptyDims);
+
+ /** Get the cell instance at specified location within the data grid. Note
+ that the data grid doesn't include the header row. Don't delete the
+ returned object! */
+ const ScDPItemData* getCell(SCCOL nCol, SCROW nRow, bool bRepeatIfEmpty) const;
+ void getValue( ScDPValueData& rVal, SCCOL nCol, SCROW nRow, bool bRepeatIfEmpty) const;
+ String getFieldName( SCCOL nIndex) const;
+
+ /** Get the unique entries for a field specified by index. The caller must
+ make sure that the table is filled before calling function, or it will
+ get an empty collection. */
+ const ::std::vector<SCROW>& getFieldEntries( sal_Int32 nColumn ) const;
+
+ /** Filter the table based on the specified criteria, and copy the
+ result to rTabData. This method is used, for example, to generate
+ a drill-down data table. */
+ void filterTable(const ::std::vector<Criterion>& rCriteria,
+ ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any > >& rTabData,
+ const ::boost::unordered_set<sal_Int32>& rRepeatIfEmptyDims);
+
+ SCROW getOrder(long nDim, SCROW nIndex) const;
+ void clear();
+ bool empty() const;
+ void setCache(const ScDPCache* p);
+ bool hasCache() const;
+
+private:
+ ScDPCacheTable();
+ ScDPCacheTable(const ScDPCacheTable&);
+
+ /**
+ * Check if a given row meets all specified criteria.
+ *
+ * @param nRow index of row to be tested.
+ * @param rCriteria a list of criteria
+ */
+ bool isRowQualified(sal_Int32 nRow, const ::std::vector<Criterion>& rCriteria, const ::boost::unordered_set<sal_Int32>& rRepeatIfEmptyDims) const;
+
+private:
+ /** unique field entires for each field (column). */
+ ::std::vector< ::std::vector<SCROW> > maFieldEntries;
+
+ /** Row flags. The first row below the header row has the index of 0. */
+ ::std::vector<RowFlag> maRowFlags;
+
+ const ScDPCache* mpCache;
+};
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */