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/msgbox.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 : #include "tabopdlg.hrc"
31 :
32 : #define _TABOPDLG_CXX
33 : #include "tabopdlg.hxx"
34 :
35 :
36 : //============================================================================
37 : // class ScTabOpDlg
38 : //----------------------------------------------------------------------------
39 :
40 0 : ScTabOpDlg::ScTabOpDlg( SfxBindings* pB, SfxChildWindow* pCW, Window* pParent,
41 : ScDocument* pDocument,
42 : const ScRefAddress& rCursorPos )
43 :
44 : : ScAnyRefDlg ( pB, pCW, pParent, RID_SCDLG_TABOP ),
45 : //
46 : aFlVariables ( this, ScResId( FL_VARIABLES ) ),
47 : aFtFormulaRange ( this, ScResId( FT_FORMULARANGE ) ),
48 : aEdFormulaRange ( this, this, ScResId( ED_FORMULARANGE ) ),
49 : aRBFormulaRange ( this, ScResId( RB_FORMULARANGE ), &aEdFormulaRange, this ),
50 : aFtRowCell ( this, ScResId( FT_ROWCELL ) ),
51 : aEdRowCell ( this, this, ScResId( ED_ROWCELL ) ),
52 : aRBRowCell ( this, ScResId( RB_ROWCELL ), &aEdRowCell, this ),
53 : aFtColCell ( this, ScResId( FT_COLCELL ) ),
54 : aEdColCell ( this, this, ScResId( ED_COLCELL ) ),
55 : aRBColCell ( this, ScResId( RB_COLCELL ), &aEdColCell, this ),
56 : aBtnOk ( this, ScResId( BTN_OK ) ),
57 : aBtnCancel ( this, ScResId( BTN_CANCEL ) ),
58 : aBtnHelp ( this, ScResId( BTN_HELP ) ),
59 : //
60 : theFormulaCell ( rCursorPos ),
61 : pDoc ( pDocument ),
62 0 : nCurTab ( theFormulaCell.Tab() ),
63 : pEdActive ( NULL ),
64 : bDlgLostFocus ( false ),
65 : errMsgNoFormula ( ScResId( STR_NOFORMULA ) ),
66 : errMsgNoColRow ( ScResId( STR_NOCOLROW ) ),
67 : errMsgWrongFormula ( ScResId( STR_WRONGFORMULA ) ),
68 : errMsgWrongRowCol ( ScResId( STR_WRONGROWCOL ) ),
69 : errMsgNoColFormula ( ScResId( STR_NOCOLFORMULA ) ),
70 0 : errMsgNoRowFormula ( ScResId( STR_NOROWFORMULA ) )
71 : {
72 0 : Init();
73 0 : FreeResource();
74 0 : }
75 :
76 : //----------------------------------------------------------------------------
77 :
78 0 : ScTabOpDlg::~ScTabOpDlg()
79 : {
80 0 : Hide();
81 0 : }
82 :
83 : //----------------------------------------------------------------------------
84 :
85 0 : void ScTabOpDlg::Init()
86 : {
87 0 : aBtnOk. SetClickHdl ( LINK( this, ScTabOpDlg, BtnHdl ) );
88 0 : aBtnCancel. SetClickHdl ( LINK( this, ScTabOpDlg, BtnHdl ) );
89 :
90 0 : Link aLink = LINK( this, ScTabOpDlg, GetFocusHdl );
91 0 : aEdFormulaRange.SetGetFocusHdl( aLink );
92 0 : aRBFormulaRange.SetGetFocusHdl( aLink );
93 0 : aEdRowCell. SetGetFocusHdl( aLink );
94 0 : aRBRowCell. SetGetFocusHdl( aLink );
95 0 : aEdColCell. SetGetFocusHdl( aLink );
96 0 : aRBColCell. SetGetFocusHdl( aLink );
97 :
98 0 : aLink = LINK( this, ScTabOpDlg, LoseFocusHdl );
99 0 : aEdFormulaRange.SetLoseFocusHdl( aLink );
100 0 : aRBFormulaRange.SetLoseFocusHdl( aLink );
101 0 : aEdRowCell. SetLoseFocusHdl( aLink );
102 0 : aRBRowCell. SetLoseFocusHdl( aLink );
103 0 : aEdColCell. SetLoseFocusHdl( aLink );
104 0 : aRBColCell. SetLoseFocusHdl( aLink );
105 :
106 0 : aEdFormulaRange.GrabFocus();
107 0 : pEdActive = &aEdFormulaRange;
108 :
109 : //@BugID 54702 Enablen/Disablen nur noch in Basisklasse
110 : //SFX_APPWINDOW->Enable();
111 0 : }
112 :
113 : //----------------------------------------------------------------------------
114 :
115 0 : sal_Bool ScTabOpDlg::Close()
116 : {
117 0 : return DoClose( ScTabOpDlgWrapper::GetChildWindowId() );
118 : }
119 :
120 : //----------------------------------------------------------------------------
121 :
122 0 : void ScTabOpDlg::SetActive()
123 : {
124 0 : if ( bDlgLostFocus )
125 : {
126 0 : bDlgLostFocus = false;
127 0 : if( pEdActive )
128 0 : pEdActive->GrabFocus();
129 : }
130 : else
131 0 : GrabFocus();
132 :
133 0 : RefInputDone();
134 0 : }
135 :
136 : //----------------------------------------------------------------------------
137 :
138 0 : void ScTabOpDlg::SetReference( const ScRange& rRef, ScDocument* pDocP )
139 : {
140 0 : if ( pEdActive )
141 : {
142 0 : ScAddress::Details aDetails(pDocP->GetAddressConvention(), 0, 0);
143 :
144 0 : if ( rRef.aStart != rRef.aEnd )
145 0 : RefInputStart(pEdActive);
146 :
147 0 : String aStr;
148 0 : sal_uInt16 nFmt = ( rRef.aStart.Tab() == nCurTab )
149 : ? SCR_ABS
150 0 : : SCR_ABS_3D;
151 :
152 0 : if ( pEdActive == &aEdFormulaRange )
153 : {
154 0 : theFormulaCell.Set( rRef.aStart, false, false, false);
155 0 : theFormulaEnd.Set( rRef.aEnd, false, false, false);
156 0 : rRef.Format( aStr, nFmt, pDocP, aDetails );
157 : }
158 0 : else if ( pEdActive == &aEdRowCell )
159 : {
160 0 : theRowCell.Set( rRef.aStart, false, false, false);
161 0 : rRef.aStart.Format( aStr, nFmt, pDocP, aDetails );
162 : }
163 0 : else if ( pEdActive == &aEdColCell )
164 : {
165 0 : theColCell.Set( rRef.aStart, false, false, false);
166 0 : rRef.aStart.Format( aStr, nFmt, pDocP, aDetails );
167 : }
168 :
169 0 : pEdActive->SetRefString( aStr );
170 : }
171 0 : }
172 :
173 : //----------------------------------------------------------------------------
174 :
175 0 : void ScTabOpDlg::RaiseError( ScTabOpErr eError )
176 : {
177 0 : const String* pMsg = &errMsgNoFormula;
178 0 : Edit* pEd = &aEdFormulaRange;
179 :
180 0 : switch ( eError )
181 : {
182 : case TABOPERR_NOFORMULA:
183 0 : pMsg = &errMsgNoFormula;
184 0 : pEd = &aEdFormulaRange;
185 0 : break;
186 :
187 : case TABOPERR_NOCOLROW:
188 0 : pMsg = &errMsgNoColRow;
189 0 : pEd = &aEdRowCell;
190 0 : break;
191 :
192 : case TABOPERR_WRONGFORMULA:
193 0 : pMsg = &errMsgWrongFormula;
194 0 : pEd = &aEdFormulaRange;
195 0 : break;
196 :
197 : case TABOPERR_WRONGROW:
198 0 : pMsg = &errMsgWrongRowCol;
199 0 : pEd = &aEdRowCell;
200 0 : break;
201 :
202 : case TABOPERR_NOCOLFORMULA:
203 0 : pMsg = &errMsgNoColFormula;
204 0 : pEd = &aEdFormulaRange;
205 0 : break;
206 :
207 : case TABOPERR_WRONGCOL:
208 0 : pMsg = &errMsgWrongRowCol;
209 0 : pEd = &aEdColCell;
210 0 : break;
211 :
212 : case TABOPERR_NOROWFORMULA:
213 0 : pMsg = &errMsgNoRowFormula;
214 0 : pEd = &aEdFormulaRange;
215 0 : break;
216 : }
217 :
218 0 : ErrorBox( this, WinBits( WB_OK_CANCEL | WB_DEF_OK), *pMsg ).Execute();
219 0 : pEd->GrabFocus();
220 0 : }
221 :
222 : //----------------------------------------------------------------------------
223 :
224 0 : static sal_Bool lcl_Parse( const String& rString, ScDocument* pDoc, SCTAB nCurTab,
225 : ScRefAddress& rStart, ScRefAddress& rEnd )
226 : {
227 0 : sal_Bool bRet = false;
228 0 : const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention();
229 0 : if ( rString.Search(':') != STRING_NOTFOUND )
230 0 : bRet = ConvertDoubleRef( pDoc, rString, nCurTab, rStart, rEnd, eConv );
231 : else
232 : {
233 0 : bRet = ConvertSingleRef( pDoc, rString, nCurTab, rStart, eConv );
234 0 : rEnd = rStart;
235 : }
236 0 : return bRet;
237 : }
238 :
239 : //----------------------------------------------------------------------------
240 : // Handler:
241 :
242 0 : IMPL_LINK( ScTabOpDlg, BtnHdl, PushButton*, pBtn )
243 : {
244 0 : if ( pBtn == &aBtnOk )
245 : {
246 0 : sal_uInt8 nMode = 3;
247 0 : sal_uInt16 nError = 0;
248 :
249 : // Zu ueberpruefen:
250 : // 1. enthalten die Strings korrekte Tabellenkoordinaten/def.Namen?
251 : // 2. IstFormelRang Zeile bei leerer Zeile bzw. Spalte bei leerer Spalte
252 : // bzw. Einfachreferenz bei beidem?
253 : // 3. Ist mindestens Zeile oder Spalte und Formel voll?
254 :
255 0 : if (aEdFormulaRange.GetText().Len() == 0)
256 0 : nError = TABOPERR_NOFORMULA;
257 0 : else if (aEdRowCell.GetText().Len() == 0 &&
258 0 : aEdColCell.GetText().Len() == 0)
259 0 : nError = TABOPERR_NOCOLROW;
260 0 : else if ( !lcl_Parse( aEdFormulaRange.GetText(), pDoc, nCurTab,
261 0 : theFormulaCell, theFormulaEnd ) )
262 0 : nError = TABOPERR_WRONGFORMULA;
263 : else
264 : {
265 0 : const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention();
266 0 : if (aEdRowCell.GetText().Len() > 0)
267 : {
268 0 : if (!ConvertSingleRef( pDoc, aEdRowCell.GetText(), nCurTab,
269 0 : theRowCell, eConv ))
270 0 : nError = TABOPERR_WRONGROW;
271 : else
272 : {
273 0 : if (aEdColCell.GetText().Len() == 0 &&
274 0 : theFormulaCell.Col() != theFormulaEnd.Col())
275 0 : nError = TABOPERR_NOCOLFORMULA;
276 : else
277 0 : nMode = 1;
278 : }
279 : }
280 0 : if (aEdColCell.GetText().Len() > 0)
281 : {
282 0 : if (!ConvertSingleRef( pDoc, aEdColCell.GetText(), nCurTab,
283 0 : theColCell, eConv ))
284 0 : nError = TABOPERR_WRONGCOL;
285 : else
286 : {
287 0 : if (nMode == 1) // beides
288 : {
289 0 : nMode = 2;
290 : ConvertSingleRef( pDoc, aEdFormulaRange.GetText(), nCurTab,
291 0 : theFormulaCell, eConv );
292 : }
293 0 : else if (theFormulaCell.Row() != theFormulaEnd.Row())
294 0 : nError = TABOPERR_NOROWFORMULA;
295 : else
296 0 : nMode = 0;
297 : }
298 : }
299 : }
300 :
301 0 : if (nError)
302 0 : RaiseError( (ScTabOpErr) nError );
303 : else
304 : {
305 : ScTabOpParam aOutParam( theFormulaCell,
306 : theFormulaEnd,
307 : theRowCell,
308 : theColCell,
309 0 : nMode );
310 0 : ScTabOpItem aOutItem( SID_TABOP, &aOutParam );
311 :
312 0 : SetDispatcherLock( false );
313 0 : SwitchToDocument();
314 0 : GetBindings().GetDispatcher()->Execute( SID_TABOP,
315 : SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD,
316 0 : &aOutItem, 0L, 0L );
317 0 : Close();
318 : }
319 : }
320 0 : else if ( pBtn == &aBtnCancel )
321 0 : Close();
322 :
323 0 : return 0;
324 : }
325 :
326 : //----------------------------------------------------------------------------
327 :
328 0 : IMPL_LINK( ScTabOpDlg, GetFocusHdl, Control*, pCtrl )
329 : {
330 0 : if( (pCtrl == (Control*)&aEdFormulaRange) || (pCtrl == (Control*)&aRBFormulaRange) )
331 0 : pEdActive = &aEdFormulaRange;
332 0 : else if( (pCtrl == (Control*)&aEdRowCell) || (pCtrl == (Control*)&aRBRowCell) )
333 0 : pEdActive = &aEdRowCell;
334 0 : else if( (pCtrl == (Control*)&aEdColCell) || (pCtrl == (Control*)&aRBColCell) )
335 0 : pEdActive = &aEdColCell;
336 : else
337 0 : pEdActive = NULL;
338 :
339 0 : if( pEdActive )
340 0 : pEdActive->SetSelection( Selection( 0, SELECTION_MAX ) );
341 :
342 0 : return 0;
343 : }
344 :
345 : //----------------------------------------------------------------------------
346 :
347 0 : IMPL_LINK_NOARG(ScTabOpDlg, LoseFocusHdl)
348 : {
349 0 : bDlgLostFocus = !IsActive();
350 0 : return 0;
351 15 : }
352 :
353 :
354 :
355 :
356 :
357 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|