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