1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_rptui.hxx"
26 
27 
28 //----------------------------------------------------------------------------
29 
30 #include <vcl/svapp.hxx>
31 #include <vcl/mnemonic.hxx>
32 #include <vcl/msgbox.hxx>
33 #include <unotools/charclass.hxx>
34 #include <unotools/viewoptions.hxx>
35 #include <tools/urlobj.hxx>
36 #include <formula/formdata.hxx>
37 #include <formula/funcutl.hxx>
38 #include <formula/tokenarray.hxx>
39 
40 #include "Formula.hxx"
41 #include "AddField.hxx"
42 #include "helpids.hrc"
43 
44 //============================================================================
45 namespace rptui
46 {
47     using namespace formula;
48     using namespace ::com::sun::star;
49 
50 //	--------------------------------------------------------------------------
51 //		Initialisierung / gemeinsame Funktionen  fuer Dialog
52 //	--------------------------------------------------------------------------
53 
FormulaDialog(Window * pParent,const uno::Reference<lang::XMultiServiceFactory> & _xServiceFactory,const::boost::shared_ptr<IFunctionManager> & _pFunctionMgr,const::rtl::OUString & _sFormula,const::com::sun::star::uno::Reference<::com::sun::star::beans::XPropertySet> & _xRowSet)54 FormulaDialog::FormulaDialog(Window* pParent
55                              , const uno::Reference<lang::XMultiServiceFactory>& _xServiceFactory
56                              , const ::boost::shared_ptr< IFunctionManager >&  _pFunctionMgr
57                              , const ::rtl::OUString& _sFormula
58                              , const ::com::sun::star::uno::Reference < ::com::sun::star::beans::XPropertySet >& _xRowSet)
59     : FormulaModalDialog( pParent, false,false,false,this,_pFunctionMgr.get(),this)
60     ,m_aFunctionManager(_pFunctionMgr)
61     ,m_pFormulaData(new FormEditData())
62     ,m_pAddField(NULL)
63     ,m_xRowSet(_xRowSet)
64     ,m_pEdit(NULL)
65     ,m_sFormula(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("=")))
66     ,m_nStart(0)
67     ,m_nEnd(1)
68 {
69     if ( _sFormula.getLength() > 0 )
70 	{
71         if ( _sFormula.getStr()[0] != '=' )
72             m_sFormula += String(_sFormula);
73         else
74             m_sFormula = _sFormula;
75 	}
76     m_xParser.set(_xServiceFactory->createInstance(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.report.pentaho.SOFormulaParser"))),uno::UNO_QUERY);
77     if ( m_xParser.is() )
78         m_xOpCodeMapper = m_xParser->getFormulaOpCodeMapper();
79     fill();
80 }
81 
notifyChange()82 void FormulaDialog::notifyChange()
83 {
84 }
85 // -----------------------------------------------------------------------------
fill()86 void FormulaDialog::fill()
87 {
88     SetMeText(m_sFormula);
89     Update(m_sFormula);
90     CheckMatrix(m_sFormula);
91     Update();
92 }
93 
~FormulaDialog()94 FormulaDialog::~FormulaDialog()
95 {
96     if ( m_pAddField )
97     {
98         SvtViewOptions aDlgOpt( E_WINDOW, String::CreateFromAscii( HID_RPT_FIELD_SEL_WIN ) );
99         aDlgOpt.SetWindowState( ::rtl::OUString::createFromAscii( m_pAddField->GetWindowState((WINDOWSTATE_MASK_X | WINDOWSTATE_MASK_Y | WINDOWSTATE_MASK_STATE | WINDOWSTATE_MASK_MINIMIZED)).GetBuffer() ) );
100 
101         ::std::auto_ptr<Window> aTemp2(m_pAddField);
102 		m_pAddField = NULL;
103     }
104 }
105 
106 //	--------------------------------------------------------------------------
107 //							Funktionen fuer rechte Seite
108 //	--------------------------------------------------------------------------
calculateValue(const String & rStrExp,String & rStrResult)109 bool FormulaDialog::calculateValue( const String& rStrExp, String& rStrResult )
110 {
111     rStrResult = rStrExp;
112 	return false;
113 }
doClose(sal_Bool _bOk)114 void FormulaDialog::doClose(sal_Bool _bOk)
115 {
116     EndDialog(_bOk ? RET_OK : RET_CANCEL);
117 }
insertEntryToLRUList(const IFunctionDescription *)118 void FormulaDialog::insertEntryToLRUList(const IFunctionDescription*	/*_pDesc*/)
119 {
120 }
showReference(const String &)121 void FormulaDialog::showReference(const String& /*_sFormula*/)
122 {
123 }
dispatch(sal_Bool,sal_Bool)124 void FormulaDialog::dispatch(sal_Bool /*_bOK*/,sal_Bool /*_bMartixChecked*/)
125 {
126 }
setDispatcherLock(sal_Bool)127 void FormulaDialog::setDispatcherLock( sal_Bool /*bLock*/ )
128 {
129 }
setReferenceInput(const FormEditData *)130 void FormulaDialog::setReferenceInput(const FormEditData* /*_pData*/)
131 {
132 }
deleteFormData()133 void FormulaDialog::deleteFormData()
134 {
135 }
clear()136 void FormulaDialog::clear()
137 {
138 }
switchBack()139 void FormulaDialog::switchBack()
140 {
141 }
getFormEditData() const142 FormEditData* FormulaDialog::getFormEditData() const
143 {
144 	return m_pFormulaData;
145 }
setCurrentFormula(const String & _sReplacement)146 void FormulaDialog::setCurrentFormula(const String& _sReplacement)
147 {
148     const xub_StrLen nOldLen = m_nEnd - m_nStart;
149 	const xub_StrLen nNewLen = _sReplacement.Len();
150 	if (nOldLen)
151 		m_sFormula.Erase( m_nStart, nOldLen );
152 	if (nNewLen)
153 		m_sFormula.Insert( _sReplacement, m_nStart );
154 	m_nEnd = m_nStart + nNewLen;
155 }
setSelection(xub_StrLen _nStart,xub_StrLen _nEnd)156 void FormulaDialog::setSelection(xub_StrLen _nStart,xub_StrLen _nEnd)
157 {
158     if ( _nStart <= _nEnd )
159 	{
160 		m_nStart = _nStart;
161 		m_nEnd = _nEnd;
162 	}
163 	else
164 	{
165 		m_nEnd = _nStart;
166 		m_nStart = _nEnd;
167 	}
168 }
getSelection(xub_StrLen & _nStart,xub_StrLen & _nEnd) const169 void FormulaDialog::getSelection(xub_StrLen& _nStart,xub_StrLen& _nEnd) const
170 {
171     _nStart = m_nStart;
172     _nEnd = m_nEnd;
173 }
getCurrentFormula() const174 String FormulaDialog::getCurrentFormula() const
175 {
176     return m_sFormula;
177 }
getFunctionManager()178 IFunctionManager* FormulaDialog::getFunctionManager()
179 {
180     return m_aFunctionManager.get();
181 }
182 // -----------------------------------------------------------------------------
ShowReference(const String &)183 void FormulaDialog::ShowReference(const String& /*_sRef*/)
184 {
185 }
186 // -----------------------------------------------------------------------------
HideReference(sal_Bool)187 void FormulaDialog::HideReference( sal_Bool /*bDoneRefMode*/)
188 {
189 }
190 // -----------------------------------------------------------------------------
ReleaseFocus(RefEdit *,RefButton *)191 void FormulaDialog::ReleaseFocus( RefEdit* /*pEdit*/, RefButton* /*pButton*/)
192 {
193 }
194 // -----------------------------------------------------------------------------
ToggleCollapsed(RefEdit * _pEdit,RefButton * _pButton)195 void FormulaDialog::ToggleCollapsed( RefEdit* _pEdit, RefButton* _pButton)
196 {
197     ::std::pair<RefButton*,RefEdit*> aPair = RefInputStartBefore( _pEdit, _pButton );
198     m_pEdit = aPair.second;
199     if ( m_pEdit )
200         m_pEdit->Hide();
201     if ( aPair.first )
202         aPair.first->Hide();
203 
204     if ( !m_pAddField )
205     {
206         m_pAddField = new OAddFieldWindow(this,m_xRowSet);
207         m_pAddField->SetCreateHdl(LINK( this, FormulaDialog, OnClickHdl ) );
208         SvtViewOptions aDlgOpt( E_WINDOW, String::CreateFromAscii( HID_RPT_FIELD_SEL_WIN ) );
209         if ( aDlgOpt.Exists() )
210         {
211             m_pAddField->SetWindowState( ByteString( aDlgOpt.GetWindowState().getStr(), RTL_TEXTENCODING_ASCII_US ) );
212 
213         }
214 
215         m_pAddField->Update();
216     } // if ( !m_pAddField )
217     RefInputStartAfter( aPair.second, aPair.first );
218     m_pAddField->Show();
219 
220 }
221 // -----------------------------------------------------------------------------
IMPL_LINK(FormulaDialog,OnClickHdl,OAddFieldWindow *,_pAddFieldDlg)222 IMPL_LINK( FormulaDialog, OnClickHdl, OAddFieldWindow* ,_pAddFieldDlg)
223 {
224     const uno::Sequence< beans::PropertyValue > aArgs = _pAddFieldDlg->getSelectedFieldDescriptors();
225     // we use this way to create undo actions
226     if ( m_pEdit && aArgs.getLength() == 1)
227     {
228         uno::Sequence< beans::PropertyValue > aValue;
229         aArgs[0].Value >>= aValue;
230         ::svx::ODataAccessDescriptor aDescriptor(aValue);
231         ::rtl::OUString sName;
232         aDescriptor[ ::svx::daColumnName ] >>= sName;
233         if ( sName.getLength() )
234         {
235             sName = ::rtl::OUString (RTL_CONSTASCII_USTRINGPARAM("[")) + sName + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("]"));
236             m_pEdit->SetText(sName);
237         }
238     } // if ( m_pEdit && aArgs.getLength() )
239     m_pEdit = NULL;
240     _pAddFieldDlg->Hide();
241     RefInputDoneAfter( sal_True );
242 
243     return 0L;
244 }
245 // -----------------------------------------------------------------------------
getFormulaParser() const246 uno::Reference< sheet::XFormulaParser> FormulaDialog::getFormulaParser() const
247 {
248     return m_xParser.get();
249 }
250 // -----------------------------------------------------------------------------
getFormulaOpCodeMapper() const251 uno::Reference< sheet::XFormulaOpCodeMapper> FormulaDialog::getFormulaOpCodeMapper() const
252 {
253     return m_xOpCodeMapper;
254 }
255 // -----------------------------------------------------------------------------
getReferencePosition() const256 table::CellAddress FormulaDialog::getReferencePosition() const
257 {
258     return table::CellAddress();
259 }
260 // -----------------------------------------------------------------------------
convertToTokenArray(const uno::Sequence<sheet::FormulaToken> & _aTokenList)261 ::std::auto_ptr<formula::FormulaTokenArray> FormulaDialog::convertToTokenArray(const uno::Sequence< sheet::FormulaToken >& _aTokenList)
262 {
263     ::std::auto_ptr<formula::FormulaTokenArray> pArray(new FormulaTokenArray());
264     pArray->Fill(_aTokenList, NULL);
265     return pArray;
266 }
267 // =============================================================================
268 } // rptui
269 // =============================================================================
270