tdf#162475 sc: preview style in easy format dialog

Change-Id: If9c96129daefd5100b4211c9b3b07953b603166d
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/169483
Reviewed-by: Szymon Kłos <szymon.klos@collabora.com>
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/170913
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com>
This commit is contained in:
Pranam Lashkari
2024-08-15 14:53:48 +02:00
committed by Caolán McNamara
parent cc9fbb8a5f
commit 367c2319a8
6 changed files with 164 additions and 138 deletions
+8 -113
View File
@@ -108,26 +108,6 @@ void ScCondFrmtEntry::Deselect()
mbActive = false;
}
//condition
namespace {
void FillStyleListBox( const ScDocument* pDoc, weld::ComboBox& rLbStyle )
{
std::set<OUString> aStyleNames;
SfxStyleSheetIterator aStyleIter( pDoc->GetStyleSheetPool(), SfxStyleFamily::Para );
for ( SfxStyleSheetBase* pStyle = aStyleIter.First(); pStyle; pStyle = aStyleIter.Next() )
{
aStyleNames.insert(pStyle->GetName());
}
for(const auto& rStyleName : aStyleNames)
{
rLbStyle.append_text(rStyleName);
}
}
}
const ScConditionMode ScConditionFrmtEntry::mpEntryToCond[ScConditionFrmtEntry::NUM_COND_ENTRIES]
= { ScConditionMode::Equal,
ScConditionMode::Less,
@@ -241,7 +221,7 @@ void ScConditionFrmtEntry::Init(ScCondFormatDlg* pDialogParent)
mxEdVal1->SetModifyHdl( LINK( this, ScConditionFrmtEntry, OnEdChanged ) );
mxEdVal2->SetModifyHdl( LINK( this, ScConditionFrmtEntry, OnEdChanged ) );
FillStyleListBox( mpDoc, *mxLbStyle );
ScCondFormatHelper::FillStyleListBox(mpDoc, *mxLbStyle);
mxLbStyle->connect_changed( LINK( this, ScConditionFrmtEntry, StyleSelectHdl ) );
mxLbCondType->connect_changed( LINK( this, ScConditionFrmtEntry, ConditionTypeSelectHdl ) );
@@ -437,104 +417,19 @@ void ScConditionFrmtEntry::SetInactive()
Deselect();
}
namespace {
void UpdateStyleList(weld::ComboBox& rLbStyle, const ScDocument* pDoc)
{
OUString aSelectedStyle = rLbStyle.get_active_text();
for (sal_Int32 i = rLbStyle.get_count(); i > 1; --i)
rLbStyle.remove(i - 1);
FillStyleListBox(pDoc, rLbStyle);
rLbStyle.set_active_text(aSelectedStyle);
}
}
void ScConditionFrmtEntry::Notify(SfxBroadcaster&, const SfxHint& rHint)
{
if(rHint.GetId() == SfxHintId::StyleSheetModified || rHint.GetId() == SfxHintId::StyleSheetModifiedExtended)
{
if(!mbIsInStyleCreate)
UpdateStyleList(*mxLbStyle, mpDoc);
ScCondFormatHelper::UpdateStyleList(*mxLbStyle, mpDoc);
}
}
namespace {
void StyleSelect(weld::Window* pDialogParent, weld::ComboBox& rLbStyle, const ScDocument* pDoc, SvxFontPrevWindow& rWdPreview)
{
if (rLbStyle.get_active() == 0)
{
// call new style dialog
SfxUInt16Item aFamilyItem( SID_STYLE_FAMILY, sal_uInt16(SfxStyleFamily::Para) );
SfxStringItem aRefItem( SID_STYLE_REFERENCE, ScResId(STR_STYLENAME_STANDARD) );
css::uno::Any aAny(pDialogParent->GetXWindow());
SfxUnoAnyItem aDialogParent( SID_DIALOG_PARENT, aAny );
// unlock the dispatcher so SID_STYLE_NEW can be executed
// (SetDispatcherLock would affect all Calc documents)
if (ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell())
{
if (SfxDispatcher* pDisp = pViewShell->GetDispatcher())
{
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->ExecuteList(SID_STYLE_NEW,
SfxCallMode::SYNCHRON | SfxCallMode::RECORD,
{ &aFamilyItem, &aRefItem }, { &aDialogParent });
if (bLocked)
pDisp->Lock(true);
// Find the new style and add it into the style list boxes
SfxStyleSheetIterator aStyleIter( pDoc->GetStyleSheetPool(), SfxStyleFamily::Para );
bool bFound = false;
for ( SfxStyleSheetBase* pStyle = aStyleIter.First(); pStyle && !bFound; pStyle = aStyleIter.Next() )
{
const OUString& aName = pStyle->GetName();
if (rLbStyle.find_text(aName) == -1) // all lists contain the same entries
{
for( sal_Int32 i = 1, n = rLbStyle.get_count(); i <= n && !bFound; ++i)
{
OUString aStyleName = ScGlobal::getCharClass().uppercase(rLbStyle.get_text(i));
if( i == n )
{
rLbStyle.append_text(aName);
rLbStyle.set_active_text(aName);
bFound = true;
}
else if( aStyleName > ScGlobal::getCharClass().uppercase(aName) )
{
rLbStyle.insert_text(i, aName);
rLbStyle.set_active_text(aName);
bFound = true;
}
}
}
}
}
}
}
OUString aStyleName = rLbStyle.get_active_text();
SfxStyleSheetBase* pStyleSheet = pDoc->GetStyleSheetPool()->Find( aStyleName, SfxStyleFamily::Para );
if(pStyleSheet)
{
const SfxItemSet& rSet = pStyleSheet->GetItemSet();
rWdPreview.SetFromItemSet(rSet, false);
}
}
}
IMPL_LINK_NOARG(ScConditionFrmtEntry, StyleSelectHdl, weld::ComboBox&, void)
{
mbIsInStyleCreate = true;
StyleSelect(mpParent->GetFrameWeld(), *mxLbStyle, mpDoc, maWdPreview);
ScCondFormatHelper::StyleSelect(mpParent->GetFrameWeld(), *mxLbStyle, mpDoc, maWdPreview);
mbIsInStyleCreate = false;
}
@@ -576,13 +471,13 @@ void ScFormulaFrmtEntry::Init(ScCondFormatDlg* pDialogParent)
{
mxEdFormula->SetGetFocusHdl( LINK( pDialogParent, ScCondFormatDlg, RangeGetFocusHdl ) );
FillStyleListBox( mpDoc, *mxLbStyle );
ScCondFormatHelper::FillStyleListBox(mpDoc, *mxLbStyle);
mxLbStyle->connect_changed( LINK( this, ScFormulaFrmtEntry, StyleSelectHdl ) );
}
IMPL_LINK_NOARG(ScFormulaFrmtEntry, StyleSelectHdl, weld::ComboBox&, void)
{
StyleSelect(mpParent->GetFrameWeld(), *mxLbStyle, mpDoc, maWdPreview);
ScCondFormatHelper::StyleSelect(mpParent->GetFrameWeld(), *mxLbStyle, mpDoc, maWdPreview);
}
ScFormatEntry* ScFormulaFrmtEntry::createFormulaEntry() const
@@ -1292,7 +1187,7 @@ void ScDateFrmtEntry::Init()
mxLbDateEntry->set_active(0);
mxLbType->set_active(3);
FillStyleListBox( mpDoc, *mxLbStyle );
ScCondFormatHelper::FillStyleListBox(mpDoc, *mxLbStyle);
mxLbStyle->connect_changed( LINK( this, ScDateFrmtEntry, StyleSelectHdl ) );
mxLbStyle->set_active(1);
}
@@ -1322,7 +1217,7 @@ void ScDateFrmtEntry::Notify( SfxBroadcaster&, const SfxHint& rHint )
if(rHint.GetId() == SfxHintId::StyleSheetModified || rHint.GetId() == SfxHintId::StyleSheetModifiedExtended)
{
if(!mbIsInStyleCreate)
UpdateStyleList(*mxLbStyle, mpDoc);
ScCondFormatHelper::UpdateStyleList(*mxLbStyle, mpDoc);
}
}
@@ -1344,7 +1239,7 @@ OUString ScDateFrmtEntry::GetExpressionString()
IMPL_LINK_NOARG( ScDateFrmtEntry, StyleSelectHdl, weld::ComboBox&, void )
{
mbIsInStyleCreate = true;
StyleSelect(mpParent->GetFrameWeld(), *mxLbStyle, mpDoc, maWdPreview);
ScCondFormatHelper::StyleSelect(mpParent->GetFrameWeld(), *mxLbStyle, mpDoc, maWdPreview);
mbIsInStyleCreate = false;
}
+13 -25
View File
@@ -6,32 +6,10 @@
#include <scresid.hxx>
#include <svl/style.hxx>
#include <strings.hrc>
#include <condformathelper.hxx>
namespace
{
void FillStyleListBox(const ScDocument* pDocument, weld::ComboBox& rCombo)
{
std::set<OUString> aStyleNames;
SfxStyleSheetIterator aStyleIter(pDocument->GetStyleSheetPool(), SfxStyleFamily::Para);
for (SfxStyleSheetBase* pStyle = aStyleIter.First(); pStyle; pStyle = aStyleIter.Next())
{
aStyleNames.insert(pStyle->GetName());
}
for (const auto& rStyleName : aStyleNames)
{
rCombo.append_text(rStyleName);
}
}
void UpdateStyleList(const ScDocument* pDocument, weld::ComboBox& rCombo)
{
OUString sSelectedStyle = rCombo.get_active_text();
for (sal_Int32 i = rCombo.get_count(); i > 1; --i)
rCombo.remove(i - 1);
FillStyleListBox(pDocument, rCombo);
rCombo.set_active_text(sSelectedStyle);
}
condformat::ScCondFormatDateType GetScCondFormatDateType(ScConditionMode mode)
{
switch (mode)
@@ -82,6 +60,7 @@ ConditionalFormatEasyDialog::ConditionalFormatEasyDialog(SfxBindings* pBindings,
: ScAnyRefDlgController(pBindings, pChildWindow, pParent,
u"modules/scalc/ui/conditionaleasydialog.ui"_ustr,
u"CondFormatEasyDlg"_ustr)
, mpParent(pParent)
, mpViewData(pViewData)
, mpDocument(&mpViewData->GetDocument())
, mbIsManaged(false)
@@ -91,6 +70,8 @@ ConditionalFormatEasyDialog::ConditionalFormatEasyDialog(SfxBindings* pBindings,
, mxRangeEntry(new formula::RefEdit(m_xBuilder->weld_entry(u"entryRange"_ustr)))
, mxButtonRangeEdit(new formula::RefButton(m_xBuilder->weld_button(u"rbassign"_ustr)))
, mxStyles(m_xBuilder->weld_combo_box(u"themeCombo"_ustr))
, mxWdPreviewWin(m_xBuilder->weld_widget("previewwin"))
, mxWdPreview(new weld::CustomWeld(*m_xBuilder, "preview", maWdPreview))
, mxDescription(m_xBuilder->weld_label(u"description"_ustr))
, mxButtonOk(m_xBuilder->weld_button(u"ok"_ustr))
, mxButtonCancel(m_xBuilder->weld_button(u"cancel"_ustr))
@@ -262,6 +243,7 @@ ConditionalFormatEasyDialog::ConditionalFormatEasyDialog(SfxBindings* pBindings,
mxButtonOk->connect_clicked(LINK(this, ConditionalFormatEasyDialog, ButtonPressed));
mxButtonCancel->connect_clicked(LINK(this, ConditionalFormatEasyDialog, ButtonPressed));
mxStyles->connect_changed(LINK(this, ConditionalFormatEasyDialog, StyleSelectHdl));
ScRangeList aRange;
mpViewData->GetMarkData().FillRangeListWithMarks(&aRange, false);
@@ -277,9 +259,10 @@ ConditionalFormatEasyDialog::ConditionalFormatEasyDialog(SfxBindings* pBindings,
mxRangeEntry->SetText(sRangeString);
StartListening(*mpDocument->GetStyleSheetPool(), DuplicateHandling::Prevent);
FillStyleListBox(mpDocument, *mxStyles);
ScCondFormatHelper::FillStyleListBox(mpDocument, *mxStyles);
mxStyles->set_active(1);
mxWdPreviewWin->show();
}
ConditionalFormatEasyDialog::~ConditionalFormatEasyDialog()
@@ -295,7 +278,7 @@ void ConditionalFormatEasyDialog::Notify(SfxBroadcaster&, const SfxHint& rHint)
{
if (rHint.GetId() == SfxHintId::StyleSheetModified
|| rHint.GetId() == SfxHintId::StyleSheetModifiedExtended)
UpdateStyleList(mpDocument, *mxStyles);
ScCondFormatHelper::UpdateStyleList(*mxStyles, mpDocument);
}
void ConditionalFormatEasyDialog::SetReference(const ScRange& rRange, ScDocument&)
@@ -393,4 +376,9 @@ IMPL_LINK(ConditionalFormatEasyDialog, ButtonPressed, weld::Button&, rButton, vo
m_xDialog->response(RET_CANCEL);
}
IMPL_LINK_NOARG(ConditionalFormatEasyDialog, StyleSelectHdl, weld::ComboBox&, void)
{
ScCondFormatHelper::StyleSelect(mpParent, *mxStyles, &(mpViewData->GetDocument()), maWdPreview);
}
} // namespace sc
@@ -15,6 +15,14 @@
#include <globstr.hrc>
#include <scresid.hxx>
#include <conditio.hxx>
#include <stlpool.hxx>
#include <svl/lstner.hxx>
#include <svl/stritem.hxx>
#include <svl/intitem.hxx>
#include <sfx2/dispatch.hxx>
#include <sfx2/frame.hxx>
#include <tabvwsh.hxx>
#include <svx/fntctrl.hxx>
namespace {
@@ -222,4 +230,98 @@ OUString ScCondFormatHelper::GetExpression( ScCondFormatEntryType eType, sal_Int
return aBuffer.makeStringAndClear();
}
void ScCondFormatHelper::StyleSelect(weld::Window* pDialogParent, weld::ComboBox& rLbStyle,
const ScDocument* pDoc, SvxFontPrevWindow& rWdPreview)
{
if (rLbStyle.get_active() == 0)
{
// call new style dialog
SfxUInt16Item aFamilyItem(SID_STYLE_FAMILY, sal_uInt16(SfxStyleFamily::Para));
SfxStringItem aRefItem(SID_STYLE_REFERENCE, ScResId(STR_STYLENAME_STANDARD));
css::uno::Any aAny(pDialogParent->GetXWindow());
SfxUnoAnyItem aDialogParent(SID_DIALOG_PARENT, aAny);
// unlock the dispatcher so SID_STYLE_NEW can be executed
// (SetDispatcherLock would affect all Calc documents)
if (ScTabViewShell* pViewShell = ScTabViewShell::GetActiveViewShell())
{
if (SfxDispatcher* pDisp = pViewShell->GetDispatcher())
{
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->ExecuteList(SID_STYLE_NEW, SfxCallMode::SYNCHRON | SfxCallMode::RECORD,
{ &aFamilyItem, &aRefItem }, { &aDialogParent });
if (bLocked)
pDisp->Lock(true);
// Find the new style and add it into the style list boxes
SfxStyleSheetIterator aStyleIter(pDoc->GetStyleSheetPool(), SfxStyleFamily::Para);
bool bFound = false;
for (SfxStyleSheetBase* pStyle = aStyleIter.First(); pStyle && !bFound;
pStyle = aStyleIter.Next())
{
const OUString& aName = pStyle->GetName();
if (rLbStyle.find_text(aName) == -1) // all lists contain the same entries
{
for (sal_Int32 i = 1, n = rLbStyle.get_count(); i <= n && !bFound; ++i)
{
OUString aStyleName
= ScGlobal::getCharClass().uppercase(rLbStyle.get_text(i));
if (i == n)
{
rLbStyle.append_text(aName);
rLbStyle.set_active_text(aName);
bFound = true;
}
else if (aStyleName > ScGlobal::getCharClass().uppercase(aName))
{
rLbStyle.insert_text(i, aName);
rLbStyle.set_active_text(aName);
bFound = true;
}
}
}
}
}
}
}
OUString aStyleName = rLbStyle.get_active_text();
SfxStyleSheetBase* pStyleSheet
= pDoc->GetStyleSheetPool()->Find(aStyleName, SfxStyleFamily::Para);
if (pStyleSheet)
{
const SfxItemSet& rSet = pStyleSheet->GetItemSet();
rWdPreview.SetFromItemSet(rSet, false);
}
}
void ScCondFormatHelper::FillStyleListBox(const ScDocument* pDocument, weld::ComboBox& rCombo)
{
std::set<OUString> aStyleNames;
SfxStyleSheetIterator aStyleIter(pDocument->GetStyleSheetPool(), SfxStyleFamily::Para);
for (SfxStyleSheetBase* pStyle = aStyleIter.First(); pStyle; pStyle = aStyleIter.Next())
{
aStyleNames.insert(pStyle->GetName());
}
for (const auto& rStyleName : aStyleNames)
{
rCombo.append_text(rStyleName);
}
}
void ScCondFormatHelper::UpdateStyleList(weld::ComboBox& rLbStyle, const ScDocument* pDoc)
{
OUString aSelectedStyle = rLbStyle.get_active_text();
for (sal_Int32 i = rLbStyle.get_count(); i > 1; --i)
rLbStyle.remove(i - 1);
ScCondFormatHelper::FillStyleListBox(pDoc, rLbStyle);
rLbStyle.set_active_text(aSelectedStyle);
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
+6
View File
@@ -12,6 +12,7 @@
#include "anyrefdg.hxx"
#include <svl/lstner.hxx>
#include <conditio.hxx>
#include <svx/fntctrl.hxx>
class ScViewData;
class ScConditionalFormat;
@@ -32,10 +33,12 @@ public:
virtual void Notify(SfxBroadcaster&, const SfxHint&) override;
DECL_LINK(ButtonPressed, weld::Button&, void);
DECL_LINK(StyleSelectHdl, weld::ComboBox&, void);
private:
void SetDescription(std::u16string_view rCondition);
weld::Window* mpParent;
ScViewData* mpViewData;
ScDocument* mpDocument;
ScConditionMode meMode;
@@ -43,12 +46,15 @@ private:
OUString msFormula;
ScAddress maPosition;
SvxFontPrevWindow maWdPreview;
std::unique_ptr<weld::Entry> mxNumberEntry;
std::unique_ptr<weld::Entry> mxNumberEntry2;
std::unique_ptr<weld::Container> mxAllInputs;
std::unique_ptr<formula::RefEdit> mxRangeEntry;
std::unique_ptr<formula::RefButton> mxButtonRangeEdit;
std::unique_ptr<weld::ComboBox> mxStyles;
std::unique_ptr<weld::Widget> mxWdPreviewWin;
std::unique_ptr<weld::CustomWeld> mxWdPreview;
std::unique_ptr<weld::Label> mxDescription;
std::unique_ptr<weld::Button> mxButtonOk;
std::unique_ptr<weld::Button> mxButtonCancel;
+5
View File
@@ -11,6 +11,7 @@
#include <rtl/ustring.hxx>
#include <address.hxx>
#include <svx/fntctrl.hxx>
class ScConditionalFormat;
@@ -31,6 +32,10 @@ public:
static SC_DLLPUBLIC OUString GetExpression( ScCondFormatEntryType eType, sal_Int32 nIndex,
std::u16string_view aStr1 = std::u16string_view(), std::u16string_view aStr2 = std::u16string_view() );
static SC_DLLPUBLIC void StyleSelect(weld::Window* pDialogParent, weld::ComboBox& rLbStyle,
const ScDocument* pDoc, SvxFontPrevWindow& rWdPreview);
static SC_DLLPUBLIC void FillStyleListBox(const ScDocument* pDocument, weld::ComboBox& rCombo);
static SC_DLLPUBLIC void UpdateStyleList(weld::ComboBox& rLbStyle, const ScDocument* pDoc);
};
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
@@ -176,6 +176,9 @@
<object class="GtkComboBoxText" id="themeCombo">
<property name="visible">True</property>
<property name="can-focus">False</property>
<items>
<item translatable="yes" context="conditionaleasydialog|style">New Style...</item>
</items>
<accessibility>
<relation type="labelled-by" target="with"/>
</accessibility>
@@ -290,6 +293,33 @@
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow" id="previewwin">
<property name="can-focus">True</property>
<property name="no-show-all">True</property>
<property name="hscrollbar-policy">never</property>
<property name="vscrollbar-policy">never</property>
<property name="shadow-type">in</property>
<child>
<object class="GtkViewport">
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
<object class="GtkDrawingArea" id="preview">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="tooltip-text" translatable="yes" context="conditionaleasydialog|preview|tooltip_text">Example</property>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>