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