1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  *
9  * This file incorporates work covered by the following license notice:
10  *
11  *   Licensed to the Apache Software Foundation (ASF) under one or more
12  *   contributor license agreements. See the NOTICE file distributed
13  *   with this work for additional information regarding copyright
14  *   ownership. The ASF licenses this file to you under the Apache
15  *   License, Version 2.0 (the "License"); you may not use this file
16  *   except in compliance with the License. You may obtain a copy of
17  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
18  */
19 
20 #include <officecfg/Office/Writer.hxx>
21 #include <wordcountdialog.hxx>
22 #include <docsh.hxx>
23 #include <docstat.hxx>
24 #include <swmodule.hxx>
25 #include <view.hxx>
26 #include <swwait.hxx>
27 #include <wrtsh.hxx>
28 #include <rtl/math.hxx>
29 #include <svl/cjkoptions.hxx>
30 #include <unotools/localedatawrapper.hxx>
31 #include <vcl/settings.hxx>
32 #include <vcl/svapp.hxx>
33 #include <comphelper/lok.hxx>
34 
35 #define IS_MOBILE_PHONE (comphelper::LibreOfficeKit::isActive() && SfxViewShell::Current() && SfxViewShell::Current()->isLOKMobilePhone())
36 
~SwWordCountFloatDlg()37 SwWordCountFloatDlg::~SwWordCountFloatDlg()
38 {
39     SwViewShell::SetCareDialog(nullptr);
40 }
41 
42 namespace
43 {
setValue(weld::Label & rWidget,sal_uLong nValue,const LocaleDataWrapper & rLocaleData)44     void setValue(weld::Label& rWidget, sal_uLong nValue, const LocaleDataWrapper& rLocaleData)
45     {
46         rWidget.set_label(rLocaleData.getNum(nValue, 0));
47     }
48 
setDoubleValue(weld::Label & rWidget,double fValue)49     void setDoubleValue(weld::Label& rWidget, double fValue)
50     {
51         OUString sValue(OUString::number(::rtl::math::round(fValue, 1)));
52         rWidget.set_label(sValue);
53     }
54 }
55 
SetValues(const SwDocStat & rCurrent,const SwDocStat & rDoc)56 void SwWordCountFloatDlg::SetValues(const SwDocStat& rCurrent, const SwDocStat& rDoc)
57 {
58     const LocaleDataWrapper& rLocaleData = Application::GetSettings().GetUILocaleDataWrapper();
59     setValue(*m_xCurrentWordFT, rCurrent.nWord, rLocaleData);
60     setValue(*m_xCurrentCharacterFT, rCurrent.nChar, rLocaleData);
61     setValue(*m_xCurrentCharacterExcludingSpacesFT, rCurrent.nCharExcludingSpaces, rLocaleData);
62     setValue(*m_xCurrentCjkcharsFT, rCurrent.nAsianWord, rLocaleData);
63     setValue(*m_xDocWordFT, rDoc.nWord, rLocaleData);
64     setValue(*m_xDocCharacterFT, rDoc.nChar, rLocaleData);
65     setValue(*m_xDocCharacterExcludingSpacesFT, rDoc.nCharExcludingSpaces, rLocaleData);
66     setValue(*m_xDocCjkcharsFT, rDoc.nAsianWord, rLocaleData);
67 
68     if (m_xStandardizedPagesLabelFT->get_visible())
69     {
70         sal_Int64 nCharsPerStandardizedPage = officecfg::Office::Writer::WordCount::StandardizedPageSize::get();
71         setDoubleValue(*m_xCurrentStandardizedPagesFT,
72             static_cast<double>(rCurrent.nChar) / nCharsPerStandardizedPage);
73         setDoubleValue(*m_xDocStandardizedPagesFT,
74             static_cast<double>(rDoc.nChar) / nCharsPerStandardizedPage);
75     }
76 
77     bool bShowCJK = (SvtCJKOptions().IsAnyEnabled() || rDoc.nAsianWord);
78     bool bToggleCJK = m_xCurrentCjkcharsFT->get_visible() != bShowCJK;
79     if (bToggleCJK)
80     {
81         showCJK(bShowCJK);
82         m_xDialog->resize_to_request(); //force resize of dialog
83     }
84 }
85 
showCJK(bool bShowCJK)86 void SwWordCountFloatDlg::showCJK(bool bShowCJK)
87 {
88     m_xCurrentCjkcharsFT->set_visible(bShowCJK);
89     m_xDocCjkcharsFT->set_visible(bShowCJK);
90     if (m_xCjkcharsLabelFT2)
91         m_xCjkcharsLabelFT2->set_visible(bShowCJK);
92     m_xCjkcharsLabelFT->set_visible(bShowCJK);
93 }
94 
showStandardizedPages(bool bShowStandardizedPages)95 void SwWordCountFloatDlg::showStandardizedPages(bool bShowStandardizedPages)
96 {
97     m_xCurrentStandardizedPagesFT->set_visible(bShowStandardizedPages);
98     m_xDocStandardizedPagesFT->set_visible(bShowStandardizedPages);
99     if (m_xStandardizedPagesLabelFT2)
100         m_xStandardizedPagesLabelFT2->set_visible(bShowStandardizedPages);
101     m_xStandardizedPagesLabelFT->set_visible(bShowStandardizedPages);
102 }
103 
SwWordCountFloatDlg(SfxBindings * _pBindings,SfxChildWindow * pChild,weld::Window * pParent,SfxChildWinInfo const * pInfo)104 SwWordCountFloatDlg::SwWordCountFloatDlg(SfxBindings* _pBindings,
105                                          SfxChildWindow* pChild,
106                                          weld::Window *pParent,
107                                          SfxChildWinInfo const * pInfo)
108     : SfxModelessDialogController(_pBindings, pChild, pParent, IS_MOBILE_PHONE ? OUString("modules/swriter/ui/wordcount-mobile.ui") : OUString("modules/swriter/ui/wordcount.ui"), "WordCountDialog")
109     , m_xCurrentWordFT(m_xBuilder->weld_label("selectwords"))
110     , m_xCurrentCharacterFT(m_xBuilder->weld_label("selectchars"))
111     , m_xCurrentCharacterExcludingSpacesFT(m_xBuilder->weld_label("selectcharsnospaces"))
112     , m_xCurrentCjkcharsFT(m_xBuilder->weld_label("selectcjkchars"))
113     , m_xCurrentStandardizedPagesFT(m_xBuilder->weld_label("selectstandardizedpages"))
114     , m_xDocWordFT(m_xBuilder->weld_label("docwords"))
115     , m_xDocCharacterFT(m_xBuilder->weld_label("docchars"))
116     , m_xDocCharacterExcludingSpacesFT(m_xBuilder->weld_label("doccharsnospaces"))
117     , m_xDocCjkcharsFT(m_xBuilder->weld_label("doccjkchars"))
118     , m_xDocStandardizedPagesFT(m_xBuilder->weld_label("docstandardizedpages"))
119     , m_xCjkcharsLabelFT(m_xBuilder->weld_label("cjkcharsft"))
120     , m_xCjkcharsLabelFT2(m_xBuilder->weld_label("cjkcharsft2"))
121     , m_xStandardizedPagesLabelFT(m_xBuilder->weld_label("standardizedpages"))
122     , m_xStandardizedPagesLabelFT2(m_xBuilder->weld_label("standardizedpages2"))
123 {
124     showCJK(SvtCJKOptions().IsAnyEnabled());
125     showStandardizedPages(officecfg::Office::Writer::WordCount::ShowStandardizedPageCount::get());
126 
127     Initialize(pInfo);
128 }
129 
UpdateCounts()130 void SwWordCountFloatDlg::UpdateCounts()
131 {
132     SwWrtShell &rSh = ::GetActiveView()->GetWrtShell();
133     SwDocStat aCurrCnt;
134     SwDocStat aDocStat;
135     {
136         auto& rDocShell(*GetActiveView()->GetDocShell());
137         SwWait aWait(rDocShell, true);
138         auto aLock = rDocShell.LockAllViews();
139         rSh.StartAction();
140         rSh.CountWords( aCurrCnt );
141         aDocStat = rSh.GetUpdatedDocStat();
142         rSh.EndAction();
143     }
144     SetValues(aCurrCnt, aDocStat);
145 }
146 
SetCounts(const SwDocStat & rCurrCnt,const SwDocStat & rDocStat)147 void SwWordCountFloatDlg::SetCounts(const SwDocStat &rCurrCnt, const SwDocStat &rDocStat)
148 {
149     SetValues(rCurrCnt, rDocStat);
150 }
151 
152 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
153