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>
24 #include <unotools/viewoptions.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 
38 using ::com::sun::star::uno::Reference;
39 using ::com::sun::star::frame::XFrame;
40 
41 
42 //# #
43 //# Childwindow-Wrapper-Class #
44 //# #
45 
46 
47 SvxHlinkCtrl::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 
61 void SvxHlinkCtrl::StateChanged( sal_uInt16 nSID, SfxItemState eState,
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 //# #
83 //# Hyperlink - Dialog #
84 //# #
86  : SfxModelessDialogController(pBindings, pChild, pParent, "cui/ui/hyperlinkdialog.ui", "HyperlinkDialog")
87  , pSet ( nullptr )
88  , pExampleSet ( nullptr )
89  , maCtrl ( SID_HYPERLINK_GETLINK, *pBindings, this )
90  , mbIsHTMLDoc ( false )
91  , m_xIconCtrl(m_xBuilder->weld_notebook("tabcontrol"))
92  , m_xOKBtn(m_xBuilder->weld_button("ok"))
93  , m_xApplyBtn(m_xBuilder->weld_button("apply"))
94  , m_xCancelBtn(m_xBuilder->weld_button("cancel"))
95  , m_xHelpBtn(m_xBuilder->weld_button("help"))
96  , m_xResetBtn(m_xBuilder->weld_button("reset"))
97 {
98  m_xIconCtrl->connect_enter_page( LINK ( this, SvxHpLinkDlg, ChosePageHdl_Impl ) );
99  m_xIconCtrl->show();
100 
101  // ItemSet
102  if ( pSet )
103  {
104  pExampleSet = new SfxItemSet( *pSet );
105  pOutSet.reset(new SfxItemSet( *pSet->GetPool(), pSet->GetRanges() ));
106  }
107 
108  // Buttons
109  m_xOKBtn->show();
110  m_xApplyBtn->show();
111  m_xCancelBtn->show();
112  m_xHelpBtn->show();
113  m_xResetBtn->show();
114 
115  mbGrabFocus = true;
116 
117  // set OK/Cancel - button
118  m_xCancelBtn->set_label(CuiResId(RID_SVXSTR_HYPDLG_CLOSEBUT));
119 
120  // create itemset for tabpages
121  mpItemSet = std::make_unique<SfxItemSet>( SfxGetpApp()->GetPool(), svl::Items<SID_HYPERLINK_GETLINK,
122  SID_HYPERLINK_SETLINK>{} );
123 
124  SvxHyperlinkItem aItem(SID_HYPERLINK_GETLINK);
125  mpItemSet->Put(aItem);
126 
127  SetInputSet (mpItemSet.get());
128 
129  // insert pages
133  {
136  }
137 
138  SetCurPageId("internet");
139 
140  // Init Dialog
141  Start();
142 
143  GetBindings().Update(SID_HYPERLINK_GETLINK);
144  GetBindings().Update(SID_READONLY_MODE);
145 
146  m_xResetBtn->connect_clicked( LINK( this, SvxHpLinkDlg, ResetHdl ) );
147  m_xOKBtn->connect_clicked( LINK ( this, SvxHpLinkDlg, ClickOkHdl_Impl ) );
148  m_xApplyBtn->connect_clicked ( LINK ( this, SvxHpLinkDlg, ClickApplyHdl_Impl ) );
149 }
150 
152 {
153  // delete config item, so the base class (SfxModelessDialogController) can not load it on the next start
154  SvtViewOptions aViewOpt( EViewType::TabDialog, OUString::number(SID_HYPERLINK_DIALOG) );
155  aViewOpt.Delete();
156 
157  mpItemSet.reset();
158 
159  maCtrl.dispose();
160 
161  maPageList.clear();
162 
163  pRanges.reset();
164  pOutSet.reset();
165 }
166 
168  if (mbGrabFocus) {
169  static_cast<SvxHyperlinkTabPageBase *>(GetTabPage(GetCurPageId()))->SetInitFocus();
170  mbGrabFocus = false;
171  }
173 }
174 
176 {
177  if (IsClosing())
178  return;
179  SfxViewFrame* pViewFrame = SfxViewFrame::Current();
180  if (pViewFrame)
181  pViewFrame->ToggleChildWindow(SID_HYPERLINK_DIALOG);
182 }
183 
185 {
186  SfxItemSet aItemSet( SfxGetpApp()->GetPool(), svl::Items<SID_HYPERLINK_GETLINK,
187  SID_HYPERLINK_SETLINK>{} );
188 
189  SvxHyperlinkTabPageBase* pCurrentPage = static_cast<SvxHyperlinkTabPageBase*>(
190  GetTabPage( GetCurPageId() ) );
191 
192  if ( pCurrentPage->AskApply() )
193  {
194  pCurrentPage->FillItemSet( &aItemSet );
195 
196  const SvxHyperlinkItem *aItem = aItemSet.GetItem(SID_HYPERLINK_SETLINK);
197  if ( !aItem->GetURL().isEmpty() )
198  GetDispatcher()->ExecuteList(SID_HYPERLINK_SETLINK,
199  SfxCallMode::ASYNCHRON | SfxCallMode::RECORD, { aItem });
200 
201  static_cast<SvxHyperlinkTabPageBase*>( GetTabPage( GetCurPageId() ) )->DoApply();
202  }
203 }
204 
206 IMPL_LINK_NOARG(SvxHpLinkDlg, ClickOkHdl_Impl, weld::Button&, void)
207 {
208  Apply();
209  m_xDialog->response(RET_OK);
210 }
211 
212 /*************************************************************************
213 |*
214 |* Click on Apply-button
215 |*
216 |************************************************************************/
217 IMPL_LINK_NOARG(SvxHpLinkDlg, ClickApplyHdl_Impl, weld::Button&, void)
218 {
219  Apply();
220 }
221 
222 /*************************************************************************
223 |*
224 |* Set Page
225 |*
226 |************************************************************************/
228 {
229  OString 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 |************************************************************************/
279 void SvxHpLinkDlg::SetReadOnlyMode( bool bRdOnly )
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: */
SvxHlinkCtrl maCtrl
Controller.
Definition: cuihyperdlg.hxx:77
void SetPage(SvxHyperlinkItem const *pItem)
std::unique_ptr< weld::Button > m_xHelpBtn
Definition: cuihyperdlg.hxx:87
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 * >())
URL aURL
void SetCurPageId(const OString &rId)
virtual void StateChanged(sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem *pState) override
Definition: cuihyperdlg.cxx:61
std::string GetValue
virtual void dispose() override
Definition: cuihyperdlg.cxx:54
OString GetCurPageId() const
virtual bool FillItemSet(SfxItemSet *) override
Definition: hltpbase.cxx:473
css::uno::Reference< css::frame::XFrame > GetActiveFrame() const
virtual void Close() override
void Start()
Definition: iconcdlg.cxx:274
SfxItemSet * pExampleSet
Definition: cuihyperdlg.hxx:74
static std::unique_ptr< IconChoicePage > Create(weld::Container *pWindow, SvxHpLinkDlg *pDlg, const SfxItemSet *pItemSet)
Definition: hldoctp.cxx:149
void PageCreated(IconChoicePage &rPage)
static std::unique_ptr< IconChoicePage > Create(weld::Container *pWindow, SvxHpLinkDlg *pDlg, const SfxItemSet *pItemSet)
Definition: hlmailtp.cxx:153
static std::unique_ptr< IconChoicePage > Create(weld::Container *pWindow, SvxHpLinkDlg *pDlg, const SfxItemSet *pItemSet)
Definition: hlinettp.cxx:185
IMPL_LINK_NOARG(SvxHpLinkDlg, ClickOkHdl_Impl, weld::Button &, void)
Click on OK button.
SfxStatusForwarder aRdOnlyForwarder
Definition: cuihyperdlg.hxx:46
SfxApplication * SfxGetpApp()
void ToggleChildWindow(sal_uInt16)
std::unique_ptr< weld::Button > m_xOKBtn
Definition: cuihyperdlg.hxx:84
HLINK_HTMLMODE
INetProtocol
SfxItemPool & GetPool() const
SvxHpLinkDlg(SfxBindings *pBindings, SfxChildWindow *pChild, weld::Window *pParent)
Definition: cuihyperdlg.cxx:85
SvxHlinkCtrl(sal_uInt16 nId, SfxBindings &rBindings, SvxHpLinkDlg *pDlg)
Definition: cuihyperdlg.cxx:47
virtual ~SvxHpLinkDlg() override
const OUString & GetURL() const
static std::unique_ptr< IconChoicePage > Create(weld::Container *pWindow, SvxHpLinkDlg *pDlg, const SfxItemSet *pItemSet)
Definition: hldocntp.cxx:223
virtual void dispose()
std::unique_ptr< weld::Notebook > m_xIconCtrl
Definition: cuihyperdlg.hxx:83
IconChoicePage * GetTabPage(std::string_view rPageId)
std::vector< std::unique_ptr< IconChoicePageData > > maPageList
Definition: cuihyperdlg.hxx:68
const SfxItemSet * pSet
Definition: cuihyperdlg.hxx:72
std::unique_ptr< weld::Button > m_xCancelBtn
Definition: cuihyperdlg.hxx:86
std::unique_ptr< SfxItemSet > pOutSet
Definition: cuihyperdlg.hxx:73
SfxItemPool * GetPool() const
OUString CuiResId(const char *pKey)
Definition: cuiresmgr.cxx:23
const SfxItemSet & GetItemSet() const
Definition: iconcdlg.hxx:68
SfxDispatcher * GetDispatcher() const
void Update(sal_uInt16 nId)
std::unique_ptr< sal_uInt16[]> pRanges
Definition: cuihyperdlg.hxx:75
const SfxPoolItem * Put(const SfxPoolItem &rItem, sal_uInt16 nWhich)
virtual void Activate() override
void SetDocumentFrame(const css::uno::Reference< css::frame::XFrame > &rxDocumentFrame)
Definition: hltpbase.hxx:102
static SfxViewFrame * Current()
SfxItemState
SfxBindings & GetBindings() const
RET_OK
Reference< XExecutableDialog > m_xDialog
std::unique_ptr< SfxItemSet > mpItemSet
Definition: cuihyperdlg.hxx:78
void ShowPage(const OString &rId)
Definition: iconcdlg.cxx:86
const sal_uInt16 * GetRanges() const
SvxLinkInsertMode GetInsertMode() const
SvxHpLinkDlg * pParent
Definition: cuihyperdlg.hxx:44
std::unique_ptr< weld::Button > m_xApplyBtn
Definition: cuihyperdlg.hxx:85
virtual void Reset(const SfxItemSet &) override
Definition: hltpbase.cxx:450
void SetInputSet(const SfxItemSet *pInSet)
Definition: iconcdlg.cxx:247
void Activate() override
void AddTabPage(const OString &rId, CreatePage pCreateFunc)
Definition: iconcdlg.cxx:73
void SetReadOnlyMode(bool bReadOnly)
Tabpage : Basisclass.
Definition: hltpbase.hxx:46
std::unique_ptr< weld::Button > m_xResetBtn
Definition: cuihyperdlg.hxx:88