fdo#34772 Add word count to the status bar in writer
This change adds a new status bar control,
"SwWordCountStatusBarControl". The control shows the number of words
selected as well as the number of words in the whole
document. Double-clicking the control launches the modeless word count
dialog.
Change-Id: I756183ab1aaf4d059e782dfb05508370178cfbe3
diff --git a/sw/Library_sw.mk b/sw/Library_sw.mk
index 45975a0..1ddc142 100644
--- a/sw/Library_sw.mk
+++ b/sw/Library_sw.mk
@@ -708,6 +708,7 @@ $(eval $(call gb_Library_add_exception_objects,sw,\
sw/source/ui/utlui/uitool \
sw/source/ui/utlui/unotools \
sw/source/ui/utlui/viewlayoutctrl \
sw/source/ui/utlui/wordcountctrl \
sw/source/ui/utlui/zoomctrl \
sw/source/ui/web/wdocsh \
sw/source/ui/web/wformsh \
diff --git a/sw/inc/cmdid.h b/sw/inc/cmdid.h
index 7802db7..ca5a872 100644
--- a/sw/inc/cmdid.h
+++ b/sw/inc/cmdid.h
@@ -1165,6 +1165,7 @@ included in c-context files, so c++ style stuff will cause problems.
#define FN_STAT_SELMODE (FN_STAT + 5)
#define FN_STAT_CONTEXT (FN_STAT + 7)
#define FN_STAT_BOOKMARK (FN_STAT + 8) /* For Popup Bookmarks*/
#define FN_STAT_WORDCOUNT (FN_STAT + 9)
/*--------------------------------------------------------------------
Region: Page preview
diff --git a/sw/sdi/_viewsh.sdi b/sw/sdi/_viewsh.sdi
index a17fbb8..d4486af 100644
--- a/sw/sdi/_viewsh.sdi
+++ b/sw/sdi/_viewsh.sdi
@@ -317,6 +317,11 @@ interface BaseTextEditView
ExecMethod = ExecuteStatusLine ;
StateMethod = StateStatusLine ;
]
FN_STAT_WORDCOUNT // status()
[
ExecMethod = ExecuteStatusLine ;
StateMethod = StateStatusLine ;
]
FN_STAT_BOOKMARK // status()
[
ExecMethod = ExecuteStatusLine ;
diff --git a/sw/sdi/swriter.sdi b/sw/sdi/swriter.sdi
index edb7809..89e1530 100644
--- a/sw/sdi/swriter.sdi
+++ b/sw/sdi/swriter.sdi
@@ -8027,6 +8027,31 @@ SfxStringItem StateZoom FN_STAT_ZOOM
]
//--------------------------------------------------------------------------
SfxStringItem StateWordCount FN_STAT_WORDCOUNT
()
[
/* flags: */
AutoUpdate = FALSE,
Cachable = Cachable,
FastCall = FALSE,
HasCoreId = FALSE,
HasDialog = FALSE,
ReadOnlyDoc = TRUE,
Toggle = FALSE,
Container = FALSE,
RecordAbsolute = FALSE,
RecordPerSet;
Synchron;
/* config: */
AccelConfig = FALSE,
MenuConfig = FALSE,
StatusBarConfig = TRUE,
ToolBoxConfig = FALSE,
GroupId = GID_VIEW;
]
//--------------------------------------------------------------------------
SfxBoolItem SubScript FN_SET_SUB_SCRIPT
[
diff --git a/sw/sdi/viewsh.sdi b/sw/sdi/viewsh.sdi
index 1005c96..d5d8380 100644
--- a/sw/sdi/viewsh.sdi
+++ b/sw/sdi/viewsh.sdi
@@ -275,8 +275,8 @@ interface TextPrintPreview
[
StateMethod = StateUndo ;
]
//---------------------------------------------------------------------
//Ab hier Statusleiste
//---------------------------------------------------------------------
// Begin StatusBar
FN_STAT_ZOOM // status()
[
ExecMethod = Execute ;
@@ -307,13 +307,18 @@ interface TextPrintPreview
ExecMethod = Execute ;
StateMethod = GetState ;
]
SID_ATTR_ZOOMSLIDER // status()
[
ExecMethod = Execute ;
StateMethod = GetState ;
]
//----------------------------------------------
//End mit Statusleiste
SID_ATTR_ZOOMSLIDER // status()
[
ExecMethod = Execute ;
StateMethod = GetState ;
]
FN_STAT_WORDCOUNT // status()
[
ExecMethod = Execute ;
StateMethod = GetState ;
]
//----------------------------------------------
// End StatusBar
}
//=========================================================================
diff --git a/sw/source/ui/app/swmodule.cxx b/sw/source/ui/app/swmodule.cxx
index 03bb5a2..4c97524 100644
--- a/sw/source/ui/app/swmodule.cxx
+++ b/sw/source/ui/app/swmodule.cxx
@@ -107,6 +107,7 @@
#include <svx/zoomsliderctrl.hxx>
#include <tblctrl.hxx>
#include <zoomctrl.hxx>
#include <wordcountctrl.hxx>
#include <workctrl.hxx>
#include <tbxanchr.hxx>
#include <fldwrap.hxx>
@@ -372,6 +373,7 @@ void SwDLL::RegisterControls()
SvxInsertStatusBarControl::RegisterControl(SID_ATTR_INSERT, pMod );
SvxSelectionModeControl::RegisterControl(FN_STAT_SELMODE, pMod );
XmlSecStatusBarControl::RegisterControl( SID_SIGNATURE, pMod );
SwWordCountStatusBarControl::RegisterControl(FN_STAT_WORDCOUNT, pMod);
SwBookmarkControl::RegisterControl(FN_STAT_PAGE, pMod );
SwTemplateControl::RegisterControl(FN_STAT_TEMPLATE, pMod );
diff --git a/sw/source/ui/inc/wordcountctrl.hxx b/sw/source/ui/inc/wordcountctrl.hxx
new file mode 100644
index 0000000..d62652f
--- /dev/null
+++ b/sw/source/ui/inc/wordcountctrl.hxx
@@ -0,0 +1,32 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* Copyright 2012 LibreOffice contributors.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
#ifndef _WORDCOUNTCTRL_HXX
#define _WORDCOUNTCTRL_HXX
#include <sfx2/stbitem.hxx>
/**
Word count status bar control for Writer.
@remarks This is a simple status bar control of type SfxStringItem, and it has no custom
logic whatsoever. The actual updating of the word count string happens in
SwView::StateStatusLine (see sw/source/ui/uiview/view2.cxx).
*/
class SwWordCountStatusBarControl : public SfxStatusBarControl
{
public:
SFX_DECL_STATUSBAR_CONTROL();
SwWordCountStatusBarControl(sal_uInt16 nSlotId, sal_uInt16 nId, StatusBar& rStb);
~SwWordCountStatusBarControl();
};
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/ui/uiview/view2.cxx b/sw/source/ui/uiview/view2.cxx
index febc076..9292185 100644
--- a/sw/source/ui/uiview/view2.cxx
+++ b/sw/source/ui/uiview/view2.cxx
@@ -140,6 +140,7 @@
#include <fmthdft.hxx>
#include <svx/ofaitem.hxx>
#include <unomid.h>
#include <docstat.hxx>
const char sStatusDelim[] = " : ";
const char sStatusComma[] = " , ";//#outlinelevel, define a Variable for "," add by zhaojianwei
@@ -1197,6 +1198,25 @@ void SwView::StateStatusLine(SfxItemSet &rSet)
}
}
break;
case FN_STAT_WORDCOUNT:
{
SwDocStat selectionStats;
SwDocStat documentStats;
{
SwWait aWait( *GetDocShell(), sal_True );
rShell.StartAction();
rShell.CountWords(selectionStats);
documentStats = rShell.GetUpdatedDocStat();
rShell.EndAction();
}
rSet.Put(SfxStringItem(FN_STAT_WORDCOUNT, rtl::OUStringBuffer("Words: ")
.append(rtl::OUString::valueOf(static_cast<sal_Int64>(selectionStats.nWord)))
.append('/')
.append(rtl::OUString::valueOf(static_cast<sal_Int64>(documentStats.nWord))).makeStringAndClear()));
}
break;
case FN_STAT_TEMPLATE:
{
rSet.Put(SfxStringItem( FN_STAT_TEMPLATE,
@@ -1471,6 +1491,13 @@ void SwView::ExecuteStatusLine(SfxRequest &rReq)
}
break;
case FN_STAT_WORDCOUNT:
{
GetViewFrame()->GetDispatcher()->Execute(FN_WORDCOUNT_DIALOG,
SFX_CALLMODE_SYNCHRON|SFX_CALLMODE_RECORD );
}
break;
case FN_STAT_BOOKMARK:
if ( pArgs )
{
diff --git a/sw/source/ui/utlui/wordcountctrl.cxx b/sw/source/ui/utlui/wordcountctrl.cxx
new file mode 100644
index 0000000..a0146d0
--- /dev/null
+++ b/sw/source/ui/utlui/wordcountctrl.cxx
@@ -0,0 +1,26 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* Copyright 2012 LibreOffice contributors.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
#include "wordcountctrl.hxx"
#include <svl/stritem.hxx>
SFX_IMPL_STATUSBAR_CONTROL(SwWordCountStatusBarControl, SfxStringItem);
SwWordCountStatusBarControl::SwWordCountStatusBarControl(
sal_uInt16 _nSlotId,
sal_uInt16 _nId,
StatusBar& rStb) :
SfxStatusBarControl(_nSlotId, _nId, rStb)
{
}
SwWordCountStatusBarControl::~SwWordCountStatusBarControl()
{
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/uiconfig/swriter/statusbar/statusbar.xml b/sw/uiconfig/swriter/statusbar/statusbar.xml
index 87b3edd..d5e2271 100644
--- a/sw/uiconfig/swriter/statusbar/statusbar.xml
+++ b/sw/uiconfig/swriter/statusbar/statusbar.xml
@@ -2,6 +2,7 @@
<!DOCTYPE statusbar:statusbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "statusbar.dtd">
<statusbar:statusbar xmlns:statusbar="http://openoffice.org/2001/statusbar" xmlns:xlink="http://www.w3.org/1999/xlink">
<statusbar:statusbaritem xlink:href=".uno:StatePageNumber" statusbar:align="left" statusbar:autosize="true" statusbar:width="54" statusbar:helpid="helpid:21181"/>
<statusbar:statusbaritem xlink:href=".uno:StateWordCount" statusbar:align="left" statusbar:autosize="true" statusbar:helpid="helpid:21184"/>
<statusbar:statusbaritem xlink:href=".uno:PageStyleName" statusbar:align="left" statusbar:autosize="true" statusbar:width="79" statusbar:helpid="helpid:21182"/>
<statusbar:statusbaritem xlink:href=".uno:LanguageStatus" statusbar:align="center" statusbar:autosize="true" statusbar:width="100" />
<statusbar:statusbaritem xlink:href=".uno:InsertMode" statusbar:align="center" statusbar:width="55" statusbar:helpid="helpid:10221"/>