sw/inc/strings.hrc                |    9 ++
 sw/source/uibase/uiview/view2.cxx |  131 +++++++++++++++++++++++++++++++++-----
 2 files changed, 125 insertions(+), 15 deletions(-)

New commits:
commit 189b65b02fe1f3ce6be5b7637cc59443561855e4
Author:     Jim Raykowski <rayk...@gmail.com>
AuthorDate: Mon Mar 28 20:48:37 2022 -0800
Commit:     Jim Raykowski <rayk...@gmail.com>
CommitDate: Tue Aug 2 18:43:39 2022 +0200

    tdf#90150 Improve Writer page number display in the status bar
    
    Enhancement patch to show page numbers as 'First visible page and
    Last visible page' when two pages are visible in the view, 'First
    visible page - Last visible page' when more than two pages are
    visible in the view. Numbers shown in () are custom page numbering
    numbers. Numbers shown in [] are virtual page numbers.
    
    Change-Id: Ie07dee0f372e2cd94fb848b092d3df04f242ab51
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/132252
    Tested-by: Jenkins
    Reviewed-by: Jim Raykowski <rayk...@gmail.com>

diff --git a/sw/inc/strings.hrc b/sw/inc/strings.hrc
index ed06d5b39d42..26d199336afa 100644
--- a/sw/inc/strings.hrc
+++ b/sw/inc/strings.hrc
@@ -1287,8 +1287,15 @@
 #define STR_REDLINE_COMMENT_ADDED               
NC_("STR_REDLINE_COMMENT_ADDED", "Comment added")
 #define STR_REDLINE_COMMENT_DELETED             
NC_("STR_REDLINE_COMMENT_DELETED", "Comment deleted")
 #define STR_PAGE                                NC_("STR_PAGE", "Page ")
+#define STR_PAGES_TWO_CONJUNCTION               
NC_("STR_PAGES_TWO_CONJUNCTION", "and")
 #define STR_PAGE_COUNT                          NC_("STR_PAGE_COUNT", "Page %1 
of %2")
-#define STR_PAGE_COUNT_CUSTOM                   NC_("STR_PAGE_COUNT_CUSTOM", 
"Page %1 of %2 (Page %3)")
+#define STR_PAGE_COUNT_EXTENDED                 NC_("STR_PAGE_COUNT_EXTENDED", 
"Page %1 of %2 [Page %3]")
+#define STR_PAGES_COUNT                         NC_("STR_PAGES_COUNT", "Pages 
%1 - %2 of %3")
+#define STR_PAGES_COUNT_EXTENDED                
NC_("STR_PAGES_COUNT_EXTENDED", "Pages %1 - %2 of %3 [Pages %4 - %5]")
+#define STR_PAGE_COUNT_CUSTOM                   NC_("STR_PAGE_COUNT_CUSTOM", 
"Page %1 (%2) of %3")
+#define STR_PAGE_COUNT_CUSTOM_EXTENDED          
NC_("STR_PAGE_COUNT_CUSTOM_EXTENDED", "Page %1 (%2) of %3 [Page %4 (%5)]")
+#define STR_PAGES_COUNT_CUSTOM                  NC_("STR_PAGES_COUNT_CUSTOM", 
"Pages %1 - %2 (%3 - %4) of %5")
+#define STR_PAGES_COUNT_CUSTOM_EXTENDED         
NC_("STR_PAGES_COUNT_CUSTOM_EXTENDED", "Pages %1 - %2 (%3 - %4) of %5 [Pages %6 
- %7 (%8 - %9)]")
 #define STR_PAGE_COUNT_PRINTED                  NC_("STR_PAGE_COUNT_PRINTED", 
"Page %1 of %2 (Page %3 of %4 to print)")
 //Strings for gallery/background
 #define STR_SWBG_PARAGRAPH                      NC_("STR_SWBG_PARAGRAPH", 
"Paragraph")
diff --git a/sw/source/uibase/uiview/view2.cxx 
b/sw/source/uibase/uiview/view2.cxx
index e534be0fa2ee..4d674434af57 100644
--- a/sw/source/uibase/uiview/view2.cxx
+++ b/sw/source/uibase/uiview/view2.cxx
@@ -1580,28 +1580,131 @@ void SwView::StateStatusLine(SfxItemSet &rSet)
     {
         switch( nWhich )
         {
-            case FN_STAT_PAGE: {
-                // number of pages, log. page number
-                sal_uInt16 nPage, nLogPage;
-                OUString sDisplay;
-                rShell.GetPageNumber( -1, rShell.IsCursorVisible(), nPage, 
nLogPage, sDisplay );
-                bool bExtendedTooltip(!sDisplay.isEmpty() &&
-                                      
std::u16string_view(OUString::number(nPage)) != sDisplay &&
-                                      nPage != nLogPage);
-                OUString aTooltip = bExtendedTooltip ? 
SwResId(STR_BOOKCTRL_HINT_EXTENDED)
-                                                     : 
SwResId(STR_BOOKCTRL_HINT);
+            case FN_STAT_PAGE:
+            {
+                OUString aTooltip;
+                OUString aPageStr;
+
+                SwVisiblePageNumbers aVisiblePageNumbers;
+                m_pWrtShell->GetFirstLastVisPageNumbers(aVisiblePageNumbers);
+
+                // convert to strings and define references
+                OUString sFirstPhy = 
OUString::number(aVisiblePageNumbers.nFirstPhy);
+                OUString sLastPhy = 
OUString::number(aVisiblePageNumbers.nLastPhy);
+                OUString sFirstVirt = 
OUString::number(aVisiblePageNumbers.nFirstVirt);
+                OUString sLastVirt = 
OUString::number(aVisiblePageNumbers.nLastVirt);
+                OUString& sFirstCustomPhy = 
aVisiblePageNumbers.sFirstCustomPhy;
+                OUString& sLastCustomPhy = aVisiblePageNumbers.sLastCustomPhy;
+                OUString& sFirstCustomVirt = 
aVisiblePageNumbers.sFirstCustomVirt;
+                OUString& sLastCustomVirt = 
aVisiblePageNumbers.sLastCustomVirt;
+                OUString sPageCount = 
OUString::number(m_pWrtShell->GetPageCount());
+
+                if (aVisiblePageNumbers.nFirstPhy == 
aVisiblePageNumbers.nFirstVirt)
+                {
+                    aTooltip = SwResId(STR_BOOKCTRL_HINT);
+                    if (aVisiblePageNumbers.nFirstPhy != 
aVisiblePageNumbers.nLastPhy)
+                    {
+                        if (sFirstPhy == sFirstCustomPhy && sLastPhy == 
sLastCustomPhy)
+                        {
+                            aPageStr = SwResId(STR_PAGES_COUNT);
+                            aPageStr = aPageStr.replaceFirst("%1", sFirstPhy);
+                            aPageStr = aPageStr.replaceFirst("%2", sLastPhy);
+                            aPageStr = aPageStr.replaceFirst("%3", sPageCount);
+                        }
+                        else
+                        {
+                            aPageStr = SwResId(STR_PAGES_COUNT_CUSTOM);
+                            aPageStr = aPageStr.replaceFirst("%1", sFirstPhy);
+                            aPageStr = aPageStr.replaceFirst("%2", sLastPhy);
+                            aPageStr = aPageStr.replaceFirst("%3", 
sFirstCustomPhy);
+                            aPageStr = aPageStr.replaceFirst("%4", 
sLastCustomPhy);
+                            aPageStr = aPageStr.replaceFirst("%5", sPageCount);
+                        }
+                    }
+                    else
+                    {
+                        if (sFirstPhy == sFirstCustomPhy && sLastPhy == 
sLastCustomPhy)
+                        {
+                            aPageStr = SwResId(STR_PAGE_COUNT);
+                            aPageStr = aPageStr.replaceFirst("%1", sFirstPhy);
+                            aPageStr = aPageStr.replaceFirst("%2", sPageCount);
+                        }
+                        else
+                        {
+                            aPageStr = SwResId(STR_PAGE_COUNT_CUSTOM);
+                            aPageStr = aPageStr.replaceFirst("%1", sFirstPhy);
+                            aPageStr = aPageStr.replaceFirst("%2", 
sFirstCustomPhy);
+                            aPageStr = aPageStr.replaceFirst("%3", sPageCount);
+                        }
+                    }
+                }
+                else
+                {
+                    aTooltip = SwResId(STR_BOOKCTRL_HINT_EXTENDED);
+                    if (aVisiblePageNumbers.nFirstPhy != 
aVisiblePageNumbers.nLastPhy)
+                    {
+                        if (sFirstPhy == sFirstCustomPhy && sLastPhy == 
sLastCustomPhy)
+                        {
+                            aPageStr = SwResId(STR_PAGES_COUNT_EXTENDED);
+                            aPageStr = aPageStr.replaceFirst("%1", sFirstPhy);
+                            aPageStr = aPageStr.replaceFirst("%2", sLastPhy);
+                            aPageStr = aPageStr.replaceFirst("%3", sPageCount);
+                            aPageStr = aPageStr.replaceFirst("%4", sFirstVirt);
+                            aPageStr = aPageStr.replaceFirst("%5", sLastVirt);
+                        }
+                        else
+                        {
+                            aPageStr = 
SwResId(STR_PAGES_COUNT_CUSTOM_EXTENDED);
+                            aPageStr = aPageStr.replaceFirst("%1", sFirstPhy);
+                            aPageStr = aPageStr.replaceFirst("%2", sLastPhy);
+                            aPageStr = aPageStr.replaceFirst("%3", 
sFirstCustomPhy);
+                            aPageStr = aPageStr.replaceFirst("%4", 
sLastCustomPhy);
+                            aPageStr = aPageStr.replaceFirst("%5", sPageCount);
+                            aPageStr = aPageStr.replaceFirst("%6", sFirstVirt);
+                            aPageStr = aPageStr.replaceFirst("%7", sLastVirt);
+                            aPageStr = aPageStr.replaceFirst("%8", 
sFirstCustomVirt);
+                            aPageStr = aPageStr.replaceFirst("%9", 
sLastCustomVirt);
+                        }
+                    }
+                    else
+                    {
+                        if (sFirstPhy == sFirstCustomPhy && sLastPhy == 
sLastCustomPhy)
+                        {
+                            aPageStr = SwResId(STR_PAGE_COUNT_EXTENDED);
+                            aPageStr = aPageStr.replaceFirst("%1", sFirstPhy);
+                            aPageStr = aPageStr.replaceFirst("%2", sPageCount);
+                            aPageStr = aPageStr.replaceFirst("%3", sFirstVirt);
+                        }
+                        else
+                        {
+                            aPageStr = SwResId(STR_PAGE_COUNT_CUSTOM_EXTENDED);
+                            aPageStr = aPageStr.replaceFirst("%1", sFirstPhy);
+                            aPageStr = aPageStr.replaceFirst("%2", 
sFirstCustomPhy);
+                            aPageStr = aPageStr.replaceFirst("%3", sPageCount);
+                            aPageStr = aPageStr.replaceFirst("%4", sFirstVirt);
+                            aPageStr = aPageStr.replaceFirst("%5", 
sFirstCustomVirt);
+                        }
+                    }
+                }
+
+                // replace range indicator with two pages conjunction if 
applicable
+                if ((aVisiblePageNumbers.nLastPhy - 
aVisiblePageNumbers.nFirstPhy) == 1)
+                    aPageStr = aPageStr.replaceAll("-", 
SwResId(STR_PAGES_TWO_CONJUNCTION));
+
+                // status bar bookmark control string and tooltip
                 std::vector<OUString> aStringList
                 {
-                    GetPageStr(nPage, nLogPage, sDisplay),
+                    aPageStr,
                     aTooltip
                 };
                 rSet.Put(SfxStringListItem(FN_STAT_PAGE, &aStringList));
+
                 //if existing page number is not equal to old page number, 
send out this event.
-                if (m_nOldPageNum != nLogPage )
+                if (m_nOldPageNum != aVisiblePageNumbers.nFirstPhy)
                 {
                     if (m_nOldPageNum != 0)
-                        SwCursorShell::FirePageChangeEvent(m_nOldPageNum, 
nLogPage);
-                    m_nOldPageNum = nLogPage;
+                        SwCursorShell::FirePageChangeEvent(m_nOldPageNum, 
aVisiblePageNumbers.nFirstPhy);
+                    m_nOldPageNum = aVisiblePageNumbers.nFirstPhy;
                 }
                 const sal_uInt16 nCnt = GetWrtShell().GetPageCnt();
                 if (m_nPageCnt != nCnt)   // notify Basic

Reply via email to