Branch data Line data Source code
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 : :
29 : : #ifndef SC_DPGROUP_HXX
30 : : #define SC_DPGROUP_HXX
31 : :
32 : : #include <vector>
33 : : #include <boost/unordered_set.hpp>
34 : : #include <boost/shared_ptr.hpp>
35 : :
36 : : #include "dptabdat.hxx"
37 : : #include "scdllapi.h"
38 : : #include "dpitemdata.hxx"
39 : : #include "dpnumgroupinfo.hxx"
40 : :
41 : : class ScDocument;
42 : :
43 : : typedef ::std::vector<ScDPItemData> ScDPItemDataVec;
44 : :
45 [ + - ]: 45 : class ScDPGroupItem
46 : : {
47 : : ScDPItemData aGroupName; // name of group item
48 : : ScDPItemDataVec aElements; // names of items in original dimension
49 : :
50 : : public:
51 : : ScDPGroupItem( const ScDPItemData& rName );
52 : : ~ScDPGroupItem();
53 : :
54 : : void AddElement( const ScDPItemData& rName );
55 : :
56 : 89 : const ScDPItemData& GetName() const { return aGroupName; }
57 : : bool HasElement( const ScDPItemData& rData ) const;
58 : : bool HasCommonElement( const ScDPGroupItem& rOther ) const;
59 : :
60 : : void FillGroupFilter( ScDPCacheTable::GroupFilter& rFilter ) const;
61 : : };
62 : :
63 : : typedef ::std::vector<ScDPGroupItem> ScDPGroupItemVec;
64 : :
65 : : class ScDPGroupDimension
66 : : {
67 : : long nSourceDim;
68 : : long nGroupDim;
69 : : rtl::OUString aGroupName;
70 : : ScDPGroupItemVec aItems;
71 : : mutable std::vector<SCROW> maMemberEntries;
72 : : bool mbDateDimension;
73 : : public:
74 : : ScDPGroupDimension( long nSource, const String& rNewName );
75 : : ScDPGroupDimension( const ScDPGroupDimension& rOther );
76 : : ~ScDPGroupDimension();
77 : :
78 : : ScDPGroupDimension& operator=( const ScDPGroupDimension& rOther );
79 : :
80 : : void AddItem( const ScDPGroupItem& rItem );
81 : : void SetGroupDim( long nDim ); // called from AddGroupDimension
82 : :
83 : 1080 : long GetSourceDim() const { return nSourceDim; }
84 : 731 : long GetGroupDim() const { return nGroupDim; }
85 : 573 : const rtl::OUString& GetName() const { return aGroupName; }
86 : :
87 : : const std::vector< SCROW >& GetColumnEntries( const ScDPCacheTable& rCacheTable ) const;
88 : : const ScDPGroupItem* GetGroupForData( const ScDPItemData& rData ) const; // rData = entry in original dim.
89 : : const ScDPGroupItem* GetGroupForName( const ScDPItemData& rName ) const; // rName = entry in group dim.
90 : : const ScDPGroupItem* GetGroupByIndex( size_t nIndex ) const;
91 : :
92 : : void DisposeData();
93 : :
94 : 0 : size_t GetItemCount() const { return aItems.size(); }
95 : :
96 : : void SetDateDimension();
97 : : bool IsDateDimension() const;
98 : : };
99 : :
100 : : typedef ::std::vector<ScDPGroupDimension> ScDPGroupDimensionVec;
101 : :
102 : : class SC_DLLPUBLIC ScDPNumGroupDimension
103 : : {
104 : : mutable ScDPNumGroupInfo aGroupInfo; // settings
105 : : mutable std::vector<SCROW> maMemberEntries;
106 : : bool mbDateDimension;
107 : :
108 : : public:
109 : : ScDPNumGroupDimension();
110 : : ScDPNumGroupDimension( const ScDPNumGroupInfo& rInfo );
111 : : ScDPNumGroupDimension( const ScDPNumGroupDimension& rOther );
112 : : ~ScDPNumGroupDimension();
113 : :
114 : : ScDPNumGroupDimension& operator=( const ScDPNumGroupDimension& rOther );
115 : :
116 : 530 : const ScDPNumGroupInfo& GetInfo() const { return aGroupInfo; }
117 : :
118 : : const std::vector<SCROW>& GetNumEntries(SCCOL nSourceDim, const ScDPCache* pCache) const;
119 : :
120 : : void SetDateDimension();
121 : :
122 : : void DisposeData();
123 : :
124 : : bool IsDateDimension() const;
125 : : };
126 : :
127 : : //
128 : : // proxy implementation of ScDPTableData to add grouped items
129 : : //
130 : :
131 : : class ScDPGroupTableData : public ScDPTableData
132 : : {
133 : : typedef ::boost::unordered_set< ::rtl::OUString, ::rtl::OUStringHash, ::std::equal_to< ::rtl::OUString > > StringHashSet;
134 : :
135 : : ::boost::shared_ptr<ScDPTableData> pSourceData;
136 : : long nSourceCount;
137 : : ScDPGroupDimensionVec aGroups;
138 : : ScDPNumGroupDimension* pNumGroups; // array[nSourceCount]
139 : : ScDocument* pDoc;
140 : : StringHashSet aGroupNames;
141 : :
142 : : void FillGroupValues(std::vector<SCROW>& rItems, const std::vector<long>& rDims);
143 : : virtual long GetSourceDim( long nDim );
144 : :
145 : : bool IsNumGroupDimension( long nDimension ) const;
146 : : void GetNumGroupInfo(long nDimension, ScDPNumGroupInfo& rInfo);
147 : :
148 : : void ModifyFilterCriteria(::std::vector<ScDPCacheTable::Criterion>& rCriteria);
149 : :
150 : : public:
151 : : // takes ownership of pSource
152 : : ScDPGroupTableData( const ::boost::shared_ptr<ScDPTableData>& pSource, ScDocument* pDocument );
153 : : virtual ~ScDPGroupTableData();
154 : :
155 : : boost::shared_ptr<ScDPTableData> GetSourceTableData();
156 : :
157 : : void AddGroupDimension( const ScDPGroupDimension& rGroup );
158 : : void SetNumGroupDimension( long nIndex, const ScDPNumGroupDimension& rGroup );
159 : : long GetDimensionIndex( const rtl::OUString& rName );
160 : :
161 : : ScDocument* GetDocument() { return pDoc; }
162 : :
163 : : virtual long GetColumnCount();
164 : : virtual long GetMembersCount( long nDim );
165 : : virtual const std::vector< SCROW >& GetColumnEntries( long nColumn ) ;
166 : : virtual const ScDPItemData* GetMemberById( long nDim, long nId);
167 : : virtual long Compare( long nDim, long nDataId1, long nDataId2);
168 : :
169 : : virtual rtl::OUString getDimensionName(long nColumn);
170 : : virtual sal_Bool getIsDataLayoutDimension(long nColumn);
171 : : virtual sal_Bool IsDateDimension(long nDim);
172 : : virtual sal_uLong GetNumberFormat(long nDim);
173 : : virtual void DisposeData();
174 : : virtual void SetEmptyFlags( sal_Bool bIgnoreEmptyRows, sal_Bool bRepeatIfEmpty );
175 : :
176 : : virtual bool IsRepeatIfEmpty();
177 : :
178 : : virtual void CreateCacheTable();
179 : : virtual void FilterCacheTable(const ::std::vector<ScDPCacheTable::Criterion>& rCriteria, const ::boost::unordered_set<sal_Int32>& rDataDims);
180 : : virtual void GetDrillDownData(const ::std::vector<ScDPCacheTable::Criterion>& rCriteria,
181 : : const ::boost::unordered_set<sal_Int32>& rCatDims,
182 : : ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any > >& rData);
183 : : virtual void CalcResults(CalcInfo& rInfo, bool bAutoShow);
184 : : virtual const ScDPCacheTable& GetCacheTable() const;
185 : : virtual void ReloadCacheTable();
186 : :
187 : : virtual sal_Bool IsBaseForGroup(long nDim) const;
188 : : virtual long GetGroupBase(long nGroupDim) const;
189 : : virtual sal_Bool IsNumOrDateGroup(long nDim) const;
190 : : virtual sal_Bool IsInGroup( const ScDPItemData& rGroupData, long nGroupIndex,
191 : : const ScDPItemData& rBaseData, long nBaseIndex ) const;
192 : : virtual sal_Bool HasCommonElement( const ScDPItemData& rFirstData, long nFirstIndex,
193 : : const ScDPItemData& rSecondData, long nSecondIndex ) const;
194 : :
195 : : #if DEBUG_PIVOT_TABLE
196 : : virtual void Dump() const;
197 : : #endif
198 : : };
199 : :
200 : :
201 : : #endif
202 : :
203 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|