bump product version to 6.4.0.3
[LibreOffice.git] / cui / source / dialogs / cuihyperdlg.cxx
blobb5fb3757c336ec542d83b2702f019ad41f1d7dd2
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
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/.
9 * This file incorporates work covered by the following license notice:
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 .
20 #include <sal/config.h>
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>
38 using ::com::sun::star::uno::Reference;
39 using ::com::sun::star::frame::XFrame;
42 //# #
43 //# Childwindow-Wrapper-Class #
44 //# #
47 SvxHlinkCtrl::SvxHlinkCtrl( sal_uInt16 _nId, SfxBindings & rBindings, SvxHpLinkDlg* pDlg )
48 : SfxControllerItem ( _nId, rBindings )
49 , aRdOnlyForwarder ( SID_READONLY_MODE, *this )
51 pParent = pDlg;
54 void SvxHlinkCtrl::dispose()
56 pParent = nullptr;
57 aRdOnlyForwarder.dispose();
58 ::SfxControllerItem::dispose();
61 void SvxHlinkCtrl::StateChanged( sal_uInt16 nSID, SfxItemState eState,
62 const SfxPoolItem* pState )
64 if (eState == SfxItemState::DEFAULT && pParent)
66 switch ( nSID )
68 case SID_HYPERLINK_GETLINK :
70 pParent->SetPage( static_cast<const SvxHyperlinkItem*>(pState) );
72 break;
73 case SID_READONLY_MODE :
75 pParent->SetReadOnlyMode( static_cast<const SfxBoolItem*>(pState)->GetValue() );
77 break;
82 //# #
83 //# Hyperlink - Dialog #
84 //# #
85 SvxHpLinkDlg::SvxHpLinkDlg(SfxBindings* pBindings, SfxChildWindow* pChild, weld::Window* pParent)
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"))
98 m_xIconCtrl->connect_enter_page( LINK ( this, SvxHpLinkDlg, ChosePageHdl_Impl ) );
99 m_xIconCtrl->show();
101 // ItemSet
102 if ( pSet )
104 pExampleSet = new SfxItemSet( *pSet );
105 pOutSet.reset(new SfxItemSet( *pSet->GetPool(), pSet->GetRanges() ));
108 // Buttons
109 m_xOKBtn->show();
110 m_xApplyBtn->show();
111 m_xCancelBtn->show();
112 m_xHelpBtn->show();
113 m_xResetBtn->show();
115 mbGrabFocus = true;
117 // set OK/Cancel - button
118 m_xCancelBtn->set_label(CuiResId(RID_SVXSTR_HYPDLG_CLOSEBUT));
120 // create itemset for tabpages
121 mpItemSet = std::make_unique<SfxItemSet>( SfxGetpApp()->GetPool(), svl::Items<SID_HYPERLINK_GETLINK,
122 SID_HYPERLINK_SETLINK>{} );
124 SvxHyperlinkItem aItem(SID_HYPERLINK_GETLINK);
125 mpItemSet->Put(aItem);
127 SetInputSet (mpItemSet.get());
129 // insert pages
130 AddTabPage("internet", SvxHyperlinkInternetTp::Create);
131 AddTabPage("mail", SvxHyperlinkMailTp::Create);
132 if (!comphelper::LibreOfficeKit::isActive())
134 AddTabPage("document", SvxHyperlinkDocTp::Create);
135 AddTabPage("newdocument", SvxHyperlinkNewDocTp::Create);
138 SetCurPageId("internet");
140 // Init Dialog
141 Start();
143 GetBindings().Update(SID_READONLY_MODE);
145 m_xResetBtn->connect_clicked( LINK( this, SvxHpLinkDlg, ResetHdl ) );
146 m_xOKBtn->connect_clicked( LINK ( this, SvxHpLinkDlg, ClickOkHdl_Impl ) );
147 m_xApplyBtn->connect_clicked ( LINK ( this, SvxHpLinkDlg, ClickApplyHdl_Impl ) );
150 SvxHpLinkDlg::~SvxHpLinkDlg()
152 // delete config item, so the base class (SfxModelessDialogController) can not load it on the next start
153 SvtViewOptions aViewOpt( EViewType::TabDialog, OUString::number(SID_HYPERLINK_DIALOG) );
154 aViewOpt.Delete();
156 mpItemSet.reset();
158 maCtrl.dispose();
160 maPageList.clear();
162 pRanges.reset();
163 pOutSet.reset();
166 void SvxHpLinkDlg::Close()
168 if (IsClosing())
169 return;
170 SfxViewFrame* pViewFrame = SfxViewFrame::Current();
171 if (pViewFrame)
172 pViewFrame->ToggleChildWindow(SID_HYPERLINK_DIALOG);
175 void SvxHpLinkDlg::Apply()
177 SfxItemSet aItemSet( SfxGetpApp()->GetPool(), svl::Items<SID_HYPERLINK_GETLINK,
178 SID_HYPERLINK_SETLINK>{} );
180 SvxHyperlinkTabPageBase* pCurrentPage = static_cast<SvxHyperlinkTabPageBase*>(
181 GetTabPage( GetCurPageId() ) );
183 if ( pCurrentPage->AskApply() )
185 pCurrentPage->FillItemSet( &aItemSet );
187 const SvxHyperlinkItem *aItem = aItemSet.GetItem(SID_HYPERLINK_SETLINK);
188 if ( !aItem->GetURL().isEmpty() )
189 GetDispatcher()->ExecuteList(SID_HYPERLINK_SETLINK,
190 SfxCallMode::ASYNCHRON | SfxCallMode::RECORD, { aItem });
192 static_cast<SvxHyperlinkTabPageBase*>( GetTabPage( GetCurPageId() ) )->DoApply();
196 /// Click on OK button
197 IMPL_LINK_NOARG(SvxHpLinkDlg, ClickOkHdl_Impl, weld::Button&, void)
199 Apply();
200 m_xDialog->response(RET_OK);
203 /*************************************************************************
205 |* Click on Apply-button
207 |************************************************************************/
208 IMPL_LINK_NOARG(SvxHpLinkDlg, ClickApplyHdl_Impl, weld::Button&, void)
210 Apply();
213 /*************************************************************************
215 |* Set Page
217 |************************************************************************/
218 void SvxHpLinkDlg::SetPage ( SvxHyperlinkItem const * pItem )
220 OString sPageId("internet");
222 OUString aStrURL(pItem->GetURL());
223 INetURLObject aURL(aStrURL);
224 INetProtocol eProtocolTyp = aURL.GetProtocol();
226 switch ( eProtocolTyp )
228 case INetProtocol::Http :
229 case INetProtocol::Ftp :
230 sPageId = "internet";
231 break;
232 case INetProtocol::File :
233 sPageId = "document";
234 break;
235 case INetProtocol::Mailto :
236 sPageId = "mail";
237 break;
238 default :
239 if (aStrURL.startsWith("#"))
240 sPageId = "document";
241 else
243 // not valid
244 sPageId = GetCurPageId();
246 break;
249 ShowPage (sPageId);
251 SvxHyperlinkTabPageBase* pCurrentPage = static_cast<SvxHyperlinkTabPageBase*>(GetTabPage( sPageId ));
253 mbIsHTMLDoc = (pItem->GetInsertMode() & HLINK_HTMLMODE) != 0;
255 IconChoicePage* pPage = GetTabPage (sPageId);
256 if(pPage)
258 SfxItemSet& aPageSet = const_cast<SfxItemSet&>(pPage->GetItemSet ());
259 aPageSet.Put ( *pItem );
261 pCurrentPage->Reset( aPageSet );
262 if ( mbGrabFocus )
264 pCurrentPage->SetInitFocus(); // #92535# grab the focus only once at initialization
265 mbGrabFocus = false;
270 /*************************************************************************
272 |* Enable/Disable ReadOnly mode
274 |************************************************************************/
275 void SvxHpLinkDlg::SetReadOnlyMode( bool bRdOnly )
277 GetOKButton().set_sensitive(!bRdOnly);
280 /*************************************************************************
282 |* late-initialization of newly created pages
284 |************************************************************************/
285 void SvxHpLinkDlg::PageCreated(const OString& /*rId*/, IconChoicePage& rPage)
287 SvxHyperlinkTabPageBase& rHyperlinkPage = dynamic_cast< SvxHyperlinkTabPageBase& >( rPage );
288 Reference< XFrame > xDocumentFrame = GetBindings().GetActiveFrame();
289 OSL_ENSURE( xDocumentFrame.is(), "SvxHpLinkDlg::PageCreated: macro assignment functionality won't work with a proper frame!" );
290 rHyperlinkPage.SetDocumentFrame( xDocumentFrame );
293 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */