blob: 64a816f8d297aec2d4a247302200f3d90b14305f [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.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_formula.hxx"
//----------------------------------------------------------------------------
#include <sfx2/dispatch.hxx>
#include <sfx2/docfile.hxx>
#include <sfx2/viewfrm.hxx>
#include <vcl/svapp.hxx>
#include <vcl/mnemonic.hxx>
#include <vcl/tabpage.hxx>
#include <vcl/tabctrl.hxx>
#include <vcl/lstbox.hxx>
#include <vcl/group.hxx>
#include <vcl/wall.hxx>
#include <svtools/stdctrl.hxx>
#include <svtools/svmedit.hxx>
#include <svtools/svtreebx.hxx>
#include <svl/stritem.hxx>
#include <svl/zforlist.hxx>
#include <svl/eitem.hxx>
#include <unotools/charclass.hxx>
#include <tools/urlobj.hxx>
#include <tools/diagnose_ex.h>
#include "formdlgs.hrc"
#include "funcpage.hxx"
#include "formula/formula.hxx"
#include "formula/IFunctionDescription.hxx"
#include "formula/FormulaCompiler.hxx"
#include "formula/token.hxx"
#include "formula/tokenarray.hxx"
#include "formula/formdata.hxx"
#include "formula/formulahelper.hxx"
#include "structpg.hxx"
#include "parawin.hxx"
#include "ModuleHelper.hxx"
#include "ForResId.hrc"
#include <com/sun/star/sheet/FormulaToken.hpp>
#include <com/sun/star/sheet/FormulaLanguage.hpp>
#include <com/sun/star/sheet/FormulaMapGroup.hpp>
#include <com/sun/star/sheet/FormulaMapGroupSpecialOffset.hpp>
#include <com/sun/star/beans/XPropertySet.hpp>
#include <boost/bind.hpp>
#include <comphelper/processfactory.hxx>
#include <map>
#define TOKEN_OPEN 0
#define TOKEN_CLOSE 1
#define TOKEN_SEP 2
namespace formula
{
using namespace ::com::sun::star;
class OFormulaToken : public IFormulaToken
{
sal_Int32 m_nParaCount;
bool m_bIsFunction;
public:
OFormulaToken(bool _bFunction,sal_Int32 _nParaCount) : m_nParaCount(_nParaCount),m_bIsFunction(_bFunction){}
virtual bool isFunction() const { return m_bIsFunction; }
virtual sal_uInt32 getArgumentCount() const { return m_nParaCount; }
};
class FormulaDlg_Impl
{
public:
::std::pair<RefButton*,RefEdit*>
RefInputStartBefore( RefEdit* pEdit, RefButton* pButton );
void RefInputStartAfter( RefEdit* pEdit, RefButton* pButton );
void RefInputDoneAfter( sal_Bool bForced );
sal_Bool CalcValue( const String& rStrExp, String& rStrResult );
sal_Bool CalcStruct( const String& rStrExp);
void UpdateValues();
void DeleteArgs();
xub_StrLen GetFunctionPos(xub_StrLen nPos);
void ClearAllParas();
void MakeTree(IStructHelper* _pTree,SvLBoxEntry* pParent,FormulaToken* _pToken,long Count);
void fillTree(IStructHelper* _pTree);
void UpdateTokenArray( const String& rStrExp);
String RepairFormula(const String& aFormula);
void FillDialog(sal_Bool nFlag=sal_True);
void EditNextFunc( sal_Bool bForward, xub_StrLen nFStart=NOT_FOUND );
void EditThisFunc(xub_StrLen nFStart);
void EditFuncParas(xub_StrLen nEditPos);
void UpdateArgInput( sal_uInt16 nOffset, sal_uInt16 nInput );
void Update();
void Update(const String& _sExp);
void SaveArg( sal_uInt16 nEd );
void UpdateSelection();
void DoEnter( sal_Bool bOk );
void UpdateFunctionDesc();
void ResizeArgArr( const IFunctionDescription* pNewFunc );
void FillListboxes();
void FillControls(sal_Bool &rbNext, sal_Bool &rbPrev);
FormulaDlgMode SetMeText(const String& _sText,xub_StrLen PrivStart, xub_StrLen PrivEnd,sal_Bool bMatrix,sal_Bool _bSelect,sal_Bool _bUpdate);
void SetMeText(const String& _sText);
sal_Bool CheckMatrix(String& aFormula /*IN/OUT*/);
void SetEdSelection();
sal_Bool UpdateParaWin(Selection& _rSelection);
void UpdateParaWin(const Selection& _rSelection,const String& _sRefStr);
void SetData(xub_StrLen nFStart,xub_StrLen nNextFStart,xub_StrLen nNextFEnd,xub_StrLen& PrivStart,xub_StrLen& PrivEnd);
void PreNotify( NotifyEvent& rNEvt );
RefEdit* GetCurrRefEdit();
rtl::OString FindFocusWin(Window *pWin);
const FormulaHelper& GetFormulaHelper() const;
uno::Reference< sheet::XFormulaOpCodeMapper > GetFormulaOpCodeMapper() const;
DECL_LINK( ModifyHdl, ParaWin* );
DECL_LINK( FxHdl, ParaWin* );
DECL_LINK( MatrixHdl, CheckBox *);
DECL_LINK( FormulaHdl, MultiLineEdit* );
DECL_LINK( FormulaCursorHdl, EditBox*);
DECL_LINK( BtnHdl, PushButton* );
DECL_LINK( GetEdFocusHdl, ArgInput* );
DECL_LINK( GetFxFocusHdl, ArgInput* );
DECL_LINK( DblClkHdl, FuncPage* );
DECL_LINK( FuncSelHdl, FuncPage*);
DECL_LINK( StructSelHdl, StructPage * );
public:
OModuleClient m_aModuleClient;
mutable uno::Reference< sheet::XFormulaOpCodeMapper> m_xOpCodeMapper;
uno::Sequence< sheet::FormulaToken > m_aTokenList;
::std::auto_ptr<FormulaTokenArray> m_pTokenArray;
mutable uno::Sequence< sheet::FormulaOpCodeMapEntry > m_aSpecialOpCodes;
mutable const sheet::FormulaOpCodeMapEntry* m_pSpecialOpCodesEnd;
mutable uno::Sequence< sheet::FormulaToken > m_aSeparatorsOpCodes;
mutable uno::Sequence< sheet::FormulaOpCodeMapEntry > m_aFunctionOpCodes;
mutable const sheet::FormulaOpCodeMapEntry* m_pFunctionOpCodesEnd;
mutable uno::Sequence< sheet::FormulaOpCodeMapEntry > m_aUnaryOpCodes;
mutable const sheet::FormulaOpCodeMapEntry* m_pUnaryOpCodesEnd;
mutable uno::Sequence< sheet::FormulaOpCodeMapEntry > m_aBinaryOpCodes;
mutable const sheet::FormulaOpCodeMapEntry* m_pBinaryOpCodesEnd;
::std::vector< ::boost::shared_ptr<OFormulaToken> > m_aTokens;
::std::map<FormulaToken*,sheet::FormulaToken> m_aTokenMap;
IFormulaEditorHelper* m_pHelper;
Dialog* m_pParent;
IControlReferenceHandler* m_pDlg;
TabControl aTabCtrl;
GroupBox aGEdit; //! MUST be placed before pParaWin for initializing
ParaWin* pParaWin;
FixedText aFtHeadLine;
FixedInfo aFtFuncName;
FixedInfo aFtFuncDesc;
FixedText aFtEditName;
//FixedInfo aFtEditDesc;
FixedText aFtResult;
ValWnd aWndResult;
FixedText aFtFormula;
EditBox aMEFormula;
CheckBox aBtnMatrix;
HelpButton aBtnHelp;
CancelButton aBtnCancel;
PushButton aBtnBackward;
PushButton aBtnForward;
OKButton aBtnEnd;
RefEdit aEdRef;
RefButton aRefBtn;
FixedText aFtFormResult;
ValWnd aWndFormResult;
RefEdit* pTheRefEdit;
RefButton* pTheRefButton;
FuncPage* pFuncPage;
StructPage* pStructPage;
String aOldFormula;
sal_Bool bStructUpdate;
MultiLineEdit* pMEdit;
sal_Bool bUserMatrixFlag;
Timer aTimer;
const String aTitle1;
const String aTitle2;
const String aTxtEnd;
const String aTxtOk; // hinter aBtnEnd
FormulaHelper
m_aFormulaHelper;
rtl::OString m_aEditHelpId;
rtl::OString aOldHelp;
rtl::OString aOldUnique;
rtl::OString aActivWinId;
sal_Bool bIsShutDown;
Font aFntBold;
Font aFntLight;
sal_uInt16 nEdFocus;
// Selection theCurSel;
sal_Bool bEditFlag;
const IFunctionDescription* pFuncDesc;
xub_StrLen nArgs;
::std::vector< ::rtl::OUString > m_aArguments;
Selection aFuncSel;
FormulaDlg_Impl(Dialog* pParent
, bool _bSupportFunctionResult
, bool _bSupportResult
, bool _bSupportMatrix
,IFormulaEditorHelper* _pHelper
,const IFunctionManager* _pFunctionMgr
,IControlReferenceHandler* _pDlg);
~FormulaDlg_Impl();
};
FormulaDlg_Impl::FormulaDlg_Impl(Dialog* pParent
, bool _bSupportFunctionResult
, bool _bSupportResult
, bool _bSupportMatrix
,IFormulaEditorHelper* _pHelper
,const IFunctionManager* _pFunctionMgr
,IControlReferenceHandler* _pDlg)
:
m_pHelper (_pHelper),
m_pParent (pParent),
m_pDlg (_pDlg),
aTabCtrl ( pParent, ModuleRes( TC_FUNCTION ) ),
aGEdit ( pParent, ModuleRes( GB_EDIT ) ),
aFtHeadLine ( pParent, ModuleRes( FT_HEADLINE ) ),
aFtFuncName ( pParent, ModuleRes( FT_FUNCNAME ) ),
aFtFuncDesc ( pParent, ModuleRes( FT_FUNCDESC ) ),
//
aFtEditName ( pParent, ModuleRes( FT_EDITNAME ) ),
aFtResult ( pParent, ModuleRes( FT_RESULT ) ),
aWndResult ( pParent, ModuleRes( WND_RESULT ) ),
aFtFormula ( pParent, ModuleRes( FT_FORMULA ) ),
aMEFormula ( pParent, ModuleRes( ED_FORMULA ) ),
//
aBtnMatrix ( pParent, ModuleRes( BTN_MATRIX ) ),
aBtnHelp ( pParent, ModuleRes( BTN_HELP ) ),
aBtnCancel ( pParent, ModuleRes( BTN_CANCEL ) ),
aBtnBackward ( pParent, ModuleRes( BTN_BACKWARD ) ),
aBtnForward ( pParent, ModuleRes( BTN_FORWARD ) ),
aBtnEnd ( pParent, ModuleRes( BTN_END ) ),
aEdRef ( pParent, _pDlg, ModuleRes( ED_REF) ),
aRefBtn ( pParent, ModuleRes( RB_REF),&aEdRef,_pDlg ),
aFtFormResult ( pParent, ModuleRes( FT_FORMULA_RESULT)),
aWndFormResult ( pParent, ModuleRes( WND_FORMULA_RESULT)),
//
pTheRefEdit (NULL),
pMEdit (NULL),
bUserMatrixFlag (sal_False),
//
aTitle1 ( ModuleRes( STR_TITLE1 ) ), // lokale Resource
aTitle2 ( ModuleRes( STR_TITLE2 ) ), // lokale Resource
aTxtEnd ( ModuleRes( STR_END ) ), // lokale Resource
aTxtOk ( aBtnEnd.GetText() ),
m_aFormulaHelper(_pFunctionMgr),
//
bIsShutDown (sal_False),
nEdFocus (0),
pFuncDesc (NULL),
nArgs (0)
{
pParaWin = new ParaWin( pParent,_pDlg, aGEdit.GetPosPixel());
aGEdit.Hide();
pParaWin->Hide();
aFtEditName.Hide();
aEdRef.Hide();
aRefBtn.Hide();
pMEdit = aMEFormula.GetEdit();
aMEFormula.SetAccessibleName(aFtFormula.GetText());
if (pMEdit)
pMEdit->SetAccessibleName(aFtFormula.GetText());
m_aEditHelpId = pMEdit->GetHelpId();
pMEdit->SetUniqueId( m_aEditHelpId );
bEditFlag=sal_False;
bStructUpdate=sal_True;
Point aPos=aGEdit.GetPosPixel();
pParaWin->SetPosPixel(aPos);
pParaWin->SetArgModifiedHdl(LINK( this, FormulaDlg_Impl, ModifyHdl ) );
pParaWin->SetFxHdl(LINK( this, FormulaDlg_Impl, FxHdl ) );
pFuncPage= new FuncPage( &aTabCtrl,_pFunctionMgr);
pStructPage= new StructPage( &aTabCtrl);
pFuncPage->Hide();
pStructPage->Hide();
aTabCtrl.SetTabPage( TP_FUNCTION, pFuncPage);
aTabCtrl.SetTabPage( TP_STRUCT, pStructPage);
aOldHelp = pParent->GetHelpId(); // HelpId aus Resource immer fuer "Seite 1"
aOldUnique = pParent->GetUniqueId();
aFtResult.Show( _bSupportResult );
aWndResult.Show( _bSupportResult );
aFtFormResult.Show( _bSupportFunctionResult );
aWndFormResult.Show( _bSupportFunctionResult );
if ( _bSupportMatrix )
aBtnMatrix.SetClickHdl(LINK( this, FormulaDlg_Impl, MatrixHdl ) );
else
aBtnMatrix.Hide();
aBtnCancel .SetClickHdl( LINK( this, FormulaDlg_Impl, BtnHdl ) );
aBtnEnd .SetClickHdl( LINK( this, FormulaDlg_Impl, BtnHdl ) );
aBtnForward .SetClickHdl( LINK( this, FormulaDlg_Impl, BtnHdl ) );
aBtnBackward.SetClickHdl( LINK( this, FormulaDlg_Impl, BtnHdl ) );
pFuncPage->SetDoubleClickHdl( LINK( this, FormulaDlg_Impl, DblClkHdl ) );
pFuncPage->SetSelectHdl( LINK( this, FormulaDlg_Impl, FuncSelHdl) );
pStructPage->SetSelectionHdl( LINK( this, FormulaDlg_Impl, StructSelHdl ) );
pMEdit->SetModifyHdl( LINK( this, FormulaDlg_Impl, FormulaHdl ) );
aMEFormula.SetSelChangedHdl( LINK( this, FormulaDlg_Impl, FormulaCursorHdl ) );
aFntLight = aFtFormula.GetFont();
aFntLight.SetTransparent( sal_True );
aFntBold = aFntLight;
aFntBold.SetWeight( WEIGHT_BOLD );
pParaWin->SetArgumentFonts(aFntBold,aFntLight);
// function description for choosing a function is no longer in a different color
aFtHeadLine.SetFont(aFntBold);
aFtFuncName.SetFont(aFntLight);
aFtFuncDesc.SetFont(aFntLight);
}
FormulaDlg_Impl::~FormulaDlg_Impl()
{
if(aTimer.IsActive())
{
aTimer.SetTimeoutHdl(Link());
aTimer.Stop();
} // if(aTimer.IsActive())
bIsShutDown=sal_True;// Setzen, damit PreNotify keinen GetFocus speichert.
FormEditData* pData = m_pHelper->getFormEditData();
if (pData) // wird nicht ueber Close zerstoert;
{
pData->SetFStart((xub_StrLen)pMEdit->GetSelection().Min());
pData->SetSelection(pMEdit->GetSelection());
if(aTabCtrl.GetCurPageId()==TP_FUNCTION)
pData->SetMode( (sal_uInt16) FORMULA_FORMDLG_FORMULA );
else
pData->SetMode( (sal_uInt16) FORMULA_FORMDLG_EDIT );
pData->SetUndoStr(pMEdit->GetText());
pData->SetMatrixFlag(aBtnMatrix.IsChecked());
}
aTabCtrl.RemovePage(TP_FUNCTION);
aTabCtrl.RemovePage(TP_STRUCT);
delete pStructPage;
delete pFuncPage;
delete pParaWin;
DeleteArgs();
}
// -----------------------------------------------------------------------------
void FormulaDlg_Impl::PreNotify( NotifyEvent& rNEvt )
{
sal_uInt16 nSwitch=rNEvt.GetType();
if(nSwitch==EVENT_GETFOCUS && !bIsShutDown)
{
Window* pWin=rNEvt.GetWindow();
if(pWin!=NULL)
{
aActivWinId = pWin->GetUniqueId();
if(aActivWinId.getLength()==0)
{
Window* pParent=pWin->GetParent();
while(pParent!=NULL)
{
aActivWinId=pParent->GetUniqueId();
if(aActivWinId.getLength()!=0) break;
pParent=pParent->GetParent();
}
}
if(aActivWinId.getLength())
{
FormEditData* pData = m_pHelper->getFormEditData();
if (pData && !aTimer.IsActive()) // wird nicht ueber Close zerstoert;
{
pData->SetUniqueId(aActivWinId);
}
}
}
}
}
uno::Reference< sheet::XFormulaOpCodeMapper > FormulaDlg_Impl::GetFormulaOpCodeMapper() const
{
if ( !m_xOpCodeMapper.is() )
{
m_xOpCodeMapper = m_pHelper->getFormulaOpCodeMapper();
m_aFunctionOpCodes = m_xOpCodeMapper->getAvailableMappings(sheet::FormulaLanguage::ODFF,sheet::FormulaMapGroup::FUNCTIONS);
m_pFunctionOpCodesEnd = m_aFunctionOpCodes.getConstArray() + m_aFunctionOpCodes.getLength();
m_aUnaryOpCodes = m_xOpCodeMapper->getAvailableMappings(sheet::FormulaLanguage::ODFF,sheet::FormulaMapGroup::UNARY_OPERATORS);
m_pUnaryOpCodesEnd = m_aUnaryOpCodes.getConstArray() + m_aUnaryOpCodes.getLength();
m_aBinaryOpCodes = m_xOpCodeMapper->getAvailableMappings(sheet::FormulaLanguage::ODFF,sheet::FormulaMapGroup::BINARY_OPERATORS);
m_pBinaryOpCodesEnd = m_aBinaryOpCodes.getConstArray() + m_aBinaryOpCodes.getLength();
uno::Sequence< ::rtl::OUString > aArgs(3);
aArgs[TOKEN_OPEN] = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("("));
aArgs[TOKEN_CLOSE] = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(")"));
aArgs[TOKEN_SEP] = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(";"));
m_aSeparatorsOpCodes = m_xOpCodeMapper->getMappings(aArgs,sheet::FormulaLanguage::ODFF);
m_aSpecialOpCodes = m_xOpCodeMapper->getAvailableMappings(sheet::FormulaLanguage::ODFF,sheet::FormulaMapGroup::SPECIAL);
m_pSpecialOpCodesEnd = m_aSpecialOpCodes.getConstArray() + m_aSpecialOpCodes.getLength();
} // if ( !m_xOpCodeMapper.is() )
return m_xOpCodeMapper;
}
void FormulaDlg_Impl::DeleteArgs()
{
::std::vector< ::rtl::OUString>().swap(m_aArguments);
nArgs = 0;
}
namespace
{
// comparing two property instances
struct OpCodeCompare : public ::std::binary_function< sheet::FormulaOpCodeMapEntry, sal_Int32 , bool >
{
bool operator() (const sheet::FormulaOpCodeMapEntry& x, sal_Int32 y) const
{
return x.Token.OpCode == y;
}
};
}
// -----------------------------------------------------------------------------
xub_StrLen FormulaDlg_Impl::GetFunctionPos(xub_StrLen nPos)
{
const sal_Unicode sep = m_pHelper->getFunctionManager()->getSingleToken(IFunctionManager::eSep);
xub_StrLen nTokPos=1;
xub_StrLen nOldTokPos=1;
xub_StrLen nFuncPos=STRING_NOTFOUND; //@ Testweise
xub_StrLen nPrevFuncPos=1;
short nBracketCount=0;
sal_Bool bFlag=sal_False;
String aFormString = pMEdit->GetText();
m_aFormulaHelper.GetCharClass()->toUpper( aFormString );
if ( m_aTokenList.getLength() )
{
const uno::Reference< sheet::XFormulaParser > xParser(m_pHelper->getFormulaParser());
const table::CellAddress aRefPos(m_pHelper->getReferencePosition());
const sheet::FormulaToken* pIter = m_aTokenList.getConstArray();
const sheet::FormulaToken* pEnd = pIter + m_aTokenList.getLength();
//if ( pIter != pEnd && aFormString.GetChar(0) == '=' )
// ++pIter;
try
{
while ( pIter != pEnd )
{
const sal_Int32 eOp = pIter->OpCode;
uno::Sequence<sheet::FormulaToken> aArgs(1);
aArgs[0] = *pIter;
const String aString = xParser->printFormula(aArgs, aRefPos);
const sheet::FormulaToken* pNextToken = pIter + 1;
if(!bUserMatrixFlag && FormulaCompiler::IsMatrixFunction((OpCode)eOp) )
{
aBtnMatrix.Check();
}
if ( eOp == m_aSpecialOpCodes[sheet::FormulaMapGroupSpecialOffset::PUSH].Token.OpCode || eOp == m_aSpecialOpCodes[sheet::FormulaMapGroupSpecialOffset::SPACES].Token.OpCode )
{
const xub_StrLen n1=aFormString.Search(sep, nTokPos);
const xub_StrLen n2=aFormString.Search(')',nTokPos);
xub_StrLen nXXX=nTokPos;
if(n1<n2)
{
nTokPos=n1;
}
else
{
nTokPos=n2;
}
if ( pNextToken != pEnd )
{
aArgs[0] = *pNextToken;
const String a2String = xParser->printFormula(aArgs, aRefPos);
const xub_StrLen n3 = aFormString.Search(a2String,nXXX);
if ( n3 < nTokPos )
nTokPos = n3;
}
}
else
{
nTokPos = sal::static_int_cast<xub_StrLen>( nTokPos + aString.Len() );
}
if ( eOp == m_aSeparatorsOpCodes[TOKEN_OPEN].OpCode )
{
nBracketCount++;
bFlag=sal_True;
}
else if ( eOp == m_aSeparatorsOpCodes[TOKEN_CLOSE].OpCode )
{
nBracketCount--;
bFlag=sal_False;
nFuncPos=nPrevFuncPos;
}
bool bIsFunction = ::std::find_if(m_aFunctionOpCodes.getConstArray(),m_pFunctionOpCodesEnd,::std::bind2nd(OpCodeCompare(),boost::cref(eOp))) != m_pFunctionOpCodesEnd;
if ( bIsFunction && m_aSpecialOpCodes[sheet::FormulaMapGroupSpecialOffset::SPACES].Token.OpCode != eOp )
{
nPrevFuncPos = nFuncPos;
nFuncPos = nOldTokPos;
}
if ( nOldTokPos <= nPos && nPos < nTokPos )
{
if ( !bIsFunction )
{
if ( nBracketCount < 1 )
{
nFuncPos= pMEdit->GetText().Len();
}
else if ( !bFlag )
{
nFuncPos=nPrevFuncPos;
}
}
break;
}
pIter = pNextToken;
nOldTokPos = nTokPos;
} // while ( pIter != pEnd )
}
catch(const uno::Exception& )
{
DBG_ERROR("Exception caught!");
}
}
return nFuncPos;
}
// -----------------------------------------------------------------------------
sal_Bool FormulaDlg_Impl::CalcValue( const String& rStrExp, String& rStrResult )
{
sal_Bool bResult = sal_True;
if ( rStrExp.Len() > 0 )
{
// nur, wenn keine Tastatureingabe mehr anliegt, den Wert berechnen:
if ( !Application::AnyInput( INPUT_KEYBOARD ) )
{
bResult = m_pHelper->calculateValue(rStrExp,rStrResult);
}
else
bResult = sal_False;
}
return bResult;
}
void FormulaDlg_Impl::UpdateValues()
{
String aStrResult;
if ( CalcValue( pFuncDesc->getFormula( m_aArguments ), aStrResult ) )
aWndResult.SetValue( aStrResult );
aStrResult.Erase();
if ( CalcValue(m_pHelper->getCurrentFormula(), aStrResult ) )
aWndFormResult.SetValue( aStrResult );
else
{
aStrResult.Erase();
aWndFormResult.SetValue( aStrResult );
}
CalcStruct(pMEdit->GetText());
}
sal_Bool FormulaDlg_Impl::CalcStruct( const String& rStrExp)
{
sal_Bool bResult = sal_True;
xub_StrLen nLength=rStrExp.Len();
if ( rStrExp.Len() > 0 && aOldFormula!=rStrExp && bStructUpdate)
{
// nur, wenn keine Tastatureingabe mehr anliegt, den Wert berechnen:
if ( !Application::AnyInput( INPUT_KEYBOARD ) )
{
pStructPage->ClearStruct();
String aString=rStrExp;
if(rStrExp.GetChar(nLength-1)=='(')
{
aString.Erase((xub_StrLen)(nLength-1));
}
aString.EraseAllChars('\n');
String aStrResult;
if ( CalcValue(aString, aStrResult ) )
aWndFormResult.SetValue( aStrResult );
UpdateTokenArray(aString);
fillTree(pStructPage);
aOldFormula=rStrExp;
if(rStrExp.GetChar(nLength-1)=='(')
UpdateTokenArray(rStrExp);
}
else
bResult = sal_False;
}
return bResult;
}
// -----------------------------------------------------------------------------
void FormulaDlg_Impl::MakeTree(IStructHelper* _pTree,SvLBoxEntry* pParent,FormulaToken* _pToken,long Count)
{
if( _pToken != NULL && Count > 0 )
{
long nParas = _pToken->GetParamCount();
OpCode eOp = _pToken->GetOpCode();
// #i101512# for output, the original token is needed
FormulaToken* pOrigToken = (_pToken->GetType() == svFAP) ? _pToken->GetFAPOrigToken() : _pToken;
uno::Sequence<sheet::FormulaToken> aArgs(1);
aArgs[0] = m_aTokenMap.find(pOrigToken)->second;
try
{
const table::CellAddress aRefPos(m_pHelper->getReferencePosition());
const String aResult = m_pHelper->getFormulaParser()->printFormula(aArgs, aRefPos);
if ( nParas > 0 )
{
SvLBoxEntry* pEntry;
String aTest=_pTree->GetEntryText(pParent);
if(aTest==aResult &&
(eOp==ocAdd || eOp==ocMul ||
eOp==ocAmpersand))
{
pEntry=pParent;
}
else
{
if(eOp==ocBad)
{
pEntry=_pTree->InsertEntry(aResult,pParent,STRUCT_ERROR,0,_pToken);
}
else
{
pEntry=_pTree->InsertEntry(aResult,pParent,STRUCT_FOLDER,0,_pToken);
}
}
MakeTree(_pTree,pEntry,m_pTokenArray->PrevRPN(),nParas);
--Count;
m_pTokenArray->NextRPN();
MakeTree(_pTree,pParent,m_pTokenArray->PrevRPN(),Count);
}
else
{
if(eOp==ocBad)
{
_pTree->InsertEntry(aResult,pParent,STRUCT_ERROR,0,_pToken);
}
else
{
_pTree->InsertEntry(aResult,pParent,STRUCT_END,0,_pToken);
}
--Count;
MakeTree(_pTree,pParent,m_pTokenArray->PrevRPN(),Count);
}
}
catch(uno::Exception&)
{
DBG_UNHANDLED_EXCEPTION();
}
}
}
void FormulaDlg_Impl::fillTree(IStructHelper* _pTree)
{
GetFormulaOpCodeMapper();
FormulaToken* pToken = m_pTokenArray->LastRPN();
if( pToken != NULL)
{
MakeTree(_pTree,NULL,pToken,1);
}
}
void FormulaDlg_Impl::UpdateTokenArray( const String& rStrExp)
{
m_aTokenMap.clear();
m_aTokenList.realloc(0);
try
{
const table::CellAddress aRefPos(m_pHelper->getReferencePosition());
m_aTokenList = m_pHelper->getFormulaParser()->parseFormula(rStrExp, aRefPos);
}
catch(const uno::Exception&)
{
DBG_UNHANDLED_EXCEPTION();
}
GetFormulaOpCodeMapper(); // just to get it initialized
m_pTokenArray = m_pHelper->convertToTokenArray(m_aTokenList);
const sal_Int32 nLen = static_cast<sal_Int32>(m_pTokenArray->GetLen());
FormulaToken** pTokens = m_pTokenArray->GetArray();
if ( pTokens && nLen == m_aTokenList.getLength() )
{
for (sal_Int32 nPos=0; nPos<nLen; nPos++)
{
m_aTokenMap.insert(::std::map<FormulaToken*,sheet::FormulaToken>::value_type(pTokens[nPos],m_aTokenList[nPos]));
}
} // if ( pTokens && nLen == m_aTokenList.getLength() )
FormulaCompiler aCompiler(*m_pTokenArray.get());
aCompiler.SetCompileForFAP(sal_True); // #i101512# special handling is needed
aCompiler.CompileTokenArray();
}
void FormulaDlg_Impl::FillDialog(sal_Bool nFlag)
{
sal_Bool bNext=sal_True, bPrev=sal_True;
if(nFlag)
FillControls(bNext, bPrev);
FillListboxes();
if(nFlag)
{
aBtnBackward.Enable(bPrev);
aBtnForward.Enable(bNext);
}
String aStrResult;
if ( CalcValue(m_pHelper->getCurrentFormula(), aStrResult ) )
aWndFormResult.SetValue( aStrResult );
else
{
aStrResult.Erase();
aWndFormResult.SetValue( aStrResult );
}
}
// -----------------------------------------------------------------------------
void FormulaDlg_Impl::FillListboxes()
{
// Umschalten zwischen den "Seiten"
FormEditData* pData = m_pHelper->getFormEditData();
String aNewTitle;
// 1. Seite: Funktion auswaehlen
if ( pFuncDesc && pFuncDesc->getCategory() )
{
if( pFuncPage->GetCategory() != pFuncDesc->getCategory()->getNumber() + 1 )
pFuncPage->SetCategory(static_cast<sal_uInt16>(pFuncDesc->getCategory()->getNumber() + 1));
sal_uInt16 nPos=pFuncPage->GetFuncPos(pFuncDesc);
pFuncPage->SetFunction(nPos);
}
else if ( pData )
{
pFuncPage->SetCategory( pData->GetCatSel() );
pFuncPage->SetFunction( pData->GetFuncSel() );
}
FuncSelHdl(NULL);
// ResizeArgArr jetzt schon in UpdateFunctionDesc
m_pHelper->setDispatcherLock( sal_True);// Modal-Modus einschalten
aNewTitle = aTitle1;
// HelpId fuer 1. Seite ist die aus der Resource
m_pParent->SetHelpId( aOldHelp );
m_pParent->SetUniqueId( aOldUnique );
}
// -----------------------------------------------------------------------------
void FormulaDlg_Impl::FillControls(sal_Bool &rbNext, sal_Bool &rbPrev)
{
// Umschalten zwischen den "Seiten"
FormEditData* pData = m_pHelper->getFormEditData();
if (!pData )
return;
String aNewTitle;
// 2. Seite oder Editieren: ausgewaehlte Funktion anzeigen
xub_StrLen nFStart = pData->GetFStart();
String aFormula = m_pHelper->getCurrentFormula();
xub_StrLen nNextFStart = nFStart;
xub_StrLen nNextFEnd = 0;
aFormula.AppendAscii(RTL_CONSTASCII_STRINGPARAM( " )" ));
DeleteArgs();
const IFunctionDescription* pOldFuncDesc = pFuncDesc;
sal_Bool bTestFlag = sal_False;
if ( m_aFormulaHelper.GetNextFunc( aFormula, sal_False,
nNextFStart, &nNextFEnd, &pFuncDesc, &m_aArguments ) )
{
bTestFlag = (pOldFuncDesc != pFuncDesc);
if(bTestFlag)
{
aFtHeadLine.Hide();
aFtFuncName.Hide();
aFtFuncDesc.Hide();
pParaWin->SetFunctionDesc(pFuncDesc);
aFtEditName.SetText( pFuncDesc->getFunctionName() );
aFtEditName.Show();
pParaWin->Show();
const rtl::OString aHelpId = pFuncDesc->getHelpId();
if ( aHelpId.getLength() )
pMEdit->SetHelpId(aHelpId);
}
xub_StrLen nOldStart, nOldEnd;
m_pHelper->getSelection( nOldStart, nOldEnd );
if ( nOldStart != nNextFStart || nOldEnd != nNextFEnd )
{
m_pHelper->setSelection( nNextFStart, nNextFEnd );
}
aFuncSel.Min() = nNextFStart;
aFuncSel.Max() = nNextFEnd;
if(!bEditFlag)
pMEdit->SetText(m_pHelper->getCurrentFormula());
xub_StrLen PrivStart, PrivEnd;
m_pHelper->getSelection( PrivStart, PrivEnd);
if(!bEditFlag)
pMEdit->SetSelection( Selection(PrivStart, PrivEnd));
nArgs = pFuncDesc->getSuppressedArgumentCount();
sal_uInt16 nOffset = pData->GetOffset();
nEdFocus = pData->GetEdFocus();
// Verkettung der Edit's fuer Focus-Kontrolle
if(bTestFlag)
pParaWin->SetArgumentOffset(nOffset);
sal_uInt16 nActiv=0;
xub_StrLen nArgPos= m_aFormulaHelper.GetArgStart( aFormula, nFStart, 0 );
xub_StrLen nEditPos=(xub_StrLen) pMEdit->GetSelection().Min();
sal_Bool bFlag=sal_False;
for(sal_uInt16 i=0;i<nArgs;i++)
{
sal_Int32 nLength = m_aArguments[i].getLength()+1;
pParaWin->SetArgument(i,m_aArguments[i]);
if(nArgPos<=nEditPos && nEditPos<nArgPos+nLength)
{
nActiv=i;
bFlag=sal_True;
}
nArgPos = sal::static_int_cast<xub_StrLen>( nArgPos + nLength );
}
pParaWin->UpdateParas();
if(bFlag)
{
pParaWin->SetActiveLine(nActiv);
}
//pParaWin->SetEdFocus( nEdFocus );
UpdateValues();
}
else
{
aFtEditName.SetText(String());
pMEdit->SetHelpId( m_aEditHelpId );
}
// Test, ob vorne/hinten noch mehr Funktionen sind
xub_StrLen nTempStart = m_aFormulaHelper.GetArgStart( aFormula, nFStart, 0 );
rbNext = m_aFormulaHelper.GetNextFunc( aFormula, sal_False, nTempStart );
nTempStart=(xub_StrLen)pMEdit->GetSelection().Min();
pData->SetFStart(nTempStart);
rbPrev = m_aFormulaHelper.GetNextFunc( aFormula, sal_True, nTempStart );
}
// -----------------------------------------------------------------------------
void FormulaDlg_Impl::ClearAllParas()
{
DeleteArgs();
pFuncDesc = NULL;
pParaWin->ClearAll();
aWndResult.SetValue(String());
aFtFuncName.SetText(String());
FuncSelHdl(NULL);
if(pFuncPage->IsVisible())
{
aFtEditName.Hide();
pParaWin->Hide();
aBtnForward.Enable(sal_True); //@new
aFtHeadLine.Show();
aFtFuncName.Show();
aFtFuncDesc.Show();
}
}
String FormulaDlg_Impl::RepairFormula(const String& aFormula)
{
String aResult('=');
try
{
UpdateTokenArray(aFormula);
if ( m_aTokenList.getLength() )
{
const table::CellAddress aRefPos(m_pHelper->getReferencePosition());
const String sFormula(m_pHelper->getFormulaParser()->printFormula(m_aTokenList, aRefPos));
if ( !sFormula.Len() || sFormula.GetChar(0) != '=' )
aResult += sFormula;
else
aResult = sFormula;
}
}
catch(const uno::Exception& )
{
DBG_ERROR("Exception caught!");
}
return aResult;
}
void FormulaDlg_Impl::DoEnter(sal_Bool bOk)
{
// Eingabe ins Dokument uebernehmen oder abbrechen
if ( bOk)
{
// ggf. Dummy-Argumente entfernen
String aInputFormula = m_pHelper->getCurrentFormula();
String aString = RepairFormula(pMEdit->GetText());
m_pHelper->setSelection(0, aInputFormula.Len());
m_pHelper->setCurrentFormula(aString);
}
m_pHelper->switchBack();
m_pHelper->dispatch(bOk,aBtnMatrix.IsChecked());
// Daten loeschen
m_pHelper->deleteFormData();
// Dialog schliessen
m_pHelper->doClose(bOk);
}
// -----------------------------------------------------------------------------
IMPL_LINK( FormulaDlg_Impl, BtnHdl, PushButton*, pBtn )
{
if ( pBtn == &aBtnCancel )
{
DoEnter(sal_False); // schliesst den Dialog
}
else if ( pBtn == &aBtnEnd )
{
DoEnter(sal_True); // schliesst den Dialog
}
else if ( pBtn == &aBtnForward )
{
//@pMEdit->GrabFocus(); // Damit die Selektion auch angezeigt wird.
const IFunctionDescription* pDesc =pFuncPage->GetFuncDesc( pFuncPage->GetFunction() );
if(pDesc==pFuncDesc || !pFuncPage->IsVisible())
EditNextFunc( sal_True );
else
{
DblClkHdl(pFuncPage); //new
aBtnForward.Enable(sal_False); //new
}
//@EditNextFunc( sal_True );
}
else if ( pBtn == &aBtnBackward )
{
bEditFlag=sal_False;
aBtnForward.Enable(sal_True);
EditNextFunc( sal_False );
aMEFormula.Invalidate();
aMEFormula.Update();
}
//...
return 0;
}
// -----------------------------------------------------------------------------
// --------------------------------------------------------------------------
// Funktionen fuer 1. Seite
// --------------------------------------------------------------------------
void FormulaDlg_Impl::ResizeArgArr( const IFunctionDescription* pNewFunc )
{
if ( pFuncDesc != pNewFunc )
{
DeleteArgs();
if ( pNewFunc )
nArgs = pNewFunc->getSuppressedArgumentCount();
pFuncDesc = pNewFunc;
}
}
// -----------------------------------------------------------------------------
void FormulaDlg_Impl::UpdateFunctionDesc()
{
FormEditData* pData = m_pHelper->getFormEditData();
if (!pData)
return;
sal_uInt16 nCat = pFuncPage->GetCategory();
if ( nCat == LISTBOX_ENTRY_NOTFOUND )
nCat = 0;
pData->SetCatSel( nCat );
sal_uInt16 nFunc = pFuncPage->GetFunction();
if ( nFunc == LISTBOX_ENTRY_NOTFOUND )
nFunc = 0;
pData->SetFuncSel( nFunc );
if ( (pFuncPage->GetFunctionEntryCount() > 0)
&& (pFuncPage->GetFunction() != LISTBOX_ENTRY_NOTFOUND) )
{
const IFunctionDescription* pDesc = pFuncPage->GetFuncDesc(pFuncPage->GetFunction() );
if (pDesc)
{
pDesc->initArgumentInfo(); // full argument info is needed
String aSig = pDesc->getSignature();
aFtFuncName.SetText( aSig );
aFtFuncDesc.SetText( pDesc->getDescription() );
ResizeArgArr( pDesc );
if ( !m_aArguments.empty() ) // noch Argumente da?
aSig = pDesc->getFormula( m_aArguments ); // fuer Eingabezeile
//@ m_pHelper->setCurrentFormula( aSig );
}
}
else
{
aFtFuncName.SetText( String() );
aFtFuncDesc.SetText( String() );
//ResizeArgArr( NULL );
m_pHelper->setCurrentFormula( String() );
}
}
// -----------------------------------------------------------------------------
// Handler fuer Listboxen
IMPL_LINK( FormulaDlg_Impl, DblClkHdl, FuncPage*, EMPTYARG )
{
sal_uInt16 nFunc = pFuncPage->GetFunction();
// ex-UpdateLRUList
const IFunctionDescription* pDesc = pFuncPage->GetFuncDesc(nFunc);
m_pHelper->insertEntryToLRUList(pDesc);
String aFuncName = pFuncPage->GetSelFunctionName();
aFuncName.AppendAscii(RTL_CONSTASCII_STRINGPARAM( "()" ));
m_pHelper->setCurrentFormula(aFuncName);
pMEdit->ReplaceSelected(aFuncName);
Selection aSel=pMEdit->GetSelection();
aSel.Max()=aSel.Max()-1;
pMEdit->SetSelection(aSel);
FormulaHdl(pMEdit);
aSel.Min()=aSel.Max();
pMEdit->SetSelection(aSel);
if(nArgs==0)
{
BtnHdl(&aBtnBackward);
}
pParaWin->SetEdFocus(0);
aBtnForward.Enable(sal_False); //@New
return 0;
}
// -----------------------------------------------------------------------------
// --------------------------------------------------------------------------
// Funktionen fuer rechte Seite
// --------------------------------------------------------------------------
void FormulaDlg_Impl::SetData(xub_StrLen nFStart,xub_StrLen nNextFStart,xub_StrLen nNextFEnd,xub_StrLen& PrivStart,xub_StrLen& PrivEnd)
{
xub_StrLen nFEnd;
// Selektion merken und neue setzen
m_pHelper->getSelection( nFStart, nFEnd );
m_pHelper->setSelection( nNextFStart, nNextFEnd );
if(!bEditFlag)
pMEdit->SetText(m_pHelper->getCurrentFormula());
m_pHelper->getSelection( PrivStart, PrivEnd);
if(!bEditFlag)
{
pMEdit->SetSelection( Selection(PrivStart, PrivEnd));
aMEFormula.UpdateOldSel();
}
FormEditData* pData = m_pHelper->getFormEditData();
pData->SetFStart( nNextFStart );
pData->SetOffset( 0 );
pData->SetEdFocus( 0 );
FillDialog();
}
// -----------------------------------------------------------------------------
void FormulaDlg_Impl::EditThisFunc(xub_StrLen nFStart)
{
FormEditData* pData = m_pHelper->getFormEditData();
if (!pData) return;
String aFormula = m_pHelper->getCurrentFormula();
if(nFStart==NOT_FOUND)
{
nFStart = pData->GetFStart();
}
else
{
pData->SetFStart(nFStart);
}
xub_StrLen nNextFStart = nFStart;
xub_StrLen nNextFEnd = 0;
sal_Bool bFound;
//@bFound = m_pHelper->getNextFunction( aFormula, sal_False, nNextFStart, &nNextFEnd, &pFuncDesc );
bFound = m_aFormulaHelper.GetNextFunc( aFormula, sal_False, nNextFStart, &nNextFEnd);
if ( bFound )
{
xub_StrLen PrivStart, PrivEnd;
SetData(nFStart,nNextFStart,nNextFEnd,PrivStart, PrivEnd);
m_pHelper->showReference(aFormula.Copy(PrivStart, PrivEnd-PrivStart));
}
else
{
ClearAllParas();
}
}
void FormulaDlg_Impl::EditNextFunc( sal_Bool bForward, xub_StrLen nFStart )
{
FormEditData* pData = m_pHelper->getFormEditData();
if (!pData)
return;
String aFormula = m_pHelper->getCurrentFormula();
if(nFStart==NOT_FOUND)
{
nFStart = pData->GetFStart();
}
else
{
pData->SetFStart(nFStart);
}
xub_StrLen nNextFStart = 0;
xub_StrLen nNextFEnd = 0;
sal_Bool bFound;
if ( bForward )
{
nNextFStart = m_aFormulaHelper.GetArgStart( aFormula, nFStart, 0 );
//@bFound = m_pHelper->getNextFunction( aFormula, sal_False, nNextFStart, &nNextFEnd, &pFuncDesc );
bFound = m_aFormulaHelper.GetNextFunc( aFormula, sal_False, nNextFStart, &nNextFEnd);
}
else
{
nNextFStart = nFStart;
//@bFound = m_pHelper->getNextFunction( aFormula, sal_True, nNextFStart, &nNextFEnd, &pFuncDesc );
bFound = m_aFormulaHelper.GetNextFunc( aFormula, sal_True, nNextFStart, &nNextFEnd);
}
if ( bFound )
{
xub_StrLen PrivStart, PrivEnd;
SetData(nFStart,nNextFStart,nNextFEnd,PrivStart, PrivEnd);
}
}
void FormulaDlg_Impl::EditFuncParas(xub_StrLen nEditPos)
{
if(pFuncDesc!=NULL)
{
FormEditData* pData = m_pHelper->getFormEditData();
if (!pData) return;
String aFormula = m_pHelper->getCurrentFormula();
aFormula +=')';
xub_StrLen nFStart = pData->GetFStart();
DeleteArgs();
nArgs = pFuncDesc->getSuppressedArgumentCount();
sal_Int32 nArgPos=m_aFormulaHelper.GetArgStart( aFormula, nFStart, 0 );
m_aFormulaHelper.GetArgStrings(m_aArguments,aFormula, nFStart, nArgs );
// m_aArguments = ScFormulaUtil::GetArgStrings( aFormula, nFStart, nArgs );
sal_uInt16 nActiv=pParaWin->GetSliderPos();
sal_Bool bFlag=sal_False;
::std::vector< ::rtl::OUString >::iterator aIter = m_aArguments.begin();
::std::vector< ::rtl::OUString >::iterator aEnd = m_aArguments.end();
for(sal_uInt16 i=0;aIter != aEnd;i++,++aIter)
{
sal_Int32 nLength=(*aIter).getLength();
pParaWin->SetArgument(i,(*aIter));
if(nArgPos<=nEditPos && nEditPos<nArgPos+nLength)
{
nActiv=i;
bFlag=sal_True;
}
nArgPos+=nLength+1;
}
if(bFlag)
{
pParaWin->SetSliderPos(nActiv);
}
pParaWin->UpdateParas();
UpdateValues();
}
}
void FormulaDlg_Impl::SaveArg( sal_uInt16 nEd )
{
if (nEd<nArgs)
{
sal_uInt16 i;
for(i=0;i<=nEd;i++)
{
if ( m_aArguments[i].getLength() == 0 )
m_aArguments[i] = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" "));
}
if(pParaWin->GetArgument(nEd).Len()!=0)
m_aArguments[nEd] = pParaWin->GetArgument(nEd);
sal_uInt16 nClearPos=nEd+1;
for(i=nEd+1;i<nArgs;i++)
{
if(pParaWin->GetArgument(i).Len()!=0)
{
nClearPos=i+1;
}
}
for(i=nClearPos;i<nArgs;i++)
{
m_aArguments[i] = ::rtl::OUString();
}
}
}
IMPL_LINK( FormulaDlg_Impl, FxHdl, ParaWin*, pPtr )
{
if(pPtr==pParaWin)
{
aBtnForward.Enable(sal_True); //@ Damit eine neue Fkt eingegeben werden kann.
aTabCtrl.SetCurPageId(TP_FUNCTION);
String aUndoStr = m_pHelper->getCurrentFormula(); // bevor unten ein ";" eingefuegt wird
FormEditData* pData = m_pHelper->getFormEditData();
if (!pData) return 0;
sal_uInt16 nArgNo = pParaWin->GetActiveLine();
nEdFocus=nArgNo;
SaveArg(nArgNo);
UpdateSelection();
xub_StrLen nFormulaStrPos = pData->GetFStart();
String aFormula = m_pHelper->getCurrentFormula();
xub_StrLen n1 = m_aFormulaHelper.GetArgStart( aFormula, nFormulaStrPos, nEdFocus+pData->GetOffset() );
pData->SetEdFocus( nEdFocus );
pData->SaveValues();
pData->SetMode( (sal_uInt16) FORMULA_FORMDLG_FORMULA );
pData->SetFStart( n1 );
pData->SetUndoStr( aUndoStr );
ClearAllParas();
FillDialog(sal_False);
pFuncPage->SetFocus(); //Da Parawin nicht mehr sichtbar
}
return 0;
}
IMPL_LINK( FormulaDlg_Impl, ModifyHdl, ParaWin*, pPtr )
{
if(pPtr==pParaWin)
{
SaveArg(pParaWin->GetActiveLine());
UpdateValues();
UpdateSelection();
CalcStruct(pMEdit->GetText());
}
return 0;
}
IMPL_LINK( FormulaDlg_Impl, FormulaHdl, MultiLineEdit*, EMPTYARG )
{
FormEditData* pData = m_pHelper->getFormEditData();
if (!pData) return 0;
bEditFlag=sal_True;
String aInputFormula=m_pHelper->getCurrentFormula();
String aString=pMEdit->GetText();
Selection aSel =pMEdit->GetSelection();
xub_StrLen nTest=0;
if(aString.Len()==0) //falls alles geloescht wurde
{
aString +='=';
pMEdit->SetText(aString);
aSel .Min()=1;
aSel .Max()=1;
pMEdit->SetSelection(aSel);
}
else if(aString.GetChar(nTest)!='=') //falls ersetzt wurde;
{
aString.Insert( (sal_Unicode)'=', 0 );
pMEdit->SetText(aString);
aSel .Min()+=1;
aSel .Max()+=1;
pMEdit->SetSelection(aSel);
}
m_pHelper->setSelection(0, aInputFormula.Len());
m_pHelper->setCurrentFormula(aString);
m_pHelper->setSelection((xub_StrLen)aSel.Min(),(xub_StrLen)aSel.Max());
xub_StrLen nPos=(xub_StrLen)aSel.Min()-1;
String aStrResult;
if ( CalcValue(m_pHelper->getCurrentFormula(), aStrResult ) )
aWndFormResult.SetValue( aStrResult );
else
{
aStrResult.Erase();
aWndFormResult.SetValue( aStrResult );
}
CalcStruct(aString);
nPos=GetFunctionPos(nPos);
if(nPos<aSel.Min()-1)
{
xub_StrLen nPos1=aString.Search('(',nPos);
EditNextFunc( sal_False, nPos1);
}
else
{
ClearAllParas();
}
m_pHelper->setSelection((xub_StrLen)aSel.Min(),(xub_StrLen)aSel.Max());
bEditFlag=sal_False;
return 0;
}
IMPL_LINK( FormulaDlg_Impl, FormulaCursorHdl, EditBox*, EMPTYARG )
{
FormEditData* pData = m_pHelper->getFormEditData();
if (!pData) return 0;
xub_StrLen nFStart = pData->GetFStart();
bEditFlag=sal_True;
String aInputFormula=m_pHelper->getCurrentFormula();
String aString=pMEdit->GetText();
Selection aSel =pMEdit->GetSelection();
m_pHelper->setSelection((xub_StrLen)aSel.Min(),(xub_StrLen)aSel.Max());
if(aSel.Min()==0)
{
aSel.Min()=1;
pMEdit->SetSelection(aSel);
}
if(aSel.Min()!=aString.Len())
{
xub_StrLen nPos=(xub_StrLen)aSel.Min();
nFStart=GetFunctionPos(nPos - 1);
if(nFStart<nPos)
{
xub_StrLen nPos1=m_aFormulaHelper.GetFunctionEnd(aString,nFStart);
if(nPos1>nPos || nPos1==STRING_NOTFOUND)
{
EditThisFunc(nFStart);
}
else
{
xub_StrLen n=nPos;
short nCount=1;
while(n>0)
{
if(aString.GetChar(n)==')')
nCount++;
else if(aString.GetChar(n)=='(')
nCount--;
if(nCount==0) break;
n--;
}
if(nCount==0)
{
nFStart=m_aFormulaHelper.GetFunctionStart(aString,n,sal_True);
EditThisFunc(nFStart);
}
else
{
ClearAllParas();
}
}
}
else
{
ClearAllParas();
}
}
m_pHelper->setSelection((xub_StrLen)aSel.Min(),(xub_StrLen)aSel.Max());
bEditFlag=sal_False;
return 0;
}
void FormulaDlg_Impl::UpdateSelection()
{
m_pHelper->setSelection((xub_StrLen)aFuncSel.Min(),(xub_StrLen)aFuncSel.Max());
m_pHelper->setCurrentFormula( pFuncDesc->getFormula( m_aArguments ) );
pMEdit->SetText(m_pHelper->getCurrentFormula());
xub_StrLen PrivStart, PrivEnd;
m_pHelper->getSelection( PrivStart, PrivEnd);
aFuncSel.Min()=PrivStart;
aFuncSel.Max()=PrivEnd;
nArgs = pFuncDesc->getSuppressedArgumentCount();
String aFormula=pMEdit->GetText();
sal_Int32 nArgPos=m_aFormulaHelper.GetArgStart( aFormula,PrivStart,0);
sal_uInt16 nPos=pParaWin->GetActiveLine();
for(sal_uInt16 i=0;i<nPos;i++)
{
nArgPos += (m_aArguments[i].getLength() + 1);
}
sal_Int32 nLength= m_aArguments[nPos].getLength();
Selection aSel(nArgPos,nArgPos+nLength);
m_pHelper->setSelection((sal_uInt16)nArgPos,(sal_uInt16)(nArgPos+nLength));
pMEdit->SetSelection(aSel);
aMEFormula.UpdateOldSel();
}
::std::pair<RefButton*,RefEdit*> FormulaDlg_Impl::RefInputStartBefore( RefEdit* pEdit, RefButton* pButton )
{
aEdRef.Show();
pTheRefEdit = pEdit;
pTheRefButton = pButton;
if( pTheRefEdit )
{
aEdRef.SetRefString( pTheRefEdit->GetText() );
aEdRef.SetSelection( pTheRefEdit->GetSelection() );
aEdRef.SetHelpId( pTheRefEdit->GetHelpId() );
aEdRef.SetUniqueId( pTheRefEdit->GetUniqueId() );
}
aRefBtn.Show( pButton != NULL );
//m_pHelper->RefInputStart( &aEdRef, pButton ? &aRefBtn : NULL );
::std::pair<RefButton*,RefEdit*> aPair;
aPair.first = pButton ? &aRefBtn : NULL;
aPair.second = &aEdRef;
return aPair;
}
void FormulaDlg_Impl::RefInputStartAfter( RefEdit* /*pEdit*/, RefButton* /*pButton*/ )
{
aRefBtn.SetEndImage();
if( pTheRefEdit )
{
String aStr = aTitle2;
aStr += ' ';
aStr += aFtEditName.GetText();
aStr.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "( " ) );
if( pParaWin->GetActiveLine() > 0 )
aStr.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "...; " ) );
aStr += pParaWin->GetActiveArgName();
if( pParaWin->GetActiveLine() + 1 < nArgs )
aStr.AppendAscii(RTL_CONSTASCII_STRINGPARAM( "; ..." ));
aStr.AppendAscii( RTL_CONSTASCII_STRINGPARAM( " )" ) );
m_pParent->SetText( MnemonicGenerator::EraseAllMnemonicChars( aStr ) );
}
}
void FormulaDlg_Impl::RefInputDoneAfter( sal_Bool bForced )
{
aRefBtn.SetStartImage();
if( bForced || !aRefBtn.IsVisible() )
{
aEdRef.Hide();
aRefBtn.Hide();
if( pTheRefEdit )
{
pTheRefEdit->SetRefString( aEdRef.GetText() );
pTheRefEdit->GrabFocus();
if( pTheRefButton )
pTheRefButton->SetStartImage();
sal_uInt16 nPrivActiv = pParaWin->GetActiveLine();
pParaWin->SetArgument( nPrivActiv, aEdRef.GetText() );
ModifyHdl( pParaWin );
pTheRefEdit = NULL;
}
m_pParent->SetText( aTitle1 );
}
}
RefEdit* FormulaDlg_Impl::GetCurrRefEdit()
{
return aEdRef.IsVisible() ? &aEdRef : pParaWin->GetActiveEdit();
}
void FormulaDlg_Impl::Update()
{
FormEditData* pData = m_pHelper->getFormEditData();
const String sExpression = pMEdit->GetText();
aOldFormula = String();
UpdateTokenArray(sExpression);
FormulaCursorHdl(&aMEFormula);
CalcStruct(sExpression);
if(pData->GetMode() == FORMULA_FORMDLG_FORMULA)
aTabCtrl.SetCurPageId(TP_FUNCTION);
else
aTabCtrl.SetCurPageId(TP_STRUCT);
aBtnMatrix.Check(pData->GetMatrixFlag());
/*aTimer.SetTimeout(200);
aTimer.SetTimeoutHdl(LINK( this, FormulaDlg_Impl, UpdateFocusHdl));
aTimer.Start();*/
}
void FormulaDlg_Impl::Update(const String& _sExp)
{
CalcStruct(_sExp);
FillDialog();
//aBtnForward.Enable(sal_True); //@New
FuncSelHdl(NULL);
}
void FormulaDlg_Impl::SetMeText(const String& _sText)
{
FormEditData* pData = m_pHelper->getFormEditData();
pMEdit->SetText(_sText);
pMEdit->SetSelection( pData->GetSelection());
aMEFormula.UpdateOldSel();
}
FormulaDlgMode FormulaDlg_Impl::SetMeText(const String& _sText,xub_StrLen PrivStart, xub_StrLen PrivEnd,sal_Bool bMatrix,sal_Bool _bSelect,sal_Bool _bUpdate)
{
FormulaDlgMode eMode = FORMULA_FORMDLG_FORMULA;
if(!bEditFlag)
pMEdit->SetText(_sText);
if ( _bSelect || !bEditFlag )
pMEdit->SetSelection( Selection(PrivStart, PrivEnd));
if ( _bUpdate )
{
aMEFormula.UpdateOldSel();
pMEdit->Invalidate();
m_pHelper->showReference(pMEdit->GetSelected());
eMode = FORMULA_FORMDLG_EDIT;
aBtnMatrix.Check( bMatrix );
} // if ( _bUpdate )
return eMode;
}
sal_Bool FormulaDlg_Impl::CheckMatrix(String& aFormula)
{
pMEdit->GrabFocus();
xub_StrLen nLen = aFormula.Len();
sal_Bool bMatrix = nLen > 3 // Matrix-Formel ?
&& aFormula.GetChar(0) == '{'
&& aFormula.GetChar(1) == '='
&& aFormula.GetChar(nLen-1) == '}';
if ( bMatrix )
{
aFormula.Erase( 0, 1 );
aFormula.Erase( aFormula.Len()-1, 1);
aBtnMatrix.Check( bMatrix );
aBtnMatrix.Disable();
} // if ( bMatrix )
aTabCtrl.SetCurPageId(TP_STRUCT);
return bMatrix;
}
IMPL_LINK( FormulaDlg_Impl, StructSelHdl, StructPage*, pStruP )
{
bStructUpdate=sal_False;
if(pStructPage->IsVisible()) aBtnForward.Enable(sal_False); //@New
if(pStructPage==pStruP)
{
/// TODO
//ScToken* pSelToken = pStructPage->GetSelectedToken();
// ScToken* pOrigToken = ((pSelToken && pSelToken->GetType() == svFAP) ?
// pSelToken->GetFAPOrigToken() : pSelToken);
//xub_StrLen nTokPos=1;
//if(pScTokA!=NULL)
//{
// ScToken* pToken = pScTokA->First();
// while(pToken!=NULL)
// {
// String aString;
// if ( pToken == pOrigToken )
// break;
// pComp->CreateStringFromToken( aString,pToken);
// nTokPos = sal::static_int_cast<xub_StrLen>( nTokPos + aString.Len() );
// pToken=pScTokA->Next();
// }
// EditThisFunc(nTokPos);
//}
//if( pOrigToken )
//{
// String aStr;
// pComp->CreateStringFromToken( aStr, pOrigToken );
// String aEntryTxt=pStructPage->GetSelectedEntryText();
// if(aEntryTxt!=aStr)
// ShowReference(aEntryTxt);
//}
}
bStructUpdate=sal_True;
return 0;
}
IMPL_LINK( FormulaDlg_Impl, MatrixHdl, CheckBox *, EMPTYARG )
{
bUserMatrixFlag=sal_True;
return 0;
}
IMPL_LINK( FormulaDlg_Impl, FuncSelHdl, FuncPage*, EMPTYARG )
{
sal_uInt16 nCat = pFuncPage->GetCategory();
if ( nCat == LISTBOX_ENTRY_NOTFOUND ) nCat = 0;
sal_uInt16 nFunc = pFuncPage->GetFunction();
if ( nFunc == LISTBOX_ENTRY_NOTFOUND ) nFunc = 0;
if ( (pFuncPage->GetFunctionEntryCount() > 0)
&& (pFuncPage->GetFunction() != LISTBOX_ENTRY_NOTFOUND) )
{
const IFunctionDescription* pDesc =pFuncPage->GetFuncDesc( pFuncPage->GetFunction() );
if(pDesc!=pFuncDesc) aBtnForward.Enable(sal_True); //new
if (pDesc)
{
pDesc->initArgumentInfo(); // full argument info is needed
String aSig = pDesc->getSignature();
aFtHeadLine.SetText( pDesc->getFunctionName() );
aFtFuncName.SetText( aSig );
aFtFuncDesc.SetText( pDesc->getDescription() );
}
}
else
{
aFtHeadLine.SetText( String() );
aFtFuncName.SetText( String() );
aFtFuncDesc.SetText( String() );
}
return 0;
}
void FormulaDlg_Impl::UpdateParaWin(const Selection& _rSelection,const String& _sRefStr)
{
Selection theSel = _rSelection;
aEdRef.ReplaceSelected( _sRefStr );
theSel.Max() = theSel.Min() + _sRefStr.Len();
aEdRef.SetSelection( theSel );
//-------------------------------------
// Manuelles Update der Ergebnisfelder:
//-------------------------------------
sal_uInt16 nPrivActiv = pParaWin->GetActiveLine();
pParaWin->SetArgument(nPrivActiv,aEdRef.GetText());
pParaWin->UpdateParas();
Edit* pEd = GetCurrRefEdit();
if( pEd != NULL )
pEd->SetSelection( theSel );
pParaWin->SetRefMode(sal_False);
}
sal_Bool FormulaDlg_Impl::UpdateParaWin(Selection& _rSelection)
{
pParaWin->SetRefMode(sal_True);
String aStrEd;
Edit* pEd = GetCurrRefEdit();
if(pEd!=NULL && pTheRefEdit==NULL)
{
_rSelection=pEd->GetSelection();
_rSelection.Justify();
aStrEd=pEd->GetText();
aEdRef.SetRefString(aStrEd);
aEdRef.SetSelection( _rSelection );
}
else
{
_rSelection=aEdRef.GetSelection();
_rSelection.Justify();
aStrEd= aEdRef.GetText();
}
return pTheRefEdit == NULL;
}
rtl::OString FormulaDlg_Impl::FindFocusWin(Window *pWin)
{
rtl::OString aUniqueId;
if(pWin->HasFocus())
{
aUniqueId=pWin->GetUniqueId();
if(aUniqueId.getLength()==0)
{
Window* pParent=pWin->GetParent();
while(pParent!=NULL)
{
aUniqueId=pParent->GetUniqueId();
if(aUniqueId.getLength()!=0) break;
pParent=pParent->GetParent();
}
}
}
else
{
sal_uInt16 nCount=pWin->GetChildCount();
for(sal_uInt16 i=0;i<nCount;i++)
{
Window* pChild=pWin->GetChild(i);
aUniqueId=FindFocusWin(pChild);
if(aUniqueId.getLength()>0) break;
}
}
return aUniqueId;
}
void FormulaDlg_Impl::SetEdSelection()
{
Edit* pEd = GetCurrRefEdit()/*aScParaWin.GetActiveEdit()*/;
if( pEd )
{
Selection theSel = aEdRef.GetSelection();
// Edit may have the focus -> call ModifyHdl in addition
// to what's happening in GetFocus
pEd->GetModifyHdl().Call(pEd);
pEd->GrabFocus();
pEd->SetSelection(theSel);
} // if( pEd )
}
// -----------------------------------------------------------------------------
const FormulaHelper& FormulaDlg_Impl::GetFormulaHelper() const
{
return m_aFormulaHelper;
}
//============================================================================
FormulaModalDialog::FormulaModalDialog( Window* pParent
, bool _bSupportFunctionResult
, bool _bSupportResult
, bool _bSupportMatrix
, IFormulaEditorHelper* _pHelper
, IFunctionManager* _pFunctionMgr
, IControlReferenceHandler* _pDlg ) :
ModalDialog( pParent, ModuleRes(RID_FORMULADLG_FORMULA_MODAL) ),
m_pImpl( new FormulaDlg_Impl(this,_bSupportFunctionResult
, _bSupportResult
, _bSupportMatrix
,_pHelper,_pFunctionMgr,_pDlg))
{
FreeResource();
SetText(m_pImpl->aTitle1);
}
FormulaModalDialog::~FormulaModalDialog()
{
}
// -----------------------------------------------------------------------------
void FormulaModalDialog::Update(const String& _sExp)
{
m_pImpl->Update(_sExp);
}
// -----------------------------------------------------------------------------
void FormulaModalDialog::SetMeText(const String& _sText)
{
m_pImpl->SetMeText(_sText);
}
// -----------------------------------------------------------------------------
FormulaDlgMode FormulaModalDialog::SetMeText(const String& _sText,xub_StrLen PrivStart, xub_StrLen PrivEnd,sal_Bool bMatrix,sal_Bool _bSelect,sal_Bool _bUpdate)
{
return m_pImpl->SetMeText(_sText,PrivStart, PrivEnd,bMatrix,_bSelect,_bUpdate);
}
// -----------------------------------------------------------------------------
void FormulaModalDialog::CheckMatrix()
{
m_pImpl->aBtnMatrix.Check();
}
// -----------------------------------------------------------------------------
sal_Bool FormulaModalDialog::CheckMatrix(String& aFormula)
{
return m_pImpl->CheckMatrix(aFormula);
}
// -----------------------------------------------------------------------------
String FormulaModalDialog::GetMeText() const
{
return m_pImpl->pMEdit->GetText();
}
// -----------------------------------------------------------------------------
void FormulaModalDialog::Update()
{
m_pImpl->Update();
}
// -----------------------------------------------------------------------------
const FormulaHelper& FormulaModalDialog::GetFormulaHelper() const
{
return m_pImpl->GetFormulaHelper();
}
// -----------------------------------------------------------------------------
sal_Bool FormulaModalDialog::isUserMatrix() const
{
return m_pImpl->bUserMatrixFlag;
}
void FormulaModalDialog::DoEnter(sal_Bool _bOk)
{
m_pImpl->DoEnter(_bOk);
}
::std::pair<RefButton*,RefEdit*> FormulaModalDialog::RefInputStartBefore( RefEdit* pEdit, RefButton* pButton )
{
return m_pImpl->RefInputStartBefore( pEdit, pButton );
}
void FormulaModalDialog::RefInputStartAfter( RefEdit* pEdit, RefButton* pButton )
{
m_pImpl->RefInputStartAfter( pEdit, pButton );
}
void FormulaModalDialog::RefInputDoneAfter( sal_Bool bForced )
{
m_pImpl->RefInputDoneAfter( bForced );
}
rtl::OString FormulaModalDialog::FindFocusWin(Window *pWin)
{
return m_pImpl->FindFocusWin( pWin );
}
void FormulaModalDialog::SetFocusWin(Window *pWin,const rtl::OString& nUniqueId)
{
if(pWin->GetUniqueId()==nUniqueId)
{
pWin->GrabFocus();
}
else
{
sal_uInt16 nCount=pWin->GetChildCount();
for(sal_uInt16 i=0;i<nCount;i++)
{
Window* pChild=pWin->GetChild(i);
SetFocusWin(pChild,nUniqueId);
}
}
}
long FormulaModalDialog::PreNotify( NotifyEvent& rNEvt )
{
m_pImpl->PreNotify( rNEvt );
return ModalDialog::PreNotify(rNEvt);
}
void FormulaModalDialog::HighlightFunctionParas(const String& aFormula)
{
m_pImpl->m_pHelper->showReference(aFormula);
}
void FormulaModalDialog::disableOk()
{
m_pImpl->aBtnEnd.Disable();
}
// -----------------------------------------------------------------------------
const IFunctionDescription* FormulaModalDialog::getCurrentFunctionDescription() const
{
OSL_VERIFY(!m_pImpl->pFuncDesc || m_pImpl->pFuncDesc->getSuppressedArgumentCount() == m_pImpl->nArgs);
return m_pImpl->pFuncDesc;
}
// -----------------------------------------------------------------------------
void FormulaModalDialog::UpdateParaWin(const Selection& _rSelection,const String& _sRefStr)
{
m_pImpl->UpdateParaWin(_rSelection,_sRefStr);
}
sal_Bool FormulaModalDialog::UpdateParaWin(Selection& _rSelection)
{
return m_pImpl->UpdateParaWin(_rSelection);
}
// -----------------------------------------------------------------------------
RefEdit* FormulaModalDialog::GetActiveEdit()
{
return m_pImpl->pParaWin->GetActiveEdit();
}
// -----------------------------------------------------------------------------
void FormulaModalDialog::SetEdSelection()
{
m_pImpl->SetEdSelection();
}
// --------------------------------------------------------------------------
// Initialisierung / gemeinsaME Funktionen fuer Dialog
// --------------------------------------------------------------------------
FormulaDlg::FormulaDlg( SfxBindings* pB, SfxChildWindow* pCW,
Window* pParent
, bool _bSupportFunctionResult
, bool _bSupportResult
, bool _bSupportMatrix
, IFormulaEditorHelper* _pHelper,IFunctionManager* _pFunctionMgr,IControlReferenceHandler* _pDlg ) :
SfxModelessDialog( pB, pCW, pParent, ModuleRes(RID_FORMULADLG_FORMULA) ),
m_pImpl( new FormulaDlg_Impl(this, _bSupportFunctionResult
, _bSupportResult
, _bSupportMatrix
,_pHelper,_pFunctionMgr,_pDlg))
{
FreeResource();
if(!GetHelpId().getLength()) //Hack, da im SfxModelessDialog die HelpId
SetHelpId(GetUniqueId()); //fuer einen ModelessDialog entfernt und
//in eine UniqueId gewandelt wird, machen
//wir das an dieser Stelle rueckgaengig.
SetText(m_pImpl->aTitle1);
}
FormulaDlg::~FormulaDlg()
{
}
// -----------------------------------------------------------------------------
void FormulaDlg::Update(const String& _sExp)
{
m_pImpl->Update(_sExp);
}
// -----------------------------------------------------------------------------
void FormulaDlg::SetMeText(const String& _sText)
{
m_pImpl->SetMeText(_sText);
}
// -----------------------------------------------------------------------------
FormulaDlgMode FormulaDlg::SetMeText(const String& _sText,xub_StrLen PrivStart, xub_StrLen PrivEnd,sal_Bool bMatrix,sal_Bool _bSelect,sal_Bool _bUpdate)
{
return m_pImpl->SetMeText(_sText,PrivStart, PrivEnd,bMatrix,_bSelect,_bUpdate);
}
// -----------------------------------------------------------------------------
void FormulaDlg::CheckMatrix()
{
m_pImpl->aBtnMatrix.Check();
}
// -----------------------------------------------------------------------------
sal_Bool FormulaDlg::CheckMatrix(String& aFormula)
{
return m_pImpl->CheckMatrix(aFormula);
}
// -----------------------------------------------------------------------------
String FormulaDlg::GetMeText() const
{
return m_pImpl->pMEdit->GetText();
}
// -----------------------------------------------------------------------------
void FormulaDlg::Update()
{
m_pImpl->Update();
m_pImpl->aTimer.SetTimeout(200);
m_pImpl->aTimer.SetTimeoutHdl(LINK( this, FormulaDlg, UpdateFocusHdl));
m_pImpl->aTimer.Start();
}
// -----------------------------------------------------------------------------
sal_Bool FormulaDlg::isUserMatrix() const
{
return m_pImpl->bUserMatrixFlag;
}
void FormulaDlg::DoEnter(sal_Bool _bOk)
{
m_pImpl->DoEnter(_bOk);
}
::std::pair<RefButton*,RefEdit*> FormulaDlg::RefInputStartBefore( RefEdit* pEdit, RefButton* pButton )
{
return m_pImpl->RefInputStartBefore( pEdit, pButton );
}
void FormulaDlg::RefInputStartAfter( RefEdit* pEdit, RefButton* pButton )
{
m_pImpl->RefInputStartAfter( pEdit, pButton );
}
void FormulaDlg::RefInputDoneAfter( sal_Bool bForced )
{
m_pImpl->RefInputDoneAfter( bForced );
}
rtl::OString FormulaDlg::FindFocusWin(Window *pWin)
{
return m_pImpl->FindFocusWin( pWin );
}
void FormulaDlg::SetFocusWin(Window *pWin,const rtl::OString& nUniqueId)
{
if(pWin->GetUniqueId()==nUniqueId)
{
pWin->GrabFocus();
}
else
{
sal_uInt16 nCount=pWin->GetChildCount();
for(sal_uInt16 i=0;i<nCount;i++)
{
Window* pChild=pWin->GetChild(i);
SetFocusWin(pChild,nUniqueId);
}
}
}
long FormulaDlg::PreNotify( NotifyEvent& rNEvt )
{
m_pImpl->PreNotify( rNEvt );
return SfxModelessDialog::PreNotify(rNEvt);
}
void FormulaDlg::HighlightFunctionParas(const String& aFormula)
{
m_pImpl->m_pHelper->showReference(aFormula);
}
void FormulaDlg::disableOk()
{
m_pImpl->aBtnEnd.Disable();
}
// -----------------------------------------------------------------------------
const IFunctionDescription* FormulaDlg::getCurrentFunctionDescription() const
{
OSL_VERIFY(!m_pImpl->pFuncDesc || m_pImpl->pFuncDesc->getSuppressedArgumentCount() == m_pImpl->nArgs);
return m_pImpl->pFuncDesc;
}
// -----------------------------------------------------------------------------
void FormulaDlg::UpdateParaWin(const Selection& _rSelection,const String& _sRefStr)
{
m_pImpl->UpdateParaWin(_rSelection,_sRefStr);
}
sal_Bool FormulaDlg::UpdateParaWin(Selection& _rSelection)
{
return m_pImpl->UpdateParaWin(_rSelection);
}
// -----------------------------------------------------------------------------
RefEdit* FormulaDlg::GetActiveEdit()
{
return m_pImpl->pParaWin->GetActiveEdit();
}
// -----------------------------------------------------------------------------
const FormulaHelper& FormulaDlg::GetFormulaHelper() const
{
return m_pImpl->GetFormulaHelper();
}
// -----------------------------------------------------------------------------
void FormulaDlg::SetEdSelection()
{
m_pImpl->SetEdSelection();
}
IMPL_LINK( FormulaDlg, UpdateFocusHdl, Timer*, EMPTYARG )
{
FormEditData* pData = m_pImpl->m_pHelper->getFormEditData();
if (pData) // wird nicht ueber Close zerstoert;
{
m_pImpl->m_pHelper->setReferenceInput(pData);
rtl::OString nUniqueId(pData->GetUniqueId());
SetFocusWin(this,nUniqueId);
}
return 0;
}
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
void FormEditData::SaveValues()
{
FormEditData* pTemp = new FormEditData(*this);
Reset();
pParent = pTemp;
}
// -----------------------------------------------------------------------------
void FormEditData::Reset()
{
pParent = NULL;
nMode = 0;
nFStart = 0;
nCatSel = 1; //! oder 0 (zuletzt benutzte)
nFuncSel = 0;
nOffset = 0;
nEdFocus = 0;
bMatrix =sal_False;
aUniqueId=rtl::OString();
aSelection.Min()=0;
aSelection.Max()=0;
aUndoStr.Erase();
}
// -----------------------------------------------------------------------------
void FormEditData::RestoreValues()
{
FormEditData* pTemp = pParent;
DBG_ASSERT(pTemp,"RestoreValues ohne Parent");
if (pTemp)
{
*this = *pTemp;
pTemp->pParent = NULL; // sonst wird der auch geloescht!
delete pTemp;
}
}
// -----------------------------------------------------------------------------
const FormEditData& FormEditData::operator=( const FormEditData& r )
{
pParent = r.pParent;
nMode = r.nMode;
nFStart = r.nFStart;
nCatSel = r.nCatSel;
nFuncSel = r.nFuncSel;
nOffset = r.nOffset;
nEdFocus = r.nEdFocus;
aUndoStr = r.aUndoStr;
bMatrix = r.bMatrix ;
aUniqueId = r.aUniqueId;
aSelection = r.aSelection;
return *this;
}
// -----------------------------------------------------------------------------
FormEditData::FormEditData()
{
Reset();
}
FormEditData::~FormEditData()
{
delete pParent;
}
FormEditData::FormEditData( const FormEditData& r )
{
*this = r;
}
// -----------------------------------------------------------------------------
} // formula
// -----------------------------------------------------------------------------