blob: 127e609a53113a976487318a0b72427f9f2da387 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#include "vbavalidation.hxx"
#include "vbaformatcondition.hxx" //#i108860
#include <com/sun/star/sheet/XSheetCondition.hpp>
#include <com/sun/star/sheet/ValidationType.hpp>
#include <com/sun/star/sheet/ValidationAlertStyle.hpp>
#include <com/sun/star/beans/XPropertySet.hpp>
#include <ooo/vba/excel/XlDVType.hpp>
#include <ooo/vba/excel/XlFormatConditionOperator.hpp>
#include <ooo/vba/excel/XlDVAlertStyle.hpp>
#include "unonames.hxx"
using namespace ::ooo::vba;
using namespace ::com::sun::star;
const static rtl::OUString VALIDATION( RTL_CONSTASCII_USTRINGPARAM( SC_UNONAME_VALIDAT ) );
const static rtl::OUString IGNOREBLANK( RTL_CONSTASCII_USTRINGPARAM( SC_UNONAME_IGNOREBL ) );
const static rtl::OUString SHOWINPUT( RTL_CONSTASCII_USTRINGPARAM( SC_UNONAME_SHOWINP ) );
const static rtl::OUString SHOWERROR( RTL_CONSTASCII_USTRINGPARAM( SC_UNONAME_SHOWERR ) );
const static rtl::OUString ERRORTITLE( RTL_CONSTASCII_USTRINGPARAM( SC_UNONAME_ERRTITLE ) );
const static rtl::OUString INPUTTITLE( RTL_CONSTASCII_USTRINGPARAM( SC_UNONAME_INPTITLE ) );
const static rtl::OUString INPUTMESS( RTL_CONSTASCII_USTRINGPARAM( SC_UNONAME_INPMESS ) );
const static rtl::OUString ERRORMESS( RTL_CONSTASCII_USTRINGPARAM( SC_UNONAME_ERRMESS ) );
const static rtl::OUString STYPE( RTL_CONSTASCII_USTRINGPARAM( SC_UNONAME_TYPE ) );
const static rtl::OUString SHOWLIST( RTL_CONSTASCII_USTRINGPARAM( SC_UNONAME_SHOWLIST ) );
const static rtl::OUString ALERTSTYLE( RTL_CONSTASCII_USTRINGPARAM( SC_UNONAME_ERRALSTY ) );
void
lcl_setValidationProps( const uno::Reference< table::XCellRange >& xRange, const uno::Reference< beans::XPropertySet >& xProps )
{
uno::Reference< beans::XPropertySet > xRangeProps( xRange, uno::UNO_QUERY_THROW );
xRangeProps->setPropertyValue( VALIDATION , uno::makeAny( xProps ) );
}
uno::Reference< beans::XPropertySet >
lcl_getValidationProps( const uno::Reference< table::XCellRange >& xRange )
{
uno::Reference< beans::XPropertySet > xProps( xRange, uno::UNO_QUERY_THROW );
uno::Reference< beans::XPropertySet > xValProps;
xValProps.set( xProps->getPropertyValue( VALIDATION ), uno::UNO_QUERY_THROW );
return xValProps;
}
::sal_Bool SAL_CALL
ScVbaValidation::getIgnoreBlank() throw (uno::RuntimeException)
{
uno::Reference< beans::XPropertySet > xProps( lcl_getValidationProps( m_xRange ) );
sal_Bool bBlank = sal_False;
xProps->getPropertyValue( IGNOREBLANK ) >>= bBlank;
return bBlank;
}
void SAL_CALL
ScVbaValidation::setIgnoreBlank( ::sal_Bool _ignoreblank ) throw (uno::RuntimeException)
{
uno::Reference< beans::XPropertySet > xProps( lcl_getValidationProps( m_xRange ) );
xProps->setPropertyValue( IGNOREBLANK, uno::makeAny( _ignoreblank ) );
lcl_setValidationProps( m_xRange, xProps );
}
::sal_Bool SAL_CALL
ScVbaValidation::getInCellDropdown() throw (uno::RuntimeException)
{
uno::Reference< beans::XPropertySet > xProps = lcl_getValidationProps( m_xRange );
sal_Int32 nShowList = 0;
xProps->getPropertyValue( SHOWLIST ) >>= nShowList;
return ( nShowList ? sal_True : sal_False );
}
void SAL_CALL
ScVbaValidation::setInCellDropdown( ::sal_Bool _incelldropdown ) throw (uno::RuntimeException)
{
sal_Int32 nDropDown = sal_False;
if ( _incelldropdown )
nDropDown = 1;
uno::Reference< beans::XPropertySet > xProps( lcl_getValidationProps(m_xRange) );
xProps->setPropertyValue( SHOWLIST, uno::makeAny( nDropDown ) );
lcl_setValidationProps( m_xRange, xProps );
}
::sal_Bool SAL_CALL
ScVbaValidation::getShowInput() throw (uno::RuntimeException)
{
uno::Reference< beans::XPropertySet > xProps = lcl_getValidationProps( m_xRange );
sal_Bool bShowInput = sal_False;
xProps->getPropertyValue( SHOWINPUT ) >>= bShowInput;
return bShowInput;
}
void SAL_CALL
ScVbaValidation:: setShowInput( ::sal_Bool _showinput ) throw (uno::RuntimeException)
{
uno::Reference< beans::XPropertySet > xProps( lcl_getValidationProps(m_xRange) );
xProps->setPropertyValue( IGNOREBLANK, uno::makeAny( _showinput ) );
lcl_setValidationProps( m_xRange, xProps );
}
::sal_Bool SAL_CALL
ScVbaValidation::getShowError() throw (uno::RuntimeException)
{
uno::Reference< beans::XPropertySet > xProps = lcl_getValidationProps( m_xRange );
sal_Bool bShowError = sal_False;
xProps->getPropertyValue( SHOWERROR ) >>= bShowError;
return bShowError;
}
void SAL_CALL
ScVbaValidation::setShowError( ::sal_Bool _showerror ) throw (uno::RuntimeException)
{
uno::Reference< beans::XPropertySet > xProps( lcl_getValidationProps( m_xRange ) );
xProps->setPropertyValue( SHOWERROR, uno::makeAny( _showerror ) );
lcl_setValidationProps( m_xRange, xProps );
}
::rtl::OUString SAL_CALL
ScVbaValidation::getErrorTitle() throw (uno::RuntimeException)
{
uno::Reference< beans::XPropertySet > xProps = lcl_getValidationProps( m_xRange );
rtl::OUString sErrorTitle;
xProps->getPropertyValue( ERRORTITLE ) >>= sErrorTitle;
return sErrorTitle;
}
void
ScVbaValidation::setErrorTitle( const rtl::OUString& _errormessage ) throw (uno::RuntimeException)
{
uno::Reference< beans::XPropertySet > xProps( lcl_getValidationProps( m_xRange ) );
xProps->setPropertyValue( ERRORTITLE, uno::makeAny( _errormessage ) );
lcl_setValidationProps( m_xRange, xProps );
}
::rtl::OUString SAL_CALL
ScVbaValidation::getInputMessage() throw (uno::RuntimeException)
{
uno::Reference< beans::XPropertySet > xProps = lcl_getValidationProps( m_xRange );
rtl::OUString sMsg;
xProps->getPropertyValue( INPUTMESS ) >>= sMsg;
return sMsg;
}
void SAL_CALL
ScVbaValidation::setInputMessage( const ::rtl::OUString& _inputmessage ) throw (uno::RuntimeException)
{
uno::Reference< beans::XPropertySet > xProps( lcl_getValidationProps( m_xRange ) );
xProps->setPropertyValue( INPUTMESS, uno::makeAny( _inputmessage ) );
lcl_setValidationProps( m_xRange, xProps );
}
::rtl::OUString SAL_CALL
ScVbaValidation::getInputTitle() throw (uno::RuntimeException)
{
uno::Reference< beans::XPropertySet > xProps = lcl_getValidationProps( m_xRange );
rtl::OUString sString;
xProps->getPropertyValue( INPUTTITLE ) >>= sString;
return sString;
}
void SAL_CALL
ScVbaValidation::setInputTitle( const ::rtl::OUString& _inputtitle ) throw (uno::RuntimeException)
{
uno::Reference< beans::XPropertySet > xProps( lcl_getValidationProps( m_xRange ) );
xProps->setPropertyValue( INPUTTITLE, uno::makeAny( _inputtitle ) );
lcl_setValidationProps( m_xRange, xProps );
}
::rtl::OUString SAL_CALL
ScVbaValidation::getErrorMessage() throw (uno::RuntimeException)
{
uno::Reference< beans::XPropertySet > xProps = lcl_getValidationProps( m_xRange );
rtl::OUString sString;
xProps->getPropertyValue( ERRORMESS ) >>= sString;
return sString;
}
void SAL_CALL
ScVbaValidation::setErrorMessage( const ::rtl::OUString& _errormessage ) throw (uno::RuntimeException)
{
uno::Reference< beans::XPropertySet > xProps( lcl_getValidationProps( m_xRange ) );
xProps->setPropertyValue( ERRORMESS, uno::makeAny( _errormessage ) );
lcl_setValidationProps( m_xRange, xProps );
}
void SAL_CALL
ScVbaValidation::Delete( ) throw (uno::RuntimeException)
{
rtl::OUString sBlank;
uno::Reference< beans::XPropertySet > xProps( lcl_getValidationProps( m_xRange ) );
uno::Reference< sheet::XSheetCondition > xCond( xProps, uno::UNO_QUERY_THROW );
xProps->setPropertyValue( IGNOREBLANK, uno::makeAny( sal_True ) );
xProps->setPropertyValue( SHOWINPUT, uno::makeAny( sal_True ) );
xProps->setPropertyValue( SHOWERROR, uno::makeAny( sal_True ) );
xProps->setPropertyValue( ERRORTITLE, uno::makeAny( sBlank ) );
xProps->setPropertyValue( INPUTMESS, uno::makeAny( sBlank) );
xProps->setPropertyValue( ALERTSTYLE, uno::makeAny( sheet::ValidationAlertStyle_STOP) );
xProps->setPropertyValue( STYPE, uno::makeAny( sheet::ValidationType_ANY ) );
xCond->setFormula1( sBlank );
xCond->setFormula2( sBlank );
xCond->setOperator( sheet::ConditionOperator_NONE );
lcl_setValidationProps( m_xRange, xProps );
}
void SAL_CALL
ScVbaValidation::Add( const uno::Any& Type, const uno::Any& AlertStyle, const uno::Any& Operator, const uno::Any& Formula1, const uno::Any& Formula2 ) throw (uno::RuntimeException)
{
uno::Reference< beans::XPropertySet > xProps( lcl_getValidationProps( m_xRange ) );
uno::Reference< sheet::XSheetCondition > xCond( xProps, uno::UNO_QUERY_THROW );
sheet::ValidationType nValType = sheet::ValidationType_ANY;
xProps->getPropertyValue( STYPE ) >>= nValType;
if ( nValType != sheet::ValidationType_ANY )
throw uno::RuntimeException( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "validation object already exists" ) ), uno::Reference< uno::XInterface >() );
sal_Int32 nType = -1;
if ( !Type.hasValue() || !( Type >>= nType ) )
throw uno::RuntimeException( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "missing required param" ) ), uno::Reference< uno::XInterface >() );
Delete(); // set up defaults
rtl::OUString sFormula1;
Formula1 >>= sFormula1;
rtl::OUString sFormula2;
Formula2 >>= sFormula2;
switch ( nType )
{
case excel::XlDVType::xlValidateList:
{
// for validate list
// at least formula1 is required
if ( !Formula1.hasValue() )
throw uno::RuntimeException( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "missing param" ) ), uno::Reference< uno::XInterface >() );
nValType = sheet::ValidationType_LIST;
xProps->setPropertyValue( STYPE, uno::makeAny(nValType ));
// #TODO validate required params
// #TODO need to correct the ';' delimited formula on get/set
break;
}
case excel::XlDVType::xlValidateWholeNumber:
nValType = sheet::ValidationType_WHOLE;
xProps->setPropertyValue( STYPE, uno::makeAny(nValType ));
break;
default:
throw uno::RuntimeException( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "unsupported operation..." ) ), uno::Reference< uno::XInterface >() );
}
sheet::ValidationAlertStyle eStyle = sheet::ValidationAlertStyle_STOP;
sal_Int32 nVbaAlertStyle = excel::XlDVAlertStyle::xlValidAlertStop;
if ( AlertStyle.hasValue() && ( AlertStyle >>= nVbaAlertStyle ) )
{
switch( nVbaAlertStyle )
{
case excel::XlDVAlertStyle::xlValidAlertStop:
// yes I know it's already defaulted but safer to assume
// someone propbably could change the code above
eStyle = sheet::ValidationAlertStyle_STOP;
break;
case excel::XlDVAlertStyle::xlValidAlertWarning:
eStyle = sheet::ValidationAlertStyle_WARNING;
break;
case excel::XlDVAlertStyle::xlValidAlertInformation:
eStyle = sheet::ValidationAlertStyle_INFO;
break;
default:
throw uno::RuntimeException( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "bad param..." ) ), uno::Reference< uno::XInterface >() );
}
}
xProps->setPropertyValue( ALERTSTYLE, uno::makeAny( eStyle ) );
//#i108860: fix the defect that validation cannot work when the input should be limited between a lower bound and an upper bound
if ( Operator.hasValue() )
{
css::sheet::ConditionOperator conOperator = ScVbaFormatCondition::retrieveAPIOperator( Operator );
xCond->setOperator( conOperator );
} //#ii108860
if ( sFormula1.getLength() )
xCond->setFormula1( sFormula1 );
if ( sFormula2.getLength() )
xCond->setFormula2( sFormula2 );
lcl_setValidationProps( m_xRange, xProps );
}
::rtl::OUString SAL_CALL
ScVbaValidation::getFormula1() throw (uno::RuntimeException)
{
uno::Reference< sheet::XSheetCondition > xCond( lcl_getValidationProps( m_xRange ), uno::UNO_QUERY_THROW );
return xCond->getFormula1();
}
::rtl::OUString SAL_CALL
ScVbaValidation::getFormula2() throw (uno::RuntimeException)
{
uno::Reference< sheet::XSheetCondition > xCond( lcl_getValidationProps( m_xRange ), uno::UNO_QUERY_THROW );
return xCond->getFormula2();
}
rtl::OUString&
ScVbaValidation::getServiceImplName()
{
static rtl::OUString sImplName( RTL_CONSTASCII_USTRINGPARAM("ScVbaValidation") );
return sImplName;
}
uno::Sequence< rtl::OUString >
ScVbaValidation::getServiceNames()
{
static uno::Sequence< rtl::OUString > aServiceNames;
if ( aServiceNames.getLength() == 0 )
{
aServiceNames.realloc( 1 );
aServiceNames[ 0 ] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("ooo.vba.excel.Validation" ) );
}
return aServiceNames;
}