Time wraparound validation feature
Change-Id: I49305167b1062dbe8158fdb446859138ba283da2 Reviewed-on: https://gerrit.libreoffice.org/16136 Tested-by: Jenkins <ci@libreoffice.org> Tested-by: jan iversen <jani@documentfoundation.org> Reviewed-by: jan iversen <jani@documentfoundation.org>
This commit is contained in:
@@ -154,10 +154,12 @@ public:
|
|||||||
class SC_DLLPUBLIC ScConditionEntry : public ScFormatEntry
|
class SC_DLLPUBLIC ScConditionEntry : public ScFormatEntry
|
||||||
{
|
{
|
||||||
// stored data:
|
// stored data:
|
||||||
|
protected:
|
||||||
ScConditionMode eOp;
|
ScConditionMode eOp;
|
||||||
sal_uInt16 nOptions;
|
sal_uInt16 nOptions;
|
||||||
double nVal1; // input or calculated
|
double nVal1; // input or calculated
|
||||||
double nVal2;
|
double nVal2;
|
||||||
|
private:
|
||||||
OUString aStrVal1; // input or calculated
|
OUString aStrVal1; // input or calculated
|
||||||
OUString aStrVal2;
|
OUString aStrVal2;
|
||||||
OUString aStrNmsp1; // namespace to be used on (re)compilation, e.g. in XML import
|
OUString aStrNmsp1; // namespace to be used on (re)compilation, e.g. in XML import
|
||||||
|
@@ -45,6 +45,7 @@
|
|||||||
#include "interpre.hxx"
|
#include "interpre.hxx"
|
||||||
#include "columniterator.hxx"
|
#include "columniterator.hxx"
|
||||||
#include "types.hxx"
|
#include "types.hxx"
|
||||||
|
#include "validat.hxx"
|
||||||
#include "conditio.hxx"
|
#include "conditio.hxx"
|
||||||
#include "colorscale.hxx"
|
#include "colorscale.hxx"
|
||||||
#include "fillinfo.hxx"
|
#include "fillinfo.hxx"
|
||||||
@@ -5690,6 +5691,31 @@ void Test::testCondFormatInsertRow()
|
|||||||
m_pDoc->DeleteTab(0);
|
m_pDoc->DeleteTab(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Test::testValidity()
|
||||||
|
{
|
||||||
|
m_pDoc->InsertTab(0, "Test");
|
||||||
|
|
||||||
|
m_pDoc->SetValue( 0, 0, 0, 22.0/24.0 );
|
||||||
|
m_pDoc->SetValue( 2, 0, 0, 23.0/24.0 );
|
||||||
|
m_pDoc->SetValue( 4, 0, 0, 24.0/24.0 );
|
||||||
|
|
||||||
|
// invalid between 2300-0100 hrs
|
||||||
|
ScValidationData* pData0 = new ScValidationData( SC_VALID_TIME, SC_COND_NOTBETWEEN,
|
||||||
|
OUString::number(23.0/24.0), OUString::number(1.0/24.0), m_pDoc, ScAddress(0,0,0) );
|
||||||
|
ScValidationData* pData1 = new ScValidationData( SC_VALID_TIME, SC_COND_NOTBETWEEN,
|
||||||
|
OUString::number(23.0/24.0), OUString::number(1.0/24.0), m_pDoc, ScAddress(2,0,0) );
|
||||||
|
ScValidationData* pData2 = new ScValidationData( SC_VALID_TIME, SC_COND_NOTBETWEEN,
|
||||||
|
OUString::number(23.0/24.0), OUString::number(1.0/24.0), m_pDoc, ScAddress(4,0,0) );
|
||||||
|
|
||||||
|
ScRefCellValue aCell;
|
||||||
|
aCell.assign(*m_pDoc, ScAddress(0,0,0));
|
||||||
|
CPPUNIT_ASSERT( pData0->IsDataValid( aCell, ScAddress(0,0,0) ) );
|
||||||
|
aCell.assign(*m_pDoc, ScAddress(2,0,0));
|
||||||
|
CPPUNIT_ASSERT( !pData1->IsDataValid( aCell, ScAddress(2,0,0) ) );
|
||||||
|
aCell.assign(*m_pDoc, ScAddress(4,0,0));
|
||||||
|
CPPUNIT_ASSERT( !pData2->IsDataValid( aCell, ScAddress(4,0,0) ) );
|
||||||
|
}
|
||||||
|
|
||||||
void Test::testCondFormatInsertDeleteSheets()
|
void Test::testCondFormatInsertDeleteSheets()
|
||||||
{
|
{
|
||||||
m_pDoc->InsertTab(0, "Test");
|
m_pDoc->InsertTab(0, "Test");
|
||||||
|
@@ -433,6 +433,7 @@ public:
|
|||||||
void testCondFormatINSDEL();
|
void testCondFormatINSDEL();
|
||||||
void testCondFormatInsertRow();
|
void testCondFormatInsertRow();
|
||||||
void testCondFormatInsertCol();
|
void testCondFormatInsertCol();
|
||||||
|
void testValidity();
|
||||||
void testCondFormatInsertDeleteSheets();
|
void testCondFormatInsertDeleteSheets();
|
||||||
void testCondCopyPaste();
|
void testCondCopyPaste();
|
||||||
void testCondCopyPasteSingleCell(); //e.g. fdo#82503
|
void testCondCopyPasteSingleCell(); //e.g. fdo#82503
|
||||||
@@ -669,6 +670,7 @@ public:
|
|||||||
CPPUNIT_TEST(testCondFormatINSDEL);
|
CPPUNIT_TEST(testCondFormatINSDEL);
|
||||||
CPPUNIT_TEST(testCondFormatInsertRow);
|
CPPUNIT_TEST(testCondFormatInsertRow);
|
||||||
CPPUNIT_TEST(testCondFormatInsertCol);
|
CPPUNIT_TEST(testCondFormatInsertCol);
|
||||||
|
CPPUNIT_TEST(testValidity);
|
||||||
CPPUNIT_TEST(testCondFormatInsertDeleteSheets);
|
CPPUNIT_TEST(testCondFormatInsertDeleteSheets);
|
||||||
CPPUNIT_TEST(testCondCopyPaste);
|
CPPUNIT_TEST(testCondCopyPaste);
|
||||||
CPPUNIT_TEST(testCondCopyPasteSingleCell);
|
CPPUNIT_TEST(testCondCopyPasteSingleCell);
|
||||||
|
@@ -543,7 +543,54 @@ bool ScValidationData::IsDataValid( ScRefCellValue& rCell, const ScAddress& rPos
|
|||||||
OSL_FAIL("not yet done");
|
OSL_FAIL("not yet done");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (eDataMode == SC_VALID_TIME) {
|
||||||
|
// consider only time portion (i.e. decimal)
|
||||||
|
double nComp1 = (nVal1 - floor(nVal1));
|
||||||
|
double nComp2 = (nVal2 - floor(nVal2));
|
||||||
|
double nInVal = (nVal - floor(nVal ));
|
||||||
|
switch (eOp)
|
||||||
|
{
|
||||||
|
case SC_COND_NONE:
|
||||||
|
break; // Always sal_False
|
||||||
|
case SC_COND_EQUAL:
|
||||||
|
bOk = ::rtl::math::approxEqual( nInVal, nComp1 );
|
||||||
|
break;
|
||||||
|
case SC_COND_NOTEQUAL:
|
||||||
|
bOk = !::rtl::math::approxEqual( nInVal, nComp1 );
|
||||||
|
break;
|
||||||
|
case SC_COND_GREATER:
|
||||||
|
bOk = ( nInVal > nComp1 ) && !::rtl::math::approxEqual( nInVal, nComp1 );
|
||||||
|
break;
|
||||||
|
case SC_COND_EQGREATER:
|
||||||
|
bOk = ( nInVal >= nComp1 ) || ::rtl::math::approxEqual( nInVal, nComp1 );
|
||||||
|
break;
|
||||||
|
case SC_COND_LESS:
|
||||||
|
bOk = ( nInVal < nComp1 ) && !::rtl::math::approxEqual( nInVal, nComp1 );
|
||||||
|
break;
|
||||||
|
case SC_COND_EQLESS:
|
||||||
|
bOk = ( nInVal <= nComp1 ) || ::rtl::math::approxEqual( nInVal, nComp1 );
|
||||||
|
break;
|
||||||
|
case SC_COND_BETWEEN:
|
||||||
|
if (nComp2 < nComp1) // time wraparound
|
||||||
|
bOk = ( nInVal >= nComp1 || nInVal <= nComp2 ) ||
|
||||||
|
::rtl::math::approxEqual( nInVal, nComp1 ) || ::rtl::math::approxEqual( nInVal, nComp2 );
|
||||||
|
else
|
||||||
|
bOk = ( nInVal >= nComp1 && nInVal <= nComp2 ) ||
|
||||||
|
::rtl::math::approxEqual( nInVal, nComp1 ) || ::rtl::math::approxEqual( nInVal, nComp2 );
|
||||||
|
break;
|
||||||
|
case SC_COND_NOTBETWEEN:
|
||||||
|
if (nComp2 < nComp1) // time wraparound
|
||||||
|
bOk = ( nInVal < nComp1 && nInVal > nComp2 ) &&
|
||||||
|
!::rtl::math::approxEqual( nInVal, nComp1 ) && !::rtl::math::approxEqual( nInVal, nComp2 );
|
||||||
|
else
|
||||||
|
bOk = ( nInVal < nComp1 || nInVal > nComp2 ) &&
|
||||||
|
!::rtl::math::approxEqual( nInVal, nComp1 ) && !::rtl::math::approxEqual( nInVal, nComp2 );
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
SAL_WARN("sc", "unknown operation at ScValidationData::IsDataValid()");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
return bOk;
|
return bOk;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user