summaryrefslogtreecommitdiff
path: root/sc/source/ui/dbgui/validate.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sc/source/ui/dbgui/validate.cxx')
-rw-r--r--sc/source/ui/dbgui/validate.cxx1021
1 files changed, 1021 insertions, 0 deletions
diff --git a/sc/source/ui/dbgui/validate.cxx b/sc/source/ui/dbgui/validate.cxx
new file mode 100644
index 000000000000..1ee02badefe1
--- /dev/null
+++ b/sc/source/ui/dbgui/validate.cxx
@@ -0,0 +1,1021 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sc.hxx"
+
+#ifdef SC_DLLIMPLEMENTATION
+#undef SC_DLLIMPLEMENTATION
+#endif
+
+#include <vcl/svapp.hxx>
+#include <svl/aeitem.hxx>
+#include <svl/stritem.hxx>
+#include <svl/eitem.hxx>
+#include <svl/intitem.hxx>
+#include <basic/sbmeth.hxx>
+#include <basic/sbstar.hxx>
+#include <basic/sbmod.hxx>
+#include <sfx2/app.hxx>
+
+#include "scresid.hxx"
+#include "sc.hrc" // -> Slot IDs
+
+#include "validat.hxx"
+#include "validate.hrc"
+#include "validate.hxx"
+#include "compiler.hxx"
+#include "formula/opcode.hxx" //CHINA001
+//<!--Added by PengYunQuan for Validity Cell Range Picker
+#include "tabvwsh.hxx"
+#include <sfx2/viewfrm.hxx>
+#include <sfx2/childwin.hxx>
+#include "reffact.hxx"
+//-->Added by PengYunQuan for Validity Cell Range Picker
+
+// ============================================================================
+
+static USHORT pValueRanges[] =
+{
+ FID_VALID_MODE, FID_VALID_ERRTEXT,
+ FID_VALID_LISTTYPE, FID_VALID_LISTTYPE,
+ 0
+};
+
+
+// ============================================================================
+
+//<!--Modified by PengYunQuan for Validity Cell Range Picker
+//ScValidationDlg::ScValidationDlg( Window* pParent, const SfxItemSet* pArgSet ) :
+// SfxTabDialog( pParent, ScResId( TAB_DLG_VALIDATION ), pArgSet )
+ScValidationDlg::ScValidationDlg( Window* pParent,
+ const SfxItemSet* pArgSet,
+ ScTabViewShell *pTabViewSh,
+ SfxBindings *pB /*= NULL*/
+ ) :
+ ScValidationDlgBase( pParent ? pParent : SFX_APP()->GetTopWindow(), TAB_DLG_VALIDATION, pArgSet, pB ),
+ m_bOwnRefHdlr( false ),
+ m_pTabVwSh( pTabViewSh ),
+ m_bRefInputting( false )
+//-->Modified by PengYunQuan for Validity Cell Range Picker
+{
+ AddTabPage( TP_VALIDATION_VALUES, ScTPValidationValue::Create, 0 );
+ AddTabPage( TP_VALIDATION_INPUTHELP, ScTPValidationHelp::Create, 0 );
+ AddTabPage( TP_VALIDATION_ERROR, ScTPValidationError::Create, 0 );
+ FreeResource();
+}
+
+//<!--Added by PengYunQuan for Validity Cell Range Picker
+void ScTPValidationValue::SetReferenceHdl( const ScRange&rRange , ScDocument* pDoc )
+{
+ if ( rRange.aStart != rRange.aEnd )
+ if ( ScValidationDlg *pValidationDlg = GetValidationDlg() )
+ if( m_pRefEdit )
+ pValidationDlg/*->GetRefHandler()*/->RefInputStart( m_pRefEdit );
+
+ if ( m_pRefEdit )
+ {
+ String aStr;
+ rRange.Format( aStr, SCR_ABS_3D, pDoc );
+ m_pRefEdit->SetRefString( aStr );
+ //m_pRefEdit->SetRefString( rRange.aStart != rRange.aEnd ? aStr : String::CreateFromAscii("=").Append( aStr ) );
+ }
+}
+
+void ScTPValidationValue:: SetActiveHdl()
+{
+ if ( m_pRefEdit ) m_pRefEdit->GrabFocus();
+
+ if ( ScValidationDlg *pValidationDlg = GetValidationDlg() )
+ if( m_pRefEdit )
+ {
+ pValidationDlg/*->GetRefHandler()*/->RefInputDone();
+ }
+}
+
+void ScTPValidationValue::RefInputStartPreHdl( ScRefEdit* pEdit, ScRefButton* pButton )
+{
+ if ( ScValidationDlg *pValidationDlg = GetValidationDlg() )
+ {
+ if( pEdit == m_pRefEdit )
+ {
+ if( Window *pPreWnd = pEdit==&maEdMax?&maFtMax:(pEdit==&maEdMin?&maFtMin:NULL) )
+ {
+ pPreWnd->SetParent( pValidationDlg );
+ pPreWnd->Hide();
+ }
+
+ m_pRefEdit->SetParent( pValidationDlg );
+ }
+
+ if( pButton == &m_btnRef )m_btnRef.SetParent( pValidationDlg );
+ }
+}
+
+void ScTPValidationValue::RefInputDonePreHdl()
+{
+
+ if( m_pRefEdit && m_pRefEdit->GetParent()!= this )
+ {
+ if( Window *pPreWnd = m_pRefEdit==&maEdMax?&maFtMax:(m_pRefEdit==&maEdMin?&maFtMin:NULL) )
+ {
+ pPreWnd->SetParent( this );
+ pPreWnd->Show();
+ }
+
+ m_pRefEdit->SetParent( this );
+
+ 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
+// aExample1.SetParent( m_pRefEdit ); // the aExample1's child order will affect acc key
+ }
+
+ if( m_btnRef.GetParent()!=this ) m_btnRef.SetParent( this );
+// if( aExample1.GetParent()!=this ) aExample1.SetParent( this );
+}
+
+void ScTPValidationValue::RefInputDonePostHdl()
+{
+
+
+ if( m_pRefEdit && !m_pRefEdit->HasFocus() )
+ m_pRefEdit->GrabFocus();
+
+}
+
+
+BOOL ScValidationDlg::Close()
+{
+ if( m_bOwnRefHdlr )
+ if( SfxTabPage* pPage = GetTabPage( TP_VALIDATION_VALUES ) )
+ static_cast<ScTPValidationValue*>(pPage)->RemoveRefDlg();
+
+ return ScValidationDlgBase::Close();
+}
+//-->Added by PengYunQuan for Validity Cell Range Picker
+
+ScValidationDlg::~ScValidationDlg()
+{
+ //<!--Added by PengYunQuan for Validity Cell Range Picker
+ if( m_bOwnRefHdlr )
+ RemoveRefDlg( FALSE );
+ //-->Added by PengYunQuan for Validity Cell Range Picker
+}
+
+
+// ============================================================================
+
+namespace {
+
+/** Converts the passed ScValidationMode to the position in the list box. */
+USHORT lclGetPosFromValMode( ScValidationMode eValMode )
+{
+ USHORT nLbPos = SC_VALIDDLG_ALLOW_ANY;
+ switch( eValMode )
+ {
+ case SC_VALID_ANY: nLbPos = SC_VALIDDLG_ALLOW_ANY; break;
+ case SC_VALID_WHOLE: nLbPos = SC_VALIDDLG_ALLOW_WHOLE; break;
+ case SC_VALID_DECIMAL: nLbPos = SC_VALIDDLG_ALLOW_DECIMAL; break;
+ case SC_VALID_DATE: nLbPos = SC_VALIDDLG_ALLOW_DATE; break;
+ case SC_VALID_TIME: nLbPos = SC_VALIDDLG_ALLOW_TIME; break;
+ case SC_VALID_TEXTLEN: nLbPos = SC_VALIDDLG_ALLOW_TEXTLEN; break;
+ case SC_VALID_LIST: nLbPos = SC_VALIDDLG_ALLOW_RANGE; break;
+ case SC_VALID_CUSTOM: nLbPos = SC_VALIDDLG_ALLOW_ANY; break; // not supported
+ default: DBG_ERRORFILE( "lclGetPosFromValMode - unknown validity mode" );
+ }
+ return nLbPos;
+}
+
+/** Converts the passed list box position to an ScValidationMode. */
+ScValidationMode lclGetValModeFromPos( USHORT nLbPos )
+{
+ ScValidationMode eValMode = SC_VALID_ANY;
+ switch( nLbPos )
+ {
+ case SC_VALIDDLG_ALLOW_ANY: eValMode = SC_VALID_ANY; break;
+ case SC_VALIDDLG_ALLOW_WHOLE: eValMode = SC_VALID_WHOLE; break;
+ case SC_VALIDDLG_ALLOW_DECIMAL: eValMode = SC_VALID_DECIMAL; break;
+ case SC_VALIDDLG_ALLOW_DATE: eValMode = SC_VALID_DATE; break;
+ case SC_VALIDDLG_ALLOW_TIME: eValMode = SC_VALID_TIME; break;
+ case SC_VALIDDLG_ALLOW_RANGE: eValMode = SC_VALID_LIST; break;
+ case SC_VALIDDLG_ALLOW_LIST: eValMode = SC_VALID_LIST; break;
+ case SC_VALIDDLG_ALLOW_TEXTLEN: eValMode = SC_VALID_TEXTLEN; break;
+ default: DBG_ERRORFILE( "lclGetValModeFromPos - invalid list box position" );
+ }
+ return eValMode;
+}
+
+/** Converts the passed ScConditionMode to the position in the list box. */
+USHORT lclGetPosFromCondMode( ScConditionMode eCondMode )
+{
+ USHORT nLbPos = SC_VALIDDLG_DATA_EQUAL;
+ switch( eCondMode )
+ {
+ case SC_COND_NONE: // #111771# may occur in old XML files after Excel import
+ case SC_COND_EQUAL: nLbPos = SC_VALIDDLG_DATA_EQUAL; break;
+ case SC_COND_LESS: nLbPos = SC_VALIDDLG_DATA_LESS; break;
+ case SC_COND_GREATER: nLbPos = SC_VALIDDLG_DATA_GREATER; break;
+ case SC_COND_EQLESS: nLbPos = SC_VALIDDLG_DATA_EQLESS; break;
+ case SC_COND_EQGREATER: nLbPos = SC_VALIDDLG_DATA_EQGREATER; break;
+ case SC_COND_NOTEQUAL: nLbPos = SC_VALIDDLG_DATA_NOTEQUAL; break;
+ case SC_COND_BETWEEN: nLbPos = SC_VALIDDLG_DATA_BETWEEN; break;
+ case SC_COND_NOTBETWEEN: nLbPos = SC_VALIDDLG_DATA_NOTBETWEEN; break;
+ default: DBG_ERRORFILE( "lclGetPosFromCondMode - unknown condition mode" );
+ }
+ return nLbPos;
+}
+
+/** Converts the passed list box position to an ScConditionMode. */
+ScConditionMode lclGetCondModeFromPos( USHORT nLbPos )
+{
+ ScConditionMode eCondMode = SC_COND_EQUAL;
+ switch( nLbPos )
+ {
+ case SC_VALIDDLG_DATA_EQUAL: eCondMode = SC_COND_EQUAL; break;
+ case SC_VALIDDLG_DATA_LESS: eCondMode = SC_COND_LESS; break;
+ case SC_VALIDDLG_DATA_GREATER: eCondMode = SC_COND_GREATER; break;
+ case SC_VALIDDLG_DATA_EQLESS: eCondMode = SC_COND_EQLESS; break;
+ case SC_VALIDDLG_DATA_EQGREATER: eCondMode = SC_COND_EQGREATER; break;
+ case SC_VALIDDLG_DATA_NOTEQUAL: eCondMode = SC_COND_NOTEQUAL; break;
+ case SC_VALIDDLG_DATA_BETWEEN: eCondMode = SC_COND_BETWEEN; break;
+ case SC_VALIDDLG_DATA_NOTBETWEEN: eCondMode = SC_COND_NOTBETWEEN; break;
+ default: DBG_ERRORFILE( "lclGetCondModeFromPos - invalid list box position" );
+ }
+ return eCondMode;
+}
+
+/** Converts line feed separated string to a formula with strings separated by semicolons.
+ @descr Keeps all empty strings.
+ Example: abc\ndef\n\nghi -> "abc";"def";"";"ghi".
+ @param rFmlaStr (out-param) The converted formula string. */
+void lclGetFormulaFromStringList( String& rFmlaStr, const String& rStringList, sal_Unicode cFmlaSep )
+{
+ rFmlaStr.Erase();
+ xub_StrLen nTokenCnt = rStringList.GetTokenCount( '\n' );
+ for( xub_StrLen nToken = 0, nStringIx = 0; nToken < nTokenCnt; ++nToken )
+ {
+ String aToken( rStringList.GetToken( 0, '\n', nStringIx ) );
+ ScGlobal::AddQuotes( aToken, '"' );
+ ScGlobal::AddToken( rFmlaStr, aToken, cFmlaSep );
+ }
+ if( !rFmlaStr.Len() )
+ rFmlaStr.AssignAscii( "\"\"" );
+}
+
+
+/** Converts formula with strings separated by semicolons to line feed separated string.
+ @descr Keeps all empty strings. Ignores all empty tokens (multiple semicolons).
+ Example: "abc";;;"def";"";"ghi" -> abc\ndef\n\nghi.
+ @param rStringList (out-param) The converted line feed separated string list.
+ @return true = Conversion successful. */
+bool lclGetStringListFromFormula( String& rStringList, const String& rFmlaStr, sal_Unicode cFmlaSep )
+{
+ String aQuotes( RTL_CONSTASCII_USTRINGPARAM( "\"\"" ) );
+ xub_StrLen nTokenCnt = rFmlaStr.GetQuotedTokenCount( aQuotes, cFmlaSep );
+
+ rStringList.Erase();
+ bool bIsStringList = (nTokenCnt > 0);
+ bool bTokenAdded = false;
+
+ for( xub_StrLen nToken = 0, nStringIx = 0; bIsStringList && (nToken < nTokenCnt); ++nToken )
+ {
+ String aToken( rFmlaStr.GetQuotedToken( 0, aQuotes, cFmlaSep, nStringIx ) );
+ aToken.EraseLeadingAndTrailingChars();
+ if( aToken.Len() ) // ignore empty tokens, i.e. "a";;"b"
+ {
+ bIsStringList = ScGlobal::IsQuoted( aToken, '"' );
+ if( bIsStringList )
+ {
+ ScGlobal::EraseQuotes( aToken, '"' );
+ ScGlobal::AddToken( rStringList, aToken, '\n', 1, bTokenAdded );
+ bTokenAdded = true;
+ }
+ }
+ }
+
+ return bIsStringList;
+}
+
+} // namespace
+
+// ----------------------------------------------------------------------------
+
+ScTPValidationValue::ScTPValidationValue( Window* pParent, const SfxItemSet& rArgSet ) :
+ SfxTabPage( pParent, ScResId( TP_VALIDATION_VALUES ), rArgSet ),
+ maFtAllow ( this, ScResId( FT_ALLOW ) ),
+ maLbAllow ( this, ScResId( LB_ALLOW ) ),
+ maCbAllow ( this, ScResId( TSB_ALLOW_BLANKS ) ),
+ maCbShow ( this, ScResId( CB_SHOWLIST ) ),
+ maCbSort ( this, ScResId( CB_SORTLIST ) ),
+ maFtValue ( this, ScResId( FT_VALUE ) ),
+ maLbValue ( this, ScResId( LB_VALUE ) ),
+ maFtMin ( this, ScResId( FT_MIN ) ),
+ maEdMin ( this, ScResId( EDT_MIN ) ),
+ maEdList ( this, ScResId( EDT_LIST ) ),
+ maFtMax ( this, ScResId( FT_MAX ) ),
+ maEdMax ( this, ScResId( EDT_MAX ) ),
+ maFtHint ( this, ScResId( FT_SOURCEHINT ) ),
+ maStrMin ( ScResId( SCSTR_VALID_MINIMUM ) ),
+ maStrMax ( ScResId( SCSTR_VALID_MAXIMUM ) ),
+ maStrValue( ScResId( SCSTR_VALID_VALUE ) ),
+ maStrRange( ScResId( SCSTR_VALID_RANGE ) ),
+ maStrList ( ScResId( SCSTR_VALID_LIST ) ),
+//<!--Added by PengYunQuan for Validity Cell Range Picker
+ m_btnRef( this, ScResId( RB_VALIDITY_REF ) )
+//-->Added by PengYunQuan for Validity Cell Range Picker
+{
+ Init();
+ FreeResource();
+
+ // list separator in formulas
+ //CHINA001 const String& rListSep = ScCompiler::pSymbolTableNative[ ocSep ];
+ String aListSep = ::GetScCompilerNativeSymbol( ocSep ); //CHINA001
+ DBG_ASSERT( aListSep.Len() == 1, "ScTPValidationValue::ScTPValidationValue - list separator error" );
+ mcFmlaSep = aListSep.Len() ? aListSep.GetChar( 0 ) : ';';
+ //<!--Added by PengYunQuan for Validity Cell Range Picker
+ m_btnRef.Hide();
+ //-->Added by PengYunQuan for Validity Cell Range Picker
+}
+
+ScTPValidationValue::~ScTPValidationValue()
+{
+}
+
+void ScTPValidationValue::Init()
+{
+ maLbAllow.SetSelectHdl( LINK( this, ScTPValidationValue, SelectHdl ) );
+ maLbValue.SetSelectHdl( LINK( this, ScTPValidationValue, SelectHdl ) );
+ maCbShow.SetClickHdl( LINK( this, ScTPValidationValue, CheckHdl ) );
+ //<!--Added by PengYunQuan for Validity Cell Range Picker
+ maEdMin.SetGetFocusHdl( LINK( this, ScTPValidationValue, EditSetFocusHdl ) );
+ maEdMin.SetLoseFocusHdl( LINK( this, ScTPValidationValue, KillFocusHdl ) );
+ maEdMax.SetGetFocusHdl( LINK( this, ScTPValidationValue, EditSetFocusHdl ) );
+ m_btnRef.SetLoseFocusHdl( LINK( this, ScTPValidationValue, KillFocusHdl ) );
+ maEdMax.SetLoseFocusHdl( LINK( this, ScTPValidationValue, KillFocusHdl ) );
+ //-->Added by PengYunQuan for Validity Cell Range Picker
+
+ maLbAllow.SelectEntryPos( SC_VALIDDLG_ALLOW_ANY );
+ maLbValue.SelectEntryPos( SC_VALIDDLG_DATA_EQUAL );
+
+ SelectHdl( NULL );
+ CheckHdl( NULL );
+}
+
+SfxTabPage* ScTPValidationValue::Create( Window* pParent, const SfxItemSet& rArgSet )
+{
+ return( new ScTPValidationValue( pParent, rArgSet ) );
+}
+
+USHORT* ScTPValidationValue::GetRanges()
+{
+ return pValueRanges;
+}
+
+void ScTPValidationValue::Reset( const SfxItemSet& rArgSet )
+{
+ const SfxPoolItem* pItem;
+
+ USHORT nLbPos = SC_VALIDDLG_ALLOW_ANY;
+ if( rArgSet.GetItemState( FID_VALID_MODE, TRUE, &pItem ) == SFX_ITEM_SET )
+ nLbPos = lclGetPosFromValMode( static_cast< ScValidationMode >(
+ static_cast< const SfxAllEnumItem* >( pItem )->GetValue() ) );
+ maLbAllow.SelectEntryPos( nLbPos );
+
+ nLbPos = SC_VALIDDLG_DATA_EQUAL;
+ if( rArgSet.GetItemState( FID_VALID_CONDMODE, TRUE, &pItem ) == SFX_ITEM_SET )
+ nLbPos = lclGetPosFromCondMode( static_cast< ScConditionMode >(
+ static_cast< const SfxAllEnumItem* >( pItem )->GetValue() ) );
+ maLbValue.SelectEntryPos( nLbPos );
+
+ // *** check boxes ***
+ BOOL bCheck = TRUE;
+ if( rArgSet.GetItemState( FID_VALID_BLANK, TRUE, &pItem ) == SFX_ITEM_SET )
+ bCheck = static_cast< const SfxBoolItem* >( pItem )->GetValue();
+ maCbAllow.Check( bCheck );
+
+ sal_Int32 nListType = ValidListType::UNSORTED;
+ if( rArgSet.GetItemState( FID_VALID_LISTTYPE, TRUE, &pItem ) == SFX_ITEM_SET )
+ nListType = static_cast< const SfxInt16Item* >( pItem )->GetValue();
+ maCbShow.Check( nListType != ValidListType::INVISIBLE );
+ maCbSort.Check( nListType == ValidListType::SORTEDASCENDING );
+
+ // *** formulas ***
+ String aFmlaStr;
+ if ( rArgSet.GetItemState( FID_VALID_VALUE1, TRUE, &pItem ) == SFX_ITEM_SET )
+ aFmlaStr = static_cast< const SfxStringItem* >( pItem )->GetValue();
+ SetFirstFormula( aFmlaStr );
+
+ aFmlaStr.Erase();
+ if ( rArgSet.GetItemState( FID_VALID_VALUE2, TRUE, &pItem ) == SFX_ITEM_SET )
+ aFmlaStr = static_cast< const SfxStringItem* >( pItem )->GetValue();
+ SetSecondFormula( aFmlaStr );
+
+ SelectHdl( NULL );
+ CheckHdl( NULL );
+}
+
+BOOL ScTPValidationValue::FillItemSet( SfxItemSet& rArgSet )
+{
+ sal_Int16 nListType = maCbShow.IsChecked() ?
+ (maCbSort.IsChecked() ? ValidListType::SORTEDASCENDING : ValidListType::UNSORTED) :
+ ValidListType::INVISIBLE;
+
+ rArgSet.Put( SfxAllEnumItem( FID_VALID_MODE, sal::static_int_cast<USHORT>(
+ lclGetValModeFromPos( maLbAllow.GetSelectEntryPos() ) ) ) );
+ rArgSet.Put( SfxAllEnumItem( FID_VALID_CONDMODE, sal::static_int_cast<USHORT>(
+ lclGetCondModeFromPos( maLbValue.GetSelectEntryPos() ) ) ) );
+ rArgSet.Put( SfxStringItem( FID_VALID_VALUE1, GetFirstFormula() ) );
+ rArgSet.Put( SfxStringItem( FID_VALID_VALUE2, GetSecondFormula() ) );
+ rArgSet.Put( SfxBoolItem( FID_VALID_BLANK, maCbAllow.IsChecked() ) );
+ rArgSet.Put( SfxInt16Item( FID_VALID_LISTTYPE, nListType ) );
+ return TRUE;
+}
+
+String ScTPValidationValue::GetFirstFormula() const
+{
+ String aFmlaStr;
+ if( maLbAllow.GetSelectEntryPos() == SC_VALIDDLG_ALLOW_LIST )
+ lclGetFormulaFromStringList( aFmlaStr, maEdList.GetText(), mcFmlaSep );
+ else
+ aFmlaStr = maEdMin.GetText();
+ return aFmlaStr;
+}
+
+String ScTPValidationValue::GetSecondFormula() const
+{
+ return maEdMax.GetText();
+}
+
+void ScTPValidationValue::SetFirstFormula( const String& rFmlaStr )
+{
+ // try if formula is a string list, validation mode must already be set
+ String aStringList;
+ if( (maLbAllow.GetSelectEntryPos() == SC_VALIDDLG_ALLOW_RANGE) &&
+ lclGetStringListFromFormula( aStringList, rFmlaStr, mcFmlaSep ) )
+ {
+ maEdList.SetText( aStringList );
+ maEdMin.SetText( EMPTY_STRING );
+ // change validation mode to string list
+ maLbAllow.SelectEntryPos( SC_VALIDDLG_ALLOW_LIST );
+ }
+ else
+ {
+ maEdMin.SetText( rFmlaStr );
+ maEdList.SetText( EMPTY_STRING );
+ }
+}
+
+void ScTPValidationValue::SetSecondFormula( const String& rFmlaStr )
+{
+ maEdMax.SetText( rFmlaStr );
+}
+
+//<!--Added by PengYunQuan for Validity Cell Range Picker
+ScValidationDlg * ScTPValidationValue::GetValidationDlg()
+{
+ if( Window *pParent = GetParent() )
+ do{
+ if ( dynamic_cast<ScValidationDlg*>( pParent ) )
+ return static_cast< ScValidationDlg * >( pParent );
+ }while ( NULL != ( pParent = pParent->GetParent() ) );
+ return NULL;
+}
+void ScTPValidationValue::SetupRefDlg()
+{
+ if( ScValidationDlg *pValidationDlg = GetValidationDlg() )
+ if( pValidationDlg->SetupRefDlg() )
+ {
+ pValidationDlg->SetHandler( this );
+ pValidationDlg->SetSetRefHdl( (ScRefHandlerHelper::PFUNCSETREFHDLTYPE)( &ScTPValidationValue::SetReferenceHdl ) );
+ pValidationDlg->SetSetActHdl( (ScRefHandlerHelper::PCOMMONHDLTYPE)( &ScTPValidationValue::SetActiveHdl ) );
+ pValidationDlg->SetRefInputStartPreHdl( (ScRefHandlerHelper::PINPUTSTARTDLTYPE)( &ScTPValidationValue::RefInputStartPreHdl ) );
+ pValidationDlg->SetRefInputDonePreHdl( (ScRefHandlerHelper::PCOMMONHDLTYPE)( &ScTPValidationValue::RefInputDonePreHdl ) );
+ pValidationDlg->SetRefInputDonePostHdl( (ScRefHandlerHelper::PCOMMONHDLTYPE)( &ScTPValidationValue::RefInputDonePostHdl ) );
+
+ if ( maEdMax.IsVisible() ) { m_pRefEdit = &maEdMax; }
+ else if ( maEdMin.IsVisible() ) { m_pRefEdit = &maEdMin; }
+
+ if( m_pRefEdit && !m_pRefEdit->HasFocus() ) m_pRefEdit->GrabFocus();
+
+ if( m_pRefEdit ) m_pRefEdit->SetRefDialog( pValidationDlg );
+ m_btnRef.SetReferences( pValidationDlg, m_pRefEdit );
+ }
+}
+
+void ScTPValidationValue::RemoveRefDlg()
+{
+ if( ScValidationDlg *pValidationDlg = GetValidationDlg() )
+ if( pValidationDlg->RemoveRefDlg() )
+ {
+ pValidationDlg->SetHandler( NULL );
+ pValidationDlg->SetSetRefHdl( NULL );
+ pValidationDlg->SetSetActHdl( NULL );
+ pValidationDlg->SetRefInputStartPreHdl( NULL );
+ pValidationDlg->SetRefInputDonePreHdl( NULL );
+ pValidationDlg->SetRefInputDonePostHdl( NULL );
+
+ if( m_pRefEdit ) m_pRefEdit->SetRefDialog( NULL );
+ m_pRefEdit = NULL;
+
+ m_btnRef.SetReferences( NULL, NULL );
+
+#if ! defined( WNT ) && !defined( _MSC_VER )
+ TidyListBoxes();
+#endif
+ }
+}
+
+void ScTPValidationValue::TidyListBoxes()
+{
+ if ( Window *pWnd = GetChild( 0 ) )
+ {
+ bool bFindLst = false;
+ std::list<Window*> alstOrder;
+
+ do{
+ if( pWnd->GetParent() == this )
+ {
+ if ( !bFindLst )
+ {
+ try{
+ if( dynamic_cast<ListBox*>(pWnd)||dynamic_cast<ListBox*>(pWnd->GetWindow(WINDOW_CLIENT) ) )
+ bFindLst = true;
+ }
+ catch( ... )
+ {
+ if ( *(void**)pWnd == *(void**)&maLbValue )
+ bFindLst = true;
+ else if ( Window *pClient = pWnd->GetWindow( WINDOW_CLIENT ) )
+ if ( *(void**)pClient == *(void**)&maLbValue )
+ bFindLst = true;
+ }
+ }
+
+ if ( bFindLst )
+ alstOrder.push_back( pWnd->GetWindow( WINDOW_CLIENT ) );
+ }
+ }while( NULL != ( pWnd = pWnd->GetWindow( WINDOW_NEXT ) ) );
+
+ pWnd = GetChild(0);
+
+ while( std::find( alstOrder.begin(), alstOrder.end(), pWnd ) != alstOrder.end() && NULL != ( pWnd = pWnd->GetWindow( WINDOW_NEXT) ) ) ;
+
+ if ( pWnd )
+ {
+ for ( std::list<Window*>::iterator i = alstOrder.begin(); i!=alstOrder.end(); i++ )
+ {
+ Window *pParent = (*i)->GetParent();
+ (*i)->SetParent( pWnd );
+ (*i)->SetParent( pParent );
+ }
+ }
+ }
+}
+
+IMPL_LINK( ScTPValidationValue, EditSetFocusHdl, Edit *, /*pEdit*/ )
+{
+ USHORT nPos=maLbAllow.GetSelectEntryPos();
+
+ if ( nPos == SC_VALIDDLG_ALLOW_RANGE )
+ {
+ SetupRefDlg();
+ }
+
+ return 0;
+}
+
+IMPL_LINK( ScTPValidationValue, KillFocusHdl, Window *, pWnd )
+{
+ if( pWnd == m_pRefEdit || pWnd == &m_btnRef )
+ if( ScValidationDlg *pValidationDlg = GetValidationDlg() )
+ if ( (pValidationDlg->IsActive() || pValidationDlg->IsChildFocus() ) && !pValidationDlg->IsRefInputting() )
+ if( ( !m_pRefEdit || !m_pRefEdit->HasFocus()) && !m_btnRef.HasFocus() )
+ {
+ RemoveRefDlg();
+ }
+
+ return 0;
+}
+//-->Added by PengYunQuan for Validity Cell Range Picker
+
+// ----------------------------------------------------------------------------
+
+IMPL_LINK( ScTPValidationValue, SelectHdl, ListBox*, EMPTYARG )
+{
+ USHORT nLbPos = maLbAllow.GetSelectEntryPos();
+ bool bEnable = (nLbPos != SC_VALIDDLG_ALLOW_ANY);
+ bool bRange = (nLbPos == SC_VALIDDLG_ALLOW_RANGE);
+ bool bList = (nLbPos == SC_VALIDDLG_ALLOW_LIST);
+
+ maCbAllow.Enable( bEnable ); // Leerzellen
+ maFtValue.Enable( bEnable );
+ maLbValue.Enable( bEnable );
+ maFtMin.Enable( bEnable );
+ maEdMin.Enable( bEnable );
+ maEdList.Enable( bEnable );
+ maFtMax.Enable( bEnable );
+ maEdMax.Enable( bEnable );
+
+ bool bShowMax = false;
+ if( bRange )
+ maFtMin.SetText( maStrRange );
+ else if( bList )
+ maFtMin.SetText( maStrList );
+ else
+ {
+ switch( maLbValue.GetSelectEntryPos() )
+ {
+ case SC_VALIDDLG_DATA_EQUAL:
+ case SC_VALIDDLG_DATA_NOTEQUAL: maFtMin.SetText( maStrValue ); break;
+
+ case SC_VALIDDLG_DATA_LESS:
+ case SC_VALIDDLG_DATA_EQLESS: maFtMin.SetText( maStrMax ); break;
+
+ case SC_VALIDDLG_DATA_BETWEEN:
+ case SC_VALIDDLG_DATA_NOTBETWEEN: bShowMax = true; // fall through
+ case SC_VALIDDLG_DATA_GREATER:
+ case SC_VALIDDLG_DATA_EQGREATER: maFtMin.SetText( maStrMin ); break;
+
+ default:
+ DBG_ERRORFILE( "ScTPValidationValue::SelectHdl - unknown condition mode" );
+ }
+ }
+
+ maCbShow.Show( bRange || bList );
+ maCbSort.Show( bRange || bList );
+ maFtValue.Show( !bRange && !bList );
+ maLbValue.Show( !bRange && !bList );
+ maEdMin.Show( !bList );
+ maEdList.Show( bList );
+ maFtMax.Show( bShowMax );
+ maEdMax.Show( bShowMax );
+ maFtHint.Show( bRange );
+ //<!--Added by PengYunQuan for Validity Cell Range Picker
+ m_btnRef.Show( bRange );
+ //-->Added by PengYunQuan for Validity Cell Range Picker
+ return 0;
+}
+
+IMPL_LINK( ScTPValidationValue, CheckHdl, CheckBox*, EMPTYARG )
+{
+ maCbSort.Enable( maCbShow.IsChecked() );
+ return 0;
+}
+
+
+//========================================================================
+//========================================================================
+// Input Help Page
+
+ScTPValidationHelp::ScTPValidationHelp( Window* pParent,
+ const SfxItemSet& rArgSet )
+
+ : SfxTabPage ( pParent,
+ ScResId( TP_VALIDATION_INPUTHELP ),
+ rArgSet ),
+ aTsbHelp ( this, ScResId( TSB_HELP ) ),
+ aFlContent ( this, ScResId( FL_CONTENT ) ),
+ aFtTitle ( this, ScResId( FT_TITLE ) ),
+ aEdtTitle ( this, ScResId( EDT_TITLE ) ),
+ aFtInputHelp ( this, ScResId( FT_INPUTHELP ) ),
+ aEdInputHelp ( this, ScResId( EDT_INPUTHELP ) ),
+
+ mrArgSet ( rArgSet )
+{
+ Init();
+ FreeResource();
+}
+
+// -----------------------------------------------------------------------
+
+__EXPORT ScTPValidationHelp::~ScTPValidationHelp()
+{
+}
+
+// -----------------------------------------------------------------------
+
+void ScTPValidationHelp::Init()
+{
+ //aLb.SetSelectHdl( LINK( this, ScTPValidationHelp, SelectHdl ) );
+
+ aTsbHelp.EnableTriState( FALSE );
+}
+
+//------------------------------------------------------------------------
+
+USHORT* __EXPORT ScTPValidationHelp::GetRanges()
+{
+ return pValueRanges;
+}
+
+// -----------------------------------------------------------------------
+
+SfxTabPage* __EXPORT ScTPValidationHelp::Create( Window* pParent,
+ const SfxItemSet& rArgSet )
+{
+ return ( new ScTPValidationHelp( pParent, rArgSet ) );
+}
+
+// -----------------------------------------------------------------------
+
+void __EXPORT ScTPValidationHelp::Reset( const SfxItemSet& rArgSet )
+{
+ const SfxPoolItem* pItem;
+
+ if ( rArgSet.GetItemState( FID_VALID_SHOWHELP, TRUE, &pItem ) == SFX_ITEM_SET )
+ aTsbHelp.SetState( ((const SfxBoolItem*)pItem)->GetValue() ? STATE_CHECK : STATE_NOCHECK );
+ else
+ aTsbHelp.SetState( STATE_NOCHECK );
+
+ if ( rArgSet.GetItemState( FID_VALID_HELPTITLE, TRUE, &pItem ) == SFX_ITEM_SET )
+ aEdtTitle.SetText( ((const SfxStringItem*)pItem)->GetValue() );
+ else
+ aEdtTitle.SetText( EMPTY_STRING );
+
+ if ( rArgSet.GetItemState( FID_VALID_HELPTEXT, TRUE, &pItem ) == SFX_ITEM_SET )
+ aEdInputHelp.SetText( ((const SfxStringItem*)pItem)->GetValue() );
+ else
+ aEdInputHelp.SetText( EMPTY_STRING );
+}
+
+// -----------------------------------------------------------------------
+
+BOOL __EXPORT ScTPValidationHelp::FillItemSet( SfxItemSet& rArgSet )
+{
+ rArgSet.Put( SfxBoolItem( FID_VALID_SHOWHELP, aTsbHelp.GetState() == STATE_CHECK ) );
+ rArgSet.Put( SfxStringItem( FID_VALID_HELPTITLE, aEdtTitle.GetText() ) );
+ rArgSet.Put( SfxStringItem( FID_VALID_HELPTEXT, aEdInputHelp.GetText() ) );
+
+ return TRUE;
+}
+
+//========================================================================
+//========================================================================
+// Error Alert Page
+
+ScTPValidationError::ScTPValidationError( Window* pParent,
+ const SfxItemSet& rArgSet )
+
+ : SfxTabPage ( pParent,
+ ScResId( TP_VALIDATION_ERROR ),
+ rArgSet ),
+ aTsbShow ( this, ScResId( TSB_SHOW ) ),
+ aFlContent ( this, ScResId( FL_CONTENT ) ),
+ aFtAction ( this, ScResId( FT_ACTION ) ),
+ aLbAction ( this, ScResId( LB_ACTION ) ),
+ aBtnSearch ( this, ScResId( BTN_SEARCH ) ),
+ aFtTitle ( this, ScResId( FT_TITLE ) ),
+ aEdtTitle ( this, ScResId( EDT_TITLE ) ),
+ aFtError ( this, ScResId( FT_ERROR ) ),
+ aEdError ( this, ScResId( EDT_ERROR ) ),
+
+ mrArgSet ( rArgSet )
+{
+ Init();
+ FreeResource();
+}
+
+// -----------------------------------------------------------------------
+
+__EXPORT ScTPValidationError::~ScTPValidationError()
+{
+}
+
+// -----------------------------------------------------------------------
+
+void ScTPValidationError::Init()
+{
+ aLbAction.SetSelectHdl( LINK( this, ScTPValidationError, SelectActionHdl ) );
+ aBtnSearch.SetClickHdl( LINK( this, ScTPValidationError, ClickSearchHdl ) );
+
+ aLbAction.SelectEntryPos( 0 );
+ aTsbShow.EnableTriState( FALSE );
+
+ SelectActionHdl( NULL );
+}
+
+//------------------------------------------------------------------------
+
+USHORT* __EXPORT ScTPValidationError::GetRanges()
+{
+ return pValueRanges;
+}
+
+// -----------------------------------------------------------------------
+
+SfxTabPage* __EXPORT ScTPValidationError::Create( Window* pParent,
+ const SfxItemSet& rArgSet )
+{
+ return ( new ScTPValidationError( pParent, rArgSet ) );
+}
+
+// -----------------------------------------------------------------------
+
+void __EXPORT ScTPValidationError::Reset( const SfxItemSet& rArgSet )
+{
+ const SfxPoolItem* pItem;
+
+ if ( rArgSet.GetItemState( FID_VALID_SHOWERR, TRUE, &pItem ) == SFX_ITEM_SET )
+ aTsbShow.SetState( ((const SfxBoolItem*)pItem)->GetValue() ? STATE_CHECK : STATE_NOCHECK );
+ else
+ aTsbShow.SetState( STATE_CHECK ); // #111720# check by default
+
+ if ( rArgSet.GetItemState( FID_VALID_ERRSTYLE, TRUE, &pItem ) == SFX_ITEM_SET )
+ aLbAction.SelectEntryPos( ((const SfxAllEnumItem*)pItem)->GetValue() );
+ else
+ aLbAction.SelectEntryPos( 0 );
+
+ if ( rArgSet.GetItemState( FID_VALID_ERRTITLE, TRUE, &pItem ) == SFX_ITEM_SET )
+ aEdtTitle.SetText( ((const SfxStringItem*)pItem)->GetValue() );
+ else
+ aEdtTitle.SetText( EMPTY_STRING );
+
+ if ( rArgSet.GetItemState( FID_VALID_ERRTEXT, TRUE, &pItem ) == SFX_ITEM_SET )
+ aEdError.SetText( ((const SfxStringItem*)pItem)->GetValue() );
+ else
+ aEdError.SetText( EMPTY_STRING );
+
+ SelectActionHdl( NULL );
+}
+
+// -----------------------------------------------------------------------
+
+BOOL __EXPORT ScTPValidationError::FillItemSet( SfxItemSet& rArgSet )
+{
+ rArgSet.Put( SfxBoolItem( FID_VALID_SHOWERR, aTsbShow.GetState() == STATE_CHECK ) );
+ rArgSet.Put( SfxAllEnumItem( FID_VALID_ERRSTYLE, aLbAction.GetSelectEntryPos() ) );
+ rArgSet.Put( SfxStringItem( FID_VALID_ERRTITLE, aEdtTitle.GetText() ) );
+ rArgSet.Put( SfxStringItem( FID_VALID_ERRTEXT, aEdError.GetText() ) );
+
+ return TRUE;
+}
+
+// -----------------------------------------------------------------------
+
+IMPL_LINK( ScTPValidationError, SelectActionHdl, ListBox*, EMPTYARG )
+{
+ ScValidErrorStyle eStyle = (ScValidErrorStyle) aLbAction.GetSelectEntryPos();
+ BOOL bMacro = ( eStyle == SC_VALERR_MACRO );
+
+ aBtnSearch.Enable( bMacro );
+ aFtError.Enable( !bMacro );
+ aEdError.Enable( !bMacro );
+
+ return( 0L );
+}
+
+// -----------------------------------------------------------------------
+
+IMPL_LINK( ScTPValidationError, ClickSearchHdl, PushButton*, EMPTYARG )
+{
+ Window* pOld = Application::GetDefDialogParent();
+ Application::SetDefDialogParent( this );
+
+ // Use static SfxApplication method to bring up selector dialog for
+ // choosing a script
+ ::rtl::OUString aScriptURL = SfxApplication::ChooseScript();
+
+ Application::SetDefDialogParent( pOld );
+
+ if ( aScriptURL != NULL && aScriptURL.getLength() != 0 )
+ {
+ aEdtTitle.SetText( aScriptURL );
+ }
+
+ return( 0L );
+}
+
+//<!--Added by PengYunQuan for Validity Cell Range Picker
+bool ScValidationDlg::EnterRefStatus()
+{
+ ScTabViewShell *pTabViewShell = GetTabViewShell();
+
+ if( !pTabViewShell ) return false;
+
+ USHORT nId = SLOTID;
+ SfxViewFrame* pViewFrm = pTabViewShell->GetViewFrame();
+ SfxChildWindow* pWnd = pViewFrm->GetChildWindow( nId );
+
+ if ( pWnd && pWnd->GetWindow()!= this ) pWnd = NULL;
+
+ SC_MOD()->SetRefDialog( nId, pWnd ? FALSE : TRUE );
+
+ return true;
+}
+
+bool ScValidationDlg::LeaveRefStatus()
+{
+ ScTabViewShell *pTabViewShell = GetTabViewShell();
+
+ if( !pTabViewShell ) return false;
+
+ USHORT nId = SLOTID;
+ SfxViewFrame* pViewFrm = pTabViewShell->GetViewFrame();
+ //SfxChildWindow* pWnd = pViewFrm->GetChildWindow( nId );
+ if ( pViewFrm->GetChildWindow( nId ) )
+ {
+ DoClose( nId );
+ }
+ return true;
+}
+
+bool ScValidationDlg::SetupRefDlg()
+{
+ if ( m_bOwnRefHdlr ) return false;
+ if( EnterRefMode() )
+ {
+ SetModal( FALSE );
+ return /*SetChkShell( GetDocShell() ),*/ m_bOwnRefHdlr = true && EnterRefStatus();
+ }
+
+ return false;
+}
+
+bool ScValidationDlg::RemoveRefDlg( BOOL bRestoreModal /* = TRUE */ )
+{
+ bool bVisLock = false;
+ bool bFreeWindowLock = false;
+
+ ScTabViewShell *pTabVwSh = GetTabViewShell();
+
+ if( !pTabVwSh ) return false;
+
+ if ( SfxChildWindow* pWnd = pTabVwSh->GetViewFrame()->GetChildWindow( SID_VALIDITY_REFERENCE ) )
+ {
+ bVisLock = static_cast<ScValidityRefChildWin*>(pWnd)->LockVisible( true );
+ bFreeWindowLock = static_cast<ScValidityRefChildWin*>(pWnd)->LockFreeWindow( true );
+ }
+
+ if ( !m_bOwnRefHdlr ) return false;
+ if( LeaveRefStatus() && LeaveRefMode() )
+ {
+ m_bOwnRefHdlr = false;
+
+ if( bRestoreModal )
+ SetModal( TRUE );
+ }
+
+ if ( SfxChildWindow* pWnd = pTabVwSh->GetViewFrame()->GetChildWindow( SID_VALIDITY_REFERENCE ) )
+ {
+ static_cast<ScValidityRefChildWin*>(pWnd)->LockVisible( bVisLock );
+ static_cast<ScValidityRefChildWin*>(pWnd)->LockFreeWindow( bFreeWindowLock );
+ }
+
+ return true;
+}
+
+//TYPEINIT1( ScTPValidationValue, SfxTabPage )
+
+void ScTPValidationValue::ScRefButtonEx::Click()
+{
+ if( ScTPValidationValue *pParent = dynamic_cast< ScTPValidationValue*>( GetParent() ) )
+ pParent->OnClick( this );
+
+ ScRefButton::Click();
+}
+
+void ScTPValidationValue::OnClick( Button *pBtn )
+{
+ if( pBtn == &m_btnRef )
+ SetupRefDlg();
+}
+
+BOOL ScValidationDlg::IsChildFocus()
+{
+ if ( const Window *pWin = Application::GetFocusWindow() )
+ while( NULL != ( pWin = pWin->GetParent() ) )
+ if( pWin == this )
+ return TRUE;
+
+ return FALSE;
+}
+
+
+bool ScValidationDlg::IsAlive()
+{
+ return SC_MOD()->IsAliveRefDlg( SLOTID, this );
+}
+//-->Added by PengYunQuan for Validity Cell Range Picker