10#include <config_oauth2.h>
16#include <fpicker/strings.hrc>
19#include <com/sun/star/task/InteractionHandler.hpp>
20#include <com/sun/star/task/PasswordContainer.hpp>
25#include <officecfg/Office/Common.hxx>
33 , m_bIsInExecute( false )
34 , m_xOk_btn(m_xBuilder->weld_button(
"ok"))
35 , m_xCancel_btn(m_xBuilder->weld_button(
"cancel"))
36 , m_xManageServices(m_xBuilder->weld_menu_button(
"add_service_btn"))
37 , m_xServices_lb(m_xBuilder->weld_combo_box(
"services_lb"))
38 , m_xPathContainer(m_xBuilder->weld_container(
"breadcrumb_container"))
39 , m_xNewFolder(m_xBuilder->weld_button(
"new_folder"))
40 , m_xListView_btn(m_xBuilder->weld_toggle_button(
"list_view"))
41 , m_xIconView_btn(m_xBuilder->weld_toggle_button(
"icon_view"))
42 , m_xFilter_lb(m_xBuilder->weld_combo_box(
"filter_lb"))
93 bMultiselection,
false));
131 OUString sSize = OUString::number( aSize.
Width() ) +
"|";
132 sSize = sSize + OUString::number( aSize.
Height() ) +
"|";
134 OUString sUserData =
m_xFileView->GetConfigString();
136 Any( sSize + sUserData ) );
142 officecfg::Office::Common::Misc::FilePickerLastService::set(
m_sLastServiceUrl, batch );
146 Sequence< OUString > placesUrlsList(
m_aServices.size() );
147 auto placesUrlsListRange = asNonConstRange(placesUrlsList);
148 Sequence< OUString > placesNamesList(
m_aServices.size() );
149 auto placesNamesListRange = asNonConstRange(placesNamesList);
154 placesUrlsListRange[
i] = service->GetUrl();
155 placesNamesListRange[
i] = service->GetName();
159 officecfg::Office::Common::Misc::FilePickerPlacesUrls::set( placesUrlsList, batch );
160 officecfg::Office::Common::Misc::FilePickerPlacesNames::set( placesNamesList, batch );
195 INetProtocol aProtocol = pService->GetUrlObject().GetProtocol();
198 case INetProtocol::Ftp:
200 case INetProtocol::Cmis:
204 if( sHost.startsWith( GDRIVE_BASE_URL ) )
205 return "Google Drive";
206 else if( sHost.startsWith( ALFRESCO_CLOUD_BASE_URL ) )
207 return "Alfresco Cloud";
208 else if( sHost.startsWith( ONEDRIVE_BASE_URL ) )
213 case INetProtocol::Smb:
214 return "Windows Share";
215 case INetProtocol::File:
217 case INetProtocol::Http:
219 case INetProtocol::Https:
221 case INetProtocol::Generic:
243 if( aUserData >>= sCfgStr )
245 sal_Int32 nPos1{ sCfgStr.indexOf(
'|') };
248 sal_Int32 nPos2{ sCfgStr.indexOf(
'|', nPos1+1 ) };
251 m_xFileView->SetConfigString( sCfgStr.subView(nPos2+1) );
261 Sequence< OUString > placesUrlsList( officecfg::Office::Common::Misc::FilePickerPlacesUrls::get() );
262 Sequence< OUString > placesNamesList( officecfg::Office::Common::Misc::FilePickerPlacesNames::get() );
264 unsigned int nPos = 0;
267 m_sLastServiceUrl = officecfg::Office::Common::Misc::FilePickerLastService::get();
269 for( sal_Int32 nPlace = 0; nPlace < placesUrlsList.getLength() && nPlace < placesNamesList.getLength(); ++nPlace )
271 ServicePtr pService = std::make_shared<Place>( placesNamesList[nPlace], placesUrlsList[nPlace],
true );
275 if( !pService->IsLocal() )
312 int nServices =
static_cast<int>(
m_aServices.size());
313 while(
nPos < nServices )
328 OUString
sName = rFilter;
347 auto xWait = std::make_unique<weld::WaitObject>(
m_xDialog.get());
349 if( !sURL.isEmpty() )
389 sal_Int32 nDotPos = rFileName.lastIndexOf(
'.' );
392 return rFileName + sExt.subView( 1 );
417 UrlRecord aURLEntries =
m_xMasterPasswd->find( sUrl, Reference< XInteractionHandler>() );
419 if( aURLEntries.UserList.hasElements() )
466 m_xPath->EnableFields(
false );
472 const OUString& rPassword,
bool bPersistent)
474 if( rURL.isEmpty() || rUser.isEmpty() || rPassword.isEmpty() )
481 &&
m_xMasterPasswd->authorizateWithMasterPassword( Reference< XInteractionHandler>() ) )
484 Reference< XInteractionHandler > xInteractionHandler =
485 InteractionHandler::createWithParent(
m_xContext,
nullptr );
487 Sequence<OUString> aPasswd { rPassword };
491 rURL, rUser, aPasswd, xInteractionHandler );
502 m_xListView_btn->set_active(
false);
503 m_xFileView->SetViewMode(
eIcon );
508 m_xIconView_btn->set_active(
false);
515 aDlg.ShowPasswordControl();
516 short aRetCode = aDlg.run();
525 OUString sPassword = aDlg.GetPassword();
526 OUString sUser = aDlg.GetUser();
527 if( !sUser.isEmpty() && !sPassword.isEmpty() )
529 bool bPersistent = aDlg.IsRememberChecked();
530 SavePassword( newService->GetUrl(), sUser, sPassword, bPersistent );
557 int nPos = GetSelectedServicePos();
561 OUString sURL = m_aServices[
nPos]->GetUrl();
562 EnableExtraMenuItems(
true);
564 m_bServiceChanged =
true;
571 OUString sIdent(rIdent);
572 if( sIdent ==
"edit_service" && m_xServices_lb->get_count() > 0 )
574 int nSelected = m_xServices_lb->get_active();
575 int nPos = GetSelectedServicePos();
580 short aRetCode = aDlg.run();
588 m_aServices[
nPos] = pEditedService;
589 m_xServices_lb->remove( nSelected );
596 m_xServices_lb->insert_text(nSelected,
sPrefix + pEditedService->GetName());
597 m_xServices_lb->set_active( nSelected );
603 sIdent =
"delete_service";
612 if( sIdent ==
"delete_service" && m_xServices_lb->get_count() > 0 )
614 int nSelected = m_xServices_lb->get_active();
615 int nPos = GetSelectedServicePos();
619 OUString sMsg =
FpsResId( STR_SVT_DELETESERVICE );
620 sMsg = sMsg.replaceFirst(
"$servicename$", m_xServices_lb->get_active_text() );
622 VclMessageType::Question, VclButtonsType::YesNo, sMsg));
628 if( m_xMasterPasswd->isPersistentStoringAllowed() )
630 OUString sUrl( m_aServices[
nPos]->GetUrl() );
632 Reference< XInteractionHandler > xInteractionHandler =
633 InteractionHandler::createWithParent(
m_xContext,
nullptr );
635 UrlRecord aURLEntries = m_xMasterPasswd->find( sUrl, xInteractionHandler );
637 if( aURLEntries.Url == sUrl && aURLEntries.UserList.hasElements() )
639 OUString sUserName = aURLEntries.UserList[0].UserName;
641 m_xMasterPasswd->removePersistent( sUrl, sUserName );
648 m_aServices.erase( m_aServices.begin() +
nPos );
649 m_xServices_lb->remove( nSelected );
651 m_xServices_lb->set_active(-1);
652 EnableExtraMenuItems(
false);
656 m_bIsConnected =
false;
661 else if( sIdent ==
"change_password" )
665 if( m_xMasterPasswd->isPersistentStoringAllowed() && m_xMasterPasswd->authorizateWithMasterPassword( Reference< XInteractionHandler>() ) )
667 int nPos = GetSelectedServicePos();
671 OUString sUrl( m_aServices[
nPos]->GetUrl() );
673 Reference< XInteractionHandler > xInteractionHandler =
674 InteractionHandler::createWithParent(
m_xContext,
nullptr );
676 UrlRecord aURLEntries = m_xMasterPasswd->find( sUrl, xInteractionHandler );
678 if( aURLEntries.Url == sUrl && aURLEntries.UserList.hasElements() )
680 OUString sUserName = aURLEntries.UserList[0].UserName;
683 = new ::comphelper::SimplePasswordRequest;
685 xInteractionHandler->handle( pPasswordRequest );
687 if ( pPasswordRequest->isPassword() )
689 OUString aNewPass = pPasswordRequest->getPassword();
690 Sequence<OUString> aPasswd { aNewPass };
692 m_xMasterPasswd->addPersistent(
693 sUrl, sUserName, aPasswd, xInteractionHandler );
702 else if( sIdent ==
"add_service" )
713 if (!
pData->mbIsFolder)
716 OpenURL(
pData->maURL);
745 m_xName_ed->set_text(
"" );
754 m_xFileView->SetNoSelection();
759 m_xFileView->SetNoSelection();
760 if (!m_xOk_btn->get_sensitive())
766 int nPos = m_xFilter_lb->get_active();
768 if(
nPos != -1 && !m_aFilters[
nPos].second.isEmpty() )
770 m_nCurrentFilter =
nPos;
772 OUString sCurrentURL = m_xFileView->GetViewURL();
774 if( !sCurrentURL.isEmpty() && m_bIsConnected )
775 OpenURL( sCurrentURL );
781 OpenURL(rBox.get_selected_id());
782 m_xFileView->grab_focus();
787 OpenURL( pPtr->GetHdlURL() );
793 m_xFileView->EndInplaceEditing();
796 SmartContent aContent;
797 aContent.enableDefaultInteractionHandler();
799 aContent.bindTo( m_xFileView->GetViewURL() );
800 if( !aContent.canCreateFolder() )
804 aContent.getTitle( aTitle );
806 bool bHandled =
false;
812 OUString aUrl = aContent.createFolder(aDlg.
GetName());
813 if( !aUrl.isEmpty() )
815 m_xFileView->CreatedFolder(aUrl, aDlg.
GetName());
826 OUString sUserSelectedPath;
829 OUString sCurrentPath = m_xFileView->GetViewURL();
830 OUString sSelectedItem = m_xFileView->GetCurrentURL();
831 OUString sUserTypedName = m_xName_ed->get_text();
835 sFileName = AddFileExtension(sUserTypedName);
837 sFileName = sUserTypedName;
840 bool bSelected = ( m_xFileView->GetSelectionCount() > 0 );
842 if( !sCurrentPath.endsWith(
"/") )
853 m_sPath = sCurrentPath;
855 m_sPath = sSelectedItem;
864 sUserSelectedPath = m_sPath;
867 bool bExists =
false;
870 bExists = ContentIsDocument( m_sPath );
872 bExists = ContentIsFolder( m_sPath );
878 OUString sMsg =
FpsResId( STR_SVT_ALREADYEXISTOVERWRITE );
879 sMsg = sMsg.replaceFirst(
"$filename$", sFileName);
881 VclMessageType::Question, VclButtonsType::YesNo, sMsg));
888 if (ContentIsFolder(sUserSelectedPath))
890 OpenURL(sUserSelectedPath);
893 m_xName_ed->grab_focus();
907 if( m_pCurrentAsyncAction.is() )
909 m_pCurrentAsyncAction->cancel();
910 onAsyncOperationFinished();
981 const OUString& rFilter,
982 const css::uno::Sequence< css::beans::StringPair >& rFilters )
985 const StringPair* pSubFilters = rFilters.getConstArray();
986 const StringPair* pSubFiltersEnd = pSubFilters + rFilters.getLength();
987 for ( ; pSubFilters != pSubFiltersEnd; ++pSubFilters )
988 AddFilter( pSubFilters->First, pSubFilters->Second );
1070 const ::std::vector< SvtContentEntry >& rFolders =
m_xFileView->GetContent();
1071 ::std::vector< std::pair< OUString, OUString > > aFolders;
1075 for(
const auto & rFolder : rFolders)
1078 OUString aFolderName = rFolder.maURL;
1079 if( rFolder.mbIsFolder && ( ( aFolderName.lastIndexOf(
'/' ) + 1 ) == aFolderName.getLength() ) )
1080 aFolderName = aFolderName.copy( 0, aFolderName.getLength() - 1 );
1082 int nTitleStart = aFolderName.lastIndexOf(
'/' );
1083 if( nTitleStart != -1 )
1086 aFolderName.subView( nTitleStart + 1 ),
1089 if( rFolder.mbIsFolder )
1091 aFolders.emplace_back( sTitle, aFolderName );
1119 std::vector<OUString> aList;
1133 if( aList.empty() && !
m_sPath.isEmpty() )
1144 ::utl::UCBContentHelper::getDefaultCommandEnvironment(),
1148 catch (css::uno::Exception
const&)
1159 ::utl::UCBContentHelper::getDefaultCommandEnvironment(),
1163 catch (css::uno::Exception
const&)
Reference< XComponentContext > m_xContext
IMPL_LINK(RemoteFilesDialog, EditServiceMenuHdl, const OUString &, rIdent, void)
static OUString lcl_GetServiceType(const ServicePtr &pService)
IMPL_LINK_NOARG(RemoteFilesDialog, IconViewHdl, weld::Button &, void)
std::shared_ptr< Place > ServicePtr
Reference< XExecutableDialog > m_xDialog
static weld::MessageDialog * CreateMessageDialog(weld::Widget *pParent, VclMessageType eMessageType, VclButtonsType eButtonType, const OUString &rPrimaryMessage, const ILibreOfficeKitNotifier *pNotifier=nullptr)
static DialogMask HandleError(ErrCode nId, weld::Window *pParent=nullptr, DialogMask nMask=DialogMask::MAX)
static OUString decode(std::u16string_view rText, DecodeMechanism eMechanism, rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8)
OUString GetLastName(DecodeMechanism eMechanism=DecodeMechanism::ToIUri, rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8) const
OUString GetUser(DecodeMechanism eMechanism=DecodeMechanism::ToIUri, rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8) const
static OUString encode(std::u16string_view rText, Part ePart, EncodeMechanism eMechanism, rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8)
void EnableExtraMenuItems(bool bEnable)
virtual bool getShowState() override
std::vector< ServicePtr > m_aServices
OUString AddFileExtension(const OUString &rFileName)
void OpenURL(OUString const &sURL)
std::unique_ptr< weld::ComboBox > m_xFilter_lb
std::unique_ptr< weld::ToggleButton > m_xIconView_btn
virtual void onAsyncOperationFinished() override
virtual OUString getCurFilter() const override
std::unique_ptr< weld::Container > m_xContainer
int GetSelectedServicePos()
std::unique_ptr< weld::Button > m_xNewFolder
virtual OUString GetCurFilter() const override
virtual const css::uno::Sequence< OUString > & GetDenyList() const override
virtual void EnableAutocompletion(bool=true) override
void SavePassword(const OUString &rURL, const OUString &rUser, const OUString &rPassword, bool bPersistent)
std::unique_ptr< weld::Button > m_xCancel_btn
std::unique_ptr< weld::Container > m_xPathContainer
virtual void onAsyncOperationStarted() override
virtual void SetDenyList(const css::uno::Sequence< OUString > &rDenyList) override
virtual const OUString & GetStandardDir() const override
virtual void AddFilter(const OUString &rFilter, const OUString &rType) override
css::uno::Sequence< OUString > m_aDenyList
Reference< XComponentContext > m_xContext
std::unique_ptr< SvtFileView > m_xFileView
std::vector< std::pair< OUString, OUString > > m_aFilters
OUString m_sLastServiceUrl
std::unique_ptr< FolderTree > m_xTreeView
virtual std::vector< OUString > GetPathList() const override
virtual void SetCurFilter(const OUString &rFilter) override
virtual void setImage(const css::uno::Any &rImage) override
virtual void enableControl(sal_Int16 nControlId, bool bEnable) override
virtual sal_Int32 getAvailableHeight() override
virtual short run() override
bool ContentIsDocument(const OUString &rURL)
virtual weld::Widget * getControl(sal_Int16 nControlId, bool bLabelControl=false) const override
::rtl::Reference< ::svt::AsyncPickerAction > m_pCurrentAsyncAction
std::unique_ptr< AutocompleteEdit > m_xName_ed
std::unique_ptr< Breadcrumb > m_xPath
virtual void SetPath(const OUString &rNewURL) override
virtual void SetStandardDir(const OUString &rStdDir) override
virtual const OUString & GetPath() override
virtual void UpdateControls(const OUString &rURL) override
virtual void AddFilterGroup(const OUString &_rFilter, const css::uno::Sequence< css::beans::StringPair > &rFilters) override
virtual void SetHasFilename(bool) override
virtual OUString getCurrentFileText() const override
std::unique_ptr< weld::ComboBox > m_xServices_lb
virtual void setCurrentFileText(const OUString &rText, bool bSelectAll=false) override
virtual void SetFileCallback(::svt::IFilePickerListener *pNotifier) override
std::unique_ptr< weld::Button > m_xOk_btn
std::unique_ptr< weld::MenuButton > m_xManageServices
Reference< XPasswordContainer2 > m_xMasterPasswd
void FillServicesListbox()
virtual SvtFileView * GetView() override
RemoteFilesDialog(weld::Window *pParent, PickerFlags nBits)
virtual bool ContentIsFolder(const OUString &rURL) override
virtual ~RemoteFilesDialog() override
virtual sal_Int32 getAvailableWidth() override
virtual void FilterSelect() override
std::unique_ptr< weld::ToggleButton > m_xListView_btn
constexpr tools::Long Height() const
constexpr tools::Long Width() const
css::uno::Any GetUserItem(const OUString &sName) const
void SetUserItem(const OUString &sName, const css::uno::Any &aValue)
void SetWindowState(const OUString &sState)
OUString GetWindowState() const
static std::shared_ptr< ConfigurationChanges > create()
std::shared_ptr< weld::Dialog > m_xDialog
std::unique_ptr< weld::Builder > m_xBuilder
#define DBG_ASSERT(sCon, aError)
const EnumerationType m_eType
#define ERRCODE_IO_NOTEXISTS
constexpr OUStringLiteral FILEDIALOG_FILTER_ALL
OUString FpsResId(TranslateId aId)
#define LINK(Instance, Class, Member)
std::unique_ptr< sal_Int32[]> pData
Reference< XComponentContext > getProcessComponentContext()
css::uno::Reference< css::deployment::XPackageRegistry > create(css::uno::Reference< css::deployment::XPackageRegistry > const &xRootRegistry, OUString const &context, OUString const &cachePath, css::uno::Reference< css::uno::XComponentContext > const &xComponentContext)
constexpr OUStringLiteral first