xref: /trunk/main/sc/source/ui/inc/optsolver.hxx (revision 38d50f7b)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #ifndef SC_OPTSOLVER_HXX
25 #define SC_OPTSOLVER_HXX
26 
27 #include "global.hxx"
28 #include "address.hxx"
29 #include "anyrefdg.hxx"
30 #include <vcl/fixed.hxx>
31 #include <vcl/group.hxx>
32 #include <vcl/lstbox.hxx>
33 #include <com/sun/star/uno/Sequence.hxx>
34 
35 #include <vector>
36 
37 namespace com { namespace sun { namespace star {
38     namespace beans { struct PropertyValue; }
39 } } }
40 
41 //============================================================================
42 
43 class ScCursorRefEdit : public formula::RefEdit
44 {
45     Link    maCursorUpLink;
46     Link    maCursorDownLink;
47 
48 public:
49             ScCursorRefEdit( ScAnyRefDlg* pParent, const ResId& rResId );
50     void    SetCursorLinks( const Link& rUp, const Link& rDown );
51 
52 protected:
53     virtual void    KeyInput( const KeyEvent& rKEvt );
54 };
55 
56 
57 /// The dialog's content for a row, not yet parsed
58 struct ScOptConditionRow
59 {
60     String  aLeftStr;
61     sal_uInt16  nOperator;
62     String  aRightStr;
63 
ScOptConditionRowScOptConditionRow64     ScOptConditionRow() : nOperator(0) {}
IsDefaultScOptConditionRow65     bool IsDefault() const { return aLeftStr.Len() == 0 && aRightStr.Len() == 0 && nOperator == 0; }
66 };
67 
68 /// All settings from the dialog, saved with the DocShell for the next call
69 class ScOptSolverSave
70 {
71     String  maObjective;
72     sal_Bool    mbMax;
73     sal_Bool    mbMin;
74     sal_Bool    mbValue;
75     String  maTarget;
76     String  maVariable;
77     std::vector<ScOptConditionRow> maConditions;
78     String  maEngine;
79     com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> maProperties;
80 
81 public:
82             ScOptSolverSave( const String& rObjective, sal_Bool bMax, sal_Bool bMin, sal_Bool bValue,
83                              const String& rTarget, const String& rVariable,
84                              const std::vector<ScOptConditionRow>& rConditions,
85                              const String& rEngine,
86                              const com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue>& rProperties );
87 
GetObjective() const88     const String&   GetObjective() const    { return maObjective; }
GetMax() const89     sal_Bool            GetMax() const          { return mbMax; }
GetMin() const90     sal_Bool            GetMin() const          { return mbMin; }
GetValue() const91     sal_Bool            GetValue() const        { return mbValue; }
GetTarget() const92     const String&   GetTarget() const       { return maTarget; }
GetVariable() const93     const String&   GetVariable() const     { return maVariable; }
GetConditions() const94     const std::vector<ScOptConditionRow>& GetConditions() const { return maConditions; }
GetEngine() const95     const String&   GetEngine() const       { return maEngine; }
GetProperties() const96     const com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue>& GetProperties() const
97                                             { return maProperties; }
98 };
99 
100 class ScOptSolverDlg : public ScAnyRefDlg
101 {
102 public:
103                     ScOptSolverDlg( SfxBindings* pB, SfxChildWindow* pCW, Window* pParent,
104                                  ScDocShell* pDocSh, ScAddress aCursorPos );
105                     ~ScOptSolverDlg();
106 
107     virtual void    SetReference( const ScRange& rRef, ScDocument* pDoc );
108     virtual sal_Bool    IsRefInputMode() const;
109     virtual void    SetActive();
110     virtual sal_Bool    Close();
111 
112 private:
113     FixedText       maFtObjectiveCell;
114     formula::RefEdit       maEdObjectiveCell;
115     formula::RefButton     maRBObjectiveCell;
116 
117     FixedText       maFtDirection;
118     RadioButton     maRbMax;
119     RadioButton     maRbMin;
120     RadioButton     maRbValue;
121     formula::RefEdit       maEdTargetValue;
122     formula::RefButton     maRBTargetValue;
123 
124     FixedText       maFtVariableCells;
125     formula::RefEdit       maEdVariableCells;
126     formula::RefButton     maRBVariableCells;
127 
128     FixedLine       maFlConditions;
129 
130     FixedText       maFtCellRef;        // labels are together with controls for the first row
131     ScCursorRefEdit maEdLeft1;
132     formula::RefButton     maRBLeft1;
133     FixedText       maFtOperator;
134     ListBox         maLbOp1;
135     FixedText       maFtConstraint;
136     ScCursorRefEdit maEdRight1;
137     formula::RefButton     maRBRight1;
138     ImageButton     maBtnDel1;
139 
140     ScCursorRefEdit maEdLeft2;
141     formula::RefButton     maRBLeft2;
142     ListBox         maLbOp2;
143     ScCursorRefEdit maEdRight2;
144     formula::RefButton     maRBRight2;
145     ImageButton     maBtnDel2;
146 
147     ScCursorRefEdit maEdLeft3;
148     formula::RefButton     maRBLeft3;
149     ListBox         maLbOp3;
150     ScCursorRefEdit maEdRight3;
151     formula::RefButton     maRBRight3;
152     ImageButton     maBtnDel3;
153 
154     ScCursorRefEdit maEdLeft4;
155     formula::RefButton     maRBLeft4;
156     ListBox         maLbOp4;
157     ScCursorRefEdit maEdRight4;
158     formula::RefButton     maRBRight4;
159     ImageButton     maBtnDel4;
160 
161     ScrollBar       maScrollBar;
162 
163     FixedLine       maFlButtons;
164 
165     PushButton      maBtnOpt;
166     HelpButton      maBtnHelp;
167     CancelButton    maBtnCancel;
168     PushButton      maBtnSolve;
169 
170     String          maInputError;
171     String          maConditionError;
172 
173     ScDocShell*     mpDocShell;
174     ScDocument*     mpDoc;
175     const SCTAB     mnCurTab;
176     formula::RefEdit*      mpEdActive;
177     bool            mbDlgLostFocus;
178 
179     static const sal_uInt16 EDIT_ROW_COUNT = 4;
180     ScCursorRefEdit* mpLeftEdit[EDIT_ROW_COUNT];
181     formula::RefButton*     mpLeftButton[EDIT_ROW_COUNT];
182     ScCursorRefEdit* mpRightEdit[EDIT_ROW_COUNT];
183     formula::RefButton*     mpRightButton[EDIT_ROW_COUNT];
184     ListBox*         mpOperator[EDIT_ROW_COUNT];
185     ImageButton*     mpDelButton[EDIT_ROW_COUNT];
186 
187     std::vector<ScOptConditionRow> maConditions;
188     long            nScrollPos;
189 
190     com::sun::star::uno::Sequence<rtl::OUString> maImplNames;
191     com::sun::star::uno::Sequence<rtl::OUString> maDescriptions;
192     String          maEngine;
193     com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> maProperties;
194 
195     void    Init(const ScAddress& rCursorPos);
196     bool    CallSolver();
197     void    ReadConditions();
198     void    ShowConditions();
199     void    EnableButtons();
200     bool    ParseRef( ScRange& rRange, const String& rInput, bool bAllowRange );
201     bool    FindTimeout( sal_Int32& rTimeout );
202     void    ShowError( bool bCondition, formula::RefEdit* pFocus );
203 
204     DECL_LINK( BtnHdl, PushButton* );
205     DECL_LINK( DelBtnHdl, PushButton* );
206     DECL_LINK( GetFocusHdl, Control* );
207     DECL_LINK( LoseFocusHdl, Control* );
208     DECL_LINK( ScrollHdl, ScrollBar* );
209     DECL_LINK( CursorUpHdl, ScCursorRefEdit* );
210     DECL_LINK( CursorDownHdl, ScCursorRefEdit* );
211     DECL_LINK( CondModifyHdl, Edit* );
212     DECL_LINK( TargetModifyHdl, Edit* );
213     DECL_LINK( SelectHdl, ListBox* );
214 };
215 
216 
217 class ScSolverProgressDialog : public ModelessDialog
218 {
219     FixedText       maFtProgress;
220     FixedText       maFtTime;
221     FixedLine       maFlButtons;
222     OKButton        maBtnOk;
223 
224 public:
225     ScSolverProgressDialog( Window* pParent );
226     ~ScSolverProgressDialog();
227 
228     void    HideTimeLimit();
229     void    SetTimeLimit( sal_Int32 nSeconds );
230 };
231 
232 class ScSolverNoSolutionDialog : public ModalDialog
233 {
234     FixedText       maFtNoSolution;
235     FixedText       maFtErrorText;
236     FixedLine       maFlButtons;
237     OKButton        maBtnOk;
238 
239 public:
240     ScSolverNoSolutionDialog( Window* pParent, const String& rErrorText );
241     ~ScSolverNoSolutionDialog();
242 };
243 
244 class ScSolverSuccessDialog : public ModalDialog
245 {
246     FixedText       maFtSuccess;
247     FixedText       maFtResult;
248     FixedText       maFtQuestion;
249     FixedLine       maFlButtons;
250     OKButton        maBtnOk;
251     CancelButton    maBtnCancel;
252 
253 public:
254     ScSolverSuccessDialog( Window* pParent, const String& rSolution );
255     ~ScSolverSuccessDialog();
256 };
257 
258 
259 #endif
260 
261