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 : * This file incorporates work covered by the following license notice:
28 : *
29 : * Licensed to the Apache Software Foundation (ASF) under one or more
30 : * contributor license agreements. See the NOTICE file distributed
31 : * with this work for additional information regarding copyright
32 : * ownership. The ASF licenses this file to you under the Apache
33 : * License, Version 2.0 (the "License"); you may not use this file
34 : * except in compliance with the License. You may obtain a copy of
35 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
36 : ************************************************************************/
37 :
38 : #ifndef SC_PVLAYDLG_HXX
39 : #define SC_PVLAYDLG_HXX
40 :
41 : #include <config_lgpl.h>
42 :
43 : #include <memory>
44 : #include <vector>
45 :
46 : #include <boost/ptr_container/ptr_vector.hpp>
47 : #include <boost/scoped_ptr.hpp>
48 :
49 : #include <formula/funcutl.hxx>
50 : #include <svtools/stdctrl.hxx>
51 : #include <vcl/lstbox.hxx>
52 : #include <vcl/morebtn.hxx>
53 : #include <vcl/scrbar.hxx>
54 :
55 : #include "anyrefdg.hxx"
56 : #include "fieldwnd.hxx"
57 :
58 : /*==========================================================================*\
59 :
60 : An instance of the class ScPivotLayoutDlg is a (semi-)modal dialog
61 : that can be associated to the mouse fields with column headings of
62 : the three pivot categories "column", "row" and "data".
63 :
64 : The dialog receives information about these headers (name,
65 : type (number/string) and function mask) in the label data structure
66 : Furthermore, three pivot field arrays are passed on, with which the three
67 : category windows are initialized. A window class is represented by an
68 : instance of class FieldWindow. Such a window is responsible for the
69 : representation of data structures on the screen. It reports on mouse
70 : actions in the dialogue and provides appropriate methods for
71 : changing the representation. The dialogue provides the adjustment of the
72 : internal data structures with respect to the representation on the screen.
73 : Another FieldWindow(Select) provides all table headers for selection,
74 : is thus "read only".
75 :
76 : \*==========================================================================*/
77 :
78 : class ScViewData;
79 : class ScDocument;
80 : struct ScPivotFuncData;
81 : class ScDPObject;
82 :
83 : class ScPivotLayoutDlg : public ScAnyRefDlg
84 : {
85 : /** data source type */
86 : enum DataSrcType {
87 : SRC_REF, /// range reference
88 : SRC_NAME, /// range name
89 : SRC_INVALID /// invalid range
90 : };
91 : public:
92 : ScPivotLayoutDlg(
93 : SfxBindings* pB,
94 : SfxChildWindow* pCW,
95 : Window* pParent,
96 : const ScDPObject& rDPObject,
97 : bool bNewOutput );
98 : virtual ~ScPivotLayoutDlg();
99 :
100 : void NotifyDoubleClick ( ScPivotFieldType eType, size_t nFieldIndex );
101 : PointerStyle NotifyMouseButtonDown( ScPivotFieldType eType, size_t nFieldIndex );
102 : void NotifyFieldFocus ( ScPivotFieldType eType, bool bGotFocus );
103 : void NotifyMoveFieldToEnd ( ScPivotFieldType eToType );
104 : void NotifyRemoveField ( ScPivotFieldType eType, size_t nFieldIndex );
105 :
106 : Size GetStdFieldBtnSize() const;
107 :
108 : /**
109 : * Drop currently dragged field item into specified position.
110 : *
111 : * @param rScrPos screen position of mouse cursor.
112 : * @param eToType type of field at mouse cursor position.
113 : */
114 : void DropFieldItem( const Point& rScrPos, ScPivotFieldType eToType );
115 :
116 : /**
117 : * Get pointer style at current mouse position during dragging of field
118 : * item.
119 : */
120 : PointerStyle GetPointerStyleAtPoint( const Point& rScrPos, ScPivotFieldType eFieldType );
121 :
122 : /**
123 : * Determine the type of field at mouse cursor position.
124 : *
125 : * @param rScrPos mouse cursor position (screen position).
126 : */
127 : ScPivotFieldType GetFieldTypeAtPoint( const Point& rScrPos ) const;
128 :
129 : protected:
130 : virtual void Deactivate();
131 : virtual void SetReference( const ScRange& rRef, ScDocument* pDoc );
132 : virtual sal_Bool IsRefInputMode() const;
133 : virtual void SetActive();
134 : virtual sal_Bool Close();
135 :
136 : private:
137 : /** Returns the localized function name for the specified (1-based) resource index. */
138 0 : inline const OUString& GetFuncName( sal_uInt16 nFuncIdx ) const { return maFuncNames[nFuncIdx-1]; }
139 :
140 : /** Fills the field windows from the current pivot table settings. */
141 : void InitFieldWindows();
142 : /** Sets focus to the specified field control, if it is not empty. */
143 : void GrabFieldFocus( ScDPFieldControlBase& rFieldWindow );
144 :
145 : void InitWndSelect(const ScDPLabelDataVector& rLabels);
146 : void InitWndData(const std::vector<ScPivotField>& rFields);
147 : void InitFieldWindow ( const ::std::vector<ScPivotField>& rFields, ScPivotFieldType eType );
148 : void AdjustDlgSize();
149 : ScDPLabelData* GetLabelData( SCCOL nCol );
150 : OUString GetLabelString(SCsCOL nCol);
151 : bool IsOrientationAllowed( SCsCOL nCol, ScPivotFieldType eType );
152 : OUString GetFuncString( sal_uInt16& rFuncMask, bool bIsValue = true );
153 :
154 : void AddField ( size_t nFromIndex,
155 : ScPivotFieldType eToType, const Point& rAtPos );
156 : void AppendField(size_t nFromIndex, ScPivotFieldType eToType);
157 : void MoveField ( ScPivotFieldType eFromType, size_t nFromIndex,
158 : ScPivotFieldType eToType, const Point& rAtPos );
159 : void MoveFieldToEnd(ScPivotFieldType eFromType, size_t nFromIndex, ScPivotFieldType eToType);
160 : void RemoveField ( ScPivotFieldType eRemType, size_t nRemIndex );
161 :
162 : bool GetPivotArrays( ::std::vector<ScPivotField>& rPageFields,
163 : ::std::vector<ScPivotField>& rColFields,
164 : ::std::vector<ScPivotField>& rRowFields,
165 : ::std::vector<ScPivotField>& rDataFields );
166 :
167 : void UpdateSrcRange();
168 : void UpdateOutputPos();
169 : void OutputPosUpdated();
170 : void MoreBtnClicked();
171 :
172 : void RepaintFieldWindows();
173 :
174 : /**
175 : * Initialize control sizes and the dialog size which depends on them.
176 : */
177 : void InitControlAndDlgSizes();
178 :
179 : ScDPFieldControlBase* GetFieldWindow(ScPivotFieldType eType);
180 :
181 : /**
182 : * Get pointers to field windows that are <b>not</b> the window of
183 : * specified type. The select window type is not included.
184 : */
185 : void GetOtherFieldWindows(
186 : ScPivotFieldType eType, ScDPFieldControlBase*& rpWnd1, ScDPFieldControlBase*& rpWnd2);
187 :
188 : // Handler
189 : DECL_LINK( ClickHdl, PushButton * );
190 : DECL_LINK( OkHdl, void * );
191 : DECL_LINK( CancelHdl, void * );
192 : DECL_LINK( MoreClickHdl, void * );
193 : DECL_LINK( EdOutModifyHdl, void * );
194 : DECL_LINK( EdInModifyHdl, void * );
195 : DECL_LINK( SelAreaHdl, void * );
196 : DECL_LINK( GetRefEditFocusHdl, formula::RefEdit* );
197 :
198 : private:
199 : typedef boost::scoped_ptr<ScDPObject> ScDPObjectPtr;
200 :
201 : FixedLine maFlLayout;
202 : FixedText maFtPage;
203 : ScDPPageFieldControl maWndPage;
204 : FixedText maFtCol;
205 : ScDPColFieldControl maWndCol;
206 : FixedText maFtRow;
207 : ScDPRowFieldControl maWndRow;
208 : FixedText maFtData;
209 : ScDPDataFieldControl maWndData;
210 : ScDPSelectFieldControl maWndSelect;
211 : FixedInfo maFtInfo;
212 :
213 : std::vector<ScDPFieldControlBase*> maFieldCtrls;
214 :
215 : FixedLine maFlAreas;
216 : FixedText maFtInArea;
217 : ::formula::RefEdit maEdInPos;
218 : ::formula::RefButton maRbInPos;
219 : ListBox maLbOutPos;
220 : FixedText maFtOutArea;
221 : formula::RefEdit maEdOutPos;
222 : formula::RefButton maRbOutPos;
223 : CheckBox maBtnIgnEmptyRows;
224 : CheckBox maBtnDetectCat;
225 : CheckBox maBtnTotalCol;
226 : CheckBox maBtnTotalRow;
227 : CheckBox maBtnFilter;
228 : CheckBox maBtnDrillDown;
229 :
230 : OKButton maBtnOk;
231 : CancelButton maBtnCancel;
232 : HelpButton maBtnHelp;
233 : PushButton maBtnRemove;
234 : PushButton maBtnOptions;
235 : MoreButton maBtnMore;
236 : std::vector<OUString> maFuncNames; /// Localized function names from resource.
237 : boost::ptr_vector<OUString> maRefStrs; /// Reference strings stored with the output list box.
238 : ScDPObjectPtr mxDlgDPObject; /// Clone of the pivot table object this dialog is based on.
239 : ScPivotParam maPivotData; /// The pivot table field configuration.
240 : ScDPLabelDataVector maLabelData; /// Information about all dimensions.
241 :
242 : ScViewData* mpViewData;
243 : ScDocument* mpDoc;
244 : formula::RefEdit* mpRefInputEdit;
245 :
246 : const OUString maStrUndefined;
247 : const OUString maStrNewTable;
248 : OUString maOutputRefStr; /// Used only for caching in UI.
249 :
250 : ScPivotFieldType meDnDFromType;
251 : size_t mnDnDFromIndex;
252 : bool mbIsDrag;
253 :
254 : ScPivotFieldType meLastActiveType; /// Type of last active area.
255 : size_t mnOffset; /// Offset of first field in TYPE_SELECT area.
256 :
257 : ScRange maOldRange;
258 : bool mbRefInputMode;
259 : };
260 :
261 :
262 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
263 :
264 : #endif
|