diff options
Diffstat (limited to 'formula/source/ui/dlg/formula.cxx')
-rw-r--r-- | formula/source/ui/dlg/formula.cxx | 2236 |
1 files changed, 2236 insertions, 0 deletions
diff --git a/formula/source/ui/dlg/formula.cxx b/formula/source/ui/dlg/formula.cxx new file mode 100644 index 000000000000..f1a97171fa11 --- /dev/null +++ b/formula/source/ui/dlg/formula.cxx @@ -0,0 +1,2236 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 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( BOOL bForced ); + BOOL CalcValue( const String& rStrExp, String& rStrResult ); + 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(BOOL nFlag=TRUE); + void EditNextFunc( BOOL bForward, xub_StrLen nFStart=NOT_FOUND ); + void EditThisFunc(xub_StrLen nFStart); + void EditFuncParas(xub_StrLen nEditPos); + + + void UpdateArgInput( USHORT nOffset, USHORT nInput ); + void Update(); + void Update(const String& _sExp); + + + void SaveArg( USHORT nEd ); + void UpdateSelection(); + void DoEnter( BOOL bOk ); + void UpdateFunctionDesc(); + void ResizeArgArr( const IFunctionDescription* pNewFunc ); + void FillListboxes(); + void FillControls(BOOL &rbNext, BOOL &rbPrev); + + FormulaDlgMode SetMeText(const String& _sText,xub_StrLen PrivStart, xub_StrLen PrivEnd,BOOL bMatrix,BOOL _bSelect,BOOL _bUpdate); + void SetMeText(const String& _sText); + BOOL CheckMatrix(String& aFormula /*IN/OUT*/); + + void SetEdSelection(); + + 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(); + ULONG 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; + BOOL bStructUpdate; + MultiLineEdit* pMEdit; + BOOL bUserMatrixFlag; + Timer aTimer; + + const String aTitle1; + const String aTitle2; + const String aTxtEnd; + const String aTxtOk; // hinter aBtnEnd + FormulaHelper + m_aFormulaHelper; + + SmartId m_aSmartEditHelpId; + + ULONG nOldHelp; + ULONG nOldUnique; + ULONG nActivWinId; + BOOL bIsShutDown; + + + + Font aFntBold; + Font aFntLight; + USHORT nEdFocus; + // Selection theCurSel; + 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 (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), + // + nActivWinId (0), + bIsShutDown (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(); + m_aSmartEditHelpId = pMEdit->GetSmartHelpId(); + pMEdit->SetSmartUniqueId(m_aSmartEditHelpId); + + bEditFlag=FALSE; + bStructUpdate=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); + + nOldHelp = pParent->GetHelpId(); // HelpId aus Resource immer fuer "Seite 1" + nOldUnique = 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( 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=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( (USHORT) FORMULA_FORMDLG_FORMULA ); + else + pData->SetMode( (USHORT) 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 ) +{ + USHORT nSwitch=rNEvt.GetType(); + if(nSwitch==EVENT_GETFOCUS && !bIsShutDown) + { + Window* pWin=rNEvt.GetWindow(); + if(pWin!=NULL) + { + nActivWinId = pWin->GetUniqueId(); + if(nActivWinId==0) + { + Window* pParent=pWin->GetParent(); + while(pParent!=NULL) + { + nActivWinId=pParent->GetUniqueId(); + + if(nActivWinId!=0) break; + + pParent=pParent->GetParent(); + } + } + if(nActivWinId!=0) + { + + FormEditData* pData = m_pHelper->getFormEditData(); + + if (pData && !aTimer.IsActive()) // wird nicht ueber Close zerstoert; + { + pData->SetUniqueId(nActivWinId); + } + } + } + } +} +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; + BOOL bFlag=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=TRUE; + } + else if ( eOp == m_aSeparatorsOpCodes[TOKEN_CLOSE].OpCode ) + { + nBracketCount--; + bFlag=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; +} +// ----------------------------------------------------------------------------- +BOOL FormulaDlg_Impl::CalcValue( const String& rStrExp, String& rStrResult ) +{ + BOOL bResult = 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 = 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()); +} + +BOOL FormulaDlg_Impl::CalcStruct( const String& rStrExp) +{ + BOOL bResult = 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 = 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(TRUE); // #i101512# special handling is needed + aCompiler.CompileTokenArray(); +} + +void FormulaDlg_Impl::FillDialog(BOOL nFlag) +{ + BOOL bNext=TRUE, bPrev=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<USHORT>(pFuncDesc->getCategory()->getNumber() + 1)); + + USHORT 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( TRUE);// Modal-Modus einschalten + + aNewTitle = aTitle1; + + // HelpId fuer 1. Seite ist die aus der Resource + m_pParent->SetHelpId( nOldHelp ); + m_pParent->SetUniqueId( nOldUnique ); +} +// ----------------------------------------------------------------------------- +void FormulaDlg_Impl::FillControls(BOOL &rbNext, 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; + BOOL bTestFlag = FALSE; + + if ( m_aFormulaHelper.GetNextFunc( aFormula, 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 long nHelpId = pFuncDesc->getHelpId(); + if ( nHelpId ) + pMEdit->SetSmartHelpId(SmartId(nHelpId)); + } + + 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(); + USHORT nOffset = pData->GetOffset(); + nEdFocus = pData->GetEdFocus(); + + // Verkettung der Edit's fuer Focus-Kontrolle + + if(bTestFlag) + pParaWin->SetArgumentOffset(nOffset); + USHORT nActiv=0; + xub_StrLen nArgPos= m_aFormulaHelper.GetArgStart( aFormula, nFStart, 0 ); + xub_StrLen nEditPos=(xub_StrLen) pMEdit->GetSelection().Min(); + BOOL bFlag=FALSE; + + for(USHORT 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=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->SetSmartHelpId(m_aSmartEditHelpId); + } + // Test, ob vorne/hinten noch mehr Funktionen sind + + xub_StrLen nTempStart = m_aFormulaHelper.GetArgStart( aFormula, nFStart, 0 ); + rbNext = m_aFormulaHelper.GetNextFunc( aFormula, FALSE, nTempStart ); + nTempStart=(xub_StrLen)pMEdit->GetSelection().Min(); + pData->SetFStart(nTempStart); + rbPrev = m_aFormulaHelper.GetNextFunc( aFormula, 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(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(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(FALSE); // schliesst den Dialog + } + else if ( pBtn == &aBtnEnd ) + { + DoEnter(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( TRUE ); + else + { + DblClkHdl(pFuncPage); //new + aBtnForward.Enable(FALSE); //new + } + //@EditNextFunc( TRUE ); + } + else if ( pBtn == &aBtnBackward ) + { + bEditFlag=FALSE; + aBtnForward.Enable(TRUE); + EditNextFunc( 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; + USHORT nCat = pFuncPage->GetCategory(); + if ( nCat == LISTBOX_ENTRY_NOTFOUND ) + nCat = 0; + pData->SetCatSel( nCat ); + USHORT 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 ) +{ + USHORT 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(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; + + BOOL bFound; + + //@bFound = m_pHelper->getNextFunction( aFormula, FALSE, nNextFStart, &nNextFEnd, &pFuncDesc ); + + bFound = m_aFormulaHelper.GetNextFunc( aFormula, 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( 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; + + BOOL bFound; + if ( bForward ) + { + nNextFStart = m_aFormulaHelper.GetArgStart( aFormula, nFStart, 0 ); + //@bFound = m_pHelper->getNextFunction( aFormula, FALSE, nNextFStart, &nNextFEnd, &pFuncDesc ); + bFound = m_aFormulaHelper.GetNextFunc( aFormula, FALSE, nNextFStart, &nNextFEnd); + } + else + { + nNextFStart = nFStart; + //@bFound = m_pHelper->getNextFunction( aFormula, TRUE, nNextFStart, &nNextFEnd, &pFuncDesc ); + bFound = m_aFormulaHelper.GetNextFunc( aFormula, 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 ); + + USHORT nActiv=pParaWin->GetSliderPos(); + BOOL bFlag=FALSE; + ::std::vector< ::rtl::OUString >::iterator aIter = m_aArguments.begin(); + ::std::vector< ::rtl::OUString >::iterator aEnd = m_aArguments.end(); + for(USHORT i=0;aIter != aEnd;i++,++aIter) + { + sal_Int32 nLength=(*aIter).getLength(); + pParaWin->SetArgument(i,(*aIter)); + if(nArgPos<=nEditPos && nEditPos<nArgPos+nLength) + { + nActiv=i; + bFlag=TRUE; + } + nArgPos+=nLength+1; + } + + if(bFlag) + { + pParaWin->SetSliderPos(nActiv); + } + + pParaWin->UpdateParas(); + UpdateValues(); + } + +} + +void FormulaDlg_Impl::SaveArg( USHORT nEd ) +{ + if (nEd<nArgs) + { + USHORT 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); + + USHORT 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(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; + + USHORT 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( (USHORT) FORMULA_FORMDLG_FORMULA ); + pData->SetFStart( n1 ); + pData->SetUndoStr( aUndoStr ); + ClearAllParas(); + + FillDialog(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=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( FALSE, nPos1); + } + else + { + ClearAllParas(); + } + + m_pHelper->setSelection((xub_StrLen)aSel.Min(),(xub_StrLen)aSel.Max()); + bEditFlag=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=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,TRUE); + EditThisFunc(nFStart); + } + else + { + ClearAllParas(); + } + } + } + else + { + ClearAllParas(); + } + } + m_pHelper->setSelection((xub_StrLen)aSel.Min(),(xub_StrLen)aSel.Max()); + + bEditFlag=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); + + USHORT nPos=pParaWin->GetActiveLine(); + + for(USHORT 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((USHORT)nArgPos,(USHORT)(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( BOOL bForced ) +{ + aRefBtn.SetStartImage(); + if( bForced || !aRefBtn.IsVisible() ) + { + aEdRef.Hide(); + aRefBtn.Hide(); + if( pTheRefEdit ) + { + pTheRefEdit->SetRefString( aEdRef.GetText() ); + pTheRefEdit->GrabFocus(); + + if( pTheRefButton ) + pTheRefButton->SetStartImage(); + + USHORT 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(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,BOOL bMatrix,BOOL _bSelect,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; +} +BOOL FormulaDlg_Impl::CheckMatrix(String& aFormula) +{ + pMEdit->GrabFocus(); + xub_StrLen nLen = aFormula.Len(); + 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=FALSE; + if(pStructPage->IsVisible()) aBtnForward.Enable(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=TRUE; + return 0; +} +IMPL_LINK( FormulaDlg_Impl, MatrixHdl, CheckBox *, EMPTYARG ) +{ + bUserMatrixFlag=TRUE; + return 0; +} + +IMPL_LINK( FormulaDlg_Impl, FuncSelHdl, FuncPage*, EMPTYARG ) +{ + USHORT nCat = pFuncPage->GetCategory(); + if ( nCat == LISTBOX_ENTRY_NOTFOUND ) nCat = 0; + USHORT 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(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: + //------------------------------------- + USHORT nPrivActiv = pParaWin->GetActiveLine(); + pParaWin->SetArgument(nPrivActiv,aEdRef.GetText()); + pParaWin->UpdateParas(); + + Edit* pEd = GetCurrRefEdit(); + if( pEd != NULL ) + pEd->SetSelection( theSel ); + + pParaWin->SetRefMode(FALSE); +} +BOOL FormulaDlg_Impl::UpdateParaWin(Selection& _rSelection) +{ + pParaWin->SetRefMode(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; +} +ULONG FormulaDlg_Impl::FindFocusWin(Window *pWin) +{ + ULONG nUniqueId=0; + if(pWin->HasFocus()) + { + nUniqueId=pWin->GetUniqueId(); + if(nUniqueId==0) + { + Window* pParent=pWin->GetParent(); + while(pParent!=NULL) + { + nUniqueId=pParent->GetUniqueId(); + + if(nUniqueId!=0) break; + + pParent=pParent->GetParent(); + } + } + } + else + { + USHORT nCount=pWin->GetChildCount(); + + for(USHORT i=0;i<nCount;i++) + { + Window* pChild=pWin->GetChild(i); + nUniqueId=FindFocusWin(pChild); + if(nUniqueId>0) break; + } + } + return nUniqueId; +} + +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,BOOL bMatrix,BOOL _bSelect,BOOL _bUpdate) +{ + return m_pImpl->SetMeText(_sText,PrivStart, PrivEnd,bMatrix,_bSelect,_bUpdate); +} +// ----------------------------------------------------------------------------- +void FormulaModalDialog::CheckMatrix() +{ + m_pImpl->aBtnMatrix.Check(); +} +// ----------------------------------------------------------------------------- +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(); +} +// ----------------------------------------------------------------------------- +BOOL FormulaModalDialog::isUserMatrix() const +{ + return m_pImpl->bUserMatrixFlag; +} +void FormulaModalDialog::DoEnter(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( BOOL bForced ) +{ + m_pImpl->RefInputDoneAfter( bForced ); +} + +ULONG FormulaModalDialog::FindFocusWin(Window *pWin) +{ + return m_pImpl->FindFocusWin( pWin ); +} + +void FormulaModalDialog::SetFocusWin(Window *pWin,ULONG nUniqueId) +{ + if(pWin->GetUniqueId()==nUniqueId) + { + pWin->GrabFocus(); + } + else + { + USHORT nCount=pWin->GetChildCount(); + + for(USHORT 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); +} +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()==0) //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,BOOL bMatrix,BOOL _bSelect,BOOL _bUpdate) +{ + return m_pImpl->SetMeText(_sText,PrivStart, PrivEnd,bMatrix,_bSelect,_bUpdate); +} +// ----------------------------------------------------------------------------- +void FormulaDlg::CheckMatrix() +{ + m_pImpl->aBtnMatrix.Check(); +} +// ----------------------------------------------------------------------------- +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(); +} + +// ----------------------------------------------------------------------------- +BOOL FormulaDlg::isUserMatrix() const +{ + return m_pImpl->bUserMatrixFlag; +} +void FormulaDlg::DoEnter(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( BOOL bForced ) +{ + m_pImpl->RefInputDoneAfter( bForced ); +} + +ULONG FormulaDlg::FindFocusWin(Window *pWin) +{ + return m_pImpl->FindFocusWin( pWin ); +} + +void FormulaDlg::SetFocusWin(Window *pWin,ULONG nUniqueId) +{ + if(pWin->GetUniqueId()==nUniqueId) + { + pWin->GrabFocus(); + } + else + { + USHORT nCount=pWin->GetChildCount(); + + for(USHORT 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); +} +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); + ULONG 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 =FALSE; + nUniqueId=0; + 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 ; + nUniqueId = r.nUniqueId; + aSelection = r.aSelection; + return *this; +} +// ----------------------------------------------------------------------------- +FormEditData::FormEditData() +{ + Reset(); +} + +FormEditData::~FormEditData() +{ + delete pParent; +} + +FormEditData::FormEditData( const FormEditData& r ) +{ + *this = r; +} + +// ----------------------------------------------------------------------------- +} // formula +// ----------------------------------------------------------------------------- |