Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include "scitems.hxx"
21 : #include <sfx2/dispatch.hxx>
22 : #include <vcl/layout.hxx>
23 :
24 : #include "uiitems.hxx"
25 : #include "global.hxx"
26 : #include "document.hxx"
27 : #include "scresid.hxx"
28 : #include "sc.hrc"
29 : #include "reffact.hxx"
30 :
31 : #include "tabopdlg.hxx"
32 :
33 : // class ScTabOpDlg
34 :
35 :
36 0 : ScTabOpDlg::ScTabOpDlg( SfxBindings* pB, SfxChildWindow* pCW, Window* pParent,
37 : ScDocument* pDocument,
38 : const ScRefAddress& rCursorPos )
39 :
40 : : ScAnyRefDlg(pB, pCW, pParent, "MultipleOperationsDialog",
41 : "modules/scalc/ui/multipleoperationsdialog.ui")
42 : , theFormulaCell(rCursorPos)
43 : , pDoc(pDocument)
44 0 : , nCurTab(theFormulaCell.Tab())
45 : , pEdActive(NULL)
46 : , bDlgLostFocus(false)
47 : , errMsgNoFormula(ScResId(STR_NOFORMULASPECIFIED))
48 : , errMsgNoColRow(ScResId(STR_NOCOLROW))
49 : , errMsgWrongFormula(ScResId(STR_WRONGFORMULA))
50 : , errMsgWrongRowCol(ScResId(STR_WRONGROWCOL))
51 : , errMsgNoColFormula(ScResId(STR_NOCOLFORMULA))
52 0 : , errMsgNoRowFormula(ScResId(STR_NOROWFORMULA))
53 : {
54 0 : get(m_pFtFormulaRange, "formulasft");
55 0 : get(m_pEdFormulaRange, "formulas");
56 0 : m_pEdFormulaRange->SetReferences(this, m_pFtFormulaRange);
57 0 : get(m_pRBFormulaRange, "formulasref");
58 0 : m_pRBFormulaRange->SetReferences(this, m_pEdFormulaRange);
59 :
60 0 : get(m_pFtRowCell, "rowft");
61 0 : get(m_pEdRowCell, "row");
62 0 : m_pEdRowCell->SetReferences(this, m_pFtRowCell);
63 0 : get(m_pRBRowCell, "rowref");
64 0 : m_pRBRowCell->SetReferences(this, m_pEdRowCell);
65 :
66 0 : get(m_pFtColCell, "colft");
67 0 : get(m_pEdColCell, "col");
68 0 : m_pEdColCell->SetReferences(this, m_pFtColCell);
69 0 : get(m_pRBColCell, "colref");
70 0 : m_pRBColCell->SetReferences(this, m_pEdColCell);
71 :
72 0 : get(m_pBtnOk, "ok");
73 0 : get(m_pBtnCancel, "cancel");
74 :
75 0 : Init();
76 0 : }
77 :
78 0 : ScTabOpDlg::~ScTabOpDlg()
79 : {
80 0 : Hide();
81 0 : }
82 :
83 0 : void ScTabOpDlg::Init()
84 : {
85 0 : m_pBtnOk->SetClickHdl ( LINK( this, ScTabOpDlg, BtnHdl ) );
86 0 : m_pBtnCancel->SetClickHdl ( LINK( this, ScTabOpDlg, BtnHdl ) );
87 :
88 0 : Link aLink = LINK( this, ScTabOpDlg, GetFocusHdl );
89 0 : m_pEdFormulaRange->SetGetFocusHdl( aLink );
90 0 : m_pRBFormulaRange->SetGetFocusHdl( aLink );
91 0 : m_pEdRowCell->SetGetFocusHdl( aLink );
92 0 : m_pRBRowCell->SetGetFocusHdl( aLink );
93 0 : m_pEdColCell->SetGetFocusHdl( aLink );
94 0 : m_pRBColCell->SetGetFocusHdl( aLink );
95 :
96 0 : aLink = LINK( this, ScTabOpDlg, LoseFocusHdl );
97 0 : m_pEdFormulaRange->SetLoseFocusHdl( aLink );
98 0 : m_pRBFormulaRange->SetLoseFocusHdl( aLink );
99 0 : m_pEdRowCell->SetLoseFocusHdl( aLink );
100 0 : m_pRBRowCell->SetLoseFocusHdl( aLink );
101 0 : m_pEdColCell->SetLoseFocusHdl( aLink );
102 0 : m_pRBColCell->SetLoseFocusHdl( aLink );
103 :
104 0 : m_pEdFormulaRange->GrabFocus();
105 0 : pEdActive = m_pEdFormulaRange;
106 :
107 : //@BugID 54702 Enablen/Disablen nur noch in Basisklasse
108 : //SFX_APPWINDOW->Enable();
109 0 : }
110 :
111 0 : bool ScTabOpDlg::Close()
112 : {
113 0 : return DoClose( ScTabOpDlgWrapper::GetChildWindowId() );
114 : }
115 :
116 0 : void ScTabOpDlg::SetActive()
117 : {
118 0 : if ( bDlgLostFocus )
119 : {
120 0 : bDlgLostFocus = false;
121 0 : if( pEdActive )
122 0 : pEdActive->GrabFocus();
123 : }
124 : else
125 0 : GrabFocus();
126 :
127 0 : RefInputDone();
128 0 : }
129 :
130 0 : void ScTabOpDlg::SetReference( const ScRange& rRef, ScDocument* pDocP )
131 : {
132 0 : if ( pEdActive )
133 : {
134 0 : ScAddress::Details aDetails(pDocP->GetAddressConvention(), 0, 0);
135 :
136 0 : if ( rRef.aStart != rRef.aEnd )
137 0 : RefInputStart(pEdActive);
138 :
139 0 : OUString aStr;
140 0 : sal_uInt16 nFmt = ( rRef.aStart.Tab() == nCurTab )
141 : ? SCR_ABS
142 0 : : SCR_ABS_3D;
143 :
144 0 : if (pEdActive == m_pEdFormulaRange)
145 : {
146 0 : theFormulaCell.Set( rRef.aStart, false, false, false);
147 0 : theFormulaEnd.Set( rRef.aEnd, false, false, false);
148 0 : aStr = rRef.Format(nFmt, pDocP, aDetails);
149 : }
150 0 : else if ( pEdActive == m_pEdRowCell )
151 : {
152 0 : theRowCell.Set( rRef.aStart, false, false, false);
153 0 : aStr = rRef.aStart.Format(nFmt, pDocP, aDetails);
154 : }
155 0 : else if ( pEdActive == m_pEdColCell )
156 : {
157 0 : theColCell.Set( rRef.aStart, false, false, false);
158 0 : aStr = rRef.aStart.Format(nFmt, pDocP, aDetails);
159 : }
160 :
161 0 : pEdActive->SetRefString( aStr );
162 : }
163 0 : }
164 :
165 0 : void ScTabOpDlg::RaiseError( ScTabOpErr eError )
166 : {
167 0 : const OUString* pMsg = &errMsgNoFormula;
168 0 : Edit* pEd = m_pEdFormulaRange;
169 :
170 0 : switch ( eError )
171 : {
172 : case TABOPERR_NOFORMULA:
173 0 : pMsg = &errMsgNoFormula;
174 0 : pEd = m_pEdFormulaRange;
175 0 : break;
176 :
177 : case TABOPERR_NOCOLROW:
178 0 : pMsg = &errMsgNoColRow;
179 0 : pEd = m_pEdRowCell;
180 0 : break;
181 :
182 : case TABOPERR_WRONGFORMULA:
183 0 : pMsg = &errMsgWrongFormula;
184 0 : pEd = m_pEdFormulaRange;
185 0 : break;
186 :
187 : case TABOPERR_WRONGROW:
188 0 : pMsg = &errMsgWrongRowCol;
189 0 : pEd = m_pEdRowCell;
190 0 : break;
191 :
192 : case TABOPERR_NOCOLFORMULA:
193 0 : pMsg = &errMsgNoColFormula;
194 0 : pEd = m_pEdFormulaRange;
195 0 : break;
196 :
197 : case TABOPERR_WRONGCOL:
198 0 : pMsg = &errMsgWrongRowCol;
199 0 : pEd = m_pEdColCell;
200 0 : break;
201 :
202 : case TABOPERR_NOROWFORMULA:
203 0 : pMsg = &errMsgNoRowFormula;
204 0 : pEd = m_pEdFormulaRange;
205 0 : break;
206 : }
207 :
208 0 : MessageDialog(this, *pMsg, VCL_MESSAGE_ERROR, VCL_BUTTONS_OK_CANCEL).Execute();
209 0 : pEd->GrabFocus();
210 0 : }
211 :
212 0 : static sal_Bool lcl_Parse( const OUString& rString, ScDocument* pDoc, SCTAB nCurTab,
213 : ScRefAddress& rStart, ScRefAddress& rEnd )
214 : {
215 0 : sal_Bool bRet = false;
216 0 : const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention();
217 0 : if ( rString.indexOf(':') != -1 )
218 0 : bRet = ConvertDoubleRef( pDoc, rString, nCurTab, rStart, rEnd, eConv );
219 : else
220 : {
221 0 : bRet = ConvertSingleRef( pDoc, rString, nCurTab, rStart, eConv );
222 0 : rEnd = rStart;
223 : }
224 0 : return bRet;
225 : }
226 :
227 :
228 : // Handler:
229 :
230 0 : IMPL_LINK( ScTabOpDlg, BtnHdl, PushButton*, pBtn )
231 : {
232 0 : if (pBtn == m_pBtnOk)
233 : {
234 0 : ScTabOpParam::Mode eMode = ScTabOpParam::Column;
235 0 : sal_uInt16 nError = 0;
236 :
237 : // Zu ueberpruefen:
238 : // 1. enthalten die Strings korrekte Tabellenkoordinaten/def.Namen?
239 : // 2. IstFormelRang Zeile bei leerer Zeile bzw. Spalte bei leerer Spalte
240 : // bzw. Einfachreferenz bei beidem?
241 : // 3. Ist mindestens Zeile oder Spalte und Formel voll?
242 :
243 0 : if (m_pEdFormulaRange->GetText().isEmpty())
244 0 : nError = TABOPERR_NOFORMULA;
245 0 : else if (m_pEdRowCell->GetText().isEmpty() &&
246 0 : m_pEdColCell->GetText().isEmpty())
247 0 : nError = TABOPERR_NOCOLROW;
248 0 : else if ( !lcl_Parse( m_pEdFormulaRange->GetText(), pDoc, nCurTab,
249 0 : theFormulaCell, theFormulaEnd ) )
250 0 : nError = TABOPERR_WRONGFORMULA;
251 : else
252 : {
253 0 : const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention();
254 0 : if (!m_pEdRowCell->GetText().isEmpty())
255 : {
256 0 : if (!ConvertSingleRef( pDoc, m_pEdRowCell->GetText(), nCurTab,
257 0 : theRowCell, eConv ))
258 0 : nError = TABOPERR_WRONGROW;
259 : else
260 : {
261 0 : if (m_pEdColCell->GetText().isEmpty() &&
262 0 : theFormulaCell.Col() != theFormulaEnd.Col())
263 0 : nError = TABOPERR_NOCOLFORMULA;
264 : else
265 0 : eMode = ScTabOpParam::Row;
266 : }
267 : }
268 0 : if (!m_pEdColCell->GetText().isEmpty())
269 : {
270 0 : if (!ConvertSingleRef( pDoc, m_pEdColCell->GetText(), nCurTab,
271 0 : theColCell, eConv ))
272 0 : nError = TABOPERR_WRONGCOL;
273 : else
274 : {
275 0 : if (eMode == ScTabOpParam::Row) // beides
276 : {
277 0 : eMode = ScTabOpParam::Both;
278 0 : ConvertSingleRef( pDoc, m_pEdFormulaRange->GetText(), nCurTab,
279 0 : theFormulaCell, eConv );
280 : }
281 0 : else if (theFormulaCell.Row() != theFormulaEnd.Row())
282 0 : nError = TABOPERR_NOROWFORMULA;
283 : else
284 0 : eMode = ScTabOpParam::Column;
285 : }
286 : }
287 : }
288 :
289 0 : if (nError)
290 0 : RaiseError( (ScTabOpErr) nError );
291 : else
292 : {
293 0 : ScTabOpParam aOutParam(theFormulaCell, theFormulaEnd, theRowCell, theColCell, eMode);
294 0 : ScTabOpItem aOutItem( SID_TABOP, &aOutParam );
295 :
296 0 : SetDispatcherLock( false );
297 0 : SwitchToDocument();
298 0 : GetBindings().GetDispatcher()->Execute( SID_TABOP,
299 : SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD,
300 0 : &aOutItem, 0L, 0L );
301 0 : Close();
302 : }
303 : }
304 0 : else if (pBtn == m_pBtnCancel)
305 0 : Close();
306 :
307 0 : return 0;
308 : }
309 :
310 0 : IMPL_LINK( ScTabOpDlg, GetFocusHdl, Control*, pCtrl )
311 : {
312 0 : if( (pCtrl == (Control*)m_pEdFormulaRange) || (pCtrl == (Control*)m_pRBFormulaRange) )
313 0 : pEdActive = m_pEdFormulaRange;
314 0 : else if( (pCtrl == (Control*)m_pEdRowCell) || (pCtrl == (Control*)m_pRBRowCell) )
315 0 : pEdActive = m_pEdRowCell;
316 0 : else if( (pCtrl == (Control*)m_pEdColCell) || (pCtrl == (Control*)m_pRBColCell) )
317 0 : pEdActive = m_pEdColCell;
318 : else
319 0 : pEdActive = NULL;
320 :
321 0 : if( pEdActive )
322 0 : pEdActive->SetSelection( Selection( 0, SELECTION_MAX ) );
323 :
324 0 : return 0;
325 : }
326 :
327 0 : IMPL_LINK_NOARG(ScTabOpDlg, LoseFocusHdl)
328 : {
329 0 : bDlgLostFocus = !IsActive();
330 0 : return 0;
331 0 : }
332 :
333 :
334 :
335 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|