sc/inc/conditio.hxx                            |   77 +++++++++--
 sc/inc/globstr.hrc                             |    5 
 sc/source/core/data/conditio.cxx               |  173 ++++++++++++++++++++++++-
 sc/source/filter/oox/condformatbuffer.cxx      |   82 ++++++-----
 sc/source/ui/condformat/condformatdlg.cxx      |   12 +
 sc/source/ui/condformat/condformatdlgentry.cxx |  145 +++++++++++++-------
 sc/source/ui/condformat/condformathelper.cxx   |    5 
 sc/source/ui/inc/condformatdlg.hrc             |    2 
 sc/source/ui/inc/condformatdlgentry.hxx        |   27 +++
 sc/source/ui/inc/condformathelper.hxx          |    3 
 sc/source/ui/src/condformatdlg.src             |   25 +++
 sc/source/ui/src/globstr.src                   |    4 
 12 files changed, 451 insertions(+), 109 deletions(-)

New commits:
commit 29206b09ca6bf2dfc5596b91fc80a0c1b62dcd6b
Author: Markus Mohrhard <markus.mohrh...@googlemail.com>
Date:   Thu Nov 15 23:37:42 2012 +0100

    ui part for conditional date formats
    
    Change-Id: I96893aaa016e6947d354aac4d7bc88da693095da

diff --git a/sc/inc/globstr.hrc b/sc/inc/globstr.hrc
index ea2d870..4fc17bd 100644
--- a/sc/inc/globstr.hrc
+++ b/sc/inc/globstr.hrc
@@ -612,9 +612,10 @@
 #define STR_COND_ENDS_WITH          487
 #define STR_COND_CONTAINS           488
 #define STR_COND_NOT_CONTAINS       489
+#define STR_COND_DATE               490
 
-#define STR_ERR_CONDFORMAT_PROTECTED 490
+#define STR_ERR_CONDFORMAT_PROTECTED 491
 
-#define STR_COUNT                   491
+#define STR_COUNT                   492
 
 #endif
diff --git a/sc/source/ui/condformat/condformatdlg.cxx 
b/sc/source/ui/condformat/condformatdlg.cxx
index 8ef887c..5212f62 100644
--- a/sc/source/ui/condformat/condformatdlg.cxx
+++ b/sc/source/ui/condformat/condformatdlg.cxx
@@ -91,6 +91,9 @@ ScCondFormatList::ScCondFormatList(Window* pParent, const 
ResId& rResId, ScDocum
                     break;
                 case condformat::ICONSET:
                     break;
+                case condformat::DATE:
+                    maEntries.push_back(new ScDateFrmtEntry( this, mpDoc, 
static_cast<const ScCondDateFormatEntry*>( pEntry ) ) );
+                    break;
             }
         }
     }
@@ -249,6 +252,7 @@ IMPL_LINK(ScCondFormatList, TypeListHdl, ListBox*, pBox)
             {
                 case condformat::entry::FORMULA:
                 case condformat::entry::CONDITION:
+                case condformat::entry::DATE:
                     break;
                 case condformat::entry::COLORSCALE2:
                 case condformat::entry::COLORSCALE3:
@@ -275,6 +279,14 @@ IMPL_LINK(ScCondFormatList, TypeListHdl, ListBox*, pBox)
             static_cast<ScCondFormatDlg*>(GetParent())->InvalidateRefData();
             itr->SetActive();
             break;
+        case 3:
+            if(itr->GetType() == condformat::entry::DATE)
+                return 0;
+
+            maEntries.replace( itr, new ScDateFrmtEntry( this, mpDoc ));
+            static_cast<ScCondFormatDlg*>(GetParent())->InvalidateRefData();
+            itr->SetActive();
+            break;
     }
     RecalcAll();
     return 0;
diff --git a/sc/source/ui/condformat/condformatdlgentry.cxx 
b/sc/source/ui/condformat/condformatdlgentry.cxx
index 817da0b..05e9335 100644
--- a/sc/source/ui/condformat/condformatdlgentry.cxx
+++ b/sc/source/ui/condformat/condformatdlgentry.cxx
@@ -254,7 +254,6 @@ ScConditionFrmtEntry::ScConditionFrmtEntry( Window* 
pParent, ScDocument* pDoc, c
 
 void ScConditionFrmtEntry::Init()
 {
-    maLbStyle.SetSeparatorPos(0);
     maEdVal1.SetGetFocusHdl( LINK( GetParent()->GetParent(), ScCondFormatDlg, 
RangeGetFocusHdl ) );
     maEdVal2.SetGetFocusHdl( LINK( GetParent()->GetParent(), ScCondFormatDlg, 
RangeGetFocusHdl ) );
     maEdVal1.SetLoseFocusHdl( LINK( GetParent()->GetParent(), ScCondFormatDlg, 
RangeLoseFocusHdl ) );
@@ -266,6 +265,7 @@ void ScConditionFrmtEntry::Init()
     maEdVal1.SetModifyHdl( LINK( this, ScCondFrmtEntry, EdModifyHdl ) );
     maEdVal2.SetModifyHdl( LINK( this, ScCondFrmtEntry, EdModifyHdl ) );
 
+    maLbStyle.SetSeparatorPos(0);
     SfxStyleSheetIterator aStyleIter( mpDoc->GetStyleSheetPool(), 
SFX_STYLE_FAMILY_PARA );
     for ( SfxStyleSheetBase* pStyle = aStyleIter.First(); pStyle; pStyle = 
aStyleIter.Next() )
     {
@@ -402,9 +402,11 @@ void ScConditionFrmtEntry::SetInactive()
     Deselect();
 }
 
-IMPL_LINK_NOARG(ScConditionFrmtEntry, StyleSelectHdl)
+namespace {
+
+void StyleSelect( ListBox& rLbStyle, ScDocument* pDoc, SvxFontPrevWindow& 
rWdPreview )
 {
-    if(maLbStyle.GetSelectEntryPos() == 0)
+    if(rLbStyle.GetSelectEntryPos() == 0)
     {
         // call new style dialog
         SfxUInt16Item aFamilyItem( SID_STYLE_FAMILY, SFX_STYLE_FAMILY_PARA );
@@ -430,26 +432,32 @@ IMPL_LINK_NOARG(ScConditionFrmtEntry, StyleSelectHdl)
 
         // Find the new style and add it into the style list boxes
         rtl::OUString aNewStyle;
-        SfxStyleSheetIterator aStyleIter( mpDoc->GetStyleSheetPool(), 
SFX_STYLE_FAMILY_PARA );
+        SfxStyleSheetIterator aStyleIter( pDoc->GetStyleSheetPool(), 
SFX_STYLE_FAMILY_PARA );
         for ( SfxStyleSheetBase* pStyle = aStyleIter.First(); pStyle; pStyle = 
aStyleIter.Next() )
         {
             rtl::OUString aName = pStyle->GetName();
-            if ( maLbStyle.GetEntryPos(aName) == LISTBOX_ENTRY_NOTFOUND )    
// all lists contain the same entries
+            if ( rLbStyle.GetEntryPos(aName) == LISTBOX_ENTRY_NOTFOUND )    // 
all lists contain the same entries
             {
-                maLbStyle.InsertEntry(aName);
-                maLbStyle.SelectEntry(aName);
+                rLbStyle.InsertEntry(aName);
+                rLbStyle.SelectEntry(aName);
             }
         }
     }
 
-    rtl::OUString aStyleName = maLbStyle.GetSelectEntry();
-    SfxStyleSheetBase* pStyleSheet = mpDoc->GetStyleSheetPool()->Find( 
aStyleName, SFX_STYLE_FAMILY_PARA );
+    rtl::OUString aStyleName = rLbStyle.GetSelectEntry();
+    SfxStyleSheetBase* pStyleSheet = pDoc->GetStyleSheetPool()->Find( 
aStyleName, SFX_STYLE_FAMILY_PARA );
     if(pStyleSheet)
     {
         const SfxItemSet& rSet = pStyleSheet->GetItemSet();
-        maWdPreview.Init( rSet );
+        rWdPreview.Init( rSet );
     }
+}
 
+}
+
+IMPL_LINK_NOARG(ScConditionFrmtEntry, StyleSelectHdl)
+{
+    StyleSelect( maLbStyle, mpDoc, maWdPreview );
     return 0;
 }
 
@@ -495,51 +503,7 @@ void ScFormulaFrmtEntry::Init()
 
 IMPL_LINK_NOARG(ScFormulaFrmtEntry, StyleSelectHdl)
 {
-    if(maLbStyle.GetSelectEntryPos() == 0)
-    {
-        // call new style dialog
-        SfxUInt16Item aFamilyItem( SID_STYLE_FAMILY, SFX_STYLE_FAMILY_PARA );
-        SfxStringItem aRefItem( SID_STYLE_REFERENCE, 
ScGlobal::GetRscString(STR_STYLENAME_STANDARD) );
-
-        // unlock the dispatcher so SID_STYLE_NEW can be executed
-        // (SetDispatcherLock would affect all Calc documents)
-        ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell();
-        SfxDispatcher* pDisp = pViewShell->GetDispatcher();
-        sal_Bool bLocked = pDisp->IsLocked();
-        if (bLocked)
-            pDisp->Lock(false);
-
-        // Execute the "new style" slot, complete with undo and all necessary 
updates.
-        // The return value (SfxUInt16Item) is ignored, look for new styles 
instead.
-        pDisp->Execute( SID_STYLE_NEW, SFX_CALLMODE_SYNCHRON | 
SFX_CALLMODE_RECORD | SFX_CALLMODE_MODAL,
-                &aFamilyItem,
-                &aRefItem,
-                0L );
-
-        if (bLocked)
-            pDisp->Lock(sal_True);
-
-        // Find the new style and add it into the style list boxes
-        rtl::OUString aNewStyle;
-        SfxStyleSheetIterator aStyleIter( mpDoc->GetStyleSheetPool(), 
SFX_STYLE_FAMILY_PARA );
-        for ( SfxStyleSheetBase* pStyle = aStyleIter.First(); pStyle; pStyle = 
aStyleIter.Next() )
-        {
-            rtl::OUString aName = pStyle->GetName();
-            if ( maLbStyle.GetEntryPos(aName) == LISTBOX_ENTRY_NOTFOUND )    
// all lists contain the same entries
-            {
-                maLbStyle.InsertEntry(aName);
-                maLbStyle.SelectEntry(aName);
-            }
-        }
-    }
-
-    rtl::OUString aStyleName = maLbStyle.GetSelectEntry();
-    SfxStyleSheetBase* pStyleSheet = mpDoc->GetStyleSheetPool()->Find( 
aStyleName, SFX_STYLE_FAMILY_PARA );
-    if(pStyleSheet)
-    {
-        const SfxItemSet& rSet = pStyleSheet->GetItemSet();
-        maWdPreview.Init( rSet );
-    }
+    StyleSelect( maLbStyle, mpDoc, maWdPreview );
 
     return 0;
 }
@@ -1169,4 +1133,75 @@ IMPL_LINK_NOARG( ScDataBarFrmtEntry, OptionBtnHdl )
     return 0;
 }
 
+ScDateFrmtEntry::ScDateFrmtEntry( Window* pParent, ScDocument* pDoc, const 
ScCondDateFormatEntry* pFormat ):
+    ScCondFrmtEntry( pParent, pDoc, ScAddress() ),
+    maLbDateEntry( this, ScResId( LB_DATE_TYPE ) ),
+    maFtStyle( this, ScResId( FT_STYLE ) ),
+    maLbStyle( this, ScResId( LB_STYLE ) ),
+    maWdPreview( this, ScResId( WD_PREVIEW ) )
+{
+    Init();
+    FreeResource();
+
+    if(pFormat)
+    {
+        sal_Int32 nPos = static_cast<sal_Int32>(pFormat->GetDateType());
+        maLbDateEntry.SelectEntryPos(nPos);
+    }
+}
+
+void ScDateFrmtEntry::Init()
+{
+    maLbDateEntry.SelectEntryPos(0);
+    maLbType.SelectEntryPos(3);
+
+    maLbStyle.SetSeparatorPos(0);
+    SfxStyleSheetIterator aStyleIter( mpDoc->GetStyleSheetPool(), 
SFX_STYLE_FAMILY_PARA );
+    for ( SfxStyleSheetBase* pStyle = aStyleIter.First(); pStyle; pStyle = 
aStyleIter.Next() )
+    {
+        rtl::OUString aName = pStyle->GetName();
+        maLbStyle.InsertEntry( aName );
+    }
+    maLbStyle.SetSelectHdl( LINK( this, ScDateFrmtEntry, StyleSelectHdl ) );
+}
+
+void ScDateFrmtEntry::SetActive()
+{
+    maLbDateEntry.Show();
+    maFtStyle.Show();
+    maWdPreview.Show();
+
+    Select();
+}
+
+void ScDateFrmtEntry::SetInactive()
+{
+    maLbDateEntry.Show();
+    maFtStyle.Show();
+    maWdPreview.Show();
+
+    Deselect();
+}
+
+ScFormatEntry* ScDateFrmtEntry::GetEntry() const
+{
+    ScCondDateFormatEntry* pNewEntry = new ScCondDateFormatEntry(mpDoc);
+    condformat::ScCondFormatDateType eType = 
static_cast<condformat::ScCondFormatDateType>(maLbDateEntry.GetSelectEntryPos());
+    pNewEntry->SetDateType(eType);
+    pNewEntry->SetStyleName(maLbStyle.GetSelectEntry());
+    return pNewEntry;
+}
+
+rtl::OUString ScDateFrmtEntry::GetExpressionString()
+{
+    return ScCondFormatHelper::GetExpression(DATE, 0);
+}
+
+IMPL_LINK_NOARG( ScDateFrmtEntry, StyleSelectHdl )
+{
+    StyleSelect( maLbStyle, mpDoc, maWdPreview );
+
+    return 0;
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/ui/condformat/condformathelper.cxx 
b/sc/source/ui/condformat/condformathelper.cxx
index 09eaa24..67a175d 100644
--- a/sc/source/ui/condformat/condformathelper.cxx
+++ b/sc/source/ui/condformat/condformathelper.cxx
@@ -27,6 +27,8 @@ rtl::OUString getTextForType(ScCondFormatEntryType eType)
             return ScGlobal::GetRscString(STR_COND_FORMULA);
         case ICONSET:
             return ScGlobal::GetRscString(STR_COND_ICONSET);
+        case DATE:
+            return ScGlobal::GetRscString(STR_COND_DATE);
         default:
             break;
     }
@@ -136,6 +138,9 @@ rtl::OUString ScCondFormatHelper::GetExpression(const 
ScConditionalFormat& rForm
             case condformat::ICONSET:
                 aBuffer.append(getTextForType(ICONSET));
                 break;
+            case condformat::DATE:
+                aBuffer.append(getTextForType(DATE));
+                break;
         }
     }
     return aBuffer.makeStringAndClear();
diff --git a/sc/source/ui/inc/condformatdlg.hrc 
b/sc/source/ui/inc/condformatdlg.hrc
index f631b53..b1ede3c 100644
--- a/sc/source/ui/inc/condformatdlg.hrc
+++ b/sc/source/ui/inc/condformatdlg.hrc
@@ -67,4 +67,6 @@
 #define LB_TYPE_COL_SCALE_MIN 42
 #define LB_TYPE_COL_SCALE_MIDDLE 43
 #define LB_TYPE_COL_SCALE_MAX 44
+
+#define LB_DATE_TYPE 45
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/ui/inc/condformatdlgentry.hxx 
b/sc/source/ui/inc/condformatdlgentry.hxx
index 0abe83b..b842ed2 100644
--- a/sc/source/ui/inc/condformatdlgentry.hxx
+++ b/sc/source/ui/inc/condformatdlgentry.hxx
@@ -21,7 +21,8 @@ enum ScCondFrmtEntryType
     FORMULA,
     COLORSCALE2,
     COLORSCALE3,
-    DATABAR
+    DATABAR,
+    DATE
 };
 
 }
@@ -74,7 +75,6 @@ public:
 
 class ScConditionFrmtEntry : public ScCondFrmtEntry
 {
-
     //cond format ui elements
     ListBox maLbCondType;
     formula::RefEdit maEdVal1;
@@ -216,4 +216,27 @@ public:
     virtual condformat::entry::ScCondFrmtEntryType GetType() { return 
condformat::entry::DATABAR; }
 };
 
+class ScDateFrmtEntry : public ScCondFrmtEntry
+{
+public:
+    ScDateFrmtEntry( Window* pParent, ScDocument* pDoc, const 
ScCondDateFormatEntry* pFormat = NULL );
+    virtual ScFormatEntry* GetEntry() const;
+    virtual void SetActive();
+    virtual void SetInactive();
+    virtual condformat::entry::ScCondFrmtEntryType GetType() { return 
condformat::entry::DATE; }
+
+protected:
+    virtual rtl::OUString GetExpressionString();
+
+private:
+    void Init();
+
+    DECL_LINK( StyleSelectHdl, void* );
+
+    ListBox maLbDateEntry;
+    FixedText maFtStyle;
+    ListBox maLbStyle;
+    SvxFontPrevWindow maWdPreview;
+};
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/ui/inc/condformathelper.hxx 
b/sc/source/ui/inc/condformathelper.hxx
index c674df4..02d24e6 100644
--- a/sc/source/ui/inc/condformathelper.hxx
+++ b/sc/source/ui/inc/condformathelper.hxx
@@ -19,7 +19,8 @@ enum ScCondFormatEntryType
     DATABAR,
     FORMULA,
     ICONSET,
-    COLLAPSED
+    DATE,
+    COLLAPSE
 };
 
 class ScCondFormatHelper
diff --git a/sc/source/ui/src/condformatdlg.src 
b/sc/source/ui/src/condformatdlg.src
index 8318cc1..ab98866 100644
--- a/sc/source/ui/src/condformatdlg.src
+++ b/sc/source/ui/src/condformatdlg.src
@@ -121,6 +121,7 @@ Control RID_COND_ENTRY
             "All Cells";
             "Cell value is";
             "Formula is";
+            "Date is";
         };
     };
     ListBox LB_CELLIS_TYPE
@@ -309,6 +310,30 @@ Control RID_COND_ENTRY
         Size = MAP_APPFONT( 60, 14 );
         Text [ en-US ] = "More options ...";
     };
+    ListBox LB_DATE_TYPE
+    {
+        Pos = MAP_APPFONT( 100, 15 );
+        Size = MAP_APPFONT( 100, 60 );
+        Border = TRUE;
+        DropDown = TRUE;
+        DDExtraWidth = TRUE;
+        StringList [ en-US ] =
+        {
+            "Today";
+            "Yesterday";
+            "Tomorrow";
+            "Last 7 days";
+            "This week";
+            "Last week";
+            "Next week";
+            "This month";
+            "Last month";
+            "Next month";
+            "This year";
+            "Last year";
+            "Next year";
+        };
+    };
 };
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/ui/src/globstr.src b/sc/source/ui/src/globstr.src
index 226bb1a..49e9176 100644
--- a/sc/source/ui/src/globstr.src
+++ b/sc/source/ui/src/globstr.src
@@ -1911,6 +1911,10 @@ Resource RID_GLOBSTR
     {
         Text [ en-US ] = "Top Percent";
     };
+    String STR_COND_DATE
+    {
+        Text [ en-US ] = "Date is";
+    };
     String STR_COND_BOTTOM_PERCENT
     {
         Text [ en-US ] = "Bottom Percent";
commit ee1af6790434bd9364334ffe14cdba21979b6381
Author: Markus Mohrhard <markus.mohrh...@googlemail.com>
Date:   Thu Nov 15 23:37:18 2012 +0100

    implement remaining conditional date formats
    
    Change-Id: I0a514f305367f556be2fea6650afb63bff4c5a8c

diff --git a/sc/inc/conditio.hxx b/sc/inc/conditio.hxx
index cdc02f5..71dcc4e 100644
--- a/sc/inc/conditio.hxx
+++ b/sc/inc/conditio.hxx
@@ -329,16 +329,19 @@ namespace condformat {
 
 enum ScCondFormatDateType
 {
+    TODAY,
     YESTERDAY,
     TOMORROW,
-    TODAY,
     LAST7DAYS,
-    LASTWEEK,
     THISWEEK,
+    LASTWEEK,
     NEXTWEEK,
-    LASTMONTH,
     THISMONTH,
-    NEXTMONTH
+    LASTMONTH,
+    NEXTMONTH,
+    THISYEAR,
+    LASTYEAR,
+    NEXTYEAR
 };
 
 }
diff --git a/sc/source/core/data/conditio.cxx b/sc/source/core/data/conditio.cxx
index d0d388b..769a95e 100644
--- a/sc/source/core/data/conditio.cxx
+++ b/sc/source/core/data/conditio.cxx
@@ -1650,12 +1650,15 @@ bool ScCondDateFormatEntry::IsValid( const ScAddress& 
rPos ) const
     if(pBaseCell->GetCellType() != CELLTYPE_VALUE && pBaseCell->GetCellType() 
!= CELLTYPE_FORMULA)
         return false;
 
-    double nVal = mpDoc->GetValue(rPos);
-    long nCellDate = static_cast<long>(nVal);
     Date aActDate( Date::SYSTEM );
     SvNumberFormatter* pFormatter = mpDoc->GetFormatTable();
     long nCurrentDate = aActDate - *(pFormatter->GetNullDate());
 
+    double nVal = mpDoc->GetValue(rPos);
+    long nCellDate = static_cast<long>(nVal);
+    Date aCellDate = *(pFormatter->GetNullDate());
+    aCellDate += (long) ::rtl::math::approxFloor(nVal);
+
     switch(meType)
     {
         case condformat::TODAY:
@@ -1670,8 +1673,63 @@ bool ScCondDateFormatEntry::IsValid( const ScAddress& 
rPos ) const
             if( nCurrentDate == nCellDate + 1)
                 return true;
             break;
-        default:
-            return true;
+        case condformat::LAST7DAYS:
+            if( nCurrentDate >= nCellDate && nCurrentDate - 7 < nCellDate )
+                return true;
+            break;
+        case condformat::LASTWEEK:
+            if( aActDate.GetYear() == aCellDate.GetYear() && 
aActDate.GetMonth() == aCellDate.GetMonth() )
+            {
+                if( aActDate.GetWeekOfYear( SUNDAY ) == 
aCellDate.GetWeekOfYear( SUNDAY ) + 1 )
+                    return true;
+            }
+            break;
+        case condformat::THISWEEK:
+            if( aActDate.GetYear() == aCellDate.GetYear() && 
aActDate.GetMonth() == aCellDate.GetMonth() )
+            {
+                if( aActDate.GetWeekOfYear( SUNDAY ) == 
aCellDate.GetWeekOfYear( SUNDAY ) )
+                    return true;
+            }
+            break;
+        case condformat::NEXTWEEK:
+            if( aActDate.GetYear() == aCellDate.GetYear() && 
aActDate.GetMonth() == aCellDate.GetMonth() )
+            {
+                if( aActDate.GetWeekOfYear( SUNDAY ) == 
aCellDate.GetWeekOfYear( SUNDAY ) - 1 )
+                    return true;
+            }
+            break;
+        case condformat::LASTMONTH:
+            if( aActDate.GetYear() == aCellDate.GetYear() )
+            {
+                if( aActDate.GetMonth() == aCellDate.GetMonth() + 1)
+                    return true;
+            }
+            break;
+        case condformat::THISMONTH:
+            if( aActDate.GetYear() == aCellDate.GetYear() )
+            {
+                if( aActDate.GetMonth() == aCellDate.GetMonth() )
+                    return true;
+            }
+            break;
+        case condformat::NEXTMONTH:
+            if( aActDate.GetYear() == aCellDate.GetYear() )
+            {
+                if( aActDate.GetMonth() == aCellDate.GetMonth() - 1)
+                    return true;
+            }
+            break;
+        case condformat::LASTYEAR:
+            if( aActDate.GetYear() == aCellDate.GetYear() + 1 )
+                return true;
+            break;
+        case condformat::THISYEAR:
+            if( aActDate.GetYear() == aCellDate.GetYear() )
+                return true;
+            break;
+        case condformat::NEXTYEAR:
+            if( aActDate.GetYear() == aCellDate.GetYear() - 1 )
+                return true;
             break;
     }
 
commit f3ddf0922ba08e3237379151f169c7e508914a39
Author: Markus Mohrhard <markus.mohrh...@googlemail.com>
Date:   Thu Nov 15 13:11:19 2012 +0100

    implement date cond format import from OOXML
    
    Change-Id: I4c0fc2dad8510260ee58848f99736c91ae58c57e

diff --git a/sc/source/filter/oox/condformatbuffer.cxx 
b/sc/source/filter/oox/condformatbuffer.cxx
index 7840be1..1b66341 100644
--- a/sc/source/filter/oox/condformatbuffer.cxx
+++ b/sc/source/filter/oox/condformatbuffer.cxx
@@ -692,41 +692,6 @@ void CondFormatRule::finalizeImport()
             eOperator = SC_COND_ENDS_WITH;
         break;
         case XML_timePeriod:
-            switch( maModel.mnTimePeriod )
-            {
-                case XML_yesterday:
-                    aReplaceFormula = "FLOOR(#B,1)=TODAY()-1";
-                break;
-                case XML_today:
-                    aReplaceFormula = "FLOOR(#B,1)=TODAY()";
-                break;
-                case XML_tomorrow:
-                    aReplaceFormula = "FLOOR(#B,1)=TODAY()+1";
-                break;
-                case XML_last7Days:
-                    aReplaceFormula = 
"AND(TODAY()-7<FLOOR(#B,1),FLOOR(#B,1)<=TODAY())";
-                break;
-                case XML_lastWeek:
-                    aReplaceFormula = 
"AND(TODAY()-WEEKDAY(TODAY())-7<FLOOR(#B,1),FLOOR(#B,1)<=TODAY()-WEEKDAY(TODAY()))";
-                break;
-                case XML_thisWeek:
-                    aReplaceFormula = 
"AND(TODAY()-WEEKDAY(TODAY())<FLOOR(#B,1),FLOOR(#B,1)<=TODAY()-WEEKDAY(TODAY())+7)";
-                break;
-                case XML_nextWeek:
-                    aReplaceFormula = 
"AND(TODAY()-WEEKDAY(TODAY())+7<FLOOR(#B,1),FLOOR(#B,1)<=TODAY()-WEEKDAY(TODAY())+14)";
-                break;
-                case XML_lastMonth:
-                    aReplaceFormula = 
"OR(AND(MONTH(#B)=MONTH(TODAY())-1,YEAR(#B)=YEAR(TODAY())),AND(MONTH(#B)=12,MONTH(TODAY())=1,YEAR(#B)=YEAR(TODAY())-1))";
-                break;
-                case XML_thisMonth:
-                    aReplaceFormula = 
"AND(MONTH(#B)=MONTH(TODAY()),YEAR(#B)=YEAR(TODAY()))";
-                break;
-                case XML_nextMonth:
-                    aReplaceFormula = 
"OR(AND(MONTH(#B)=MONTH(TODAY())+1,YEAR(#B)=YEAR(TODAY())),AND(MONTH(#B)=1,MONTH(TODAY())=12,YEAR(#B)=YEAR(TODAY())+1))";
-                break;
-                default:
-                    OSL_FAIL( "CondFormatRule::finalizeImport - unknown time 
period type" );
-            }
         break;
         case XML_containsBlanks:
             aReplaceFormula = "LEN(TRIM(#B))=0";
@@ -856,6 +821,53 @@ void CondFormatRule::finalizeImport()
         ScCondFormatEntry* pNewEntry = new ScCondFormatEntry( eOperator, NULL, 
NULL, &rDoc, aPos, aStyleName );
         mpFormat->AddEntry(pNewEntry);
     }
+    else if( maModel.mnType == XML_timePeriod )
+    {
+        condformat::ScCondFormatDateType eDateType = condformat::TODAY;
+        switch( maModel.mnTimePeriod )
+        {
+            case XML_yesterday:
+                eDateType = condformat::YESTERDAY;
+                break;
+            case XML_today:
+                eDateType = condformat::TODAY;
+                break;
+            case XML_tomorrow:
+                eDateType = condformat::TOMORROW;
+                break;
+            case XML_last7Days:
+                eDateType = condformat::LAST7DAYS;
+                break;
+            case XML_lastWeek:
+                eDateType = condformat::LASTWEEK;
+                break;
+            case XML_thisWeek:
+                eDateType = condformat::THISWEEK;
+                break;
+            case XML_nextWeek:
+                eDateType = condformat::NEXTWEEK;
+                break;
+            case XML_lastMonth:
+                eDateType = condformat::LASTMONTH;
+                break;
+            case XML_thisMonth:
+                eDateType = condformat::THISMONTH;
+                break;
+            case XML_nextMonth:
+                eDateType = condformat::NEXTMONTH;
+                break;
+            default:
+                SAL_WARN("sc", "CondFormatRule::finalizeImport - unknown time 
period type" );
+        }
+
+        ScDocument& rDoc = getScDocument();
+        ScCondDateFormatEntry* pFormatEntry = new ScCondDateFormatEntry(&rDoc);
+        pFormatEntry->SetDateType(eDateType);
+        OUString aStyleName = getStyles().createDxfStyle( maModel.mnDxfId );
+        pFormatEntry->SetStyleName( aStyleName );
+
+        mpFormat->AddEntry(pFormatEntry);
+    }
     else if( mpColor )
     {
         ScDocument& rDoc = getScDocument();
commit 95634322a93dfab4378206d4269f3d5cbcdaedc1
Author: Markus Mohrhard <markus.mohrh...@googlemail.com>
Date:   Thu Nov 15 13:10:56 2012 +0100

    initial work for date conditional formats
    
    Change-Id: Ifba8a4061e898a031004c20222e78eb825f07e4e

diff --git a/sc/inc/conditio.hxx b/sc/inc/conditio.hxx
index 1009df7..cdc02f5 100644
--- a/sc/inc/conditio.hxx
+++ b/sc/inc/conditio.hxx
@@ -95,7 +95,8 @@ enum ScFormatEntryType
     CONDITION,
     COLORSCALE,
     DATABAR,
-    ICONSET
+    ICONSET,
+    DATE
 };
 
 }
@@ -324,6 +325,59 @@ protected:
     virtual void    DataChanged( const ScRange* pModified ) const;
 };
 
+namespace condformat {
+
+enum ScCondFormatDateType
+{
+    YESTERDAY,
+    TOMORROW,
+    TODAY,
+    LAST7DAYS,
+    LASTWEEK,
+    THISWEEK,
+    NEXTWEEK,
+    LASTMONTH,
+    THISMONTH,
+    NEXTMONTH
+};
+
+}
+
+class SC_DLLPUBLIC ScCondDateFormatEntry : public ScFormatEntry
+{
+public:
+    ScCondDateFormatEntry(ScDocument* pDoc);
+    ScCondDateFormatEntry(ScDocument* pDoc, const ScCondDateFormatEntry& 
rEntry);
+
+    bool IsValid( const ScAddress& rPos ) const;
+
+    void SetDateType(condformat::ScCondFormatDateType eType);
+    condformat::ScCondFormatDateType GetDateType() const;
+
+    const rtl::OUString& GetStyleName() const;
+    void SetStyleName( const rtl::OUString& rStyleName );
+
+    virtual condformat::ScFormatEntryType GetType() const { return 
condformat::DATE; }
+    virtual void UpdateReference( UpdateRefMode, const ScRange&,
+            SCsCOL, SCsROW, SCsTAB ) {}
+    virtual void UpdateMoveTab( SCTAB, SCTAB ) {}
+
+    virtual ScFormatEntry* Clone( ScDocument* pDoc = NULL ) const;
+
+    virtual void SetParent( ScConditionalFormat* ) {}
+
+    bool operator==( const ScFormatEntry& ) const;
+
+#if DUMP_FORMAT_INFO
+    virtual void dumpInfo(rtl::OUStringBuffer& rBuf) const;
+#endif
+
+private:
+    condformat::ScCondFormatDateType meType;
+
+    rtl::OUString maStyleName;
+};
+
 //
 //  complete conditional formatting
 //
diff --git a/sc/source/core/data/conditio.cxx b/sc/source/core/data/conditio.cxx
index 12fe329..d0d388b 100644
--- a/sc/source/core/data/conditio.cxx
+++ b/sc/source/core/data/conditio.cxx
@@ -1628,6 +1628,101 @@ ScFormatEntry* ScCondFormatEntry::Clone( ScDocument* 
pDoc ) const
 
 //------------------------------------------------------------------------
 
+ScCondDateFormatEntry::ScCondDateFormatEntry( ScDocument* pDoc ):
+    ScFormatEntry( pDoc )
+{
+}
+
+ScCondDateFormatEntry::ScCondDateFormatEntry( ScDocument* pDoc, const 
ScCondDateFormatEntry& rFormat ):
+    ScFormatEntry( pDoc ),
+    meType( rFormat.meType ),
+    maStyleName( rFormat.maStyleName )
+{
+}
+
+bool ScCondDateFormatEntry::IsValid( const ScAddress& rPos ) const
+{
+    ScBaseCell* pBaseCell = mpDoc->GetCell( rPos );
+
+    if(!pBaseCell)
+        return false;
+
+    if(pBaseCell->GetCellType() != CELLTYPE_VALUE && pBaseCell->GetCellType() 
!= CELLTYPE_FORMULA)
+        return false;
+
+    double nVal = mpDoc->GetValue(rPos);
+    long nCellDate = static_cast<long>(nVal);
+    Date aActDate( Date::SYSTEM );
+    SvNumberFormatter* pFormatter = mpDoc->GetFormatTable();
+    long nCurrentDate = aActDate - *(pFormatter->GetNullDate());
+
+    switch(meType)
+    {
+        case condformat::TODAY:
+            if( nCurrentDate == nCellDate )
+                return true;
+            break;
+        case condformat::TOMORROW:
+            if( nCurrentDate == nCellDate -1 )
+                return true;
+            break;
+        case condformat::YESTERDAY:
+            if( nCurrentDate == nCellDate + 1)
+                return true;
+            break;
+        default:
+            return true;
+            break;
+    }
+
+    return false;
+}
+
+void ScCondDateFormatEntry::SetDateType( condformat::ScCondFormatDateType 
eType )
+{
+    meType = eType;
+}
+
+condformat::ScCondFormatDateType ScCondDateFormatEntry::GetDateType() const
+{
+    return meType;
+}
+
+const rtl::OUString& ScCondDateFormatEntry::GetStyleName() const
+{
+    return maStyleName;
+}
+
+void ScCondDateFormatEntry::SetStyleName( const rtl::OUString& rStyleName )
+{
+    maStyleName = rStyleName;
+}
+
+ScFormatEntry* ScCondDateFormatEntry::Clone( ScDocument* pDoc ) const
+{
+    return new ScCondDateFormatEntry( pDoc, *this );
+}
+
+bool ScCondDateFormatEntry::operator==( const ScFormatEntry& r ) const
+{
+    if(r.GetType() != condformat::DATE)
+        return false;
+
+    const ScCondDateFormatEntry& rEntry = static_cast<const 
ScCondDateFormatEntry&>(r);
+
+    if(rEntry.meType != meType)
+        return false;
+
+    return rEntry.maStyleName == maStyleName;
+}
+
+void ScCondDateFormatEntry::dumpInfo( rtl::OUStringBuffer& rBuffer ) const
+{
+    rBuffer.append("Date Format");
+}
+
+//------------------------------------------------------------------------
+
 ScConditionalFormat::ScConditionalFormat(sal_uInt32 nNewKey, ScDocument* 
pDocument) :
     pDoc( pDocument ),
     nKey( nNewKey )
@@ -1717,6 +1812,12 @@ const rtl::OUString& ScConditionalFormat::GetCellStyle( 
ScBaseCell* pCell, const
             if ( rEntry.IsCellValid( pCell, rPos ) )
                 return rEntry.GetStyle();
         }
+        else if(itr->GetType() == condformat::DATE)
+        {
+            const ScCondDateFormatEntry& rEntry = static_cast<const 
ScCondDateFormatEntry&>(*itr);
+            if (rEntry.IsValid( rPos ))
+                return rEntry.GetStyleName();
+        }
     }
 
     return EMPTY_OUSTRING;
@@ -1748,6 +1849,12 @@ ScCondFormatData ScConditionalFormat::GetData( 
ScBaseCell* pCell, const ScAddres
             const ScIconSetFormat& rEntry = static_cast<const 
ScIconSetFormat&>(*itr);
             aData.pIconSet = rEntry.GetIconSetInfo(rPos);
         }
+        else if(itr->GetType() == condformat::DATE && 
aData.aStyleName.isEmpty())
+        {
+            const ScCondDateFormatEntry& rEntry = static_cast<const 
ScCondDateFormatEntry&>(*itr);
+            if ( rEntry.IsValid( rPos ) )
+                aData.aStyleName = rEntry.GetStyleName();
+        }
     }
     return aData;
 }
commit ced69036671bd995b5af0e521cf913a0fb11753d
Author: Markus Mohrhard <markus.mohrh...@googlemail.com>
Date:   Thu Nov 15 13:10:28 2012 +0100

    String to OUString
    
    Change-Id: I32f35a34f031b1905b1b3955d6a8e6804bd4ce23

diff --git a/sc/inc/conditio.hxx b/sc/inc/conditio.hxx
index bf4ca53..1009df7 100644
--- a/sc/inc/conditio.hxx
+++ b/sc/inc/conditio.hxx
@@ -293,7 +293,7 @@ private:
 
 class SC_DLLPUBLIC ScCondFormatEntry : public ScConditionEntry
 {
-    String                  aStyleName;
+    rtl::OUString                  aStyleName;
 
     using ScConditionEntry::operator==;
 
@@ -316,8 +316,8 @@ public:
 
     int             operator== ( const ScCondFormatEntry& r ) const;
 
-    const String&   GetStyle() const        { return aStyleName; }
-    void            UpdateStyleName(const String& rNew)  { aStyleName=rNew; }
+    const rtl::OUString&   GetStyle() const        { return aStyleName; }
+    void            UpdateStyleName(const rtl::OUString& rNew)  { 
aStyleName=rNew; }
     virtual ScFormatEntry* Clone(ScDocument* pDoc) const;
 
 protected:
@@ -360,13 +360,13 @@ public:
                                 const ScRange& rRange, SCsCOL nDx, SCsROW nDy, 
SCsTAB nDz );
     void            DeleteArea( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW 
nRow2 );
     void            UpdateMoveTab( SCTAB nOldPos, SCTAB nNewPos );
-    void            RenameCellStyle( const String& rOld, const String& rNew );
+    void            RenameCellStyle( const rtl::OUString& rOld, const 
rtl::OUString& rNew );
 
     void            SourceChanged( const ScAddress& rAddr );
 
     const ScFormatEntry* GetEntry( sal_uInt16 nPos ) const;
 
-    const String&   GetCellStyle( ScBaseCell* pCell, const ScAddress& rPos ) 
const;
+    const rtl::OUString&   GetCellStyle( ScBaseCell* pCell, const ScAddress& 
rPos ) const;
 
     ScCondFormatData GetData( ScBaseCell* pCell, const ScAddress& rPos ) const;
 
@@ -422,7 +422,7 @@ public:
     void    CompileXML();
     void    UpdateReference( UpdateRefMode eUpdateRefMode,
                                 const ScRange& rRange, SCsCOL nDx, SCsROW nDy, 
SCsTAB nDz );
-    void    RenameCellStyle( const String& rOld, const String& rNew );
+    void    RenameCellStyle( const rtl::OUString& rOld, const rtl::OUString& 
rNew );
     void    UpdateMoveTab( SCTAB nOldPos, SCTAB nNewPos );
     void    DeleteArea( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2 );
 
diff --git a/sc/source/core/data/conditio.cxx b/sc/source/core/data/conditio.cxx
index ecece73..12fe329 100644
--- a/sc/source/core/data/conditio.cxx
+++ b/sc/source/core/data/conditio.cxx
@@ -1707,7 +1707,7 @@ const ScFormatEntry* ScConditionalFormat::GetEntry( 
sal_uInt16 nPos ) const
         return NULL;
 }
 
-const String& ScConditionalFormat::GetCellStyle( ScBaseCell* pCell, const 
ScAddress& rPos ) const
+const rtl::OUString& ScConditionalFormat::GetCellStyle( ScBaseCell* pCell, 
const ScAddress& rPos ) const
 {
     for (CondFormatContainer::const_iterator itr = maEntries.begin(); itr != 
maEntries.end(); ++itr)
     {
@@ -1719,7 +1719,7 @@ const String& ScConditionalFormat::GetCellStyle( 
ScBaseCell* pCell, const ScAddr
         }
     }
 
-    return EMPTY_STRING;
+    return EMPTY_OUSTRING;
 }
 
 ScCondFormatData ScConditionalFormat::GetData( ScBaseCell* pCell, const 
ScAddress& rPos ) const
@@ -1804,7 +1804,7 @@ void ScConditionalFormat::DeleteArea( SCCOL nCol1, SCROW 
nRow1, SCCOL nCol2, SCR
     maRanges.DeleteArea( nCol1, nRow1, nTab, nCol2, nRow2, nTab );
 }
 
-void ScConditionalFormat::RenameCellStyle(const String& rOld, const String& 
rNew)
+void ScConditionalFormat::RenameCellStyle(const rtl::OUString& rOld, const 
rtl::OUString& rNew)
 {
     for(CondFormatContainer::iterator itr = maEntries.begin(); itr != 
maEntries.end(); ++itr)
         if(itr->GetType() == condformat::CONDITION)
@@ -1963,7 +1963,7 @@ void ScConditionalFormatList::UpdateReference( 
UpdateRefMode eUpdateRefMode,
     }
 }
 
-void ScConditionalFormatList::RenameCellStyle( const String& rOld, const 
String& rNew )
+void ScConditionalFormatList::RenameCellStyle( const rtl::OUString& rOld, 
const rtl::OUString& rNew )
 {
     for( iterator itr = begin(); itr != end(); ++itr)
         itr->RenameCellStyle(rOld,rNew);
commit ca97c8679bc3646160649a5a2f28878a971512f8
Author: Markus Mohrhard <markus.mohrh...@googlemail.com>
Date:   Thu Nov 15 13:07:32 2012 +0100

    remove strange comments
    
    Change-Id: I307ac354550119f87e7eee0d747b36715c9e0ccc

diff --git a/sc/inc/conditio.hxx b/sc/inc/conditio.hxx
index d60da24..bf4ca53 100644
--- a/sc/inc/conditio.hxx
+++ b/sc/inc/conditio.hxx
@@ -57,12 +57,12 @@ class ScTokenArray;
 
 enum ScConditionMode
 {
-    SC_COND_EQUAL, //done
-    SC_COND_LESS, //done
+    SC_COND_EQUAL,
+    SC_COND_LESS,
     SC_COND_GREATER,
     SC_COND_EQLESS,
     SC_COND_EQGREATER,
-    SC_COND_NOTEQUAL, //done
+    SC_COND_NOTEQUAL,
     SC_COND_BETWEEN,
     SC_COND_NOTBETWEEN,
     SC_COND_DUPLICATE,
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to