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