LibreOffice Module cui (master)  1
hldocntp.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 <hldocntp.hxx>
21 #include <osl/file.hxx>
22 #include <sfx2/viewfrm.hxx>
23 #include <sfx2/docfilt.hxx>
24 #include <svl/stritem.hxx>
25 #include <com/sun/star/awt/XTopWindow.hpp>
26 #include <com/sun/star/uno/Reference.h>
27 #include <com/sun/star/uno/Sequence.h>
28 #include <com/sun/star/beans/PropertyValue.hpp>
29 #include <com/sun/star/uno/Exception.hpp>
30 #include <vcl/svapp.hxx>
31 #include <vcl/weld.hxx>
32 #include <tools/urlobj.hxx>
33 #include <unotools/pathoptions.hxx>
36 #include <unotools/ucbhelper.hxx>
37 
39 #include <com/sun/star/ui/dialogs/FolderPicker.hpp>
40 #include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp>
41 
42 #include <cuihyperdlg.hxx>
43 #include <dialmgr.hxx>
44 #include <strings.hrc>
45 
46 using namespace ::com::sun::star::lang;
47 using namespace ::com::sun::star::ui::dialogs;
48 using namespace ::com::sun::star::uno;
49 
50 using namespace ::com::sun::star;
51 
52 /*************************************************************************
53 |*
54 |* Data-struct for documenttypes in listbox
55 |*
56 |************************************************************************/
57 
59 {
60  OUString aStrURL;
61  OUString aStrExt;
62  DocumentTypeData (const OUString& aURL, const OUString& aExt) : aStrURL(aURL), aStrExt(aExt)
63  {}
64 };
65 
66 bool SvxHyperlinkNewDocTp::ImplGetURLObject( const OUString& rPath, const OUString& rBase, INetURLObject& aURLObject ) const
67 {
68  bool bIsValidURL = !rPath.isEmpty();
69  if ( bIsValidURL )
70  {
71  aURLObject.SetURL( rPath );
72  if ( aURLObject.GetProtocol() == INetProtocol::NotValid ) // test if the source is already a valid url
73  { // if not we have to create a url from a physical file name
74  bool wasAbs;
75  INetURLObject base(rBase);
76  base.setFinalSlash();
77  aURLObject = base.smartRel2Abs(
78  rPath, wasAbs, true, INetURLObject::EncodeMechanism::All,
79  RTL_TEXTENCODING_UTF8, true);
80  }
81  bIsValidURL = aURLObject.GetProtocol() != INetProtocol::NotValid;
82  if ( bIsValidURL )
83  {
84  OUString aBase( aURLObject.getName( INetURLObject::LAST_SEGMENT, false ) );
85  if ( aBase.isEmpty() || ( aBase[0] == '.' ) )
86  bIsValidURL = false;
87  }
88  if ( bIsValidURL )
89  {
90  sal_Int32 nPos = m_xLbDocTypes->get_selected_index();
91  if (nPos != -1)
92  aURLObject.SetExtension(reinterpret_cast<DocumentTypeData*>(m_xLbDocTypes->get_id(nPos).toInt64())->aStrExt);
93  }
94 
95  }
96  return bIsValidURL;
97 }
98 
99 /*************************************************************************
100 |*
101 |* Constructor / Destructor
102 |*
103 |************************************************************************/
104 
106  : SvxHyperlinkTabPageBase(pParent, pDlg, "cui/ui/hyperlinknewdocpage.ui", "HyperlinkNewDocPage", pItemSet)
107  , m_xRbtEditNow(xBuilder->weld_radio_button("editnow"))
108  , m_xRbtEditLater(xBuilder->weld_radio_button("editlater"))
109  , m_xCbbPath(new SvxHyperURLBox(xBuilder->weld_combo_box("path")))
110  , m_xBtCreate(xBuilder->weld_button("create"))
111  , m_xLbDocTypes(xBuilder->weld_tree_view("types"))
112 {
113  m_xCbbPath->SetSmartProtocol(INetProtocol::File);
114  m_xLbDocTypes->set_size_request(-1, m_xLbDocTypes->get_height_rows(5));
115 
116  InitStdControls();
117 
119 
120  m_xCbbPath->show();
121  m_xCbbPath->SetBaseURL(SvtPathOptions().GetWorkPath());
122 
123  // set defaults
124  m_xRbtEditNow->set_active(true);
125 
126  m_xBtCreate->connect_clicked(LINK(this, SvxHyperlinkNewDocTp, ClickNewHdl_Impl));
127 
128  FillDocumentList ();
129 }
130 
132 {
133  if (m_xLbDocTypes)
134  {
135  for (sal_Int32 n = 0, nEntryCount = m_xLbDocTypes->n_children(); n < nEntryCount; ++n)
136  delete reinterpret_cast<DocumentTypeData*>(m_xLbDocTypes->get_id(n).toInt64());
137  m_xLbDocTypes = nullptr;
138  }
139 }
140 
141 /*************************************************************************
142 |*
143 |* Fill the all dialog-controls except controls in groupbox "more..."
144 |*
145 |************************************************************************/
146 
147 
148 void SvxHyperlinkNewDocTp::FillDlgFields(const OUString& /*rStrURL*/)
149 {
150 }
151 
153 {
154  weld::WaitObject aWaitObj(mpDialog->getDialog());
155 
156  uno::Sequence< uno::Sequence< beans::PropertyValue > >
157  aDynamicMenuEntries( SvtDynamicMenuOptions().GetMenu( EDynamicMenuType::NewMenu ) );
158 
159  sal_uInt32 i, nCount = aDynamicMenuEntries.getLength();
160  for ( i = 0; i < nCount; i++ )
161  {
162  uno::Sequence< beans::PropertyValue >& rDynamicMenuEntry = aDynamicMenuEntries[ i ];
163 
164  OUString aDocumentUrl, aTitle;
165 
166  for ( int e = 0; e < rDynamicMenuEntry.getLength(); e++ )
167  {
168  if ( rDynamicMenuEntry[ e ].Name == DYNAMICMENU_PROPERTYNAME_URL )
169  rDynamicMenuEntry[ e ].Value >>= aDocumentUrl;
170  else if ( rDynamicMenuEntry[e].Name == DYNAMICMENU_PROPERTYNAME_TITLE )
171  rDynamicMenuEntry[e].Value >>= aTitle;
172  }
173  //#i96822# business cards, labels and database should not be inserted here
174  if( aDocumentUrl == "private:factory/swriter?slot=21051" ||
175  aDocumentUrl == "private:factory/swriter?slot=21052" ||
176  aDocumentUrl == "private:factory/sdatabase?Interactive" )
177  continue;
178 
179  // Insert into listbox
180  if ( !aDocumentUrl.isEmpty() )
181  {
182  if ( aDocumentUrl == "private:factory/simpress?slot=6686" ) // SJ: #106216# do not start
183  aDocumentUrl = "private:factory/simpress"; // the AutoPilot for impress
184 
185  // insert private-url and default-extension as user-data
186  std::shared_ptr<const SfxFilter> pFilter = SfxFilter::GetDefaultFilterFromFactory( aDocumentUrl );
187  if ( pFilter )
188  {
189  // insert doc-name and image
190  OUString aTitleName = aTitle.replaceFirst( "~", "" );
191 
192  OUString aStrDefExt(pFilter->GetDefaultExtension());
193  DocumentTypeData *pTypeData = new DocumentTypeData(aDocumentUrl, aStrDefExt.copy(2));
194  OUString sId(OUString::number(reinterpret_cast<sal_Int64>(pTypeData)));
195  m_xLbDocTypes->append(sId, aTitleName);
196  }
197  }
198  }
199  m_xLbDocTypes->select(0);
200 }
201 
202 /*************************************************************************
203 |*
204 |* retrieve and prepare data from dialog-fields
205 |*
206 |************************************************************************/
207 
208 void SvxHyperlinkNewDocTp::GetCurentItemData ( OUString& rStrURL, OUString& aStrName,
209  OUString& aStrIntName, OUString& aStrFrame,
210  SvxLinkInsertMode& eMode )
211 {
212  // get data from dialog-controls
213  rStrURL = m_xCbbPath->get_active_text();
214  INetURLObject aURL;
215  if ( ImplGetURLObject( rStrURL, m_xCbbPath->GetBaseURL(), aURL ) )
216  {
218  }
219 
220  GetDataFromCommonFields( aStrName, aStrIntName, aStrFrame, eMode );
221 }
222 
223 /*************************************************************************
224 |*
225 |* static method to create Tabpage
226 |*
227 |************************************************************************/
228 
229 std::unique_ptr<IconChoicePage> SvxHyperlinkNewDocTp::Create(weld::Container* pWindow, SvxHpLinkDlg* pDlg, const SfxItemSet* pItemSet)
230 {
231  return std::make_unique<SvxHyperlinkNewDocTp>(pWindow, pDlg, pItemSet);
232 }
233 
234 /*************************************************************************
235 |*
236 |* Set initial focus
237 |*
238 |************************************************************************/
240 {
241  m_xCbbPath->grab_focus();
242 }
243 
244 /*************************************************************************
245 |*
246 |* Ask page whether an insert is possible
247 |*
248 \************************************************************************/
250 {
251  INetURLObject aINetURLObject;
252  bool bRet = ImplGetURLObject(m_xCbbPath->get_active_text(), m_xCbbPath->GetBaseURL(), aINetURLObject);
253  if ( !bRet )
254  {
255  std::unique_ptr<weld::MessageDialog> xWarn(Application::CreateMessageDialog(mpDialog->getDialog(),
256  VclMessageType::Warning, VclButtonsType::Ok,
257  CuiResId(RID_SVXSTR_HYPDLG_NOVALIDFILENAME)));
258  xWarn->run();
259  }
260  return bRet;
261 }
262 
263 namespace
264 {
265  struct ExecuteInfo
266  {
267  bool bRbtEditLater;
268  bool bRbtEditNow;
269  INetURLObject aURL;
270  OUString aStrDocName;
271  // current document
272  css::uno::Reference<css::frame::XFrame> xFrame;
273  SfxDispatcher* pDispatcher;
274  };
275 }
276 
277 IMPL_STATIC_LINK(SvxHyperlinkNewDocTp, DispatchDocument, void*, p, void)
278 {
279  std::unique_ptr<ExecuteInfo> xExecuteInfo(static_cast<ExecuteInfo*>(p));
280  if (!xExecuteInfo->xFrame.is())
281  return;
282  try
283  {
284  //if it throws dispatcher is invalid
285  css::uno::Reference<css::awt::XTopWindow>(xExecuteInfo->xFrame->getContainerWindow(), css::uno::UNO_QUERY_THROW);
286 
287  SfxViewFrame *pViewFrame = nullptr;
288 
289  // create items
290  SfxStringItem aName( SID_FILE_NAME, xExecuteInfo->aStrDocName );
291  SfxStringItem aReferer( SID_REFERER, "private:user" );
292  SfxStringItem aFrame( SID_TARGETNAME, "_blank");
293 
294  OUString aStrFlags('S');
295  if (xExecuteInfo->bRbtEditLater)
296  {
297  aStrFlags += "H";
298  }
299  SfxStringItem aFlags (SID_OPTIONS, aStrFlags);
300 
301  // open url
302  const SfxPoolItem* pReturn = xExecuteInfo->pDispatcher->ExecuteList(
303  SID_OPENDOC, SfxCallMode::SYNCHRON,
304  { &aName, &aFlags, &aFrame, &aReferer });
305 
306  // save new doc
307  const SfxViewFrameItem *pItem = dynamic_cast<const SfxViewFrameItem*>( pReturn ); // SJ: pReturn is NULL if the Hyperlink
308  if ( pItem ) // creation is cancelled #106216#
309  {
310  pViewFrame = pItem->GetFrame();
311  if (pViewFrame)
312  {
313  SfxStringItem aNewName( SID_FILE_NAME, xExecuteInfo->aURL.GetMainURL( INetURLObject::DecodeMechanism::NONE ) );
314  SfxUnoFrameItem aDocFrame( SID_FILLFRAME, pViewFrame->GetFrame().GetFrameInterface() );
315  fprintf(stderr, "is there a frame int %p\n", pViewFrame->GetFrame().GetFrameInterface().get() );
316  pViewFrame->GetDispatcher()->ExecuteList(
317  SID_SAVEASDOC, SfxCallMode::SYNCHRON,
318  { &aNewName }, { &aDocFrame });
319  }
320  }
321 
322  if (xExecuteInfo->bRbtEditNow)
323  {
324  css::uno::Reference<css::awt::XTopWindow> xWindow(xExecuteInfo->xFrame->getContainerWindow(), css::uno::UNO_QUERY);
325  if (xWindow.is()) //will be false if the frame was exited while the document was loading (e.g. we waited for warning dialogs)
326  xWindow->toFront();
327  }
328 
329  if (pViewFrame && xExecuteInfo->bRbtEditLater)
330  {
331  SfxObjectShell* pObjShell = pViewFrame->GetObjectShell();
332  pObjShell->DoClose();
333  }
334  }
335  catch (...)
336  {
337  }
338 }
339 
340 /*************************************************************************
341 |*
342 |* Any action to do after apply-button is pressed
343 |*
344 \************************************************************************/
346 {
347  weld::WaitObject aWait(mpDialog->getDialog());
348 
349  // get data from dialog-controls
350  OUString aStrNewName = m_xCbbPath->get_active_text();
351 
352  if ( aStrNewName.isEmpty() )
353  aStrNewName = maStrInitURL;
354 
355  // create a real URL-String
356  INetURLObject aURL;
357  if ( ImplGetURLObject( aStrNewName, m_xCbbPath->GetBaseURL(), aURL ) )
358  {
359  // create Document
360  aStrNewName = aURL.GetURLPath( INetURLObject::DecodeMechanism::NONE );
361  bool bCreate = true;
362  try
363  {
364  // check if file exists, warn before we overwrite it
365  std::unique_ptr<SvStream> pIStm = ::utl::UcbStreamHelper::CreateStream( aURL.GetMainURL( INetURLObject::DecodeMechanism::NONE ), StreamMode::READ );
366 
367  bool bOk = pIStm && ( pIStm->GetError() == ERRCODE_NONE);
368 
369  pIStm.reset();
370 
371  if( bOk )
372  {
373  std::unique_ptr<weld::MessageDialog> xWarn(Application::CreateMessageDialog(mpDialog->getDialog(),
374  VclMessageType::Warning, VclButtonsType::YesNo,
375  CuiResId(RID_SVXSTR_HYPERDLG_QUERYOVERWRITE)));
376  bCreate = xWarn->run() == RET_YES;
377  }
378  }
379  catch (const uno::Exception&)
380  {
381  }
382 
383  if (bCreate && !aStrNewName.isEmpty())
384  {
385  ExecuteInfo* pExecuteInfo = new ExecuteInfo;
386 
387  pExecuteInfo->bRbtEditLater = m_xRbtEditLater->get_active();
388  pExecuteInfo->bRbtEditNow = m_xRbtEditNow->get_active();
389  // get private-url
390  sal_Int32 nPos = m_xLbDocTypes->get_selected_index();
391  if (nPos == -1)
392  nPos = 0;
393  pExecuteInfo->aURL = aURL;
394  pExecuteInfo->aStrDocName = reinterpret_cast<DocumentTypeData*>(m_xLbDocTypes->get_id(nPos).toInt64())->aStrURL;
395 
396  // current document
397  pExecuteInfo->xFrame = GetDispatcher()->GetFrame()->GetFrame().GetFrameInterface();
398  pExecuteInfo->pDispatcher = GetDispatcher();
399 
400  Application::PostUserEvent(LINK(nullptr, SvxHyperlinkNewDocTp, DispatchDocument), pExecuteInfo);
401  }
402  }
403 }
404 
405 /*************************************************************************
406 |*
407 |* Click on imagebutton : new
408 |*
409 |************************************************************************/
411 {
412  DisableClose( true );
413  uno::Reference < XComponentContext > xContext( ::comphelper::getProcessComponentContext() );
414  uno::Reference < XFolderPicker2 > xFolderPicker = FolderPicker::create(xContext);
415 
416  OUString aStrURL;
417  OUString aTempStrURL( m_xCbbPath->get_active_text() );
418  osl::FileBase::getFileURLFromSystemPath( aTempStrURL, aStrURL );
419 
420  OUString aStrPath = aStrURL;
421  bool bZeroPath = aStrPath.isEmpty();
422  bool bHandleFileName = bZeroPath; // when path has length of 0, then the rest should always be handled
423  // as file name, otherwise we do not yet know
424 
425  if( bZeroPath )
426  aStrPath = SvtPathOptions().GetWorkPath();
427  else if( !::utl::UCBContentHelper::IsFolder( aStrURL ) )
428  bHandleFileName = true;
429 
430  xFolderPicker->setDisplayDirectory( aStrPath );
431  sal_Int16 nResult = xFolderPicker->execute();
432  DisableClose( false );
433  if( ExecutableDialogResults::OK == nResult )
434  {
435  sal_Char const sSlash[] = "/";
436 
437  INetURLObject aURL( aStrURL, INetProtocol::File );
438  OUString aStrName;
439  if( bHandleFileName )
440  aStrName = bZeroPath? aTempStrURL : aURL.getName();
441 
442  m_xCbbPath->SetBaseURL( xFolderPicker->getDirectory() );
443  OUString aStrTmp( xFolderPicker->getDirectory() );
444 
445  if( aStrTmp[ aStrTmp.getLength() - 1 ] != sSlash[0] )
446  aStrTmp += sSlash;
447 
448  // append old file name
449  if( bHandleFileName )
450  aStrTmp += aStrName;
451 
452  INetURLObject aNewURL( aStrTmp );
453 
454  if (!aStrName.isEmpty() && !aNewURL.getExtension().isEmpty() &&
455  m_xLbDocTypes->get_selected_index() != -1)
456  {
457  // get private-url
458  const sal_Int32 nPos = m_xLbDocTypes->get_selected_index();
459  aNewURL.setExtension(reinterpret_cast<DocumentTypeData*>(m_xLbDocTypes->get_id(nPos).toInt64())->aStrExt);
460  }
461 
462  if( aNewURL.GetProtocol() == INetProtocol::File )
463  {
464  osl::FileBase::getSystemPathFromFileURL(aNewURL.GetMainURL( INetURLObject::DecodeMechanism::NONE ), aStrTmp);
465  }
466  else
467  {
469  }
470 
471  m_xCbbPath->set_entry_text( aStrTmp );
472  }
473 }
474 
475 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
#define DYNAMICMENU_PROPERTYNAME_URL
void FillDlgFields(const OUString &rStrURL) override
Definition: hldocntp.cxx:148
bool ImplGetURLObject(const OUString &rPath, const OUString &rBase, INetURLObject &aURLObject) const
Definition: hldocntp.cxx:66
virtual void SetInitFocus() override
Definition: hldocntp.cxx:239
OUString GetURLPath(DecodeMechanism eMechanism=DecodeMechanism::ToIUri, rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8) const
IMPL_STATIC_LINK(SvxHyperlinkNewDocTp, DispatchDocument, void *, p, void)
Definition: hldocntp.cxx:277
Reference< XFrame > xFrame
static ImplSVEvent * PostUserEvent(const Link< void *, void > &rLink, void *pCaller=nullptr, bool bReferenceLink=false)
OUString aStrURL
Definition: hldocntp.cxx:60
OUString Name
std::unique_ptr< weld::RadioButton > m_xRbtEditNow
Definition: hldocntp.hxx:32
std::unique_ptr< weld::RadioButton > m_xRbtEditLater
Definition: hldocntp.hxx:33
RET_YES
bool setFinalSlash()
static std::unique_ptr< SvStream > CreateStream(const OUString &rFileName, StreamMode eOpenMode, css::uno::Reference< css::awt::XWindow > xParentWin=nullptr)
virtual bool AskApply() override
Definition: hldocntp.cxx:249
bool setExtension(OUString const &rTheExtension, sal_Int32 nIndex=LAST_SEGMENT, bool bIgnoreFinalSlash=true, rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8)
char sal_Char
SfxFrame & GetFrame() const
void SetExtension(OUString const &rTheExtension)
void GetDataFromCommonFields(OUString &aStrName, OUString &aStrIntName, OUString &aStrFrame, SvxLinkInsertMode &eMode)
Definition: hltpbase.cxx:423
static std::shared_ptr< const SfxFilter > GetDefaultFilterFromFactory(const OUString &rServiceName)
static std::unique_ptr< IconChoicePage > Create(weld::Container *pWindow, SvxHpLinkDlg *pDlg, const SfxItemSet *pItemSet)
Definition: hldocntp.cxx:229
SfxDispatcher * GetDispatcher() const
Definition: hltpbase.cxx:307
virtual SfxObjectShell * GetObjectShell() override
void const * base
OUString getName(sal_Int32 nIndex=LAST_SEGMENT, bool bIgnoreFinalSlash=true, DecodeMechanism eMechanism=DecodeMechanism::ToIUri, rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8) const
int i
SvxLinkInsertMode
SvxHpLinkDlg * mpDialog
Definition: hltpbase.hxx:64
SvxHyperlinkNewDocTp(weld::Container *pParent, SvxHpLinkDlg *pDlg, const SfxItemSet *pItemSet)
Definition: hldocntp.cxx:105
IMPL_LINK_NOARG(SvxHyperlinkNewDocTp, ClickNewHdl_Impl, weld::Button &, void)
Definition: hldocntp.cxx:410
std::unique_ptr< SvxHyperURLBox > m_xCbbPath
Definition: hldocntp.hxx:34
#define DYNAMICMENU_PROPERTYNAME_TITLE
OUString CuiResId(const char *pKey)
Definition: cuiresmgr.cxx:23
DocumentTypeData(const OUString &aURL, const OUString &aExt)
Definition: hldocntp.cxx:62
const css::uno::Reference< css::frame::XFrame > & GetFrameInterface() const
OUString GetMainURL(DecodeMechanism eMechanism, rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8) const
std::unique_ptr< weld::TreeView > m_xLbDocTypes
Definition: hldocntp.hxx:36
virtual void DoApply() override
Definition: hldocntp.cxx:345
void SetExchangeSupport()
Definition: iconcdlg.hxx:75
const OUString & GetWorkPath() const
SfxViewFrame * GetFrame() const
#define ERRCODE_NONE
INetProtocol GetProtocol() const
SfxViewFrame * GetFrame() const
Reference< XComponentContext > getProcessComponentContext()
static weld::MessageDialog * CreateMessageDialog(weld::Widget *pParent, VclMessageType eMessageType, VclButtonsType eButtonType, const OUString &rPrimaryMessage)
OString const aName
ComboBox-Control for URL's with History and Autocompletion.
Definition: hltpbase.hxx:36
std::unique_ptr< weld::Button > m_xBtCreate
Definition: hldocntp.hxx:35
bool SetURL(OUString const &rTheAbsURIRef, EncodeMechanism eMechanism=EncodeMechanism::WasEncoded, rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8)
UNOTOOLS_DLLPUBLIC bool IsFolder(OUString const &url)
void GetCurentItemData(OUString &rStrURL, OUString &aStrName, OUString &aStrIntName, OUString &aStrFrame, SvxLinkInsertMode &eMode) override
Definition: hldocntp.cxx:208
INetURLObject smartRel2Abs(OUString const &rTheRelURIRef, bool &rWasAbsolute, bool bIgnoreFragment=false, EncodeMechanism eMechanism=EncodeMechanism::WasEncoded, rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8, bool bRelativeNonURIs=false, FSysStyle eStyle=FSysStyle::Detect) const
sal_Int32 nPos
OUString aStrExt
Definition: hldocntp.cxx:61
virtual ~SvxHyperlinkNewDocTp() override
Definition: hldocntp.cxx:131
Tabpage : Basisclass.
Definition: hltpbase.hxx:47
OUString getExtension(sal_Int32 nIndex=LAST_SEGMENT, bool bIgnoreFinalSlash=true, DecodeMechanism eMechanism=DecodeMechanism::ToIUri, rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8) const
OUString sId