22 #include <tipoftheday.hrc>
29 #include <com/sun/star/frame/XDesktop2.hpp>
30 #include <com/sun/star/frame/XDispatch.hpp>
31 #include <com/sun/star/frame/XDispatchProvider.hpp>
32 #include <com/sun/star/util/URL.hpp>
33 #include <com/sun/star/util/URLTransformer.hpp>
36 #include <dialmgr.hxx>
38 #include <officecfg/Office/Common.hxx>
39 #include <osl/file.hxx>
40 #include <rtl/bootstrap.hxx>
43 #include <com/sun/star/beans/PropertyValue.hpp>
46 : GenericDialogController(pParent,
"cui/ui/tipofthedaydialog.ui",
"TipOfTheDayDialog")
47 , m_pText(m_xBuilder->weld_label(
"lbText"))
48 , m_pShowTip(m_xBuilder->weld_check_button(
"cbShowTip"))
49 , m_pNext(m_xBuilder->weld_button(
"btnNext"))
50 , m_pLink(m_xBuilder->weld_link_button(
"btnLink"))
51 , m_pPreview(new
weld::CustomWeld(*m_xBuilder,
"imPreview", m_aPreview))
53 m_pShowTip->set_active(officecfg::Office::Common::Misc::ShowTipOfTheDay::get());
56 m_nCurrentTip = officecfg::Office::Common::Misc::LastTipOfTheDayID::get();
58 const auto t0 = std::chrono::system_clock::now().time_since_epoch();
59 m_nDay = std::chrono::duration_cast<std::chrono::hours>(t0).
count() / 24;
60 if (
m_nDay > officecfg::Office::Common::Misc::LastTipOfTheDayShown::get())
68 std::shared_ptr<comphelper::ConfigurationChanges> xChanges(
70 officecfg::Office::Common::Misc::LastTipOfTheDayShown::set(
m_nDay, xChanges);
71 officecfg::Office::Common::Misc::LastTipOfTheDayID::set(
m_nCurrentTip, xChanges);
72 officecfg::Office::Common::Misc::ShowTipOfTheDay::set(
m_pShowTip->get_active(), xChanges);
78 ::osl::File aFile(fileName);
79 return aFile.open(osl_File_OpenFlag_Read) == osl::FileBase::E_None;
84 constexpr sal_Int32 nNumberOfTips =
SAL_N_ELEMENTS(TIPOFTHEDAY_STRINGARRAY);
91 .replaceFirst(
"%CURRENT", OUString::number(
m_nCurrentTip + 1))
92 .replaceFirst(
"%TOTAL", OUString::number(nNumberOfTips)));
94 auto[sTip, sLink, sImage] = TIPOFTHEDAY_STRINGARRAY[
m_nCurrentTip];
99 const OUString aMOD1 =
CuiResId(STR_CMD);
100 const OUString aMOD2 =
CuiResId(STR_Option);
102 const OUString aMOD1 =
CuiResId(STR_CTRL);
103 const OUString aMOD2 =
CuiResId(STR_Alt);
105 m_pText->set_label(
CuiResId(sTip).replaceAll(
"%MOD1", aMOD1).replaceAll(
"%MOD2", aMOD2));
112 else if (sLink.startsWith(
".uno:"))
120 const css::uno::Reference<css::frame::XDispatchProvider> xDispatchProvider(
121 xFrame, css::uno::UNO_QUERY);
122 if (xDispatchProvider.is())
124 css::util::URL aCommandURL;
125 aCommandURL.Complete = sLink;
126 const css::uno::Reference<css::uno::XComponentContext> xContext
128 const css::uno::Reference<css::util::XURLTransformer> xParser
129 = css::util::URLTransformer::create(xContext);
130 xParser->parseStrict(aCommandURL);
131 const css::uno::Reference<css::frame::XDispatch> xDisp
132 = xDispatchProvider->queryDispatch(aCommandURL, OUString(), 0);
138 const OUString aModuleName(
151 else if (sLink.startsWith(
"http"))
156 if (aLang ==
"en" || aLang ==
"pt" || aLang ==
"zh")
158 m_pLink->set_uri(aText.replaceFirst(
"%LANGUAGENAME", aLang));
171 OUString
aURL(
"$BRAND_BASE_DIR/$BRAND_SHARE_SUBDIR/tipoftheday/");
172 rtl::Bootstrap::expandMacros(aURL);
173 OUString aImageName = sImage;
175 if (aImageName.isEmpty() || !
file_exists(aURL + aImageName))
176 aImageName =
"tipoftheday.png";
184 const OUString sLink = rButton.get_uri();
185 if (sLink.startsWith(
".uno:"))
#define LINK(Instance, Class, Member)
std::shared_ptr< weld::Dialog > m_xDialog
const size_t count(pCandidateA->getBorderLines().size())
OUString ExpandVariables(const OUString &rString)
Reference< XFrame > xFrame
const OUString & getBcp47(bool bResolveSystem=true) const
std::unique_ptr< weld::Label > m_pText
CuiGraphicPreviewWindow m_aPreview
PropertiesInfo aProperties
OUString getLanguage() const
bool dispatchCommand(const OUString &rCommand, const uno::Reference< css::frame::XFrame > &rFrame, const css::uno::Sequence< css::beans::PropertyValue > &rArguments, const uno::Reference< css::frame::XDispatchResultListener > &rListener)
SfxFrame & GetFrame() const
static std::shared_ptr< ConfigurationChanges > create(css::uno::Reference< css::uno::XComponentContext > const &context=comphelper::getProcessComponentContext())
std::unique_ptr< weld::LinkButton > m_pLink
IMPL_LINK_NOARG(TipOfTheDayDialog, OnNextClick, weld::Button &, void)
#define SAL_N_ELEMENTS(arr)
static ErrCode LoadGraphic(const OUString &rPath, const OUString &rFilter, Graphic &rGraphic, GraphicFilter *pFilter=nullptr, sal_uInt16 *pDeterminedFormat=nullptr)
std::unique_ptr< weld::CheckButton > m_pShowTip
OUString GetModuleIdentifier(const Reference< frame::XFrame > &rxFrame)
static bool file_exists(const OUString &fileName)
virtual bool Start(const OUString &rHelpId, const vcl::Window *pWindow)
TipOfTheDayDialog(weld::Window *pWindow)
static OUString getUILocale()
OUString CuiResId(const char *pKey)
void SetPreview(const Graphic &rGraphic)
const css::uno::Reference< css::frame::XFrame > & GetFrameInterface() const
void response(int nResponse)
virtual ~TipOfTheDayDialog() override
Sequence< beans::PropertyValue > GetCommandProperties(const OUString &rsCommandName, const OUString &rsModuleName)
static SfxViewFrame * Current()
std::unique_ptr< weld::Button > m_pNext
IMPL_LINK(TipOfTheDayDialog, OnLinkClick, weld::LinkButton &, rButton, bool)
Reference< XComponentContext > getProcessComponentContext()
OUString GetTooltipForCommand(const OUString &rsCommandName, const css::uno::Sequence< css::beans::PropertyValue > &rProperties, const Reference< frame::XFrame > &rxFrame)