/************************************************************** * * 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_reportdesign.hxx" //---------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include "Formula.hxx" #include "AddField.hxx" #include "helpids.hrc" //============================================================================ namespace rptui { using namespace formula; using namespace ::com::sun::star; // -------------------------------------------------------------------------- // Initialisierung / gemeinsame Funktionen fuer Dialog // -------------------------------------------------------------------------- FormulaDialog::FormulaDialog(Window* pParent , const uno::Reference& _xServiceFactory , const ::boost::shared_ptr< IFunctionManager >& _pFunctionMgr , const ::rtl::OUString& _sFormula , const ::com::sun::star::uno::Reference < ::com::sun::star::beans::XPropertySet >& _xRowSet) : FormulaModalDialog( pParent, false,false,false,this,_pFunctionMgr.get(),this) ,m_aFunctionManager(_pFunctionMgr) ,m_pFormulaData(new FormEditData()) ,m_pAddField(NULL) ,m_xRowSet(_xRowSet) ,m_pEdit(NULL) ,m_sFormula(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("="))) ,m_nStart(0) ,m_nEnd(1) { if ( _sFormula.getLength() > 0 ) { if ( _sFormula.getStr()[0] != '=' ) m_sFormula += String(_sFormula); else m_sFormula = _sFormula; } m_xParser.set(_xServiceFactory->createInstance(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.report.pentaho.SOFormulaParser"))),uno::UNO_QUERY); if ( m_xParser.is() ) m_xOpCodeMapper = m_xParser->getFormulaOpCodeMapper(); fill(); } void FormulaDialog::notifyChange() { } // ----------------------------------------------------------------------------- void FormulaDialog::fill() { SetMeText(m_sFormula); Update(m_sFormula); CheckMatrix(m_sFormula); Update(); } FormulaDialog::~FormulaDialog() { if ( m_pAddField ) { SvtViewOptions aDlgOpt( E_WINDOW, String::CreateFromAscii( HID_RPT_FIELD_SEL_WIN ) ); aDlgOpt.SetWindowState( ::rtl::OUString::createFromAscii( m_pAddField->GetWindowState((WINDOWSTATE_MASK_X | WINDOWSTATE_MASK_Y | WINDOWSTATE_MASK_STATE | WINDOWSTATE_MASK_MINIMIZED)).GetBuffer() ) ); ::std::auto_ptr aTemp2(m_pAddField); m_pAddField = NULL; } } // -------------------------------------------------------------------------- // Funktionen fuer rechte Seite // -------------------------------------------------------------------------- bool FormulaDialog::calculateValue( const String& rStrExp, String& rStrResult ) { rStrResult = rStrExp; return false; } void FormulaDialog::doClose(sal_Bool _bOk) { EndDialog(_bOk ? RET_OK : RET_CANCEL); } void FormulaDialog::insertEntryToLRUList(const IFunctionDescription* /*_pDesc*/) { } void FormulaDialog::showReference(const String& /*_sFormula*/) { } void FormulaDialog::dispatch(sal_Bool /*_bOK*/,sal_Bool /*_bMartixChecked*/) { } void FormulaDialog::setDispatcherLock( sal_Bool /*bLock*/ ) { } void FormulaDialog::setReferenceInput(const FormEditData* /*_pData*/) { } void FormulaDialog::deleteFormData() { } void FormulaDialog::clear() { } void FormulaDialog::switchBack() { } FormEditData* FormulaDialog::getFormEditData() const { return m_pFormulaData; } void FormulaDialog::setCurrentFormula(const String& _sReplacement) { const xub_StrLen nOldLen = m_nEnd - m_nStart; const xub_StrLen nNewLen = _sReplacement.Len(); if (nOldLen) m_sFormula.Erase( m_nStart, nOldLen ); if (nNewLen) m_sFormula.Insert( _sReplacement, m_nStart ); m_nEnd = m_nStart + nNewLen; } void FormulaDialog::setSelection(xub_StrLen _nStart,xub_StrLen _nEnd) { if ( _nStart <= _nEnd ) { m_nStart = _nStart; m_nEnd = _nEnd; } else { m_nEnd = _nStart; m_nStart = _nEnd; } } void FormulaDialog::getSelection(xub_StrLen& _nStart,xub_StrLen& _nEnd) const { _nStart = m_nStart; _nEnd = m_nEnd; } String FormulaDialog::getCurrentFormula() const { return m_sFormula; } IFunctionManager* FormulaDialog::getFunctionManager() { return m_aFunctionManager.get(); } // ----------------------------------------------------------------------------- void FormulaDialog::ShowReference(const String& /*_sRef*/) { } // ----------------------------------------------------------------------------- void FormulaDialog::HideReference( sal_Bool /*bDoneRefMode*/) { } // ----------------------------------------------------------------------------- void FormulaDialog::ReleaseFocus( RefEdit* /*pEdit*/, RefButton* /*pButton*/) { } // ----------------------------------------------------------------------------- void FormulaDialog::ToggleCollapsed( RefEdit* _pEdit, RefButton* _pButton) { ::std::pair aPair = RefInputStartBefore( _pEdit, _pButton ); m_pEdit = aPair.second; if ( m_pEdit ) m_pEdit->Hide(); if ( aPair.first ) aPair.first->Hide(); if ( !m_pAddField ) { m_pAddField = new OAddFieldWindow(this,m_xRowSet); m_pAddField->SetCreateHdl(LINK( this, FormulaDialog, OnClickHdl ) ); SvtViewOptions aDlgOpt( E_WINDOW, String::CreateFromAscii( HID_RPT_FIELD_SEL_WIN ) ); if ( aDlgOpt.Exists() ) { m_pAddField->SetWindowState( ByteString( aDlgOpt.GetWindowState().getStr(), RTL_TEXTENCODING_ASCII_US ) ); } m_pAddField->Update(); } // if ( !m_pAddField ) RefInputStartAfter( aPair.second, aPair.first ); m_pAddField->Show(); } // ----------------------------------------------------------------------------- IMPL_LINK( FormulaDialog, OnClickHdl, OAddFieldWindow* ,_pAddFieldDlg) { const uno::Sequence< beans::PropertyValue > aArgs = _pAddFieldDlg->getSelectedFieldDescriptors(); // we use this way to create undo actions if ( m_pEdit && aArgs.getLength() == 1) { uno::Sequence< beans::PropertyValue > aValue; aArgs[0].Value >>= aValue; ::svx::ODataAccessDescriptor aDescriptor(aValue); ::rtl::OUString sName; aDescriptor[ ::svx::daColumnName ] >>= sName; if ( sName.getLength() ) { sName = ::rtl::OUString (RTL_CONSTASCII_USTRINGPARAM("[")) + sName + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("]")); m_pEdit->SetText(sName); } } // if ( m_pEdit && aArgs.getLength() ) m_pEdit = NULL; _pAddFieldDlg->Hide(); RefInputDoneAfter( sal_True ); return 0L; } // ----------------------------------------------------------------------------- uno::Reference< sheet::XFormulaParser> FormulaDialog::getFormulaParser() const { return m_xParser.get(); } // ----------------------------------------------------------------------------- uno::Reference< sheet::XFormulaOpCodeMapper> FormulaDialog::getFormulaOpCodeMapper() const { return m_xOpCodeMapper; } // ----------------------------------------------------------------------------- table::CellAddress FormulaDialog::getReferencePosition() const { return table::CellAddress(); } // ----------------------------------------------------------------------------- ::std::auto_ptr FormulaDialog::convertToTokenArray(const uno::Sequence< sheet::FormulaToken >& _aTokenList) { ::std::auto_ptr pArray(new FormulaTokenArray()); pArray->Fill(_aTokenList, NULL); return pArray; } // ============================================================================= } // rptui // =============================================================================