xref: /core/cui/source/options/personalization.cxx (revision ecf6f6f2)
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 #include <config_folders.h>
11 
12 #include "personalization.hxx"
13 
14 #include <dialmgr.hxx>
15 
16 #include <comphelper/processfactory.hxx>
17 #include <officecfg/Office/Common.hxx>
18 #include <rtl/bootstrap.hxx>
19 #include <tools/urlobj.hxx>
20 #include <tools/stream.hxx>
21 #include <vcl/event.hxx>
22 #include <vcl/svapp.hxx>
23 #include <vcl/settings.hxx>
24 #include <vcl/graphicfilter.hxx>
25 #include <vcl/virdev.hxx>
26 #include <personas.hrc>
27 
28 using namespace com::sun::star;
29 using namespace ::com::sun::star::beans;
30 
31 // persona
SvxPersonalizationTabPage(weld::Container * pPage,weld::DialogController * pController,const SfxItemSet & rSet)32 SvxPersonalizationTabPage::SvxPersonalizationTabPage(weld::Container* pPage,
33                                                      weld::DialogController* pController,
34                                                      const SfxItemSet& rSet)
35     : SfxTabPage(pPage, pController, u"cui/ui/personalization_tab.ui"_ustr,
36                  u"PersonalizationTabPage"_ustr, &rSet)
37     , m_xNoPersona(m_xBuilder->weld_radio_button(u"no_persona"_ustr))
38     , m_xPersonaImg(m_xBuilder->weld_widget(u"lockpersona"_ustr))
39     , m_xDefaultPersona(m_xBuilder->weld_radio_button(u"default_persona"_ustr))
40     , m_xContentGrid(m_xBuilder->weld_container(u"gridpersonasetting"_ustr))
41 {
42     for (sal_uInt32 i = 0; i < MAX_DEFAULT_PERSONAS; ++i)
43     {
44         OUString sDefaultId("default" + OUString::number(i));
45         m_vDefaultPersonaImages[i] = m_xBuilder->weld_toggle_button(sDefaultId);
46         m_vDefaultPersonaImages[i]->connect_clicked(
47             LINK(this, SvxPersonalizationTabPage, DefaultPersona));
48     }
49 
50     LoadDefaultImages();
51 }
52 
~SvxPersonalizationTabPage()53 SvxPersonalizationTabPage::~SvxPersonalizationTabPage() {}
54 
Create(weld::Container * pPage,weld::DialogController * pController,const SfxItemSet * rSet)55 std::unique_ptr<SfxTabPage> SvxPersonalizationTabPage::Create(weld::Container* pPage,
56                                                               weld::DialogController* pController,
57                                                               const SfxItemSet* rSet)
58 {
59     return std::make_unique<SvxPersonalizationTabPage>(pPage, pController, *rSet);
60 }
61 
GetAllStrings()62 OUString SvxPersonalizationTabPage::GetAllStrings()
63 {
64     OUString sAllStrings;
65     OUString radioButton[] = { u"no_persona"_ustr, u"default_persona"_ustr };
66 
67     for (const auto& radio : radioButton)
68     {
69         if (const auto& pString = m_xBuilder->weld_radio_button(radio))
70             sAllStrings += pString->get_label() + " ";
71     }
72 
73     if (const auto& pString = m_xBuilder->weld_label(u"personas_label"_ustr))
74         sAllStrings += pString->get_label() + " ";
75 
76     return sAllStrings.replaceAll("_", "");
77 }
78 
FillItemSet(SfxItemSet *)79 bool SvxPersonalizationTabPage::FillItemSet(SfxItemSet*)
80 {
81     // persona
82     OUString aPersona(u"default"_ustr);
83     if (m_xNoPersona->get_active())
84         aPersona = "no";
85 
86     bool bModified = false;
87     if (aPersona != officecfg::Office::Common::Misc::Persona::get()
88         || m_aPersonaSettings != officecfg::Office::Common::Misc::PersonaSettings::get())
89     {
90         bModified = true;
91     }
92 
93     // write
94     std::shared_ptr<comphelper::ConfigurationChanges> batch(
95         comphelper::ConfigurationChanges::create());
96     if (aPersona == "no")
97         m_aPersonaSettings.clear();
98     officecfg::Office::Common::Misc::Persona::set(aPersona, batch);
99     officecfg::Office::Common::Misc::PersonaSettings::set(m_aPersonaSettings, batch);
100     batch->commit();
101 
102     if (bModified)
103     {
104         // broadcast the change
105         DataChangedEvent aDataChanged(DataChangedEventType::SETTINGS, nullptr,
106                                       AllSettingsFlags::STYLE);
107         Application::NotifyAllWindows(aDataChanged);
108     }
109 
110     return bModified;
111 }
112 
Reset(const SfxItemSet *)113 void SvxPersonalizationTabPage::Reset(const SfxItemSet*)
114 {
115     // persona
116     OUString aPersona = officecfg::Office::Common::Misc::Persona::get();
117     m_aPersonaSettings = officecfg::Office::Common::Misc::PersonaSettings::get();
118 
119     if (aPersona == "no")
120         m_xNoPersona->set_active(true);
121     else
122         m_xDefaultPersona->set_active(true);
123 
124     if (officecfg::Office::Common::Misc::Persona::isReadOnly())
125     {
126         m_xNoPersona->set_sensitive(false);
127         m_xDefaultPersona->set_sensitive(false);
128         m_xPersonaImg->set_visible(true);
129     }
130 
131     if (officecfg::Office::Common::Misc::PersonaSettings::isReadOnly())
132         m_xContentGrid->set_sensitive(false);
133 }
134 
LoadDefaultImages()135 void SvxPersonalizationTabPage::LoadDefaultImages()
136 {
137     // Load the pre saved personas
138 
139     OUString gallery = u"$BRAND_BASE_DIR/" LIBO_SHARE_FOLDER "/gallery/personas/"_ustr;
140     rtl::Bootstrap::expandMacros(gallery);
141     OUString aPersonasList = gallery + "personas_list.txt";
142     SvFileStream aStream(aPersonasList, StreamMode::READ);
143     GraphicFilter aFilter;
144     Graphic aGraphic;
145     sal_Int32 nIndex = 0;
146     bool foundOne = false;
147 
148     OStringBuffer aLine;
149     int nLineNumberFilePersona = 0;
150     while (aStream.IsOpen() && !aStream.eof() && nIndex < MAX_DEFAULT_PERSONAS)
151     {
152         OUString aPersonaSetting, aPreviewFile, aName;
153         sal_Int32 nParseIndex = 0;
154 
155         aStream.ReadLine(aLine);
156         aPersonaSetting = OStringToOUString(aLine, RTL_TEXTENCODING_UTF8);
157         aName = CuiResId(RID_PERSONAS_COLOR[nLineNumberFilePersona].first);
158         aPreviewFile = aPersonaSetting.getToken(2, ';', nParseIndex);
159 
160         if (aPreviewFile.isEmpty())
161             break;
162 
163         m_vDefaultPersonaSettings.push_back(aPersonaSetting);
164 
165         INetURLObject aURLObj(rtl::Concat2View(gallery + aPreviewFile));
166         aFilter.ImportGraphic(aGraphic, aURLObj);
167 
168         Size aSize(aGraphic.GetSizePixel());
169         aSize.setWidth(aSize.Width() / 4);
170         aSize.setHeight(aSize.Height() / 1.5);
171         ScopedVclPtr<VirtualDevice> xVirDev
172             = m_vDefaultPersonaImages[nIndex]->create_virtual_device();
173         xVirDev->SetOutputSizePixel(aSize);
174         aGraphic.Draw(*xVirDev, Point(0, 0));
175         m_vDefaultPersonaImages[nIndex]->set_image(xVirDev.get());
176         xVirDev.disposeAndClear();
177 
178         m_vDefaultPersonaImages[nIndex]->set_tooltip_text(aName);
179         m_vDefaultPersonaImages[nIndex++]->show();
180         foundOne = true;
181         ++nLineNumberFilePersona;
182     }
183 
184     m_xDefaultPersona->set_sensitive(foundOne);
185 }
186 
IMPL_LINK(SvxPersonalizationTabPage,DefaultPersona,weld::Button &,rButton,void)187 IMPL_LINK(SvxPersonalizationTabPage, DefaultPersona, weld::Button&, rButton, void)
188 {
189     m_xDefaultPersona->set_active(true);
190     for (sal_Int32 nIndex = 0; nIndex < MAX_DEFAULT_PERSONAS; ++nIndex)
191     {
192         if (&rButton == m_vDefaultPersonaImages[nIndex].get())
193             m_aPersonaSettings = m_vDefaultPersonaSettings[nIndex];
194         else
195             m_vDefaultPersonaImages[nIndex]->set_active(false);
196     }
197 }
198 
199 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
200