LibreOffice Module cui (master) 1
cuihyperdlg.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 * This file incorporates work covered by the following license notice:
10 *
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 */
19
20#include <sal/config.h>
21
22#include <osl/diagnose.h>
23#include <comphelper/lok.hxx>
25#include <cuihyperdlg.hxx>
26#include <hlinettp.hxx>
27#include <hlmailtp.hxx>
28#include <hldoctp.hxx>
29#include <hldocntp.hxx>
30#include <sfx2/app.hxx>
31#include <sfx2/viewfrm.hxx>
32#include <svl/eitem.hxx>
33#include <svx/svxids.hrc>
34#include <dialmgr.hxx>
35#include <strings.hrc>
36#include <vector>
37
38using ::com::sun::star::uno::Reference;
39using ::com::sun::star::frame::XFrame;
40
41
42//# #
43//# Childwindow-Wrapper-Class #
44//# #
45
46
47SvxHlinkCtrl::SvxHlinkCtrl( sal_uInt16 _nId, SfxBindings & rBindings, SvxHpLinkDlg* pDlg )
48 : SfxControllerItem ( _nId, rBindings )
49 , aRdOnlyForwarder ( SID_READONLY_MODE, *this )
50{
51 pParent = pDlg;
52}
53
55{
56 pParent = nullptr;
59}
60
62 const SfxPoolItem* pState )
63{
64 if (!(eState == SfxItemState::DEFAULT && pParent))
65 return;
66
67 switch ( nSID )
68 {
69 case SID_HYPERLINK_GETLINK :
70 {
71 pParent->SetPage( static_cast<const SvxHyperlinkItem*>(pState) );
72 }
73 break;
74 case SID_READONLY_MODE :
75 {
76 pParent->SetReadOnlyMode( static_cast<const SfxBoolItem*>(pState)->GetValue() );
77 }
78 break;
79 }
80}
81
82// tdf#90496 - remember last used view in hyperlink dialog
83OUString SvxHpLinkDlg::msRememberedPageId("internet");
84
85//# #
86//# Hyperlink - Dialog #
87//# #
89 : SfxModelessDialogController(pBindings, pChild, pParent, "cui/ui/hyperlinkdialog.ui", "HyperlinkDialog")
90 , pSet ( nullptr )
91 , maCtrl ( SID_HYPERLINK_GETLINK, *pBindings, this )
92 , mbIsHTMLDoc ( false )
93 , m_xIconCtrl(m_xBuilder->weld_notebook("tabcontrol"))
94 , m_xOKBtn(m_xBuilder->weld_button("ok"))
95 , m_xApplyBtn(m_xBuilder->weld_button("apply"))
96 , m_xCancelBtn(m_xBuilder->weld_button("cancel"))
97 , m_xHelpBtn(m_xBuilder->weld_button("help"))
98 , m_xResetBtn(m_xBuilder->weld_button("reset"))
99{
100 m_xIconCtrl->connect_enter_page( LINK ( this, SvxHpLinkDlg, ChosePageHdl_Impl ) );
101 m_xIconCtrl->show();
102
103 // ItemSet
104 if ( pSet )
105 {
106 pExampleSet.reset(new SfxItemSet( *pSet ));
107 pOutSet.reset(new SfxItemSet( *pSet->GetPool(), pSet->GetRanges() ));
108 }
109
110 // Buttons
111 m_xOKBtn->show();
112 m_xApplyBtn->show();
113 m_xCancelBtn->show();
114 m_xHelpBtn->show();
115 m_xResetBtn->show();
116
117 mbGrabFocus = true;
118
119 // set OK/Cancel - button
120 m_xCancelBtn->set_label(CuiResId(RID_CUISTR_HYPDLG_CLOSEBUT));
121
122 // create itemset for tabpages
123 mpItemSet = std::make_unique<SfxItemSetFixed<SID_HYPERLINK_GETLINK,
124 SID_HYPERLINK_SETLINK>>( SfxGetpApp()->GetPool());
125
126 SvxHyperlinkItem aItem(SID_HYPERLINK_GETLINK);
127 mpItemSet->Put(aItem);
128
129 SetInputSet (mpItemSet.get());
130
131 // insert pages
135 {
138 }
139
140 // tdf#90496 - remember last used view in hyperlink dialog
142
143 // Init Dialog
144 Start();
145
146 GetBindings().Update(SID_HYPERLINK_GETLINK);
147 GetBindings().Update(SID_READONLY_MODE);
148
149 m_xResetBtn->connect_clicked( LINK( this, SvxHpLinkDlg, ResetHdl ) );
150 m_xOKBtn->connect_clicked( LINK ( this, SvxHpLinkDlg, ClickOkHdl_Impl ) );
151 m_xApplyBtn->connect_clicked ( LINK ( this, SvxHpLinkDlg, ClickApplyHdl_Impl ) );
152}
153
155{
156 mbGrabFocus = false; // don't do any grab if tear-down moves focus around during destruction
157
158 // delete config item, so the base class (SfxModelessDialogController) can not load it on the next start
159 SvtViewOptions aViewOpt( EViewType::TabDialog, OUString::number(SID_HYPERLINK_DIALOG) );
160 aViewOpt.Delete();
161
162 mpItemSet.reset();
163
164 maCtrl.dispose();
165
166 maPageList.clear();
167
168 pRanges.reset();
169 pOutSet.reset();
170}
171
173 if (mbGrabFocus) {
174 static_cast<SvxHyperlinkTabPageBase *>(GetTabPage(GetCurPageId()))->SetInitFocus();
175 mbGrabFocus = false;
176 }
178}
179
181{
182 if (IsClosing())
183 return;
184 if (SfxViewFrame* pViewFrame = SfxViewFrame::Current())
185 pViewFrame->ToggleChildWindow(SID_HYPERLINK_DIALOG);
186}
187
189{
191
192 SvxHyperlinkTabPageBase* pCurrentPage = static_cast<SvxHyperlinkTabPageBase*>(
194
195 pCurrentPage->FillItemSet( &aItemSet );
196
197 const SvxHyperlinkItem *aItem = aItemSet.GetItem(SID_HYPERLINK_SETLINK);
198 if ( !aItem->GetURL().isEmpty() )
199 GetDispatcher()->ExecuteList(SID_HYPERLINK_SETLINK,
200 SfxCallMode::ASYNCHRON | SfxCallMode::RECORD, { aItem });
201
202 static_cast<SvxHyperlinkTabPageBase*>( GetTabPage( GetCurPageId() ) )->DoApply();
203}
204
207{
208 Apply();
209 m_xDialog->response(RET_OK);
210}
211
212/*************************************************************************
213|*
214|* Click on Apply-button
215|*
216|************************************************************************/
217IMPL_LINK_NOARG(SvxHpLinkDlg, ClickApplyHdl_Impl, weld::Button&, void)
218{
219 Apply();
220}
221
222/*************************************************************************
223|*
224|* Set Page
225|*
226|************************************************************************/
228{
229 OUString sPageId("internet");
230
231 OUString aStrURL(pItem->GetURL());
232 INetURLObject aURL(aStrURL);
233 INetProtocol eProtocolTyp = aURL.GetProtocol();
234
235 switch ( eProtocolTyp )
236 {
237 case INetProtocol::Http :
238 case INetProtocol::Ftp :
239 sPageId = "internet";
240 break;
241 case INetProtocol::File :
242 sPageId = "document";
243 break;
244 case INetProtocol::Mailto :
245 sPageId = "mail";
246 break;
247 default :
248 if (aStrURL.startsWith("#"))
249 sPageId = "document";
250 else
251 {
252 // not valid
253 sPageId = GetCurPageId();
254 }
255 break;
256 }
257
258 ShowPage (sPageId);
259
260 SvxHyperlinkTabPageBase* pCurrentPage = static_cast<SvxHyperlinkTabPageBase*>(GetTabPage( sPageId ));
261
262 mbIsHTMLDoc = (pItem->GetInsertMode() & HLINK_HTMLMODE) != 0;
263
264 IconChoicePage* pPage = GetTabPage (sPageId);
265 if(pPage)
266 {
267 SfxItemSet& aPageSet = const_cast<SfxItemSet&>(pPage->GetItemSet ());
268 aPageSet.Put ( *pItem );
269
270 pCurrentPage->Reset( aPageSet );
271 }
272}
273
274/*************************************************************************
275|*
276|* Enable/Disable ReadOnly mode
277|*
278|************************************************************************/
280{
281 m_xOKBtn->set_sensitive(!bRdOnly);
282}
283
284/*************************************************************************
285|*
286|* late-initialization of newly created pages
287|*
288|************************************************************************/
290{
291 SvxHyperlinkTabPageBase& rHyperlinkPage = dynamic_cast< SvxHyperlinkTabPageBase& >( rPage );
292 Reference< XFrame > xDocumentFrame = GetBindings().GetActiveFrame();
293 OSL_ENSURE( xDocumentFrame.is(), "SvxHpLinkDlg::PageCreated: macro assignment functionality won't work with a proper frame!" );
294 rHyperlinkPage.SetDocumentFrame( xDocumentFrame );
295}
296
297/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
SfxApplication * SfxGetpApp()
Reference< XExecutableDialog > m_xDialog
const SfxItemSet & GetItemSet() const
Definition: iconcdlg.hxx:54
void Update(sal_uInt16 nId)
css::uno::Reference< css::frame::XFrame > GetActiveFrame() const
virtual void dispose()
const SfxPoolItem * ExecuteList(sal_uInt16 nSlot, SfxCallMode nCall, std::initializer_list< SfxPoolItem const * > args, std::initializer_list< SfxPoolItem const * > internalargs=std::initializer_list< SfxPoolItem const * >())
const WhichRangesContainer & GetRanges() const
SfxItemPool * GetPool() const
const SfxPoolItem * GetItem(sal_uInt16 nWhich, bool bSearchInParent=true) const
const SfxPoolItem * Put(const SfxPoolItem &rItem, sal_uInt16 nWhich)
SfxBindings & GetBindings() const
virtual void Activate() override
SfxItemPool & GetPool() const
static SAL_WARN_UNUSED_RESULT SfxViewFrame * Current()
SfxStatusForwarder aRdOnlyForwarder
Definition: cuihyperdlg.hxx:46
SvxHlinkCtrl(sal_uInt16 nId, SfxBindings &rBindings, SvxHpLinkDlg *pDlg)
Definition: cuihyperdlg.cxx:47
virtual void dispose() override
Definition: cuihyperdlg.cxx:54
SvxHpLinkDlg * pParent
Definition: cuihyperdlg.hxx:44
virtual void StateChangedAtToolBoxControl(sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem *pState) override
Definition: cuihyperdlg.cxx:61
IconChoicePage * GetTabPage(std::u16string_view rPageId)
std::unique_ptr< weld::Button > m_xCancelBtn
Definition: cuihyperdlg.hxx:88
void Activate() override
void PageCreated(IconChoicePage &rPage)
WhichRangesContainer pRanges
Definition: cuihyperdlg.hxx:77
void SetPage(SvxHyperlinkItem const *pItem)
const OUString & GetCurPageId() const
std::unique_ptr< weld::Button > m_xApplyBtn
Definition: cuihyperdlg.hxx:87
void SetReadOnlyMode(bool bReadOnly)
std::unique_ptr< weld::Button > m_xHelpBtn
Definition: cuihyperdlg.hxx:89
SfxDispatcher * GetDispatcher() const
void Start()
Definition: iconcdlg.cxx:274
SvxHpLinkDlg(SfxBindings *pBindings, SfxChildWindow *pChild, weld::Window *pParent)
Definition: cuihyperdlg.cxx:88
std::unique_ptr< weld::Button > m_xOKBtn
Definition: cuihyperdlg.hxx:86
std::vector< std::unique_ptr< IconChoicePageData > > maPageList
Definition: cuihyperdlg.hxx:68
virtual ~SvxHpLinkDlg() override
std::unique_ptr< SfxItemSet > pOutSet
Definition: cuihyperdlg.hxx:75
virtual void Close() override
std::unique_ptr< SfxItemSet > pExampleSet
Definition: cuihyperdlg.hxx:76
void AddTabPage(const OUString &rId, CreatePage pCreateFunc)
Definition: iconcdlg.cxx:73
SvxHlinkCtrl maCtrl
Controller.
Definition: cuihyperdlg.hxx:79
static OUString msRememberedPageId
Definition: cuihyperdlg.hxx:72
std::unique_ptr< weld::Button > m_xResetBtn
Definition: cuihyperdlg.hxx:90
std::unique_ptr< weld::Notebook > m_xIconCtrl
Definition: cuihyperdlg.hxx:85
void SetInputSet(const SfxItemSet *pInSet)
Definition: iconcdlg.cxx:247
void SetCurPageId(const OUString &rId)
void ShowPage(const OUString &rId)
Definition: iconcdlg.cxx:86
const SfxItemSet * pSet
Definition: cuihyperdlg.hxx:74
std::unique_ptr< SfxItemSet > mpItemSet
Definition: cuihyperdlg.hxx:80
static std::unique_ptr< IconChoicePage > Create(weld::Container *pWindow, SvxHpLinkDlg *pDlg, const SfxItemSet *pItemSet)
Definition: hldoctp.cxx:148
static std::unique_ptr< IconChoicePage > Create(weld::Container *pWindow, SvxHpLinkDlg *pDlg, const SfxItemSet *pItemSet)
Definition: hlinettp.cxx:179
SvxLinkInsertMode GetInsertMode() const
const OUString & GetURL() const
static std::unique_ptr< IconChoicePage > Create(weld::Container *pWindow, SvxHpLinkDlg *pDlg, const SfxItemSet *pItemSet)
Definition: hlmailtp.cxx:146
static std::unique_ptr< IconChoicePage > Create(weld::Container *pWindow, SvxHpLinkDlg *pDlg, const SfxItemSet *pItemSet)
Definition: hldocntp.cxx:223
Tabpage : Basisclass.
Definition: hltpbase.hxx:47
void SetDocumentFrame(const css::uno::Reference< css::frame::XFrame > &rxDocumentFrame)
Definition: hltpbase.hxx:102
virtual void Reset(const SfxItemSet &) override
Definition: hltpbase.cxx:442
virtual bool FillItemSet(SfxItemSet *) override
Definition: hltpbase.cxx:490
IMPL_LINK_NOARG(SvxHpLinkDlg, ClickOkHdl_Impl, weld::Button &, void)
Click on OK button.
OUString CuiResId(TranslateId aKey)
Definition: cuiresmgr.cxx:23
URL aURL
virtual tools::Long GetValue() const override
HLINK_HTMLMODE
SfxItemState
INetProtocol
RET_OK