Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*************************************************************************
3 : : *
4 : : * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 : : *
6 : : * Copyright 2000, 2010 Oracle and/or its affiliates.
7 : : *
8 : : * OpenOffice.org - a multi-platform office productivity suite
9 : : *
10 : : * This file is part of OpenOffice.org.
11 : : *
12 : : * OpenOffice.org is free software: you can redistribute it and/or modify
13 : : * it under the terms of the GNU Lesser General Public License version 3
14 : : * only, as published by the Free Software Foundation.
15 : : *
16 : : * OpenOffice.org is distributed in the hope that it will be useful,
17 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 : : * GNU Lesser General Public License version 3 for more details
20 : : * (a copy is included in the LICENSE file that accompanied this code).
21 : : *
22 : : * You should have received a copy of the GNU Lesser General Public License
23 : : * version 3 along with OpenOffice.org. If not, see
24 : : * <http://www.openoffice.org/license.html>
25 : : * for a copy of the LGPLv3 License.
26 : : *
27 : : ************************************************************************/
28 : :
29 : :
30 : : #ifdef SC_DLLIMPLEMENTATION
31 : : #undef SC_DLLIMPLEMENTATION
32 : : #endif
33 : :
34 : : #include <comphelper/string.hxx>
35 : : #include <vcl/svapp.hxx>
36 : : #include <svl/aeitem.hxx>
37 : : #include <svl/stritem.hxx>
38 : : #include <svl/eitem.hxx>
39 : : #include <svl/intitem.hxx>
40 : : #include <basic/sbmeth.hxx>
41 : : #include <basic/sbstar.hxx>
42 : : #include <basic/sbmod.hxx>
43 : : #include <sfx2/app.hxx>
44 : :
45 : : #include "scresid.hxx"
46 : : #include "sc.hrc" // -> Slot IDs
47 : :
48 : : #include "stringutil.hxx"
49 : : #include "validat.hxx"
50 : : #include "validate.hrc"
51 : : #include "validate.hxx"
52 : : #include "compiler.hxx"
53 : : #include "formula/opcode.hxx"
54 : :
55 : : // cell range picker
56 : : #include "tabvwsh.hxx"
57 : : #include <sfx2/viewfrm.hxx>
58 : : #include <sfx2/childwin.hxx>
59 : : #include "reffact.hxx"
60 : :
61 : : // ============================================================================
62 : :
63 : : static sal_uInt16 pValueRanges[] =
64 : : {
65 : : FID_VALID_MODE, FID_VALID_ERRTEXT,
66 : : FID_VALID_LISTTYPE, FID_VALID_LISTTYPE,
67 : : 0
68 : : };
69 : :
70 : :
71 : : // ============================================================================
72 : :
73 : 0 : ScValidationDlg::ScValidationDlg( Window* pParent,
74 : : const SfxItemSet* pArgSet,
75 : : ScTabViewShell *pTabViewSh,
76 : : SfxBindings *pB /*= NULL*/
77 : : ) :
78 : 0 : ScValidationDlgBase( pParent ? pParent : SFX_APP()->GetTopWindow(), TAB_DLG_VALIDATION, pArgSet, pB ),
79 : : m_bOwnRefHdlr( false ),
80 : : m_pTabVwSh( pTabViewSh ),
81 : 0 : m_bRefInputting( false )
82 : : {
83 : 0 : AddTabPage( TP_VALIDATION_VALUES, ScTPValidationValue::Create, 0 );
84 : 0 : AddTabPage( TP_VALIDATION_INPUTHELP, ScTPValidationHelp::Create, 0 );
85 : 0 : AddTabPage( TP_VALIDATION_ERROR, ScTPValidationError::Create, 0 );
86 : 0 : FreeResource();
87 : 0 : }
88 : :
89 : 0 : void ScTPValidationValue::SetReferenceHdl( const ScRange&rRange , ScDocument* pDoc )
90 : : {
91 : 0 : if ( rRange.aStart != rRange.aEnd )
92 : 0 : if ( ScValidationDlg *pValidationDlg = GetValidationDlg() )
93 : 0 : if( m_pRefEdit )
94 : 0 : pValidationDlg->RefInputStart( m_pRefEdit );
95 : :
96 : 0 : if ( m_pRefEdit )
97 : : {
98 : 0 : String aStr;
99 : 0 : rRange.Format( aStr, SCR_ABS_3D, pDoc );
100 : 0 : m_pRefEdit->SetRefString( aStr );
101 : : }
102 : 0 : }
103 : :
104 : 0 : void ScTPValidationValue:: SetActiveHdl()
105 : : {
106 : 0 : if ( m_pRefEdit ) m_pRefEdit->GrabFocus();
107 : :
108 : 0 : if ( ScValidationDlg *pValidationDlg = GetValidationDlg() )
109 : 0 : if( m_pRefEdit )
110 : : {
111 : 0 : pValidationDlg->RefInputDone();
112 : : }
113 : 0 : }
114 : :
115 : 0 : void ScTPValidationValue::RefInputStartPreHdl( formula::RefEdit* pEdit, formula::RefButton* pButton )
116 : : {
117 : 0 : if ( ScValidationDlg *pValidationDlg = GetValidationDlg() )
118 : : {
119 : 0 : if( pEdit == m_pRefEdit )
120 : : {
121 : 0 : if( Window *pPreWnd = pEdit==&maEdMax?&maFtMax:(pEdit==&maEdMin?&maFtMin:NULL) )
122 : : {
123 : 0 : pPreWnd->SetParent( pValidationDlg );
124 : 0 : pPreWnd->Hide();
125 : : }
126 : :
127 : 0 : m_pRefEdit->SetParent( pValidationDlg );
128 : : }
129 : :
130 : 0 : if( pButton == &m_btnRef )m_btnRef.SetParent( pValidationDlg );
131 : : }
132 : 0 : }
133 : :
134 : 0 : void ScTPValidationValue::RefInputDonePreHdl()
135 : : {
136 : :
137 : 0 : if( m_pRefEdit && m_pRefEdit->GetParent()!= this )
138 : : {
139 : 0 : if( Window *pPreWnd = m_pRefEdit==&maEdMax?&maFtMax:(m_pRefEdit==&maEdMin?&maFtMin:NULL) )
140 : : {
141 : 0 : pPreWnd->SetParent( this );
142 : 0 : pPreWnd->Show();
143 : : }
144 : :
145 : 0 : m_pRefEdit->SetParent( this );
146 : :
147 : 0 : m_btnRef.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
148 : : }
149 : :
150 : 0 : if( m_btnRef.GetParent()!=this ) m_btnRef.SetParent( this );
151 : 0 : }
152 : :
153 : 0 : void ScTPValidationValue::RefInputDonePostHdl()
154 : : {
155 : :
156 : :
157 : 0 : if( m_pRefEdit && !m_pRefEdit->HasFocus() )
158 : 0 : m_pRefEdit->GrabFocus();
159 : :
160 : 0 : }
161 : :
162 : :
163 : 0 : sal_Bool ScValidationDlg::Close()
164 : : {
165 : 0 : if( m_bOwnRefHdlr )
166 : 0 : if( SfxTabPage* pPage = GetTabPage( TP_VALIDATION_VALUES ) )
167 : 0 : static_cast<ScTPValidationValue*>(pPage)->RemoveRefDlg();
168 : :
169 : 0 : return ScValidationDlgBase::Close();
170 : : }
171 : :
172 : 0 : ScValidationDlg::~ScValidationDlg()
173 : : {
174 : 0 : if( m_bOwnRefHdlr )
175 : 0 : RemoveRefDlg( false );
176 : 0 : }
177 : :
178 : :
179 : : // ============================================================================
180 : :
181 : : namespace {
182 : :
183 : : /** Converts the passed ScValidationMode to the position in the list box. */
184 : 0 : sal_uInt16 lclGetPosFromValMode( ScValidationMode eValMode )
185 : : {
186 : 0 : sal_uInt16 nLbPos = SC_VALIDDLG_ALLOW_ANY;
187 : 0 : switch( eValMode )
188 : : {
189 : 0 : case SC_VALID_ANY: nLbPos = SC_VALIDDLG_ALLOW_ANY; break;
190 : 0 : case SC_VALID_WHOLE: nLbPos = SC_VALIDDLG_ALLOW_WHOLE; break;
191 : 0 : case SC_VALID_DECIMAL: nLbPos = SC_VALIDDLG_ALLOW_DECIMAL; break;
192 : 0 : case SC_VALID_DATE: nLbPos = SC_VALIDDLG_ALLOW_DATE; break;
193 : 0 : case SC_VALID_TIME: nLbPos = SC_VALIDDLG_ALLOW_TIME; break;
194 : 0 : case SC_VALID_TEXTLEN: nLbPos = SC_VALIDDLG_ALLOW_TEXTLEN; break;
195 : 0 : case SC_VALID_LIST: nLbPos = SC_VALIDDLG_ALLOW_RANGE; break;
196 : 0 : case SC_VALID_CUSTOM: nLbPos = SC_VALIDDLG_ALLOW_ANY; break; // not supported
197 : : default: OSL_FAIL( "lclGetPosFromValMode - unknown validity mode" );
198 : : }
199 : 0 : return nLbPos;
200 : : }
201 : :
202 : : /** Converts the passed list box position to an ScValidationMode. */
203 : 0 : ScValidationMode lclGetValModeFromPos( sal_uInt16 nLbPos )
204 : : {
205 : 0 : ScValidationMode eValMode = SC_VALID_ANY;
206 : 0 : switch( nLbPos )
207 : : {
208 : 0 : case SC_VALIDDLG_ALLOW_ANY: eValMode = SC_VALID_ANY; break;
209 : 0 : case SC_VALIDDLG_ALLOW_WHOLE: eValMode = SC_VALID_WHOLE; break;
210 : 0 : case SC_VALIDDLG_ALLOW_DECIMAL: eValMode = SC_VALID_DECIMAL; break;
211 : 0 : case SC_VALIDDLG_ALLOW_DATE: eValMode = SC_VALID_DATE; break;
212 : 0 : case SC_VALIDDLG_ALLOW_TIME: eValMode = SC_VALID_TIME; break;
213 : 0 : case SC_VALIDDLG_ALLOW_RANGE: eValMode = SC_VALID_LIST; break;
214 : 0 : case SC_VALIDDLG_ALLOW_LIST: eValMode = SC_VALID_LIST; break;
215 : 0 : case SC_VALIDDLG_ALLOW_TEXTLEN: eValMode = SC_VALID_TEXTLEN; break;
216 : : default: OSL_FAIL( "lclGetValModeFromPos - invalid list box position" );
217 : : }
218 : 0 : return eValMode;
219 : : }
220 : :
221 : : /** Converts the passed ScConditionMode to the position in the list box. */
222 : 0 : sal_uInt16 lclGetPosFromCondMode( ScConditionMode eCondMode )
223 : : {
224 : 0 : sal_uInt16 nLbPos = SC_VALIDDLG_DATA_EQUAL;
225 : 0 : switch( eCondMode )
226 : : {
227 : : case SC_COND_NONE: // may occur in old XML files after Excel import
228 : 0 : case SC_COND_EQUAL: nLbPos = SC_VALIDDLG_DATA_EQUAL; break;
229 : 0 : case SC_COND_LESS: nLbPos = SC_VALIDDLG_DATA_LESS; break;
230 : 0 : case SC_COND_GREATER: nLbPos = SC_VALIDDLG_DATA_GREATER; break;
231 : 0 : case SC_COND_EQLESS: nLbPos = SC_VALIDDLG_DATA_EQLESS; break;
232 : 0 : case SC_COND_EQGREATER: nLbPos = SC_VALIDDLG_DATA_EQGREATER; break;
233 : 0 : case SC_COND_NOTEQUAL: nLbPos = SC_VALIDDLG_DATA_NOTEQUAL; break;
234 : 0 : case SC_COND_BETWEEN: nLbPos = SC_VALIDDLG_DATA_VALIDRANGE; break;
235 : 0 : case SC_COND_NOTBETWEEN: nLbPos = SC_VALIDDLG_DATA_INVALIDRANGE; break;
236 : : default: OSL_FAIL( "lclGetPosFromCondMode - unknown condition mode" );
237 : : }
238 : 0 : return nLbPos;
239 : : }
240 : :
241 : : /** Converts the passed list box position to an ScConditionMode. */
242 : 0 : ScConditionMode lclGetCondModeFromPos( sal_uInt16 nLbPos )
243 : : {
244 : 0 : ScConditionMode eCondMode = SC_COND_EQUAL;
245 : 0 : switch( nLbPos )
246 : : {
247 : 0 : case SC_VALIDDLG_DATA_EQUAL: eCondMode = SC_COND_EQUAL; break;
248 : 0 : case SC_VALIDDLG_DATA_LESS: eCondMode = SC_COND_LESS; break;
249 : 0 : case SC_VALIDDLG_DATA_GREATER: eCondMode = SC_COND_GREATER; break;
250 : 0 : case SC_VALIDDLG_DATA_EQLESS: eCondMode = SC_COND_EQLESS; break;
251 : 0 : case SC_VALIDDLG_DATA_EQGREATER: eCondMode = SC_COND_EQGREATER; break;
252 : 0 : case SC_VALIDDLG_DATA_NOTEQUAL: eCondMode = SC_COND_NOTEQUAL; break;
253 : 0 : case SC_VALIDDLG_DATA_VALIDRANGE: eCondMode = SC_COND_BETWEEN; break;
254 : 0 : case SC_VALIDDLG_DATA_INVALIDRANGE: eCondMode = SC_COND_NOTBETWEEN; break;
255 : : default: OSL_FAIL( "lclGetCondModeFromPos - invalid list box position" );
256 : : }
257 : 0 : return eCondMode;
258 : : }
259 : :
260 : : /** Converts line feed separated string to a formula with strings separated by semicolons.
261 : : @descr Keeps all empty strings.
262 : : Example: abc\ndef\n\nghi -> "abc";"def";"";"ghi".
263 : : @param rFmlaStr (out-param) The converted formula string. */
264 : 0 : void lclGetFormulaFromStringList( String& rFmlaStr, const String& rStringList, sal_Unicode cFmlaSep )
265 : : {
266 : 0 : rFmlaStr.Erase();
267 : 0 : xub_StrLen nTokenCnt = comphelper::string::getTokenCount(rStringList, '\n');
268 : 0 : for( xub_StrLen nToken = 0, nStringIx = 0; nToken < nTokenCnt; ++nToken )
269 : : {
270 : 0 : String aToken( rStringList.GetToken( 0, '\n', nStringIx ) );
271 : 0 : ScGlobal::AddQuotes( aToken, '"' );
272 : 0 : ScGlobal::AddToken( rFmlaStr, aToken, cFmlaSep );
273 : 0 : }
274 : 0 : if( !rFmlaStr.Len() )
275 : 0 : rFmlaStr.AssignAscii( "\"\"" );
276 : 0 : }
277 : :
278 : :
279 : : /** Converts formula with strings separated by semicolons to line feed separated string.
280 : : @descr Keeps all empty strings. Ignores all empty tokens (multiple semicolons).
281 : : Example: "abc";;;"def";"";"ghi" -> abc\ndef\n\nghi.
282 : : @param rStringList (out-param) The converted line feed separated string list.
283 : : @return true = Conversion successful. */
284 : 0 : bool lclGetStringListFromFormula( String& rStringList, const String& rFmlaStr, sal_Unicode cFmlaSep )
285 : : {
286 : 0 : String aQuotes( RTL_CONSTASCII_USTRINGPARAM( "\"\"" ) );
287 : 0 : xub_StrLen nTokenCnt = ScStringUtil::GetQuotedTokenCount(rFmlaStr, aQuotes, cFmlaSep );
288 : :
289 : 0 : rStringList.Erase();
290 : 0 : bool bIsStringList = (nTokenCnt > 0);
291 : 0 : bool bTokenAdded = false;
292 : :
293 : 0 : for( xub_StrLen nToken = 0, nStringIx = 0; bIsStringList && (nToken < nTokenCnt); ++nToken )
294 : : {
295 : 0 : String aToken( ScStringUtil::GetQuotedToken(rFmlaStr, 0, aQuotes, cFmlaSep, nStringIx ) );
296 : 0 : aToken = comphelper::string::strip(aToken, ' ');
297 : 0 : if( aToken.Len() ) // ignore empty tokens, i.e. "a";;"b"
298 : : {
299 : 0 : bIsStringList = ScGlobal::IsQuoted( aToken, '"' );
300 : 0 : if( bIsStringList )
301 : : {
302 : 0 : ScGlobal::EraseQuotes( aToken, '"' );
303 : 0 : ScGlobal::AddToken( rStringList, aToken, '\n', 1, bTokenAdded );
304 : 0 : bTokenAdded = true;
305 : : }
306 : : }
307 : 0 : }
308 : :
309 : 0 : return bIsStringList;
310 : : }
311 : :
312 : : } // namespace
313 : :
314 : : // ----------------------------------------------------------------------------
315 : :
316 : 0 : ScTPValidationValue::ScTPValidationValue( Window* pParent, const SfxItemSet& rArgSet ) :
317 : : SfxTabPage( pParent, ScResId( TP_VALIDATION_VALUES ), rArgSet ),
318 : : maFtAllow ( this, ScResId( FT_ALLOW ) ),
319 : : maLbAllow ( this, ScResId( LB_ALLOW ) ),
320 : : maCbAllow ( this, ScResId( TSB_ALLOW_BLANKS ) ),
321 : : maCbShow ( this, ScResId( CB_SHOWLIST ) ),
322 : : maCbSort ( this, ScResId( CB_SORTLIST ) ),
323 : : maFtValue ( this, ScResId( FT_VALUE ) ),
324 : : maLbValue ( this, ScResId( LB_VALUE ) ),
325 : : maFtMin ( this, ScResId( FT_MIN ) ),
326 : : maEdMin ( this, ScResId( EDT_MIN ) ),
327 : : maEdList ( this, ScResId( EDT_LIST ) ),
328 : : maFtMax ( this, ScResId( FT_MAX ) ),
329 : : maEdMax ( this, ScResId( EDT_MAX ) ),
330 : : maFtHint ( this, ScResId( FT_SOURCEHINT ) ),
331 : : maStrMin ( ScResId( SCSTR_VALID_MINIMUM ) ),
332 : : maStrMax ( ScResId( SCSTR_VALID_MAXIMUM ) ),
333 : : maStrValue( ScResId( SCSTR_VALID_VALUE ) ),
334 : : maStrRange( ScResId( SCSTR_VALID_RANGE ) ),
335 : : maStrList ( ScResId( SCSTR_VALID_LIST ) ),
336 : 0 : m_btnRef( this, ScResId( RB_VALIDITY_REF ) )
337 : : {
338 : 0 : Init();
339 : 0 : FreeResource();
340 : :
341 : : // list separator in formulas
342 : 0 : String aListSep = ::ScCompiler::GetNativeSymbol( ocSep );
343 : : OSL_ENSURE( aListSep.Len() == 1, "ScTPValidationValue::ScTPValidationValue - list separator error" );
344 : 0 : mcFmlaSep = aListSep.Len() ? aListSep.GetChar( 0 ) : ';';
345 : 0 : m_btnRef.Hide(); // cell range picker
346 : 0 : }
347 : :
348 : 0 : ScTPValidationValue::~ScTPValidationValue()
349 : : {
350 : 0 : }
351 : :
352 : 0 : void ScTPValidationValue::Init()
353 : : {
354 : 0 : maLbAllow.SetSelectHdl( LINK( this, ScTPValidationValue, SelectHdl ) );
355 : 0 : maLbValue.SetSelectHdl( LINK( this, ScTPValidationValue, SelectHdl ) );
356 : 0 : maCbShow.SetClickHdl( LINK( this, ScTPValidationValue, CheckHdl ) );
357 : :
358 : : // cell range picker
359 : 0 : maEdMin.SetGetFocusHdl( LINK( this, ScTPValidationValue, EditSetFocusHdl ) );
360 : 0 : maEdMin.SetLoseFocusHdl( LINK( this, ScTPValidationValue, KillFocusHdl ) );
361 : 0 : maEdMax.SetGetFocusHdl( LINK( this, ScTPValidationValue, EditSetFocusHdl ) );
362 : 0 : m_btnRef.SetLoseFocusHdl( LINK( this, ScTPValidationValue, KillFocusHdl ) );
363 : 0 : maEdMax.SetLoseFocusHdl( LINK( this, ScTPValidationValue, KillFocusHdl ) );
364 : :
365 : 0 : maLbAllow.SelectEntryPos( SC_VALIDDLG_ALLOW_ANY );
366 : 0 : maLbValue.SelectEntryPos( SC_VALIDDLG_DATA_EQUAL );
367 : :
368 : 0 : SelectHdl( NULL );
369 : 0 : CheckHdl( NULL );
370 : 0 : }
371 : :
372 : 0 : SfxTabPage* ScTPValidationValue::Create( Window* pParent, const SfxItemSet& rArgSet )
373 : : {
374 : 0 : return( new ScTPValidationValue( pParent, rArgSet ) );
375 : : }
376 : :
377 : 0 : sal_uInt16* ScTPValidationValue::GetRanges()
378 : : {
379 : 0 : return pValueRanges;
380 : : }
381 : :
382 : 0 : void ScTPValidationValue::Reset( const SfxItemSet& rArgSet )
383 : : {
384 : : const SfxPoolItem* pItem;
385 : :
386 : 0 : sal_uInt16 nLbPos = SC_VALIDDLG_ALLOW_ANY;
387 : 0 : if( rArgSet.GetItemState( FID_VALID_MODE, sal_True, &pItem ) == SFX_ITEM_SET )
388 : : nLbPos = lclGetPosFromValMode( static_cast< ScValidationMode >(
389 : 0 : static_cast< const SfxAllEnumItem* >( pItem )->GetValue() ) );
390 : 0 : maLbAllow.SelectEntryPos( nLbPos );
391 : :
392 : 0 : nLbPos = SC_VALIDDLG_DATA_EQUAL;
393 : 0 : if( rArgSet.GetItemState( FID_VALID_CONDMODE, sal_True, &pItem ) == SFX_ITEM_SET )
394 : : nLbPos = lclGetPosFromCondMode( static_cast< ScConditionMode >(
395 : 0 : static_cast< const SfxAllEnumItem* >( pItem )->GetValue() ) );
396 : 0 : maLbValue.SelectEntryPos( nLbPos );
397 : :
398 : : // *** check boxes ***
399 : 0 : sal_Bool bCheck = sal_True;
400 : 0 : if( rArgSet.GetItemState( FID_VALID_BLANK, sal_True, &pItem ) == SFX_ITEM_SET )
401 : 0 : bCheck = static_cast< const SfxBoolItem* >( pItem )->GetValue();
402 : 0 : maCbAllow.Check( bCheck );
403 : :
404 : 0 : sal_Int32 nListType = ValidListType::UNSORTED;
405 : 0 : if( rArgSet.GetItemState( FID_VALID_LISTTYPE, sal_True, &pItem ) == SFX_ITEM_SET )
406 : 0 : nListType = static_cast< const SfxInt16Item* >( pItem )->GetValue();
407 : 0 : maCbShow.Check( nListType != ValidListType::INVISIBLE );
408 : 0 : maCbSort.Check( nListType == ValidListType::SORTEDASCENDING );
409 : :
410 : : // *** formulas ***
411 : 0 : String aFmlaStr;
412 : 0 : if ( rArgSet.GetItemState( FID_VALID_VALUE1, sal_True, &pItem ) == SFX_ITEM_SET )
413 : 0 : aFmlaStr = static_cast< const SfxStringItem* >( pItem )->GetValue();
414 : 0 : SetFirstFormula( aFmlaStr );
415 : :
416 : 0 : aFmlaStr.Erase();
417 : 0 : if ( rArgSet.GetItemState( FID_VALID_VALUE2, sal_True, &pItem ) == SFX_ITEM_SET )
418 : 0 : aFmlaStr = static_cast< const SfxStringItem* >( pItem )->GetValue();
419 : 0 : SetSecondFormula( aFmlaStr );
420 : :
421 : 0 : SelectHdl( NULL );
422 : 0 : CheckHdl( NULL );
423 : 0 : }
424 : :
425 : 0 : sal_Bool ScTPValidationValue::FillItemSet( SfxItemSet& rArgSet )
426 : : {
427 : 0 : sal_Int16 nListType = maCbShow.IsChecked() ?
428 : 0 : (maCbSort.IsChecked() ? ValidListType::SORTEDASCENDING : ValidListType::UNSORTED) :
429 : 0 : ValidListType::INVISIBLE;
430 : :
431 : : rArgSet.Put( SfxAllEnumItem( FID_VALID_MODE, sal::static_int_cast<sal_uInt16>(
432 : 0 : lclGetValModeFromPos( maLbAllow.GetSelectEntryPos() ) ) ) );
433 : : rArgSet.Put( SfxAllEnumItem( FID_VALID_CONDMODE, sal::static_int_cast<sal_uInt16>(
434 : 0 : lclGetCondModeFromPos( maLbValue.GetSelectEntryPos() ) ) ) );
435 : 0 : rArgSet.Put( SfxStringItem( FID_VALID_VALUE1, GetFirstFormula() ) );
436 : 0 : rArgSet.Put( SfxStringItem( FID_VALID_VALUE2, GetSecondFormula() ) );
437 : 0 : rArgSet.Put( SfxBoolItem( FID_VALID_BLANK, maCbAllow.IsChecked() ) );
438 : 0 : rArgSet.Put( SfxInt16Item( FID_VALID_LISTTYPE, nListType ) );
439 : 0 : return sal_True;
440 : : }
441 : :
442 : 0 : String ScTPValidationValue::GetFirstFormula() const
443 : : {
444 : 0 : String aFmlaStr;
445 : 0 : if( maLbAllow.GetSelectEntryPos() == SC_VALIDDLG_ALLOW_LIST )
446 : 0 : lclGetFormulaFromStringList( aFmlaStr, maEdList.GetText(), mcFmlaSep );
447 : : else
448 : 0 : aFmlaStr = maEdMin.GetText();
449 : 0 : return aFmlaStr;
450 : : }
451 : :
452 : 0 : String ScTPValidationValue::GetSecondFormula() const
453 : : {
454 : 0 : return maEdMax.GetText();
455 : : }
456 : :
457 : 0 : void ScTPValidationValue::SetFirstFormula( const String& rFmlaStr )
458 : : {
459 : : // try if formula is a string list, validation mode must already be set
460 : 0 : String aStringList;
461 : 0 : if( (maLbAllow.GetSelectEntryPos() == SC_VALIDDLG_ALLOW_RANGE) &&
462 : 0 : lclGetStringListFromFormula( aStringList, rFmlaStr, mcFmlaSep ) )
463 : : {
464 : 0 : maEdList.SetText( aStringList );
465 : 0 : maEdMin.SetText( EMPTY_STRING );
466 : : // change validation mode to string list
467 : 0 : maLbAllow.SelectEntryPos( SC_VALIDDLG_ALLOW_LIST );
468 : : }
469 : : else
470 : : {
471 : 0 : maEdMin.SetText( rFmlaStr );
472 : 0 : maEdList.SetText( EMPTY_STRING );
473 : 0 : }
474 : 0 : }
475 : :
476 : 0 : void ScTPValidationValue::SetSecondFormula( const String& rFmlaStr )
477 : : {
478 : 0 : maEdMax.SetText( rFmlaStr );
479 : 0 : }
480 : :
481 : 0 : ScValidationDlg * ScTPValidationValue::GetValidationDlg()
482 : : {
483 : 0 : if( Window *pParent = GetParent() )
484 : 0 : do{
485 : 0 : if ( dynamic_cast<ScValidationDlg*>( pParent ) )
486 : 0 : return static_cast< ScValidationDlg * >( pParent );
487 : : }while ( NULL != ( pParent = pParent->GetParent() ) );
488 : 0 : return NULL;
489 : : }
490 : :
491 : 0 : void ScTPValidationValue::SetupRefDlg()
492 : : {
493 : 0 : if( ScValidationDlg *pValidationDlg = GetValidationDlg() )
494 : 0 : if( pValidationDlg->SetupRefDlg() )
495 : : {
496 : 0 : pValidationDlg->SetHandler( this );
497 : 0 : pValidationDlg->SetSetRefHdl( (ScRefHandlerHelper::PFUNCSETREFHDLTYPE)( &ScTPValidationValue::SetReferenceHdl ) );
498 : 0 : pValidationDlg->SetSetActHdl( (ScRefHandlerHelper::PCOMMONHDLTYPE)( &ScTPValidationValue::SetActiveHdl ) );
499 : 0 : pValidationDlg->SetRefInputStartPreHdl( (ScRefHandlerHelper::PINPUTSTARTDLTYPE)( &ScTPValidationValue::RefInputStartPreHdl ) );
500 : 0 : pValidationDlg->SetRefInputDonePreHdl( (ScRefHandlerHelper::PCOMMONHDLTYPE)( &ScTPValidationValue::RefInputDonePreHdl ) );
501 : 0 : pValidationDlg->SetRefInputDonePostHdl( (ScRefHandlerHelper::PCOMMONHDLTYPE)( &ScTPValidationValue::RefInputDonePostHdl ) );
502 : :
503 : 0 : if ( maEdMax.IsVisible() ) { m_pRefEdit = &maEdMax; }
504 : 0 : else if ( maEdMin.IsVisible() ) { m_pRefEdit = &maEdMin; }
505 : :
506 : 0 : if( m_pRefEdit && !m_pRefEdit->HasFocus() ) m_pRefEdit->GrabFocus();
507 : :
508 : 0 : if( m_pRefEdit ) m_pRefEdit->SetRefDialog( pValidationDlg );
509 : 0 : m_btnRef.SetReferences( pValidationDlg, m_pRefEdit );
510 : : }
511 : 0 : }
512 : :
513 : 0 : void ScTPValidationValue::RemoveRefDlg()
514 : : {
515 : 0 : if( ScValidationDlg *pValidationDlg = GetValidationDlg() )
516 : 0 : if( pValidationDlg->RemoveRefDlg() )
517 : : {
518 : 0 : pValidationDlg->SetHandler( NULL );
519 : 0 : pValidationDlg->SetSetRefHdl( NULL );
520 : 0 : pValidationDlg->SetSetActHdl( NULL );
521 : 0 : pValidationDlg->SetRefInputStartPreHdl( NULL );
522 : 0 : pValidationDlg->SetRefInputDonePreHdl( NULL );
523 : 0 : pValidationDlg->SetRefInputDonePostHdl( NULL );
524 : :
525 : 0 : if( m_pRefEdit ) m_pRefEdit->SetRefDialog( NULL );
526 : 0 : m_pRefEdit = NULL;
527 : :
528 : 0 : m_btnRef.SetReferences( NULL, NULL );
529 : :
530 : : #if ! defined( WNT ) && !defined( _MSC_VER )
531 : 0 : TidyListBoxes();
532 : : #endif
533 : : }
534 : 0 : }
535 : :
536 : 0 : void ScTPValidationValue::TidyListBoxes()
537 : : {
538 : 0 : if ( Window *pWnd = GetChild( 0 ) )
539 : : {
540 : 0 : bool bFindLst = false;
541 : 0 : std::list<Window*> alstOrder;
542 : :
543 : 0 : do{
544 : 0 : if( pWnd->GetParent() == this )
545 : : {
546 : 0 : if ( !bFindLst )
547 : : {
548 : : try{
549 : 0 : if( dynamic_cast<ListBox*>(pWnd)||dynamic_cast<ListBox*>(pWnd->GetWindow(WINDOW_CLIENT) ) )
550 : 0 : bFindLst = true;
551 : : }
552 : 0 : catch( ... )
553 : : {
554 : 0 : if ( *(void**)pWnd == *(void**)&maLbValue )
555 : 0 : bFindLst = true;
556 : 0 : else if ( Window *pClient = pWnd->GetWindow( WINDOW_CLIENT ) )
557 : 0 : if ( *(void**)pClient == *(void**)&maLbValue )
558 : 0 : bFindLst = true;
559 : : }
560 : : }
561 : :
562 : 0 : if ( bFindLst )
563 : 0 : alstOrder.push_back( pWnd->GetWindow( WINDOW_CLIENT ) );
564 : : }
565 : 0 : }while( NULL != ( pWnd = pWnd->GetWindow( WINDOW_NEXT ) ) );
566 : :
567 : 0 : pWnd = GetChild(0);
568 : :
569 : 0 : while( std::find( alstOrder.begin(), alstOrder.end(), pWnd ) != alstOrder.end() && NULL != ( pWnd = pWnd->GetWindow( WINDOW_NEXT) ) ) ;
570 : :
571 : 0 : if ( pWnd )
572 : : {
573 : 0 : for ( std::list<Window*>::iterator i = alstOrder.begin(); i!=alstOrder.end(); ++i )
574 : : {
575 : 0 : Window *pParent = (*i)->GetParent();
576 : 0 : (*i)->SetParent( pWnd );
577 : 0 : (*i)->SetParent( pParent );
578 : : }
579 : 0 : }
580 : : }
581 : 0 : }
582 : :
583 : 0 : IMPL_LINK_NOARG(ScTPValidationValue, EditSetFocusHdl)
584 : : {
585 : 0 : sal_uInt16 nPos=maLbAllow.GetSelectEntryPos();
586 : :
587 : 0 : if ( nPos == SC_VALIDDLG_ALLOW_RANGE )
588 : : {
589 : 0 : SetupRefDlg();
590 : : }
591 : :
592 : 0 : return 0;
593 : : }
594 : :
595 : 0 : IMPL_LINK( ScTPValidationValue, KillFocusHdl, Window *, pWnd )
596 : : {
597 : 0 : if( pWnd == m_pRefEdit || pWnd == &m_btnRef )
598 : 0 : if( ScValidationDlg *pValidationDlg = GetValidationDlg() )
599 : 0 : if ( (pValidationDlg->IsActive() || pValidationDlg->IsChildFocus() ) && !pValidationDlg->IsRefInputting() )
600 : 0 : if( ( !m_pRefEdit || !m_pRefEdit->HasFocus()) && !m_btnRef.HasFocus() )
601 : : {
602 : 0 : RemoveRefDlg();
603 : : }
604 : :
605 : 0 : return 0;
606 : : }
607 : :
608 : : // ----------------------------------------------------------------------------
609 : :
610 : 0 : IMPL_LINK_NOARG(ScTPValidationValue, SelectHdl)
611 : : {
612 : 0 : sal_uInt16 nLbPos = maLbAllow.GetSelectEntryPos();
613 : 0 : bool bEnable = (nLbPos != SC_VALIDDLG_ALLOW_ANY);
614 : 0 : bool bRange = (nLbPos == SC_VALIDDLG_ALLOW_RANGE);
615 : 0 : bool bList = (nLbPos == SC_VALIDDLG_ALLOW_LIST);
616 : :
617 : 0 : maCbAllow.Enable( bEnable ); // Empty cell
618 : 0 : maFtValue.Enable( bEnable );
619 : 0 : maLbValue.Enable( bEnable );
620 : 0 : maFtMin.Enable( bEnable );
621 : 0 : maEdMin.Enable( bEnable );
622 : 0 : maEdList.Enable( bEnable );
623 : 0 : maFtMax.Enable( bEnable );
624 : 0 : maEdMax.Enable( bEnable );
625 : :
626 : 0 : bool bShowMax = false;
627 : 0 : if( bRange )
628 : 0 : maFtMin.SetText( maStrRange );
629 : 0 : else if( bList )
630 : 0 : maFtMin.SetText( maStrList );
631 : : else
632 : : {
633 : 0 : switch( maLbValue.GetSelectEntryPos() )
634 : : {
635 : : case SC_VALIDDLG_DATA_EQUAL:
636 : 0 : case SC_VALIDDLG_DATA_NOTEQUAL: maFtMin.SetText( maStrValue ); break;
637 : :
638 : : case SC_VALIDDLG_DATA_LESS:
639 : 0 : case SC_VALIDDLG_DATA_EQLESS: maFtMin.SetText( maStrMax ); break;
640 : :
641 : : case SC_VALIDDLG_DATA_VALIDRANGE:
642 : 0 : case SC_VALIDDLG_DATA_INVALIDRANGE: bShowMax = true; // fall through
643 : : case SC_VALIDDLG_DATA_GREATER:
644 : 0 : case SC_VALIDDLG_DATA_EQGREATER: maFtMin.SetText( maStrMin ); break;
645 : :
646 : : default:
647 : : OSL_FAIL( "ScTPValidationValue::SelectHdl - unknown condition mode" );
648 : : }
649 : : }
650 : :
651 : 0 : maCbShow.Show( bRange || bList );
652 : 0 : maCbSort.Show( bRange || bList );
653 : 0 : maFtValue.Show( !bRange && !bList );
654 : 0 : maLbValue.Show( !bRange && !bList );
655 : 0 : maEdMin.Show( !bList );
656 : 0 : maEdList.Show( bList );
657 : 0 : maFtMax.Show( bShowMax );
658 : 0 : maEdMax.Show( bShowMax );
659 : 0 : maFtHint.Show( bRange );
660 : 0 : m_btnRef.Show( bRange ); // cell range picker
661 : 0 : return 0;
662 : : }
663 : :
664 : 0 : IMPL_LINK_NOARG(ScTPValidationValue, CheckHdl)
665 : : {
666 : 0 : maCbSort.Enable( maCbShow.IsChecked() );
667 : 0 : return 0;
668 : : }
669 : :
670 : :
671 : : //========================================================================
672 : : //========================================================================
673 : : // Input Help Page
674 : :
675 : 0 : ScTPValidationHelp::ScTPValidationHelp( Window* pParent,
676 : : const SfxItemSet& rArgSet )
677 : :
678 : : : SfxTabPage ( pParent,
679 : : ScResId( TP_VALIDATION_INPUTHELP ),
680 : : rArgSet ),
681 : : aTsbHelp ( this, ScResId( TSB_HELP ) ),
682 : : aFlContent ( this, ScResId( FL_CONTENT ) ),
683 : : aFtTitle ( this, ScResId( FT_TITLE ) ),
684 : : aEdtTitle ( this, ScResId( EDT_TITLE ) ),
685 : : aFtInputHelp ( this, ScResId( FT_INPUTHELP ) ),
686 : : aEdInputHelp ( this, ScResId( EDT_INPUTHELP ) ),
687 : :
688 : 0 : mrArgSet ( rArgSet )
689 : : {
690 : 0 : Init();
691 : 0 : FreeResource();
692 : 0 : }
693 : :
694 : : // -----------------------------------------------------------------------
695 : :
696 : 0 : ScTPValidationHelp::~ScTPValidationHelp()
697 : : {
698 : 0 : }
699 : :
700 : : // -----------------------------------------------------------------------
701 : :
702 : 0 : void ScTPValidationHelp::Init()
703 : : {
704 : 0 : aTsbHelp.EnableTriState( false );
705 : 0 : }
706 : :
707 : : //------------------------------------------------------------------------
708 : :
709 : 0 : sal_uInt16* ScTPValidationHelp::GetRanges()
710 : : {
711 : 0 : return pValueRanges;
712 : : }
713 : :
714 : : // -----------------------------------------------------------------------
715 : :
716 : 0 : SfxTabPage* ScTPValidationHelp::Create( Window* pParent,
717 : : const SfxItemSet& rArgSet )
718 : : {
719 : 0 : return ( new ScTPValidationHelp( pParent, rArgSet ) );
720 : : }
721 : :
722 : : // -----------------------------------------------------------------------
723 : :
724 : 0 : void ScTPValidationHelp::Reset( const SfxItemSet& rArgSet )
725 : : {
726 : : const SfxPoolItem* pItem;
727 : :
728 : 0 : if ( rArgSet.GetItemState( FID_VALID_SHOWHELP, sal_True, &pItem ) == SFX_ITEM_SET )
729 : 0 : aTsbHelp.SetState( ((const SfxBoolItem*)pItem)->GetValue() ? STATE_CHECK : STATE_NOCHECK );
730 : : else
731 : 0 : aTsbHelp.SetState( STATE_NOCHECK );
732 : :
733 : 0 : if ( rArgSet.GetItemState( FID_VALID_HELPTITLE, sal_True, &pItem ) == SFX_ITEM_SET )
734 : 0 : aEdtTitle.SetText( ((const SfxStringItem*)pItem)->GetValue() );
735 : : else
736 : 0 : aEdtTitle.SetText( EMPTY_STRING );
737 : :
738 : 0 : if ( rArgSet.GetItemState( FID_VALID_HELPTEXT, sal_True, &pItem ) == SFX_ITEM_SET )
739 : 0 : aEdInputHelp.SetText( ((const SfxStringItem*)pItem)->GetValue() );
740 : : else
741 : 0 : aEdInputHelp.SetText( EMPTY_STRING );
742 : 0 : }
743 : :
744 : : // -----------------------------------------------------------------------
745 : :
746 : 0 : sal_Bool ScTPValidationHelp::FillItemSet( SfxItemSet& rArgSet )
747 : : {
748 : 0 : rArgSet.Put( SfxBoolItem( FID_VALID_SHOWHELP, aTsbHelp.GetState() == STATE_CHECK ) );
749 : 0 : rArgSet.Put( SfxStringItem( FID_VALID_HELPTITLE, aEdtTitle.GetText() ) );
750 : 0 : rArgSet.Put( SfxStringItem( FID_VALID_HELPTEXT, aEdInputHelp.GetText() ) );
751 : :
752 : 0 : return sal_True;
753 : : }
754 : :
755 : : //========================================================================
756 : : //========================================================================
757 : : // Error Alert Page
758 : :
759 : 0 : ScTPValidationError::ScTPValidationError( Window* pParent,
760 : : const SfxItemSet& rArgSet )
761 : :
762 : : : SfxTabPage ( pParent,
763 : : ScResId( TP_VALIDATION_ERROR ),
764 : : rArgSet ),
765 : : aTsbShow ( this, ScResId( TSB_SHOW ) ),
766 : : aFlContent ( this, ScResId( FL_CONTENT ) ),
767 : : aFtAction ( this, ScResId( FT_ACTION ) ),
768 : : aLbAction ( this, ScResId( LB_ACTION ) ),
769 : : aBtnSearch ( this, ScResId( BTN_SEARCH ) ),
770 : : aFtTitle ( this, ScResId( FT_TITLE ) ),
771 : : aEdtTitle ( this, ScResId( EDT_TITLE ) ),
772 : : aFtError ( this, ScResId( FT_ERROR ) ),
773 : : aEdError ( this, ScResId( EDT_ERROR ) ),
774 : :
775 : 0 : mrArgSet ( rArgSet )
776 : : {
777 : 0 : Init();
778 : 0 : FreeResource();
779 : 0 : }
780 : :
781 : : // -----------------------------------------------------------------------
782 : :
783 : 0 : ScTPValidationError::~ScTPValidationError()
784 : : {
785 : 0 : }
786 : :
787 : : // -----------------------------------------------------------------------
788 : :
789 : 0 : void ScTPValidationError::Init()
790 : : {
791 : 0 : aLbAction.SetSelectHdl( LINK( this, ScTPValidationError, SelectActionHdl ) );
792 : 0 : aBtnSearch.SetClickHdl( LINK( this, ScTPValidationError, ClickSearchHdl ) );
793 : :
794 : 0 : aLbAction.SelectEntryPos( 0 );
795 : 0 : aTsbShow.EnableTriState( false );
796 : :
797 : 0 : SelectActionHdl( NULL );
798 : 0 : }
799 : :
800 : : //------------------------------------------------------------------------
801 : :
802 : 0 : sal_uInt16* ScTPValidationError::GetRanges()
803 : : {
804 : 0 : return pValueRanges;
805 : : }
806 : :
807 : : // -----------------------------------------------------------------------
808 : :
809 : 0 : SfxTabPage* ScTPValidationError::Create( Window* pParent,
810 : : const SfxItemSet& rArgSet )
811 : : {
812 : 0 : return ( new ScTPValidationError( pParent, rArgSet ) );
813 : : }
814 : :
815 : : // -----------------------------------------------------------------------
816 : :
817 : 0 : void ScTPValidationError::Reset( const SfxItemSet& rArgSet )
818 : : {
819 : : const SfxPoolItem* pItem;
820 : :
821 : 0 : if ( rArgSet.GetItemState( FID_VALID_SHOWERR, sal_True, &pItem ) == SFX_ITEM_SET )
822 : 0 : aTsbShow.SetState( ((const SfxBoolItem*)pItem)->GetValue() ? STATE_CHECK : STATE_NOCHECK );
823 : : else
824 : 0 : aTsbShow.SetState( STATE_CHECK ); // check by default
825 : :
826 : 0 : if ( rArgSet.GetItemState( FID_VALID_ERRSTYLE, sal_True, &pItem ) == SFX_ITEM_SET )
827 : 0 : aLbAction.SelectEntryPos( ((const SfxAllEnumItem*)pItem)->GetValue() );
828 : : else
829 : 0 : aLbAction.SelectEntryPos( 0 );
830 : :
831 : 0 : if ( rArgSet.GetItemState( FID_VALID_ERRTITLE, sal_True, &pItem ) == SFX_ITEM_SET )
832 : 0 : aEdtTitle.SetText( ((const SfxStringItem*)pItem)->GetValue() );
833 : : else
834 : 0 : aEdtTitle.SetText( EMPTY_STRING );
835 : :
836 : 0 : if ( rArgSet.GetItemState( FID_VALID_ERRTEXT, sal_True, &pItem ) == SFX_ITEM_SET )
837 : 0 : aEdError.SetText( ((const SfxStringItem*)pItem)->GetValue() );
838 : : else
839 : 0 : aEdError.SetText( EMPTY_STRING );
840 : :
841 : 0 : SelectActionHdl( NULL );
842 : 0 : }
843 : :
844 : : // -----------------------------------------------------------------------
845 : :
846 : 0 : sal_Bool ScTPValidationError::FillItemSet( SfxItemSet& rArgSet )
847 : : {
848 : 0 : rArgSet.Put( SfxBoolItem( FID_VALID_SHOWERR, aTsbShow.GetState() == STATE_CHECK ) );
849 : 0 : rArgSet.Put( SfxAllEnumItem( FID_VALID_ERRSTYLE, aLbAction.GetSelectEntryPos() ) );
850 : 0 : rArgSet.Put( SfxStringItem( FID_VALID_ERRTITLE, aEdtTitle.GetText() ) );
851 : 0 : rArgSet.Put( SfxStringItem( FID_VALID_ERRTEXT, aEdError.GetText() ) );
852 : :
853 : 0 : return sal_True;
854 : : }
855 : :
856 : : // -----------------------------------------------------------------------
857 : :
858 : 0 : IMPL_LINK_NOARG(ScTPValidationError, SelectActionHdl)
859 : : {
860 : 0 : ScValidErrorStyle eStyle = (ScValidErrorStyle) aLbAction.GetSelectEntryPos();
861 : 0 : sal_Bool bMacro = ( eStyle == SC_VALERR_MACRO );
862 : :
863 : 0 : aBtnSearch.Enable( bMacro );
864 : 0 : aFtError.Enable( !bMacro );
865 : 0 : aEdError.Enable( !bMacro );
866 : :
867 : 0 : return( 0L );
868 : : }
869 : :
870 : : // -----------------------------------------------------------------------
871 : :
872 : 0 : IMPL_LINK_NOARG(ScTPValidationError, ClickSearchHdl)
873 : : {
874 : 0 : Window* pOld = Application::GetDefDialogParent();
875 : 0 : Application::SetDefDialogParent( this );
876 : :
877 : : // Use static SfxApplication method to bring up selector dialog for
878 : : // choosing a script
879 : 0 : ::rtl::OUString aScriptURL = SfxApplication::ChooseScript();
880 : :
881 : 0 : Application::SetDefDialogParent( pOld );
882 : :
883 : 0 : if ( aScriptURL != NULL && !aScriptURL.isEmpty() )
884 : : {
885 : 0 : aEdtTitle.SetText( aScriptURL );
886 : : }
887 : :
888 : 0 : return( 0L );
889 : : }
890 : :
891 : 0 : bool ScValidationDlg::EnterRefStatus()
892 : : {
893 : 0 : ScTabViewShell *pTabViewShell = GetTabViewShell();
894 : :
895 : 0 : if( !pTabViewShell ) return false;
896 : :
897 : 0 : sal_uInt16 nId = SLOTID;
898 : 0 : SfxViewFrame* pViewFrm = pTabViewShell->GetViewFrame();
899 : 0 : SfxChildWindow* pWnd = pViewFrm->GetChildWindow( nId );
900 : :
901 : 0 : if ( pWnd && pWnd->GetWindow()!= this ) pWnd = NULL;
902 : :
903 : 0 : SC_MOD()->SetRefDialog( nId, pWnd ? false : sal_True );
904 : :
905 : 0 : return true;
906 : : }
907 : :
908 : 0 : bool ScValidationDlg::LeaveRefStatus()
909 : : {
910 : 0 : ScTabViewShell *pTabViewShell = GetTabViewShell();
911 : :
912 : 0 : if( !pTabViewShell ) return false;
913 : :
914 : 0 : sal_uInt16 nId = SLOTID;
915 : 0 : SfxViewFrame* pViewFrm = pTabViewShell->GetViewFrame();
916 : 0 : if ( pViewFrm->GetChildWindow( nId ) )
917 : : {
918 : 0 : DoClose( nId );
919 : : }
920 : 0 : return true;
921 : : }
922 : :
923 : 0 : bool ScValidationDlg::SetupRefDlg()
924 : : {
925 : 0 : if ( m_bOwnRefHdlr ) return false;
926 : 0 : if( EnterRefMode() )
927 : : {
928 : 0 : SetModal( false );
929 : 0 : return m_bOwnRefHdlr = true && EnterRefStatus();
930 : : }
931 : :
932 : 0 : return false;
933 : : }
934 : :
935 : 0 : bool ScValidationDlg::RemoveRefDlg( sal_Bool bRestoreModal /* = sal_True */ )
936 : : {
937 : 0 : bool bVisLock = false;
938 : 0 : bool bFreeWindowLock = false;
939 : :
940 : 0 : ScTabViewShell *pTabVwSh = GetTabViewShell();
941 : :
942 : 0 : if( !pTabVwSh ) return false;
943 : :
944 : 0 : if ( SfxChildWindow* pWnd = pTabVwSh->GetViewFrame()->GetChildWindow( SID_VALIDITY_REFERENCE ) )
945 : : {
946 : 0 : bVisLock = static_cast<ScValidityRefChildWin*>(pWnd)->LockVisible( true );
947 : 0 : bFreeWindowLock = static_cast<ScValidityRefChildWin*>(pWnd)->LockFreeWindow( true );
948 : : }
949 : :
950 : 0 : if ( !m_bOwnRefHdlr ) return false;
951 : 0 : if( LeaveRefStatus() && LeaveRefMode() )
952 : : {
953 : 0 : m_bOwnRefHdlr = false;
954 : :
955 : 0 : if( bRestoreModal )
956 : 0 : SetModal( sal_True );
957 : : }
958 : :
959 : 0 : if ( SfxChildWindow* pWnd = pTabVwSh->GetViewFrame()->GetChildWindow( SID_VALIDITY_REFERENCE ) )
960 : : {
961 : 0 : static_cast<ScValidityRefChildWin*>(pWnd)->LockVisible( bVisLock );
962 : 0 : static_cast<ScValidityRefChildWin*>(pWnd)->LockFreeWindow( bFreeWindowLock );
963 : : }
964 : :
965 : 0 : return true;
966 : : }
967 : :
968 : 0 : void ScTPValidationValue::ScRefButtonEx::Click()
969 : : {
970 : 0 : if( ScTPValidationValue *pParent = dynamic_cast< ScTPValidationValue*>( GetParent() ) )
971 : 0 : pParent->OnClick( this );
972 : :
973 : 0 : formula::RefButton::Click();
974 : 0 : }
975 : :
976 : 0 : void ScTPValidationValue::OnClick( Button *pBtn )
977 : : {
978 : 0 : if( pBtn == &m_btnRef )
979 : 0 : SetupRefDlg();
980 : 0 : }
981 : :
982 : 0 : sal_Bool ScValidationDlg::IsChildFocus()
983 : : {
984 : 0 : if ( const Window *pWin = Application::GetFocusWindow() )
985 : 0 : while( NULL != ( pWin = pWin->GetParent() ) )
986 : 0 : if( pWin == this )
987 : 0 : return sal_True;
988 : :
989 : 0 : return false;
990 : : }
991 : :
992 : :
993 : 0 : bool ScValidationDlg::IsAlive()
994 : : {
995 : 0 : return SC_MOD()->IsAliveRefDlg( SLOTID, this );
996 : : }
997 : :
998 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|