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 :
21 : #ifdef SC_DLLIMPLEMENTATION
22 : #undef SC_DLLIMPLEMENTATION
23 : #endif
24 :
25 : #include <comphelper/string.hxx>
26 : #include <vcl/svapp.hxx>
27 : #include <svl/aeitem.hxx>
28 : #include <svl/stritem.hxx>
29 : #include <svl/eitem.hxx>
30 : #include <svl/intitem.hxx>
31 : #include <basic/sbmeth.hxx>
32 : #include <basic/sbstar.hxx>
33 : #include <basic/sbmod.hxx>
34 : #include <sfx2/app.hxx>
35 :
36 : #include "scresid.hxx"
37 : #include "sc.hrc"
38 :
39 : #include "stringutil.hxx"
40 : #include "validat.hxx"
41 : #include "validate.hxx"
42 : #include "compiler.hxx"
43 : #include "formula/opcode.hxx"
44 :
45 : // cell range picker
46 : #include "tabvwsh.hxx"
47 : #include <sfx2/viewfrm.hxx>
48 : #include <sfx2/childwin.hxx>
49 : #include "reffact.hxx"
50 :
51 : /* Position indexes for "Allow" list box.
52 : They do not map directly to ScValidationMode and can safely be modified to
53 : change the order of the list box entries. */
54 : #define SC_VALIDDLG_ALLOW_ANY 0
55 : #define SC_VALIDDLG_ALLOW_WHOLE 1
56 : #define SC_VALIDDLG_ALLOW_DECIMAL 2
57 : #define SC_VALIDDLG_ALLOW_DATE 3
58 : #define SC_VALIDDLG_ALLOW_TIME 4
59 : #define SC_VALIDDLG_ALLOW_RANGE 5
60 : #define SC_VALIDDLG_ALLOW_LIST 6
61 : #define SC_VALIDDLG_ALLOW_TEXTLEN 7
62 :
63 : /* Position indexes for "Data" list box.
64 : They do not map directly to ScConditionMode and can safely be modified to
65 : change the order of the list box entries. */
66 : #define SC_VALIDDLG_DATA_EQUAL 0
67 : #define SC_VALIDDLG_DATA_LESS 1
68 : #define SC_VALIDDLG_DATA_GREATER 2
69 : #define SC_VALIDDLG_DATA_EQLESS 3
70 : #define SC_VALIDDLG_DATA_EQGREATER 4
71 : #define SC_VALIDDLG_DATA_NOTEQUAL 5
72 : #define SC_VALIDDLG_DATA_VALIDRANGE 6
73 : #define SC_VALIDDLG_DATA_INVALIDRANGE 7
74 :
75 :
76 : static sal_uInt16 pValueRanges[] =
77 : {
78 : FID_VALID_MODE, FID_VALID_ERRTEXT,
79 : FID_VALID_LISTTYPE, FID_VALID_LISTTYPE,
80 : 0
81 : };
82 :
83 :
84 0 : ScValidationDlg::ScValidationDlg(Window* pParent, const SfxItemSet* pArgSet,
85 : ScTabViewShell *pTabViewSh, SfxBindings *pB /*= NULL*/)
86 0 : : ScValidationDlgBase(pParent ? pParent : SFX_APP()->GetTopWindow(),
87 : "ValidationDialog", "modules/scalc/ui/validationdialog.ui", pArgSet, pB)
88 : , m_pTabVwSh(pTabViewSh)
89 : , m_nValuePageId(0)
90 : , m_bOwnRefHdlr(false)
91 0 : , m_bRefInputting(false)
92 : {
93 0 : m_nValuePageId = AddTabPage("criteria", ScTPValidationValue::Create, 0);
94 0 : AddTabPage("inputhelp", ScTPValidationHelp::Create, 0);
95 0 : AddTabPage("erroralert", ScTPValidationError::Create, 0);
96 0 : get(m_pHBox, "refinputbox");
97 0 : }
98 :
99 0 : void ScTPValidationValue::SetReferenceHdl( const ScRange&rRange , ScDocument* pDoc )
100 : {
101 0 : if ( rRange.aStart != rRange.aEnd )
102 0 : if ( ScValidationDlg *pValidationDlg = GetValidationDlg() )
103 0 : if( m_pRefEdit )
104 0 : pValidationDlg->RefInputStart( m_pRefEdit );
105 :
106 0 : if ( m_pRefEdit )
107 : {
108 0 : OUString aStr(rRange.Format(SCR_ABS_3D, pDoc));
109 0 : m_pRefEdit->SetRefString( aStr );
110 : }
111 0 : }
112 :
113 0 : void ScTPValidationValue:: SetActiveHdl()
114 : {
115 0 : if ( m_pRefEdit ) m_pRefEdit->GrabFocus();
116 :
117 0 : if ( ScValidationDlg *pValidationDlg = GetValidationDlg() )
118 0 : if( m_pRefEdit )
119 : {
120 0 : pValidationDlg->RefInputDone();
121 : }
122 0 : }
123 :
124 0 : void ScTPValidationValue::RefInputStartPreHdl( formula::RefEdit* pEdit, formula::RefButton* pButton )
125 : {
126 0 : if ( ScValidationDlg *pValidationDlg = GetValidationDlg() )
127 : {
128 0 : Window *pNewParent = pValidationDlg->get_refinput_shrink_parent();
129 0 : if( pEdit == m_pRefEdit && m_pRefEdit->GetParent() != pNewParent )
130 : {
131 0 : m_pRefEdit->SetParent(pNewParent);
132 : }
133 :
134 0 : if( pButton == m_pBtnRef && m_pBtnRef->GetParent() != pNewParent )
135 : {
136 0 : m_pBtnRef->SetParent(pNewParent);
137 : }
138 :
139 0 : pNewParent->Show();
140 : }
141 0 : }
142 :
143 0 : void ScTPValidationValue::RefInputDonePostHdl()
144 : {
145 0 : if( m_pRefEdit && m_pRefEdit->GetParent() != m_pRefGrid )
146 : {
147 0 : m_pRefEdit->SetParent( m_pRefGrid );
148 0 : m_pBtnRef->SetParent( m_pRefEdit ); //if Edit SetParent but button not, the tab order will be incorrect, need button to setparent to anthor window and restore parent later in order to restore the tab order
149 : }
150 :
151 0 : if( m_pBtnRef->GetParent() != m_pRefGrid )
152 0 : m_pBtnRef->SetParent( m_pRefGrid );
153 :
154 0 : if ( ScValidationDlg *pValidationDlg = GetValidationDlg() )
155 0 : pValidationDlg->get_refinput_shrink_parent()->Hide();
156 :
157 0 : if( m_pRefEdit && !m_pRefEdit->HasFocus() )
158 0 : m_pRefEdit->GrabFocus();
159 :
160 0 : }
161 :
162 0 : bool ScValidationDlg::Close()
163 : {
164 0 : if( m_bOwnRefHdlr )
165 : {
166 0 : if (SfxTabPage* pPage = GetTabPage(m_nValuePageId))
167 0 : static_cast<ScTPValidationValue*>(pPage)->RemoveRefDlg();
168 : }
169 :
170 0 : return ScValidationDlgBase::Close();
171 : }
172 :
173 0 : ScValidationDlg::~ScValidationDlg()
174 : {
175 0 : if( m_bOwnRefHdlr )
176 0 : RemoveRefDlg( false );
177 0 : }
178 :
179 : namespace {
180 :
181 : /** Converts the passed ScValidationMode to the position in the list box. */
182 0 : sal_uInt16 lclGetPosFromValMode( ScValidationMode eValMode )
183 : {
184 0 : sal_uInt16 nLbPos = SC_VALIDDLG_ALLOW_ANY;
185 0 : switch( eValMode )
186 : {
187 0 : case SC_VALID_ANY: nLbPos = SC_VALIDDLG_ALLOW_ANY; break;
188 0 : case SC_VALID_WHOLE: nLbPos = SC_VALIDDLG_ALLOW_WHOLE; break;
189 0 : case SC_VALID_DECIMAL: nLbPos = SC_VALIDDLG_ALLOW_DECIMAL; break;
190 0 : case SC_VALID_DATE: nLbPos = SC_VALIDDLG_ALLOW_DATE; break;
191 0 : case SC_VALID_TIME: nLbPos = SC_VALIDDLG_ALLOW_TIME; break;
192 0 : case SC_VALID_TEXTLEN: nLbPos = SC_VALIDDLG_ALLOW_TEXTLEN; break;
193 0 : case SC_VALID_LIST: nLbPos = SC_VALIDDLG_ALLOW_RANGE; break;
194 0 : case SC_VALID_CUSTOM: nLbPos = SC_VALIDDLG_ALLOW_ANY; break; // not supported
195 : default: OSL_FAIL( "lclGetPosFromValMode - unknown validity mode" );
196 : }
197 0 : return nLbPos;
198 : }
199 :
200 : /** Converts the passed list box position to an ScValidationMode. */
201 0 : ScValidationMode lclGetValModeFromPos( sal_uInt16 nLbPos )
202 : {
203 0 : ScValidationMode eValMode = SC_VALID_ANY;
204 0 : switch( nLbPos )
205 : {
206 0 : case SC_VALIDDLG_ALLOW_ANY: eValMode = SC_VALID_ANY; break;
207 0 : case SC_VALIDDLG_ALLOW_WHOLE: eValMode = SC_VALID_WHOLE; break;
208 0 : case SC_VALIDDLG_ALLOW_DECIMAL: eValMode = SC_VALID_DECIMAL; break;
209 0 : case SC_VALIDDLG_ALLOW_DATE: eValMode = SC_VALID_DATE; break;
210 0 : case SC_VALIDDLG_ALLOW_TIME: eValMode = SC_VALID_TIME; break;
211 0 : case SC_VALIDDLG_ALLOW_RANGE: eValMode = SC_VALID_LIST; break;
212 0 : case SC_VALIDDLG_ALLOW_LIST: eValMode = SC_VALID_LIST; break;
213 0 : case SC_VALIDDLG_ALLOW_TEXTLEN: eValMode = SC_VALID_TEXTLEN; break;
214 : default: OSL_FAIL( "lclGetValModeFromPos - invalid list box position" );
215 : }
216 0 : return eValMode;
217 : }
218 :
219 : /** Converts the passed ScConditionMode to the position in the list box. */
220 0 : sal_uInt16 lclGetPosFromCondMode( ScConditionMode eCondMode )
221 : {
222 0 : sal_uInt16 nLbPos = SC_VALIDDLG_DATA_EQUAL;
223 0 : switch( eCondMode )
224 : {
225 : case SC_COND_NONE: // may occur in old XML files after Excel import
226 0 : case SC_COND_EQUAL: nLbPos = SC_VALIDDLG_DATA_EQUAL; break;
227 0 : case SC_COND_LESS: nLbPos = SC_VALIDDLG_DATA_LESS; break;
228 0 : case SC_COND_GREATER: nLbPos = SC_VALIDDLG_DATA_GREATER; break;
229 0 : case SC_COND_EQLESS: nLbPos = SC_VALIDDLG_DATA_EQLESS; break;
230 0 : case SC_COND_EQGREATER: nLbPos = SC_VALIDDLG_DATA_EQGREATER; break;
231 0 : case SC_COND_NOTEQUAL: nLbPos = SC_VALIDDLG_DATA_NOTEQUAL; break;
232 0 : case SC_COND_BETWEEN: nLbPos = SC_VALIDDLG_DATA_VALIDRANGE; break;
233 0 : case SC_COND_NOTBETWEEN: nLbPos = SC_VALIDDLG_DATA_INVALIDRANGE; break;
234 : default: OSL_FAIL( "lclGetPosFromCondMode - unknown condition mode" );
235 : }
236 0 : return nLbPos;
237 : }
238 :
239 : /** Converts the passed list box position to an ScConditionMode. */
240 0 : ScConditionMode lclGetCondModeFromPos( sal_uInt16 nLbPos )
241 : {
242 0 : ScConditionMode eCondMode = SC_COND_EQUAL;
243 0 : switch( nLbPos )
244 : {
245 0 : case SC_VALIDDLG_DATA_EQUAL: eCondMode = SC_COND_EQUAL; break;
246 0 : case SC_VALIDDLG_DATA_LESS: eCondMode = SC_COND_LESS; break;
247 0 : case SC_VALIDDLG_DATA_GREATER: eCondMode = SC_COND_GREATER; break;
248 0 : case SC_VALIDDLG_DATA_EQLESS: eCondMode = SC_COND_EQLESS; break;
249 0 : case SC_VALIDDLG_DATA_EQGREATER: eCondMode = SC_COND_EQGREATER; break;
250 0 : case SC_VALIDDLG_DATA_NOTEQUAL: eCondMode = SC_COND_NOTEQUAL; break;
251 0 : case SC_VALIDDLG_DATA_VALIDRANGE: eCondMode = SC_COND_BETWEEN; break;
252 0 : case SC_VALIDDLG_DATA_INVALIDRANGE: eCondMode = SC_COND_NOTBETWEEN; break;
253 : default: OSL_FAIL( "lclGetCondModeFromPos - invalid list box position" );
254 : }
255 0 : return eCondMode;
256 : }
257 :
258 : /** Converts line feed separated string to a formula with strings separated by semicolons.
259 : @descr Keeps all empty strings.
260 : Example: abc\ndef\n\nghi -> "abc";"def";"";"ghi".
261 : @param rFmlaStr (out-param) The converted formula string. */
262 0 : void lclGetFormulaFromStringList( OUString& rFmlaStr, const OUString& rStringList, sal_Unicode cFmlaSep )
263 : {
264 0 : rFmlaStr = "";
265 0 : sal_Int32 nTokenCnt = comphelper::string::getTokenCount(rStringList, '\n');
266 0 : for( sal_Int32 nToken = 0, nStringIx = 0; nToken < (sal_Int32) nTokenCnt; ++nToken )
267 : {
268 0 : OUString aToken( rStringList.getToken( 0, '\n', nStringIx ) );
269 0 : ScGlobal::AddQuotes( aToken, '"' );
270 0 : rFmlaStr = ScGlobal::addToken(rFmlaStr, aToken, cFmlaSep);
271 0 : }
272 0 : if( rFmlaStr.isEmpty() )
273 0 : rFmlaStr = "\"\"";
274 0 : }
275 :
276 :
277 : /** Converts formula with strings separated by semicolons to line feed separated string.
278 : @descr Keeps all empty strings. Ignores all empty tokens (multiple semicolons).
279 : Example: "abc";;;"def";"";"ghi" -> abc\ndef\n\nghi.
280 : @param rStringList (out-param) The converted line feed separated string list.
281 : @return true = Conversion successful. */
282 0 : bool lclGetStringListFromFormula( OUString& rStringList, const OUString& rFmlaStr, sal_Unicode cFmlaSep )
283 : {
284 0 : OUString aQuotes( "\"\"" );
285 0 : sal_Int32 nTokenCnt = ScStringUtil::GetQuotedTokenCount(rFmlaStr, aQuotes, cFmlaSep );
286 :
287 0 : rStringList="";
288 0 : bool bIsStringList = (nTokenCnt > 0);
289 0 : bool bTokenAdded = false;
290 :
291 0 : for( sal_Int32 nToken = 0, nStringIx = 0; bIsStringList && (nToken < nTokenCnt); ++nToken )
292 : {
293 0 : OUString aToken( ScStringUtil::GetQuotedToken(rFmlaStr, 0, aQuotes, cFmlaSep, nStringIx ) );
294 0 : aToken = comphelper::string::strip(aToken, ' ');
295 0 : if( !aToken.isEmpty() ) // ignore empty tokens, i.e. "a";;"b"
296 : {
297 0 : bIsStringList = ScGlobal::IsQuoted( aToken, '"' );
298 0 : if( bIsStringList )
299 : {
300 0 : ScGlobal::EraseQuotes( aToken, '"' );
301 0 : rStringList = ScGlobal::addToken(rStringList, aToken, '\n', 1, bTokenAdded);
302 0 : bTokenAdded = true;
303 : }
304 : }
305 0 : }
306 :
307 0 : return bIsStringList;
308 : }
309 :
310 : } // namespace
311 :
312 0 : ScTPValidationValue::ScTPValidationValue( Window* pParent, const SfxItemSet& rArgSet )
313 : : SfxTabPage( pParent, "ValidationCriteriaPage",
314 : "modules/scalc/ui/validationcriteriapage.ui", rArgSet)
315 : , maStrMin(ScResId(SCSTR_VALID_MINIMUM))
316 : , maStrMax(ScResId(SCSTR_VALID_MAXIMUM))
317 : , maStrValue(ScResId(SCSTR_VALID_VALUE))
318 : , maStrRange(ScResId(SCSTR_VALID_RANGE))
319 0 : , maStrList(ScResId(SCSTR_VALID_LIST))
320 : {
321 0 : get(m_pLbAllow, "allow");
322 0 : get(m_pCbAllow, "allowempty");
323 0 : get(m_pCbShow, "showlist");
324 0 : get(m_pCbSort, "sortascend");
325 0 : get(m_pFtValue, "valueft");
326 0 : get(m_pLbValue, "data");
327 0 : get(m_pFtMin, "minft");
328 0 : get(m_pMinGrid, "mingrid");
329 0 : get(m_pEdMin, "min");
330 0 : m_pEdMin->SetReferences(NULL, m_pFtMin);
331 0 : get(m_pEdList, "minlist");
332 0 : Size aSize(LogicToPixel(Size(174, 105), MAP_APPFONT));
333 0 : m_pEdList->set_width_request(aSize.Width());
334 0 : m_pEdList->set_height_request(aSize.Height());
335 0 : get(m_pFtMax, "maxft");
336 0 : get(m_pEdMax, "max");
337 0 : m_pEdMax->SetReferences(NULL, m_pFtMax);
338 0 : get(m_pFtHint, "hintft");
339 0 : get(m_pBtnRef, "validref");
340 0 : m_pBtnRef->SetParentPage(this);
341 0 : get(m_pRefGrid, "refgrid");
342 :
343 : //lock in the max size initial config
344 0 : aSize = get_preferred_size();
345 0 : set_width_request(aSize.Width());
346 0 : set_height_request(aSize.Height());
347 :
348 0 : Init();
349 :
350 : // list separator in formulas
351 0 : OUString aListSep = ::ScCompiler::GetNativeSymbol( ocSep );
352 : OSL_ENSURE( aListSep.getLength() == 1, "ScTPValidationValue::ScTPValidationValue - list separator error" );
353 0 : mcFmlaSep = aListSep.getLength() ? aListSep[0] : ';';
354 0 : m_pBtnRef->Hide(); // cell range picker
355 0 : }
356 :
357 0 : void ScTPValidationValue::Init()
358 : {
359 0 : m_pLbAllow->SetSelectHdl( LINK( this, ScTPValidationValue, SelectHdl ) );
360 0 : m_pLbValue->SetSelectHdl( LINK( this, ScTPValidationValue, SelectHdl ) );
361 0 : m_pCbShow->SetClickHdl( LINK( this, ScTPValidationValue, CheckHdl ) );
362 :
363 : // cell range picker
364 0 : m_pEdMin->SetGetFocusHdl( LINK( this, ScTPValidationValue, EditSetFocusHdl ) );
365 0 : m_pEdMin->SetLoseFocusHdl( LINK( this, ScTPValidationValue, KillFocusHdl ) );
366 0 : m_pEdMax->SetGetFocusHdl( LINK( this, ScTPValidationValue, EditSetFocusHdl ) );
367 0 : m_pBtnRef->SetLoseFocusHdl( LINK( this, ScTPValidationValue, KillFocusHdl ) );
368 0 : m_pEdMax->SetLoseFocusHdl( LINK( this, ScTPValidationValue, KillFocusHdl ) );
369 :
370 0 : m_pLbAllow->SelectEntryPos( SC_VALIDDLG_ALLOW_ANY );
371 0 : m_pLbValue->SelectEntryPos( SC_VALIDDLG_DATA_EQUAL );
372 :
373 0 : SelectHdl( NULL );
374 0 : CheckHdl( NULL );
375 0 : }
376 :
377 0 : SfxTabPage* ScTPValidationValue::Create( Window* pParent, const SfxItemSet& rArgSet )
378 : {
379 0 : return( new ScTPValidationValue( pParent, rArgSet ) );
380 : }
381 :
382 0 : sal_uInt16* ScTPValidationValue::GetRanges()
383 : {
384 0 : return pValueRanges;
385 : }
386 :
387 0 : void ScTPValidationValue::Reset( const SfxItemSet& rArgSet )
388 : {
389 : const SfxPoolItem* pItem;
390 :
391 0 : sal_uInt16 nLbPos = SC_VALIDDLG_ALLOW_ANY;
392 0 : if( rArgSet.GetItemState( FID_VALID_MODE, true, &pItem ) == SFX_ITEM_SET )
393 : nLbPos = lclGetPosFromValMode( static_cast< ScValidationMode >(
394 0 : static_cast< const SfxAllEnumItem* >( pItem )->GetValue() ) );
395 0 : m_pLbAllow->SelectEntryPos( nLbPos );
396 :
397 0 : nLbPos = SC_VALIDDLG_DATA_EQUAL;
398 0 : if( rArgSet.GetItemState( FID_VALID_CONDMODE, true, &pItem ) == SFX_ITEM_SET )
399 : nLbPos = lclGetPosFromCondMode( static_cast< ScConditionMode >(
400 0 : static_cast< const SfxAllEnumItem* >( pItem )->GetValue() ) );
401 0 : m_pLbValue->SelectEntryPos( nLbPos );
402 :
403 : // *** check boxes ***
404 0 : sal_Bool bCheck = sal_True;
405 0 : if( rArgSet.GetItemState( FID_VALID_BLANK, true, &pItem ) == SFX_ITEM_SET )
406 0 : bCheck = static_cast< const SfxBoolItem* >( pItem )->GetValue();
407 0 : m_pCbAllow->Check( bCheck );
408 :
409 0 : sal_Int32 nListType = ValidListType::UNSORTED;
410 0 : if( rArgSet.GetItemState( FID_VALID_LISTTYPE, true, &pItem ) == SFX_ITEM_SET )
411 0 : nListType = static_cast< const SfxInt16Item* >( pItem )->GetValue();
412 0 : m_pCbShow->Check( nListType != ValidListType::INVISIBLE );
413 0 : m_pCbSort->Check( nListType == ValidListType::SORTEDASCENDING );
414 :
415 : // *** formulas ***
416 0 : OUString aFmlaStr;
417 0 : if ( rArgSet.GetItemState( FID_VALID_VALUE1, true, &pItem ) == SFX_ITEM_SET )
418 0 : aFmlaStr = static_cast< const SfxStringItem* >( pItem )->GetValue();
419 0 : SetFirstFormula( aFmlaStr );
420 :
421 0 : aFmlaStr= "";
422 0 : if ( rArgSet.GetItemState( FID_VALID_VALUE2, true, &pItem ) == SFX_ITEM_SET )
423 0 : aFmlaStr = static_cast< const SfxStringItem* >( pItem )->GetValue();
424 0 : SetSecondFormula( aFmlaStr );
425 :
426 0 : SelectHdl( NULL );
427 0 : CheckHdl( NULL );
428 0 : }
429 :
430 0 : bool ScTPValidationValue::FillItemSet( SfxItemSet& rArgSet )
431 : {
432 0 : sal_Int16 nListType = m_pCbShow->IsChecked() ?
433 0 : (m_pCbSort->IsChecked() ? ValidListType::SORTEDASCENDING : ValidListType::UNSORTED) :
434 0 : ValidListType::INVISIBLE;
435 :
436 : rArgSet.Put( SfxAllEnumItem( FID_VALID_MODE, sal::static_int_cast<sal_uInt16>(
437 0 : lclGetValModeFromPos( m_pLbAllow->GetSelectEntryPos() ) ) ) );
438 : rArgSet.Put( SfxAllEnumItem( FID_VALID_CONDMODE, sal::static_int_cast<sal_uInt16>(
439 0 : lclGetCondModeFromPos( m_pLbValue->GetSelectEntryPos() ) ) ) );
440 0 : rArgSet.Put( SfxStringItem( FID_VALID_VALUE1, GetFirstFormula() ) );
441 0 : rArgSet.Put( SfxStringItem( FID_VALID_VALUE2, GetSecondFormula() ) );
442 0 : rArgSet.Put( SfxBoolItem( FID_VALID_BLANK, m_pCbAllow->IsChecked() ) );
443 0 : rArgSet.Put( SfxInt16Item( FID_VALID_LISTTYPE, nListType ) );
444 0 : return true;
445 : }
446 :
447 0 : OUString ScTPValidationValue::GetFirstFormula() const
448 : {
449 0 : OUString aFmlaStr;
450 0 : if( m_pLbAllow->GetSelectEntryPos() == SC_VALIDDLG_ALLOW_LIST )
451 0 : lclGetFormulaFromStringList( aFmlaStr, m_pEdList->GetText(), mcFmlaSep );
452 : else
453 0 : aFmlaStr = m_pEdMin->GetText();
454 0 : return aFmlaStr;
455 : }
456 :
457 0 : OUString ScTPValidationValue::GetSecondFormula() const
458 : {
459 0 : return m_pEdMax->GetText();
460 : }
461 :
462 0 : void ScTPValidationValue::SetFirstFormula( const OUString& rFmlaStr )
463 : {
464 : // try if formula is a string list, validation mode must already be set
465 0 : OUString aStringList;
466 0 : if( (m_pLbAllow->GetSelectEntryPos() == SC_VALIDDLG_ALLOW_RANGE) &&
467 0 : lclGetStringListFromFormula( aStringList, rFmlaStr, mcFmlaSep ) )
468 : {
469 0 : m_pEdList->SetText( aStringList );
470 0 : m_pEdMin->SetText( EMPTY_OUSTRING );
471 : // change validation mode to string list
472 0 : m_pLbAllow->SelectEntryPos( SC_VALIDDLG_ALLOW_LIST );
473 : }
474 : else
475 : {
476 0 : m_pEdMin->SetText( rFmlaStr );
477 0 : m_pEdList->SetText( EMPTY_OUSTRING );
478 0 : }
479 0 : }
480 :
481 0 : void ScTPValidationValue::SetSecondFormula( const OUString& rFmlaStr )
482 : {
483 0 : m_pEdMax->SetText( rFmlaStr );
484 0 : }
485 :
486 0 : ScValidationDlg * ScTPValidationValue::GetValidationDlg()
487 : {
488 0 : if( Window *pParent = GetParent() )
489 0 : do{
490 0 : if ( dynamic_cast<ScValidationDlg*>( pParent ) )
491 0 : return static_cast< ScValidationDlg * >( pParent );
492 : }while ( NULL != ( pParent = pParent->GetParent() ) );
493 0 : return NULL;
494 : }
495 :
496 0 : void ScTPValidationValue::SetupRefDlg()
497 : {
498 0 : if( ScValidationDlg *pValidationDlg = GetValidationDlg() )
499 : {
500 0 : if( pValidationDlg->SetupRefDlg() )
501 : {
502 0 : pValidationDlg->SetHandler( this );
503 0 : pValidationDlg->SetSetRefHdl( (ScRefHandlerHelper::PFUNCSETREFHDLTYPE)( &ScTPValidationValue::SetReferenceHdl ) );
504 0 : pValidationDlg->SetSetActHdl( (ScRefHandlerHelper::PCOMMONHDLTYPE)( &ScTPValidationValue::SetActiveHdl ) );
505 0 : pValidationDlg->SetRefInputStartPreHdl( (ScRefHandlerHelper::PINPUTSTARTDLTYPE)( &ScTPValidationValue::RefInputStartPreHdl ) );
506 0 : pValidationDlg->SetRefInputDonePostHdl( (ScRefHandlerHelper::PCOMMONHDLTYPE)( &ScTPValidationValue::RefInputDonePostHdl ) );
507 :
508 0 : Window *pLabel = NULL;
509 :
510 0 : if ( m_pEdMax->IsVisible() )
511 : {
512 0 : m_pRefEdit = m_pEdMax;
513 0 : pLabel = m_pFtMax;
514 : }
515 0 : else if ( m_pEdMin->IsVisible() )
516 : {
517 0 : m_pRefEdit = m_pEdMin;
518 0 : pLabel = m_pFtMin;
519 : }
520 :
521 0 : if( m_pRefEdit && !m_pRefEdit->HasFocus() )
522 0 : m_pRefEdit->GrabFocus();
523 :
524 0 : if( m_pRefEdit )
525 0 : m_pRefEdit->SetReferences( pValidationDlg, pLabel );
526 :
527 0 : m_pBtnRef->SetReferences( pValidationDlg, m_pRefEdit );
528 : }
529 : }
530 0 : }
531 :
532 0 : void ScTPValidationValue::RemoveRefDlg()
533 : {
534 0 : if( ScValidationDlg *pValidationDlg = GetValidationDlg() )
535 : {
536 0 : if( pValidationDlg->RemoveRefDlg() )
537 : {
538 0 : pValidationDlg->SetHandler( NULL );
539 0 : pValidationDlg->SetSetRefHdl( NULL );
540 0 : pValidationDlg->SetSetActHdl( NULL );
541 0 : pValidationDlg->SetRefInputStartPreHdl( NULL );
542 0 : pValidationDlg->SetRefInputDonePostHdl( NULL );
543 :
544 0 : if( m_pRefEdit )
545 0 : m_pRefEdit->SetReferences( NULL, NULL );
546 0 : m_pRefEdit = NULL;
547 :
548 0 : m_pBtnRef->SetReferences( NULL, NULL );
549 : }
550 : }
551 0 : }
552 :
553 0 : IMPL_LINK_NOARG(ScTPValidationValue, EditSetFocusHdl)
554 : {
555 0 : sal_uInt16 nPos=m_pLbAllow->GetSelectEntryPos();
556 :
557 0 : if ( nPos == SC_VALIDDLG_ALLOW_RANGE )
558 : {
559 0 : SetupRefDlg();
560 : }
561 :
562 0 : return 0;
563 : }
564 :
565 0 : IMPL_LINK( ScTPValidationValue, KillFocusHdl, Window *, pWnd )
566 : {
567 0 : if( pWnd == m_pRefEdit || pWnd == m_pBtnRef )
568 0 : if( ScValidationDlg *pValidationDlg = GetValidationDlg() )
569 0 : if ( (pValidationDlg->IsActive() || pValidationDlg->IsChildFocus() ) && !pValidationDlg->IsRefInputting() )
570 0 : if( ( !m_pRefEdit || !m_pRefEdit->HasFocus()) && !m_pBtnRef->HasFocus() )
571 : {
572 0 : RemoveRefDlg();
573 : }
574 :
575 0 : return 0;
576 : }
577 :
578 0 : IMPL_LINK_NOARG(ScTPValidationValue, SelectHdl)
579 : {
580 0 : sal_uInt16 nLbPos = m_pLbAllow->GetSelectEntryPos();
581 0 : bool bEnable = (nLbPos != SC_VALIDDLG_ALLOW_ANY);
582 0 : bool bRange = (nLbPos == SC_VALIDDLG_ALLOW_RANGE);
583 0 : bool bList = (nLbPos == SC_VALIDDLG_ALLOW_LIST);
584 :
585 0 : m_pCbAllow->Enable( bEnable ); // Empty cell
586 0 : m_pFtValue->Enable( bEnable );
587 0 : m_pLbValue->Enable( bEnable );
588 0 : m_pFtMin->Enable( bEnable );
589 0 : m_pEdMin->Enable( bEnable );
590 0 : m_pEdList->Enable( bEnable );
591 0 : m_pFtMax->Enable( bEnable );
592 0 : m_pEdMax->Enable( bEnable );
593 :
594 0 : bool bShowMax = false;
595 0 : if( bRange )
596 0 : m_pFtMin->SetText( maStrRange );
597 0 : else if( bList )
598 0 : m_pFtMin->SetText( maStrList );
599 : else
600 : {
601 0 : switch( m_pLbValue->GetSelectEntryPos() )
602 : {
603 : case SC_VALIDDLG_DATA_EQUAL:
604 0 : case SC_VALIDDLG_DATA_NOTEQUAL: m_pFtMin->SetText( maStrValue ); break;
605 :
606 : case SC_VALIDDLG_DATA_LESS:
607 0 : case SC_VALIDDLG_DATA_EQLESS: m_pFtMin->SetText( maStrMax ); break;
608 :
609 : case SC_VALIDDLG_DATA_VALIDRANGE:
610 0 : case SC_VALIDDLG_DATA_INVALIDRANGE: bShowMax = true; // fall through
611 : case SC_VALIDDLG_DATA_GREATER:
612 0 : case SC_VALIDDLG_DATA_EQGREATER: m_pFtMin->SetText( maStrMin ); break;
613 :
614 : default:
615 : OSL_FAIL( "ScTPValidationValue::SelectHdl - unknown condition mode" );
616 : }
617 : }
618 :
619 0 : m_pCbShow->Show( bRange || bList );
620 0 : m_pCbSort->Show( bRange || bList );
621 0 : m_pFtValue->Show( !bRange && !bList );
622 0 : m_pLbValue->Show( !bRange && !bList );
623 0 : m_pEdMin->Show( !bList );
624 0 : m_pEdList->Show( bList );
625 0 : m_pMinGrid->set_vexpand( bList );
626 0 : WinBits nBits = m_pFtMin->GetStyle();
627 0 : nBits &= ~(WB_TOP | WB_VCENTER | WB_BOTTOM);
628 0 : if (bList)
629 0 : nBits |= WB_TOP;
630 : else
631 0 : nBits |= WB_VCENTER;
632 0 : m_pFtMin->SetStyle( nBits );
633 0 : m_pFtMax->Show( bShowMax );
634 0 : m_pEdMax->Show( bShowMax );
635 0 : m_pFtHint->Show( bRange );
636 0 : m_pBtnRef->Show( bRange ); // cell range picker
637 0 : return 0;
638 : }
639 :
640 0 : IMPL_LINK_NOARG(ScTPValidationValue, CheckHdl)
641 : {
642 0 : m_pCbSort->Enable( m_pCbShow->IsChecked() );
643 0 : return 0;
644 : }
645 :
646 :
647 : // Input Help Page
648 :
649 0 : ScTPValidationHelp::ScTPValidationHelp( Window* pParent,
650 : const SfxItemSet& rArgSet )
651 :
652 : : SfxTabPage ( pParent,
653 : "ValidationHelpTabPage" , "modules/scalc/ui/validationhelptabpage.ui" ,
654 0 : rArgSet )
655 : {
656 0 : get(pTsbHelp,"tsbhelp");
657 0 : get(pEdtTitle,"title");
658 0 : get(pEdInputHelp,"inputhelp");
659 0 : pEdInputHelp->set_height_request(pEdInputHelp->GetTextHeight() * 12);
660 0 : pEdInputHelp->set_width_request(pEdInputHelp->approximate_char_width() * 50);
661 0 : Init();
662 0 : }
663 :
664 0 : ScTPValidationHelp::~ScTPValidationHelp()
665 : {
666 0 : }
667 :
668 0 : void ScTPValidationHelp::Init()
669 : {
670 0 : pTsbHelp->EnableTriState( false );
671 0 : }
672 :
673 0 : SfxTabPage* ScTPValidationHelp::Create( Window* pParent,
674 : const SfxItemSet& rArgSet )
675 : {
676 0 : return ( new ScTPValidationHelp( pParent, rArgSet ) );
677 : }
678 :
679 0 : void ScTPValidationHelp::Reset( const SfxItemSet& rArgSet )
680 : {
681 : const SfxPoolItem* pItem;
682 :
683 0 : if ( rArgSet.GetItemState( FID_VALID_SHOWHELP, true, &pItem ) == SFX_ITEM_SET )
684 0 : pTsbHelp->SetState( ((const SfxBoolItem*)pItem)->GetValue() ? TRISTATE_TRUE : TRISTATE_FALSE );
685 : else
686 0 : pTsbHelp->SetState( TRISTATE_FALSE );
687 :
688 0 : if ( rArgSet.GetItemState( FID_VALID_HELPTITLE, true, &pItem ) == SFX_ITEM_SET )
689 0 : pEdtTitle->SetText( ((const SfxStringItem*)pItem)->GetValue() );
690 : else
691 0 : pEdtTitle->SetText( EMPTY_OUSTRING );
692 :
693 0 : if ( rArgSet.GetItemState( FID_VALID_HELPTEXT, true, &pItem ) == SFX_ITEM_SET )
694 0 : pEdInputHelp->SetText( ((const SfxStringItem*)pItem)->GetValue() );
695 : else
696 0 : pEdInputHelp->SetText( EMPTY_OUSTRING );
697 0 : }
698 :
699 0 : bool ScTPValidationHelp::FillItemSet( SfxItemSet& rArgSet )
700 : {
701 0 : rArgSet.Put( SfxBoolItem( FID_VALID_SHOWHELP, pTsbHelp->GetState() == TRISTATE_TRUE ) );
702 0 : rArgSet.Put( SfxStringItem( FID_VALID_HELPTITLE, pEdtTitle->GetText() ) );
703 0 : rArgSet.Put( SfxStringItem( FID_VALID_HELPTEXT, pEdInputHelp->GetText() ) );
704 :
705 0 : return true;
706 : }
707 :
708 : // Error Alert Page
709 :
710 0 : ScTPValidationError::ScTPValidationError( Window* pParent,
711 : const SfxItemSet& rArgSet )
712 :
713 : : SfxTabPage ( pParent,
714 : "ErrorAlertTabPage" , "modules/scalc/ui/erroralerttabpage.ui" ,
715 0 : rArgSet )
716 : {
717 0 : get(m_pTsbShow,"tsbshow");
718 0 : get(m_pLbAction,"actionCB");
719 0 : get(m_pBtnSearch,"browseBtn");
720 0 : get(m_pEdtTitle,"title");
721 0 : get(m_pFtError,"errormsg_label");
722 0 : get(m_pEdError,"errorMsg");
723 0 : m_pEdError->set_height_request(m_pEdError->GetTextHeight() * 12);
724 0 : m_pEdError->set_width_request(m_pEdError->approximate_char_width() * 50);
725 0 : Init();
726 0 : }
727 :
728 0 : ScTPValidationError::~ScTPValidationError()
729 : {
730 0 : }
731 :
732 0 : void ScTPValidationError::Init()
733 : {
734 0 : m_pLbAction->SetSelectHdl( LINK( this, ScTPValidationError, SelectActionHdl ) );
735 0 : m_pBtnSearch->SetClickHdl( LINK( this, ScTPValidationError, ClickSearchHdl ) );
736 :
737 0 : m_pLbAction->SelectEntryPos( 0 );
738 0 : m_pTsbShow->EnableTriState( false );
739 :
740 0 : SelectActionHdl( NULL );
741 0 : }
742 :
743 0 : SfxTabPage* ScTPValidationError::Create( Window* pParent,
744 : const SfxItemSet& rArgSet )
745 : {
746 0 : return ( new ScTPValidationError( pParent, rArgSet ) );
747 : }
748 :
749 0 : void ScTPValidationError::Reset( const SfxItemSet& rArgSet )
750 : {
751 : const SfxPoolItem* pItem;
752 :
753 0 : if ( rArgSet.GetItemState( FID_VALID_SHOWERR, true, &pItem ) == SFX_ITEM_SET )
754 0 : m_pTsbShow->SetState( ((const SfxBoolItem*)pItem)->GetValue() ? TRISTATE_TRUE : TRISTATE_FALSE );
755 : else
756 0 : m_pTsbShow->SetState( TRISTATE_TRUE ); // check by default
757 :
758 0 : if ( rArgSet.GetItemState( FID_VALID_ERRSTYLE, true, &pItem ) == SFX_ITEM_SET )
759 0 : m_pLbAction->SelectEntryPos( ((const SfxAllEnumItem*)pItem)->GetValue() );
760 : else
761 0 : m_pLbAction->SelectEntryPos( 0 );
762 :
763 0 : if ( rArgSet.GetItemState( FID_VALID_ERRTITLE, true, &pItem ) == SFX_ITEM_SET )
764 0 : m_pEdtTitle->SetText( ((const SfxStringItem*)pItem)->GetValue() );
765 : else
766 0 : m_pEdtTitle->SetText( EMPTY_OUSTRING );
767 :
768 0 : if ( rArgSet.GetItemState( FID_VALID_ERRTEXT, true, &pItem ) == SFX_ITEM_SET )
769 0 : m_pEdError->SetText( ((const SfxStringItem*)pItem)->GetValue() );
770 : else
771 0 : m_pEdError->SetText( EMPTY_OUSTRING );
772 :
773 0 : SelectActionHdl( NULL );
774 0 : }
775 :
776 0 : bool ScTPValidationError::FillItemSet( SfxItemSet& rArgSet )
777 : {
778 0 : rArgSet.Put( SfxBoolItem( FID_VALID_SHOWERR, m_pTsbShow->GetState() == TRISTATE_TRUE ) );
779 0 : rArgSet.Put( SfxAllEnumItem( FID_VALID_ERRSTYLE, m_pLbAction->GetSelectEntryPos() ) );
780 0 : rArgSet.Put( SfxStringItem( FID_VALID_ERRTITLE, m_pEdtTitle->GetText() ) );
781 0 : rArgSet.Put( SfxStringItem( FID_VALID_ERRTEXT, m_pEdError->GetText() ) );
782 :
783 0 : return true;
784 : }
785 :
786 0 : IMPL_LINK_NOARG(ScTPValidationError, SelectActionHdl)
787 : {
788 0 : ScValidErrorStyle eStyle = (ScValidErrorStyle) m_pLbAction->GetSelectEntryPos();
789 0 : sal_Bool bMacro = ( eStyle == SC_VALERR_MACRO );
790 :
791 0 : m_pBtnSearch->Enable( bMacro );
792 0 : m_pFtError->Enable( !bMacro );
793 0 : m_pEdError->Enable( !bMacro );
794 :
795 0 : return( 0L );
796 : }
797 :
798 0 : IMPL_LINK_NOARG(ScTPValidationError, ClickSearchHdl)
799 : {
800 0 : Window* pOld = Application::GetDefDialogParent();
801 0 : Application::SetDefDialogParent( this );
802 :
803 : // Use static SfxApplication method to bring up selector dialog for
804 : // choosing a script
805 0 : OUString aScriptURL = SfxApplication::ChooseScript();
806 :
807 0 : Application::SetDefDialogParent( pOld );
808 :
809 0 : if ( aScriptURL != NULL && !aScriptURL.isEmpty() )
810 : {
811 0 : m_pEdtTitle->SetText( aScriptURL );
812 : }
813 :
814 0 : return( 0L );
815 : }
816 :
817 0 : bool ScValidationDlg::EnterRefStatus()
818 : {
819 0 : ScTabViewShell *pTabViewShell = GetTabViewShell();
820 :
821 0 : if( !pTabViewShell ) return false;
822 :
823 0 : sal_uInt16 nId = SLOTID;
824 0 : SfxViewFrame* pViewFrm = pTabViewShell->GetViewFrame();
825 0 : SfxChildWindow* pWnd = pViewFrm->GetChildWindow( nId );
826 :
827 0 : if ( pWnd && pWnd->GetWindow()!= this ) pWnd = NULL;
828 :
829 0 : SC_MOD()->SetRefDialog( nId, pWnd ? false : sal_True );
830 :
831 0 : return true;
832 : }
833 :
834 0 : bool ScValidationDlg::LeaveRefStatus()
835 : {
836 0 : ScTabViewShell *pTabViewShell = GetTabViewShell();
837 :
838 0 : if( !pTabViewShell ) return false;
839 :
840 0 : sal_uInt16 nId = SLOTID;
841 0 : SfxViewFrame* pViewFrm = pTabViewShell->GetViewFrame();
842 0 : if ( pViewFrm->GetChildWindow( nId ) )
843 : {
844 0 : DoClose( nId );
845 : }
846 0 : return true;
847 : }
848 :
849 0 : bool ScValidationDlg::SetupRefDlg()
850 : {
851 0 : if ( m_bOwnRefHdlr ) return false;
852 0 : if( EnterRefMode() )
853 : {
854 0 : SetModal( false );
855 0 : return m_bOwnRefHdlr = true && EnterRefStatus();
856 : }
857 :
858 0 : return false;
859 : }
860 :
861 0 : bool ScValidationDlg::RemoveRefDlg( bool bRestoreModal /* = true */ )
862 : {
863 0 : bool bVisLock = false;
864 0 : bool bFreeWindowLock = false;
865 :
866 0 : ScTabViewShell *pTabVwSh = GetTabViewShell();
867 :
868 0 : if( !pTabVwSh ) return false;
869 :
870 0 : if ( SfxChildWindow* pWnd = pTabVwSh->GetViewFrame()->GetChildWindow( SID_VALIDITY_REFERENCE ) )
871 : {
872 0 : bVisLock = static_cast<ScValidityRefChildWin*>(pWnd)->LockVisible( true );
873 0 : bFreeWindowLock = static_cast<ScValidityRefChildWin*>(pWnd)->LockFreeWindow( true );
874 : }
875 :
876 0 : if ( !m_bOwnRefHdlr ) return false;
877 0 : if( LeaveRefStatus() && LeaveRefMode() )
878 : {
879 0 : m_bOwnRefHdlr = false;
880 :
881 0 : if( bRestoreModal )
882 0 : SetModal( true );
883 : }
884 :
885 0 : if ( SfxChildWindow* pWnd = pTabVwSh->GetViewFrame()->GetChildWindow( SID_VALIDITY_REFERENCE ) )
886 : {
887 0 : static_cast<ScValidityRefChildWin*>(pWnd)->LockVisible( bVisLock );
888 0 : static_cast<ScValidityRefChildWin*>(pWnd)->LockFreeWindow( bFreeWindowLock );
889 : }
890 :
891 0 : return true;
892 : }
893 :
894 0 : extern "C" SAL_DLLPUBLIC_EXPORT Window* SAL_CALL makeScRefButtonEx(Window *pParent, VclBuilder::stringmap &)
895 : {
896 0 : return new ScTPValidationValue::ScRefButtonEx(pParent, 0);
897 : }
898 :
899 0 : void ScTPValidationValue::ScRefButtonEx::Click()
900 : {
901 0 : if( ScTPValidationValue *pParent = GetParentPage() )
902 0 : pParent->OnClick( this );
903 :
904 0 : formula::RefButton::Click();
905 0 : }
906 :
907 0 : void ScTPValidationValue::OnClick( Button *pBtn )
908 : {
909 0 : if( pBtn == m_pBtnRef )
910 0 : SetupRefDlg();
911 0 : }
912 :
913 0 : bool ScValidationDlg::IsChildFocus()
914 : {
915 0 : if ( const Window *pWin = Application::GetFocusWindow() )
916 0 : while( NULL != ( pWin = pWin->GetParent() ) )
917 0 : if( pWin == this )
918 0 : return true;
919 :
920 0 : return false;
921 0 : }
922 :
923 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|