blob: 3868ff79b499fe6b33c1304c398a78dcb74cc118 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#ifndef SC_OPTSOLVER_HXX
#define SC_OPTSOLVER_HXX
#include "global.hxx"
#include "address.hxx"
#include "anyrefdg.hxx"
#include <vcl/fixed.hxx>
#include <vcl/group.hxx>
#include <vcl/lstbox.hxx>
#include <com/sun/star/uno/Sequence.hxx>
#include <vector>
namespace com { namespace sun { namespace star {
namespace beans { struct PropertyValue; }
} } }
//============================================================================
class ScCursorRefEdit : public formula::RefEdit
{
Link maCursorUpLink;
Link maCursorDownLink;
public:
ScCursorRefEdit( ScAnyRefDlg* pParent, const ResId& rResId );
void SetCursorLinks( const Link& rUp, const Link& rDown );
protected:
virtual void KeyInput( const KeyEvent& rKEvt );
};
/// The dialog's content for a row, not yet parsed
struct ScOptConditionRow
{
String aLeftStr;
sal_uInt16 nOperator;
String aRightStr;
ScOptConditionRow() : nOperator(0) {}
bool IsDefault() const { return aLeftStr.Len() == 0 && aRightStr.Len() == 0 && nOperator == 0; }
};
/// All settings from the dialog, saved with the DocShell for the next call
class ScOptSolverSave
{
String maObjective;
sal_Bool mbMax;
sal_Bool mbMin;
sal_Bool mbValue;
String maTarget;
String maVariable;
std::vector<ScOptConditionRow> maConditions;
String maEngine;
com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> maProperties;
public:
ScOptSolverSave( const String& rObjective, sal_Bool bMax, sal_Bool bMin, sal_Bool bValue,
const String& rTarget, const String& rVariable,
const std::vector<ScOptConditionRow>& rConditions,
const String& rEngine,
const com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue>& rProperties );
const String& GetObjective() const { return maObjective; }
sal_Bool GetMax() const { return mbMax; }
sal_Bool GetMin() const { return mbMin; }
sal_Bool GetValue() const { return mbValue; }
const String& GetTarget() const { return maTarget; }
const String& GetVariable() const { return maVariable; }
const std::vector<ScOptConditionRow>& GetConditions() const { return maConditions; }
const String& GetEngine() const { return maEngine; }
const com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue>& GetProperties() const
{ return maProperties; }
};
class ScOptSolverDlg : public ScAnyRefDlg
{
public:
ScOptSolverDlg( SfxBindings* pB, SfxChildWindow* pCW, Window* pParent,
ScDocShell* pDocSh, ScAddress aCursorPos );
~ScOptSolverDlg();
virtual void SetReference( const ScRange& rRef, ScDocument* pDoc );
virtual sal_Bool IsRefInputMode() const;
virtual void SetActive();
virtual sal_Bool Close();
private:
FixedText maFtObjectiveCell;
formula::RefEdit maEdObjectiveCell;
formula::RefButton maRBObjectiveCell;
FixedText maFtDirection;
RadioButton maRbMax;
RadioButton maRbMin;
RadioButton maRbValue;
formula::RefEdit maEdTargetValue;
formula::RefButton maRBTargetValue;
FixedText maFtVariableCells;
formula::RefEdit maEdVariableCells;
formula::RefButton maRBVariableCells;
FixedLine maFlConditions;
FixedText maFtCellRef; // labels are together with controls for the first row
ScCursorRefEdit maEdLeft1;
formula::RefButton maRBLeft1;
FixedText maFtOperator;
ListBox maLbOp1;
FixedText maFtConstraint;
ScCursorRefEdit maEdRight1;
formula::RefButton maRBRight1;
ImageButton maBtnDel1;
ScCursorRefEdit maEdLeft2;
formula::RefButton maRBLeft2;
ListBox maLbOp2;
ScCursorRefEdit maEdRight2;
formula::RefButton maRBRight2;
ImageButton maBtnDel2;
ScCursorRefEdit maEdLeft3;
formula::RefButton maRBLeft3;
ListBox maLbOp3;
ScCursorRefEdit maEdRight3;
formula::RefButton maRBRight3;
ImageButton maBtnDel3;
ScCursorRefEdit maEdLeft4;
formula::RefButton maRBLeft4;
ListBox maLbOp4;
ScCursorRefEdit maEdRight4;
formula::RefButton maRBRight4;
ImageButton maBtnDel4;
ScrollBar maScrollBar;
FixedLine maFlButtons;
PushButton maBtnOpt;
HelpButton maBtnHelp;
CancelButton maBtnCancel;
PushButton maBtnSolve;
String maInputError;
String maConditionError;
ScDocShell* mpDocShell;
ScDocument* mpDoc;
const SCTAB mnCurTab;
formula::RefEdit* mpEdActive;
bool mbDlgLostFocus;
static const sal_uInt16 EDIT_ROW_COUNT = 4;
ScCursorRefEdit* mpLeftEdit[EDIT_ROW_COUNT];
formula::RefButton* mpLeftButton[EDIT_ROW_COUNT];
ScCursorRefEdit* mpRightEdit[EDIT_ROW_COUNT];
formula::RefButton* mpRightButton[EDIT_ROW_COUNT];
ListBox* mpOperator[EDIT_ROW_COUNT];
ImageButton* mpDelButton[EDIT_ROW_COUNT];
std::vector<ScOptConditionRow> maConditions;
long nScrollPos;
com::sun::star::uno::Sequence<rtl::OUString> maImplNames;
com::sun::star::uno::Sequence<rtl::OUString> maDescriptions;
String maEngine;
com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> maProperties;
void Init(const ScAddress& rCursorPos);
bool CallSolver();
void ReadConditions();
void ShowConditions();
void EnableButtons();
bool ParseRef( ScRange& rRange, const String& rInput, bool bAllowRange );
bool FindTimeout( sal_Int32& rTimeout );
void ShowError( bool bCondition, formula::RefEdit* pFocus );
DECL_LINK( BtnHdl, PushButton* );
DECL_LINK( DelBtnHdl, PushButton* );
DECL_LINK( GetFocusHdl, Control* );
DECL_LINK( LoseFocusHdl, Control* );
DECL_LINK( ScrollHdl, ScrollBar* );
DECL_LINK( CursorUpHdl, ScCursorRefEdit* );
DECL_LINK( CursorDownHdl, ScCursorRefEdit* );
DECL_LINK( CondModifyHdl, Edit* );
DECL_LINK( TargetModifyHdl, Edit* );
DECL_LINK( SelectHdl, ListBox* );
};
class ScSolverProgressDialog : public ModelessDialog
{
FixedText maFtProgress;
FixedText maFtTime;
FixedLine maFlButtons;
OKButton maBtnOk;
public:
ScSolverProgressDialog( Window* pParent );
~ScSolverProgressDialog();
void HideTimeLimit();
void SetTimeLimit( sal_Int32 nSeconds );
};
class ScSolverNoSolutionDialog : public ModalDialog
{
FixedText maFtNoSolution;
FixedText maFtErrorText;
FixedLine maFlButtons;
OKButton maBtnOk;
public:
ScSolverNoSolutionDialog( Window* pParent, const String& rErrorText );
~ScSolverNoSolutionDialog();
};
class ScSolverSuccessDialog : public ModalDialog
{
FixedText maFtSuccess;
FixedText maFtResult;
FixedText maFtQuestion;
FixedLine maFlButtons;
OKButton maBtnOk;
CancelButton maBtnCancel;
public:
ScSolverSuccessDialog( Window* pParent, const String& rSolution );
~ScSolverSuccessDialog();
};
#endif