LibreOffice Module sw (master)  1
StylePresetsPanel.cxx
Go to the documentation of this file.
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  */
10 
11 #include <sal/config.h>
12 
13 #include "StylePresetsPanel.hxx"
14 
15 #include <vcl/image.hxx>
16 #include <vcl/virdev.hxx>
17 #include <vcl/svapp.hxx>
18 
19 #include <sfx2/objsh.hxx>
21 
22 #include <com/sun/star/lang/IllegalArgumentException.hpp>
23 
24 #include <sfx2/doctempl.hxx>
25 
26 #include <shellio.hxx>
27 #include <docsh.hxx>
28 
29 #include <sfx2/docfile.hxx>
30 
31 namespace sw::sidebar {
32 
33 namespace {
34 
35 void renderPreview(sfx2::StyleManager* pStyleManager, OutputDevice& aOutputDevice,
36  std::u16string_view sName, sal_Int32 nHeight, tools::Rectangle const & aRect)
37 {
38  SfxStyleSheetBase* pStyleSheet = pStyleManager->Search(sName, SfxStyleFamily::Para);
39 
40  if (pStyleSheet)
41  {
42  std::unique_ptr<sfx2::StylePreviewRenderer> pStylePreviewRenderer
43  = pStyleManager->CreateStylePreviewRenderer(aOutputDevice, pStyleSheet, nHeight);
44  pStylePreviewRenderer->recalculate();
45  pStylePreviewRenderer->render(aRect, sfx2::StylePreviewRenderer::RenderAlign::TOP);
46  }
47 }
48 
49 BitmapEx GenerateStylePreview(SfxObjectShell& rSource, OUString const & aName)
50 {
51  sfx2::StyleManager* pStyleManager = rSource.GetStyleManager();
52 
54 
55  float fScalingFactor = pVirtualDev->GetDPIScaleFactor();
56 
57  sal_Int32 nMargin = 6 * fScalingFactor;
58 
59  sal_Int32 nPreviewWidth = 144 * fScalingFactor;
60 
61  sal_Int32 nNameHeight = 16 * fScalingFactor;
62  sal_Int32 nTitleHeight = 32 * fScalingFactor;
63  sal_Int32 nHeadingHeight = 24 * fScalingFactor;
64  sal_Int32 nTextBodyHeight = 16 * fScalingFactor;
65  sal_Int32 nBottomMargin = 2 * fScalingFactor;
66 
67  sal_Int32 nNameFontSize = 12 * fScalingFactor;
68 
69  sal_Int32 nPreviewHeight = nNameHeight + nTitleHeight + nHeadingHeight + nTextBodyHeight + nBottomMargin;
70 
71  Size aSize(nPreviewWidth, nPreviewHeight);
72 
73  pVirtualDev->SetOutputSizePixel(aSize);
74 
75  pVirtualDev->SetLineColor(COL_LIGHTGRAY);
76  pVirtualDev->SetFillColor();
77 
78  tools::Long y = 0;
79  {
80  pVirtualDev->SetFillColor(COL_LIGHTGRAY);
81  tools::Rectangle aNameRect(0, y, nPreviewWidth, nNameHeight);
82  pVirtualDev->DrawRect(aNameRect);
83 
84  vcl::Font aFont;
85  aFont.SetFontSize(Size(0, nNameFontSize));
86 
87  pVirtualDev->SetFont(aFont);
88 
89  Size aTextSize(pVirtualDev->GetTextWidth(aName), pVirtualDev->GetTextHeight());
90 
91  Point aPoint((aNameRect.GetWidth() / 2.0) - (aTextSize.Width() / 2.0),
92  y + (aNameRect.GetHeight() / 2.0) - (aTextSize.Height() / 2.0));
93 
94  pVirtualDev->DrawText(aPoint, aName);
95 
96  y += nNameHeight;
97  }
98 
99  {
100  tools::Rectangle aRenderRect(Point(nMargin, y), aSize);
101  renderPreview(pStyleManager, *pVirtualDev, u"Title", nTitleHeight, aRenderRect);
102  y += nTitleHeight;
103  }
104 
105  {
106  tools::Rectangle aRenderRect(Point(nMargin, y), aSize);
107  renderPreview(pStyleManager, *pVirtualDev, u"Heading 1", nHeadingHeight, aRenderRect);
108  y += nHeadingHeight;
109  }
110  {
111  tools::Rectangle aRenderRect(Point(nMargin, y), aSize);
112  renderPreview(pStyleManager, *pVirtualDev, u"Text Body", nTextBodyHeight, aRenderRect);
113  }
114 
115  return pVirtualDev->GetBitmapEx(Point(), aSize);
116 }
117 
118 BitmapEx CreatePreview(OUString const & aUrl, OUString const & aName)
119 {
120  SfxMedium aMedium(aUrl, StreamMode::STD_READWRITE);
121  SfxObjectShell* pObjectShell = SfxObjectShell::Current();
122  SfxObjectShellLock xTemplDoc = SfxObjectShell::CreateObjectByFactoryName(pObjectShell->GetFactory().GetFactoryName(), SfxObjectCreateMode::ORGANIZER);
123  xTemplDoc->DoInitNew();
124  if (xTemplDoc->LoadFrom(aMedium))
125  {
126  return GenerateStylePreview(*xTemplDoc, aName);
127  }
128  return BitmapEx();
129 }
130 
131 }
132 
133 std::unique_ptr<PanelLayout> StylePresetsPanel::Create(weld::Widget* pParent)
134 {
135  if (pParent == nullptr)
136  throw css::lang::IllegalArgumentException("no parent Window given to StylePresetsPanel::Create", nullptr, 0);
137 
138  return std::make_unique<StylePresetsPanel>(pParent);
139 }
140 
142  : PanelLayout(pParent, "StylePresetsPanel", "modules/swriter/ui/sidebarstylepresets.ui")
143  , mxValueSet(new ValueSet(nullptr))
144  , mxValueSetWin(new weld::CustomWeld(*m_xBuilder, "valueset", *mxValueSet))
145 {
146  mxValueSet->SetColCount(2);
147 
148  mxValueSet->SetDoubleClickHdl(LINK(this, StylePresetsPanel, DoubleClickHdl));
149 
150  RefreshList();
151 }
152 
154 {
155  SfxDocumentTemplates aTemplates;
156  sal_uInt16 nCount = aTemplates.GetRegionCount();
157  for (sal_uInt16 i = 0; i < nCount; ++i)
158  {
159  OUString aRegionName(aTemplates.GetFullRegionName(i));
160  if (aRegionName == "Styles")
161  {
162  for (sal_uInt16 j = 0; j < aTemplates.GetCount(i); ++j)
163  {
164  OUString aName = aTemplates.GetName(i,j);
165  OUString aURL = aTemplates.GetPath(i,j);
166  BitmapEx aPreview = CreatePreview(aURL, aName);
167  sal_uInt16 nId = j + 1;
168  mxValueSet->InsertItem(nId, Image(aPreview), aName);
169  maTemplateEntries.push_back(std::make_unique<TemplateEntry>(aURL));
170  mxValueSet->SetItemData(nId, maTemplateEntries.back().get());
171  }
172  mxValueSet->SetOptimalSize();
173  }
174  }
175 }
176 
178 {
179 }
180 
182 {
183  sal_Int32 nItemId = mxValueSet->GetSelectedItemId();
184  TemplateEntry* pEntry = static_cast<TemplateEntry*>(mxValueSet->GetItemData(nItemId));
185 
186  SwDocShell* pDocSh = static_cast<SwDocShell*>(SfxObjectShell::Current());
187  if (pDocSh)
188  {
189  SwgReaderOption aOption;
190  aOption.SetTextFormats(true);
191  aOption.SetNumRules(true);
192  pDocSh->LoadStylesFromFile(pEntry->maURL, aOption, false);
193  }
194 }
195 
196 void StylePresetsPanel::NotifyItemUpdate(const sal_uInt16 /*nSId*/,
197  const SfxItemState /*eState*/,
198  const SfxPoolItem* /*pState*/)
199 {
200 }
201 
202 } // end of namespace ::sw::sidebar
203 
204 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
tools::Long const nBottomMargin
URL aURL
virtual SfxObjectFactory & GetFactory() const =0
void SetFontSize(const Size &)
OUString GetPath(sal_uInt16 nRegion, sal_uInt16 nIdx) const
const OUString & GetFactoryName() const
long Long
sal_Int16 nId
static SfxObjectShell * Current()
virtual sfx2::StyleManager * GetStyleManager()
std::vector< std::unique_ptr< TemplateEntry > > maTemplateEntries
void SetTextFormats(const bool bNew)
Definition: shellio.hxx:126
sal_uInt16 GetRegionCount() const
static OutputDevice * GetDefaultDevice()
int nCount
std::unique_ptr< ValueSet > mxValueSet
float y
int i
static SfxObjectShell * CreateObjectByFactoryName(const OUString &rURL, SfxObjectCreateMode=SfxObjectCreateMode::STANDARD)
virtual bool LoadFrom(SfxMedium &rMedium)
sal_uInt16 GetCount(sal_uInt16 nRegion) const
static std::unique_ptr< PanelLayout > Create(weld::Widget *pParent)
IMPL_LINK_NOARG(PageColumnControl, MoreButtonClickHdl_Impl, weld::Button &, void)
virtual void NotifyItemUpdate(const sal_uInt16 nSId, const SfxItemState eState, const SfxPoolItem *pState) override
ErrCode LoadStylesFromFile(const OUString &rURL, SwgReaderOption &rOpt, bool bUnoCall)
Definition: docsh2.cxx:1548
SfxItemState
StylePresetsPanel(weld::Widget *pParent)
SfxStyleSheetBase * Search(std::u16string_view rStyleName, SfxStyleFamily eFamily)
bool DoInitNew(SfxMedium *pMedium=nullptr)
OUString GetFullRegionName(sal_uInt16 nIdx) const
OUString GetName(sal_uInt16 nRegion, sal_uInt16 nIdx) const
void SetNumRules(const bool bNew)
Definition: shellio.hxx:129
virtual std::unique_ptr< StylePreviewRenderer > CreateStylePreviewRenderer(OutputDevice &rOutputDev, SfxStyleSheetBase *pStyle, tools::Long nMaxHeight)=0