sw clearing breaks: add insert UI
Expose SwLineBreakClear in SwBreakDlg and extend SwWrtShell::InsertLineBreak() to be able to insert clearing breaks as well. Change-Id: I17a4c34cb74f1c72d8e208bace25597de0367e17 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/132024 Reviewed-by: Miklos Vajna <vmiklos@collabora.com> Tested-by: Jenkins
This commit is contained in:
parent
312cf9580c
commit
8a7d0e8a81
12 changed files with 229 additions and 15 deletions
75
sw/CppunitTest_sw_uibase_wrtsh.mk
Normal file
75
sw/CppunitTest_sw_uibase_wrtsh.mk
Normal file
|
@ -0,0 +1,75 @@
|
|||
# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
|
||||
#*************************************************************************
|
||||
#
|
||||
# This file is part of the LibreOffice project.
|
||||
#
|
||||
# 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/.
|
||||
#
|
||||
#*************************************************************************
|
||||
|
||||
$(eval $(call gb_CppunitTest_CppunitTest,sw_uibase_wrtsh))
|
||||
|
||||
$(eval $(call gb_CppunitTest_use_common_precompiled_header,sw_uibase_wrtsh))
|
||||
|
||||
$(eval $(call gb_CppunitTest_add_exception_objects,sw_uibase_wrtsh, \
|
||||
sw/qa/uibase/wrtsh/wrtsh \
|
||||
))
|
||||
|
||||
$(eval $(call gb_CppunitTest_use_libraries,sw_uibase_wrtsh, \
|
||||
comphelper \
|
||||
cppu \
|
||||
cppuhelper \
|
||||
editeng \
|
||||
sal \
|
||||
sfx \
|
||||
svl \
|
||||
svx \
|
||||
svxcore \
|
||||
sw \
|
||||
swqahelper \
|
||||
test \
|
||||
unotest \
|
||||
utl \
|
||||
vcl \
|
||||
tl \
|
||||
))
|
||||
|
||||
$(eval $(call gb_CppunitTest_use_externals,sw_uibase_wrtsh,\
|
||||
boost_headers \
|
||||
libxml2 \
|
||||
))
|
||||
|
||||
$(eval $(call gb_CppunitTest_set_include,sw_uibase_wrtsh,\
|
||||
-I$(SRCDIR)/sw/inc \
|
||||
-I$(SRCDIR)/sw/source/core/inc \
|
||||
-I$(SRCDIR)/sw/source/uibase/inc \
|
||||
-I$(SRCDIR)/sw/qa/inc \
|
||||
$$(INCLUDE) \
|
||||
))
|
||||
|
||||
$(eval $(call gb_CppunitTest_use_api,sw_uibase_wrtsh,\
|
||||
udkapi \
|
||||
offapi \
|
||||
oovbaapi \
|
||||
))
|
||||
|
||||
$(eval $(call gb_CppunitTest_use_ure,sw_uibase_wrtsh))
|
||||
$(eval $(call gb_CppunitTest_use_vcl,sw_uibase_wrtsh))
|
||||
|
||||
$(eval $(call gb_CppunitTest_use_rdb,sw_uibase_wrtsh,services))
|
||||
|
||||
$(eval $(call gb_CppunitTest_use_custom_headers,sw_uibase_wrtsh,\
|
||||
officecfg/registry \
|
||||
))
|
||||
|
||||
$(eval $(call gb_CppunitTest_use_configuration,sw_uibase_wrtsh))
|
||||
|
||||
$(eval $(call gb_CppunitTest_use_uiconfigs,sw_uibase_wrtsh, \
|
||||
modules/swriter \
|
||||
))
|
||||
|
||||
$(eval $(call gb_CppunitTest_use_more_fonts,sw_uibase_wrtsh))
|
||||
|
||||
# vim: set noet sw=4 ts=4:
|
|
@ -129,6 +129,7 @@ $(eval $(call gb_Module_add_slowcheck_targets,sw,\
|
|||
CppunitTest_sw_uibase_dochdl \
|
||||
CppunitTest_sw_uibase_frmdlg \
|
||||
CppunitTest_sw_uibase_uno \
|
||||
CppunitTest_sw_uibase_wrtsh \
|
||||
CppunitTest_sw_core_accessibilitycheck \
|
||||
CppunitTest_sw_core_layout \
|
||||
CppunitTest_sw_core_fields \
|
||||
|
|
|
@ -60,6 +60,7 @@ class SwInsTableDlg;
|
|||
enum class SwBorderModes;
|
||||
enum class SwCharDlgMode;
|
||||
enum class SfxStyleFamily;
|
||||
enum class SwLineBreakClear;
|
||||
|
||||
namespace com::sun::star{
|
||||
namespace frame{
|
||||
|
@ -235,6 +236,7 @@ public:
|
|||
virtual OUString GetTemplateName() = 0;
|
||||
virtual sal_uInt16 GetKind() = 0;
|
||||
virtual ::std::optional<sal_uInt16> GetPageNumber() = 0;
|
||||
virtual std::optional<SwLineBreakClear> GetClear() = 0;
|
||||
|
||||
virtual std::shared_ptr<weld::DialogController> getDialogController() = 0;
|
||||
};
|
||||
|
|
58
sw/qa/uibase/wrtsh/wrtsh.cxx
Normal file
58
sw/qa/uibase/wrtsh/wrtsh.cxx
Normal file
|
@ -0,0 +1,58 @@
|
|||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/*
|
||||
* This file is part of the LibreOffice project.
|
||||
*
|
||||
* 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 <swmodeltestbase.hxx>
|
||||
|
||||
#include <optional>
|
||||
|
||||
#include <com/sun/star/text/XTextContent.hpp>
|
||||
#include <com/sun/star/text/XTextRange.hpp>
|
||||
|
||||
#include <rtl/ustring.hxx>
|
||||
#include <sal/types.h>
|
||||
|
||||
#include <doc.hxx>
|
||||
#include <docsh.hxx>
|
||||
#include <formatlinebreak.hxx>
|
||||
#include <wrtsh.hxx>
|
||||
|
||||
namespace
|
||||
{
|
||||
/// Covers sw/source/uibase/wrtsh/ fixes.
|
||||
class Test : public SwModelTestBase
|
||||
{
|
||||
};
|
||||
|
||||
CPPUNIT_TEST_FIXTURE(Test, testInsertLineBreak)
|
||||
{
|
||||
// Given an empty document:
|
||||
SwDoc* pDoc = createSwDoc();
|
||||
|
||||
// When inserting a clearing break:
|
||||
SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell();
|
||||
std::optional<SwLineBreakClear> oClear = SwLineBreakClear::ALL;
|
||||
pWrtShell->InsertLineBreak(oClear);
|
||||
|
||||
// Then make sure it's not just a plain linebreak:
|
||||
uno::Reference<css::text::XTextRange> xTextPortion = getRun(getParagraph(1), 1);
|
||||
auto aPortionType = getProperty<OUString>(xTextPortion, "TextPortionType");
|
||||
// Without the accompanying fix in place, this test would have failed with:
|
||||
// - Expected: LineBreak
|
||||
// - Actual : Text
|
||||
// i.e. the line break lost its "clear" property.
|
||||
CPPUNIT_ASSERT_EQUAL(OUString("LineBreak"), aPortionType);
|
||||
auto xLineBreak = getProperty<uno::Reference<text::XTextContent>>(xTextPortion, "LineBreak");
|
||||
auto eClear = getProperty<sal_Int16>(xLineBreak, "Clear");
|
||||
CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int16>(SwLineBreakClear::ALL), eClear);
|
||||
}
|
||||
}
|
||||
|
||||
CPPUNIT_PLUGIN_IMPLEMENT();
|
||||
|
||||
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|
|
@ -36,7 +36,10 @@ void SwBreakDlg::rememberResult()
|
|||
{
|
||||
nKind = 0;
|
||||
if (m_xLineBtn->get_active())
|
||||
{
|
||||
nKind = 1;
|
||||
m_eClear = static_cast<SwLineBreakClear>(m_xLineClearBox->get_active());
|
||||
}
|
||||
else if(m_xColumnBtn->get_active())
|
||||
nKind = 2;
|
||||
else if(m_xPageBtn->get_active())
|
||||
|
@ -125,6 +128,8 @@ IMPL_LINK_NOARG(SwBreakDlg, OkHdl, weld::Button&, void)
|
|||
SwBreakDlg::SwBreakDlg(weld::Window *pParent, SwWrtShell &rS)
|
||||
: GenericDialogController(pParent, "modules/swriter/ui/insertbreak.ui", "BreakDialog")
|
||||
, m_xLineBtn(m_xBuilder->weld_radio_button("linerb"))
|
||||
, m_xLineClearText(m_xBuilder->weld_label("clearft"))
|
||||
, m_xLineClearBox(m_xBuilder->weld_combo_box("clearlb"))
|
||||
, m_xColumnBtn(m_xBuilder->weld_radio_button("columnrb"))
|
||||
, m_xPageBtn(m_xBuilder->weld_radio_button("pagerb"))
|
||||
, m_xPageCollText(m_xBuilder->weld_label("styleft"))
|
||||
|
@ -189,6 +194,9 @@ void SwBreakDlg::CheckEnable()
|
|||
const bool bPage = m_xPageBtn->get_active();
|
||||
m_xPageCollText->set_sensitive(bPage);
|
||||
m_xPageCollBox->set_sensitive(bPage);
|
||||
bool bLine = m_xLineBtn->get_active();
|
||||
m_xLineClearText->set_sensitive(bLine);
|
||||
m_xLineClearBox->set_sensitive(bLine);
|
||||
|
||||
bEnable &= bPage;
|
||||
if ( bEnable )
|
||||
|
|
|
@ -87,7 +87,7 @@
|
|||
#include <mailconfigpage.hxx>
|
||||
#include <uiborder.hxx>
|
||||
#include <mmresultdialogs.hxx>
|
||||
|
||||
#include <formatlinebreak.hxx>
|
||||
|
||||
using namespace ::com::sun::star;
|
||||
using namespace css::frame;
|
||||
|
@ -386,6 +386,15 @@ sal_uInt16 AbstractSwBreakDlg_Impl:: GetKind()
|
|||
return 0;
|
||||
}
|
||||
|
||||
std::optional<SwLineBreakClear> AbstractSwBreakDlg_Impl::GetClear()
|
||||
{
|
||||
SwBreakDlg* pDlg = dynamic_cast<SwBreakDlg*>(m_xDlg.get());
|
||||
if (pDlg)
|
||||
return pDlg->GetClear();
|
||||
|
||||
return SwLineBreakClear::NONE;
|
||||
}
|
||||
|
||||
void AbstractSwConvertTableDlg_Impl::GetValues( sal_Unicode& rDelim,SwInsertTableOptions& rInsTableFlags,
|
||||
SwTableAutoFormat const*& prTAFormat)
|
||||
{
|
||||
|
|
|
@ -181,6 +181,7 @@ public:
|
|||
virtual OUString GetTemplateName() override;
|
||||
virtual sal_uInt16 GetKind() override;
|
||||
virtual ::std::optional<sal_uInt16> GetPageNumber() override;
|
||||
std::optional<SwLineBreakClear> GetClear() override;
|
||||
|
||||
virtual std::shared_ptr<weld::DialogController> getDialogController() override { return m_xDlg; }
|
||||
};
|
||||
|
|
|
@ -24,10 +24,13 @@
|
|||
#include <optional>
|
||||
|
||||
class SwWrtShell;
|
||||
enum class SwLineBreakClear;
|
||||
|
||||
class SwBreakDlg final : public weld::GenericDialogController
|
||||
{
|
||||
std::unique_ptr<weld::RadioButton> m_xLineBtn;
|
||||
std::unique_ptr<weld::Label> m_xLineClearText;
|
||||
std::unique_ptr<weld::ComboBox> m_xLineClearBox;
|
||||
std::unique_ptr<weld::RadioButton> m_xColumnBtn;
|
||||
std::unique_ptr<weld::RadioButton> m_xPageBtn;
|
||||
std::unique_ptr<weld::Label> m_xPageCollText;
|
||||
|
@ -40,6 +43,7 @@ class SwBreakDlg final : public weld::GenericDialogController
|
|||
OUString m_aTemplate;
|
||||
sal_uInt16 nKind;
|
||||
::std::optional<sal_uInt16> oPgNum;
|
||||
std::optional<SwLineBreakClear> m_eClear;
|
||||
|
||||
bool bHtmlMode;
|
||||
|
||||
|
@ -57,6 +61,7 @@ public:
|
|||
const OUString& GetTemplateName() const { return m_aTemplate; }
|
||||
sal_uInt16 GetKind() const { return nKind; }
|
||||
const ::std::optional<sal_uInt16>& GetPageNumber() const { return oPgNum; }
|
||||
std::optional<SwLineBreakClear> GetClear() const { return m_eClear; }
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -53,6 +53,7 @@ class SfxStringListItem;
|
|||
enum class SvMacroItemId : sal_uInt16;
|
||||
class SwFieldMgr;
|
||||
class SfxRequest;
|
||||
enum class SwLineBreakClear;
|
||||
|
||||
namespace i18nutil {
|
||||
struct SearchOptions2;
|
||||
|
@ -312,7 +313,7 @@ typedef bool (SwWrtShell::*FNSimpleMove)();
|
|||
|
||||
void InsertByWord( const OUString & );
|
||||
void InsertPageBreak(const OUString *pPageDesc = nullptr, const ::std::optional<sal_uInt16>& rPgNum = std::nullopt);
|
||||
void InsertLineBreak();
|
||||
void InsertLineBreak(std::optional<SwLineBreakClear> oClear = std::nullopt);
|
||||
void InsertColumnBreak();
|
||||
void InsertFootnote(const OUString &, bool bEndNote = false, bool bEdit = true );
|
||||
void SplitNode( bool bAutoFormat = false );
|
||||
|
|
|
@ -331,12 +331,13 @@ namespace {
|
|||
void InsertBreak(SwWrtShell& rWrtSh,
|
||||
sal_uInt16 nKind,
|
||||
::std::optional<sal_uInt16> oPageNumber,
|
||||
const OUString& rTemplateName)
|
||||
const OUString& rTemplateName, std::optional<SwLineBreakClear> oClear)
|
||||
{
|
||||
switch ( nKind )
|
||||
{
|
||||
case 1 :
|
||||
rWrtSh.InsertLineBreak(); break;
|
||||
rWrtSh.InsertLineBreak(oClear);
|
||||
break;
|
||||
case 2 :
|
||||
rWrtSh.InsertColumnBreak(); break;
|
||||
case 3 :
|
||||
|
@ -652,6 +653,7 @@ void SwTextShell::Execute(SfxRequest &rReq)
|
|||
if ( pItem )
|
||||
{
|
||||
::std::optional<sal_uInt16> oPageNumber;
|
||||
std::optional<SwLineBreakClear> oClear;
|
||||
OUString aTemplateName;
|
||||
sal_uInt16 nKind = static_cast<const SfxInt16Item*>(pItem)->GetValue();
|
||||
const SfxStringItem* pTemplate = rReq.GetArg<SfxStringItem>(FN_PARAM_1);
|
||||
|
@ -662,7 +664,7 @@ void SwTextShell::Execute(SfxRequest &rReq)
|
|||
if ( pNumber && pIsNumberFilled && pIsNumberFilled->GetValue() )
|
||||
oPageNumber = pNumber->GetValue();
|
||||
|
||||
InsertBreak(rWrtSh, nKind, oPageNumber, aTemplateName);
|
||||
InsertBreak(rWrtSh, nKind, oPageNumber, aTemplateName, oClear);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -678,8 +680,9 @@ void SwTextShell::Execute(SfxRequest &rReq)
|
|||
sal_uInt16 nKind = pAbstractDialog->GetKind();
|
||||
OUString aTemplateName = pAbstractDialog->GetTemplateName();
|
||||
::std::optional<sal_uInt16> oPageNumber = pAbstractDialog->GetPageNumber();
|
||||
std::optional<SwLineBreakClear> oClear = pAbstractDialog->GetClear();
|
||||
|
||||
InsertBreak(rWrtSh, nKind, oPageNumber, aTemplateName);
|
||||
InsertBreak(rWrtSh, nKind, oPageNumber, aTemplateName, oClear);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
@ -111,6 +111,7 @@
|
|||
#include <IDocumentUndoRedo.hxx>
|
||||
#include <UndoInsert.hxx>
|
||||
#include <UndoCore.hxx>
|
||||
#include <formatlinebreak.hxx>
|
||||
|
||||
using namespace sw::mark;
|
||||
using namespace com::sun::star;
|
||||
|
@ -949,7 +950,7 @@ void SwWrtShell::InsertPageBreak(const OUString *pPageDesc, const ::std::optiona
|
|||
// Insert hard page break;
|
||||
// Selections will be overwritten
|
||||
|
||||
void SwWrtShell::InsertLineBreak()
|
||||
void SwWrtShell::InsertLineBreak(std::optional<SwLineBreakClear> oClear)
|
||||
{
|
||||
if (!lcl_IsAllowed(this))
|
||||
return;
|
||||
|
@ -961,11 +962,26 @@ void SwWrtShell::InsertLineBreak()
|
|||
DelRight();
|
||||
|
||||
const sal_Unicode cIns = 0x0A;
|
||||
SwLineBreakClear eClear = SwLineBreakClear::NONE;
|
||||
if (oClear.has_value())
|
||||
{
|
||||
eClear = *oClear;
|
||||
}
|
||||
SvxAutoCorrect* pACorr = lcl_IsAutoCorr();
|
||||
if( pACorr )
|
||||
if (pACorr && eClear == SwLineBreakClear::NONE)
|
||||
AutoCorrect( *pACorr, cIns );
|
||||
else
|
||||
SwWrtShell::Insert( OUString( cIns ) );
|
||||
{
|
||||
if (eClear == SwLineBreakClear::NONE)
|
||||
{
|
||||
SwWrtShell::Insert(OUString(cIns));
|
||||
}
|
||||
else
|
||||
{
|
||||
SwFormatLineBreak aLineBreak(eClear);
|
||||
SetAttrItem(aLineBreak);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -114,6 +114,41 @@
|
|||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel" id="clearft">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="margin_top">6</property>
|
||||
<property name="label" translatable="yes" context="insertbreak|clearft">Restart Location:</property>
|
||||
<property name="use_underline">True</property>
|
||||
<property name="mnemonic_widget">clearlb</property>
|
||||
<property name="xalign">0</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkComboBoxText" id="clearlb">
|
||||
<property name="visible">True</property>
|
||||
<property name="sensitive">False</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="active">0</property>
|
||||
<items>
|
||||
<item id="0" translatable="yes" context="insertbreak|clearlb0">[None]</item>
|
||||
<item id="1" translatable="yes" context="insertbreak|clearlb1">Left</item>
|
||||
<item id="2" translatable="yes" context="insertbreak|clearlb2">Right</item>
|
||||
<item id="3" translatable="yes" context="insertbreak|clearlb3">Next Full Line</item>
|
||||
</items>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkRadioButton" id="columnrb">
|
||||
<property name="label" translatable="yes" context="insertbreak|columnrb">Column break</property>
|
||||
|
@ -132,7 +167,7 @@
|
|||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
<property name="position">3</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
|
@ -153,7 +188,7 @@
|
|||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">2</property>
|
||||
<property name="position">4</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
|
@ -169,7 +204,7 @@
|
|||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">3</property>
|
||||
<property name="position">5</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
|
@ -189,7 +224,7 @@
|
|||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">4</property>
|
||||
<property name="position">6</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
|
@ -210,7 +245,7 @@
|
|||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">5</property>
|
||||
<property name="position">7</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
|
@ -233,7 +268,7 @@
|
|||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">6</property>
|
||||
<property name="position">8</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
|
|
Loading…
Reference in a new issue