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 
11 #ifndef INCLUDED_SC_SOURCE_UI_INC_STATISTICSINPUTOUTPUTDIALOG_HXX
12 #define INCLUDED_SC_SOURCE_UI_INC_STATISTICSINPUTOUTPUTDIALOG_HXX
13 
14 #include <address.hxx>
15 #include "anyrefdg.hxx"
16 #include "viewdata.hxx"
17 
18 class ScStatisticsInputOutputDialog : public ScAnyRefDlgController
19 {
20 public:
21     enum GroupedBy {
22         BY_COLUMN,
23         BY_ROW
24     };
25 
26     ScStatisticsInputOutputDialog(
27         SfxBindings* pB, SfxChildWindow* pCW,
28         weld::Window* pParent, ScViewData* pViewData,
29         const OUString& rUIXMLDescription,
30         const OString& rID);
31 
32     virtual ~ScStatisticsInputOutputDialog() override;
33 
34     virtual void        SetReference( const ScRange& rRef, ScDocument* pDoc ) override;
35     virtual void        SetActive() override;
36 
37 protected:
38     void CalculateInputAndWriteToOutput();
39 
40     virtual ScRange ApplyOutput(ScDocShell* pDocShell) = 0;
41     virtual const char* GetUndoNameId() = 0;
42     virtual bool InputRangesValid();
43     void ValidateDialogInput();
44 
45     // Widgets
46     std::unique_ptr<weld::Label> mxInputRangeLabel;
47     std::unique_ptr<formula::RefEdit> mxInputRangeEdit;
48     std::unique_ptr<formula::RefButton> mxInputRangeButton;
49 
50     std::unique_ptr<weld::Label> mxOutputRangeLabel;
51     std::unique_ptr<formula::RefEdit> mxOutputRangeEdit;
52     std::unique_ptr<formula::RefButton> mxOutputRangeButton;
53 
54     std::unique_ptr<weld::RadioButton> mxGroupByColumnsRadio;
55     std::unique_ptr<weld::RadioButton> mxGroupByRowsRadio;
56 
57     // Data
58     ScViewData* const         mViewData;
59     ScDocument* const         mDocument;
60 
61     ScRange                   mInputRange;
62     ScAddress::Details const  mAddressDetails;
63     ScAddress                 mOutputAddress;
64     GroupedBy                 mGroupedBy;
65 
66     static ScRangeList MakeColumnRangeList(SCTAB aTab, ScAddress const & aStart, ScAddress const & aEnd);
67     static ScRangeList MakeRowRangeList(SCTAB aTab, ScAddress const & aStart, ScAddress const & aEnd);
68 
69 private:
70     // Widgets
71     std::unique_ptr<weld::Button>       mxButtonOk;
72 
73     formula::RefEdit*      mpActiveEdit;
74     ScAddress const            mCurrentAddress;
75     bool                       mDialogLostFocus;
76 
77     void Init();
78     void GetRangeFromSelection();
79 
80     DECL_LINK( GroupByChanged, weld::ToggleButton&, void );
81     DECL_LINK( OkClicked, weld::Button&, void );
82     DECL_LINK( GetEditFocusHandler,  formula::RefEdit&, void );
83     DECL_LINK( GetButtonFocusHandler,  formula::RefButton&, void );
84     DECL_LINK( LoseEditFocusHandler, formula::RefEdit&, void );
85     DECL_LINK( LoseButtonFocusHandler, formula::RefButton&, void );
86     DECL_LINK( RefInputModifyHandler, formula::RefEdit&, void );
87 };
88 
89 
90 #endif
91 
92 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
93