nss: upgrade to release 3.73
[LibreOffice.git] / svtools / source / dialogs / PlaceEditDialog.cxx
blobf006f82c84a70b0e7a120e8ec0a097536aee3b2b
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/.
8 */
10 #include <config_oauth2.h>
12 #include <svtools/PlaceEditDialog.hxx>
14 #include <com/sun/star/uno/Sequence.hxx>
15 #include <officecfg/Office/Common.hxx>
16 #include <svtools/svtresid.hxx>
17 #include <svtools/strings.hrc>
18 #include <svtools/place.hxx>
20 #include "ServerDetailsControls.hxx"
22 using namespace com::sun::star::uno;
24 PlaceEditDialog::PlaceEditDialog(weld::Window* pParent)
25 : GenericDialogController(pParent, "svt/ui/placeedit.ui", "PlaceEditDialog")
26 , m_xCurrentDetails()
27 , m_nCurrentType( 0 )
28 , m_bLabelChanged( false )
29 , m_bShowPassword( true )
30 , m_xEDServerName(m_xBuilder->weld_entry("name"))
31 , m_xLBServerType(m_xBuilder->weld_combo_box("type"))
32 , m_xEDUsername(m_xBuilder->weld_entry("login"))
33 , m_xFTUsernameLabel(m_xBuilder->weld_label("loginLabel"))
34 , m_xBTOk(m_xBuilder->weld_button("ok"))
35 , m_xBTCancel(m_xBuilder->weld_button("cancel"))
36 , m_xBTDelete(m_xBuilder->weld_button("delete"))
37 , m_xBTRepoRefresh(m_xBuilder->weld_button("repositoriesRefresh"))
38 , m_xCBPassword(m_xBuilder->weld_check_button("rememberPassword"))
39 , m_xEDPassword(m_xBuilder->weld_entry("password"))
40 , m_xFTPasswordLabel(m_xBuilder->weld_label("passwordLabel"))
41 , m_xTypeGrid(m_xBuilder->weld_widget("TypeGrid"))
43 , m_xRepositoryBox(m_xBuilder->weld_widget("RepositoryDetails"))
44 , m_xFTRepository(m_xBuilder->weld_label("repositoryLabel"))
45 , m_xLBRepository(m_xBuilder->weld_combo_box("repositories"))
47 , m_xEDShare(m_xBuilder->weld_entry("share"))
48 , m_xFTShare(m_xBuilder->weld_label("shareLabel"))
50 , m_xDetailsGrid(m_xBuilder->weld_widget("Details"))
51 , m_xHostBox(m_xBuilder->weld_widget("HostDetails"))
52 , m_xEDHost(m_xBuilder->weld_entry("host"))
53 , m_xFTHost(m_xBuilder->weld_label("hostLabel"))
54 , m_xEDPort(m_xBuilder->weld_spin_button("port"))
55 , m_xFTPort(m_xBuilder->weld_label("portLabel"))
56 , m_xEDRoot(m_xBuilder->weld_entry("path"))
57 , m_xFTRoot(m_xBuilder->weld_label("pathLabel"))
59 , m_xCBDavs(m_xBuilder->weld_check_button("webdavs"))
61 m_xBTOk->connect_clicked( LINK( this, PlaceEditDialog, OKHdl) );
62 m_xBTOk->set_sensitive( false );
64 m_xEDServerName->connect_changed( LINK( this, PlaceEditDialog, EditLabelHdl) );
66 // This constructor is called when user request a place creation, so
67 // delete button is hidden.
68 m_xBTDelete->hide();
70 m_xLBServerType->connect_changed( LINK( this, PlaceEditDialog, SelectTypeHdl ) );
71 m_xEDUsername->connect_changed( LINK( this, PlaceEditDialog, EditUsernameHdl ) );
72 m_xEDPassword->connect_changed( LINK( this, PlaceEditDialog, EditUsernameHdl ) );
74 InitDetails( );
77 PlaceEditDialog::PlaceEditDialog(weld::Window* pParent, const std::shared_ptr<Place>& rPlace)
78 : GenericDialogController(pParent, "svt/ui/placeedit.ui", "PlaceEditDialog")
79 , m_xCurrentDetails( )
80 , m_bLabelChanged( true )
81 , m_bShowPassword( false )
82 , m_xEDServerName(m_xBuilder->weld_entry("name"))
83 , m_xLBServerType(m_xBuilder->weld_combo_box("type"))
84 , m_xEDUsername(m_xBuilder->weld_entry("login"))
85 , m_xFTUsernameLabel(m_xBuilder->weld_label("loginLabel"))
86 , m_xBTOk(m_xBuilder->weld_button("ok"))
87 , m_xBTCancel(m_xBuilder->weld_button("cancel"))
88 , m_xBTDelete(m_xBuilder->weld_button("delete"))
89 , m_xBTRepoRefresh(m_xBuilder->weld_button("repositoriesRefresh"))
90 , m_xCBPassword(m_xBuilder->weld_check_button("rememberPassword"))
91 , m_xEDPassword(m_xBuilder->weld_entry("password"))
92 , m_xFTPasswordLabel(m_xBuilder->weld_label("passwordLabel"))
93 , m_xTypeGrid(m_xBuilder->weld_widget("TypeGrid"))
95 , m_xRepositoryBox(m_xBuilder->weld_widget("RepositoryDetails"))
96 , m_xFTRepository(m_xBuilder->weld_label("repositoryLabel"))
97 , m_xLBRepository(m_xBuilder->weld_combo_box("repositories"))
99 , m_xEDShare(m_xBuilder->weld_entry("share"))
100 , m_xFTShare(m_xBuilder->weld_label("shareLabel"))
102 , m_xDetailsGrid(m_xBuilder->weld_widget("Details"))
103 , m_xHostBox(m_xBuilder->weld_widget("HostDetails"))
104 , m_xEDHost(m_xBuilder->weld_entry("host"))
105 , m_xFTHost(m_xBuilder->weld_label("hostLabel"))
106 , m_xEDPort(m_xBuilder->weld_spin_button("port"))
107 , m_xFTPort(m_xBuilder->weld_label("portLabel"))
108 , m_xEDRoot(m_xBuilder->weld_entry("path"))
109 , m_xFTRoot(m_xBuilder->weld_label("pathLabel"))
111 , m_xCBDavs(m_xBuilder->weld_check_button("webdavs"))
113 m_xEDPassword->hide();
114 m_xFTPasswordLabel->hide();
115 m_xCBPassword->hide();
117 m_xBTOk->connect_clicked( LINK( this, PlaceEditDialog, OKHdl) );
118 m_xBTDelete->connect_clicked( LINK( this, PlaceEditDialog, DelHdl) );
120 m_xEDServerName->connect_changed( LINK( this, PlaceEditDialog, ModifyHdl) );
121 m_xLBServerType->connect_changed( LINK( this, PlaceEditDialog, SelectTypeHdl ) );
123 InitDetails( );
125 m_xEDServerName->set_text(rPlace->GetName());
127 // Fill the boxes with the URL parts
128 bool bSuccess = false;
129 for (size_t i = 0 ; i < m_aDetailsContainers.size( ) && !bSuccess; ++i)
131 INetURLObject& rUrl = rPlace->GetUrlObject();
132 bSuccess = m_aDetailsContainers[i]->setUrl( rUrl );
133 if ( bSuccess )
135 // Fill the Username field
136 if ( rUrl.HasUserData( ) )
138 m_xEDUsername->set_text( rUrl.GetUser(INetURLObject::DecodeMechanism::WithCharset) );
139 m_aDetailsContainers[i]->setUsername( rUrl.GetUser(INetURLObject::DecodeMechanism::WithCharset) );
142 m_xLBServerType->set_active(i);
143 SelectType(true);
147 // In edit mode user can't change connection type
148 m_xTypeGrid->hide();
151 PlaceEditDialog::~PlaceEditDialog()
155 OUString PlaceEditDialog::GetServerUrl()
157 OUString sUrl;
158 if (m_xCurrentDetails)
160 INetURLObject aUrl = m_xCurrentDetails->getUrl();
161 OUString sUsername = m_xEDUsername->get_text().trim();
162 if ( !sUsername.isEmpty( ) )
163 aUrl.SetUser( sUsername );
164 if ( !aUrl.HasError( ) )
165 sUrl = aUrl.GetMainURL( INetURLObject::DecodeMechanism::NONE );
168 return sUrl;
171 std::shared_ptr<Place> PlaceEditDialog::GetPlace()
173 return std::make_shared<Place>(m_xEDServerName->get_text(), GetServerUrl(), true);
176 void PlaceEditDialog::InitDetails( )
178 // Create CMIS controls for each server type
180 Reference< XComponentContext > xContext = ::comphelper::getProcessComponentContext();
182 // Load the ServerType entries
183 bool bSkipGDrive = OUString( GDRIVE_CLIENT_ID ).isEmpty() ||
184 OUString( GDRIVE_CLIENT_SECRET ).isEmpty();
185 bool bSkipAlfresco = OUString( ALFRESCO_CLOUD_CLIENT_ID ).isEmpty() ||
186 OUString( ALFRESCO_CLOUD_CLIENT_SECRET ).isEmpty();
187 bool bSkipOneDrive= OUString( ONEDRIVE_CLIENT_ID ).isEmpty() ||
188 OUString( ONEDRIVE_CLIENT_SECRET ).isEmpty();
190 Sequence< OUString > aTypesUrlsList( officecfg::Office::Common::Misc::CmisServersUrls::get( xContext ) );
191 Sequence< OUString > aTypesNamesList( officecfg::Office::Common::Misc::CmisServersNames::get( xContext ) );
193 int nPos = 0;
194 auto nSize = std::min(aTypesUrlsList.getLength(), aTypesNamesList.getLength());
195 for ( sal_Int32 i = 0; i < nSize; ++i )
197 OUString sUrl = aTypesUrlsList[i].replaceFirst("<host", OUString("<" + SvtResId(STR_SVT_HOST))).replaceFirst("port>", OUString(SvtResId(STR_SVT_PORT) + ">"));
199 if ((sUrl == GDRIVE_BASE_URL && bSkipGDrive) ||
200 (sUrl.startsWith( ALFRESCO_CLOUD_BASE_URL) && bSkipAlfresco) ||
201 (sUrl == ONEDRIVE_BASE_URL && bSkipOneDrive))
203 // this service is not supported
204 continue;
207 m_xLBServerType->insert_text(nPos, aTypesNamesList[i].replaceFirst("Other CMIS", SvtResId(STR_SVT_OTHER_CMIS)));
209 std::shared_ptr<DetailsContainer> xCmisDetails(std::make_shared<CmisDetailsContainer>(this, sUrl));
210 xCmisDetails->setChangeHdl( LINK( this, PlaceEditDialog, EditHdl ) );
211 m_aDetailsContainers.push_back(xCmisDetails);
213 ++nPos;
216 // Create WebDAV / FTP / SSH details control
217 std::shared_ptr<DetailsContainer> xDavDetails(std::make_shared<DavDetailsContainer>(this));
218 xDavDetails->setChangeHdl( LINK( this, PlaceEditDialog, EditHdl ) );
219 m_aDetailsContainers.push_back(xDavDetails);
221 std::shared_ptr<DetailsContainer> xFtpDetails(std::make_shared<HostDetailsContainer>(this, 21, "ftp"));
222 xFtpDetails->setChangeHdl( LINK( this, PlaceEditDialog, EditHdl ) );
223 m_aDetailsContainers.push_back(xFtpDetails);
225 std::shared_ptr<DetailsContainer> xSshDetails(std::make_shared<HostDetailsContainer>(this, 22, "ssh"));
226 xSshDetails->setChangeHdl( LINK( this, PlaceEditDialog, EditHdl ) );
227 m_aDetailsContainers.push_back(xSshDetails);
229 // Remove Windows Share entry from dialog on Windows OS, where it's non-functional
230 #if defined(_WIN32)
231 // nPos is the position of first item that is pre-defined in svtools/uiconfig/ui/placeedit.ui,
232 // after other CMIS types were inserted
233 m_xLBServerType->remove(nPos + 3);
234 #else
235 // Create Windows Share control
236 std::shared_ptr<DetailsContainer> xSmbDetails(std::make_shared<SmbDetailsContainer>(this));
237 xSmbDetails->setChangeHdl( LINK( this, PlaceEditDialog, EditHdl ) );
238 m_aDetailsContainers.push_back(xSmbDetails);
239 #endif
241 // Set default to first value
242 m_xLBServerType->set_active(0);
244 if (m_xLBServerType->get_active_text() == "--------------------" )
245 m_xLBServerType->set_active(1);
247 SelectType(true);
250 IMPL_LINK( PlaceEditDialog, OKHdl, weld::Button&, /*rBtn*/, void)
252 if ( !m_xCurrentDetails )
253 return;
255 OUString sUrl = m_xCurrentDetails->getUrl().GetHost( INetURLObject::DecodeMechanism::WithCharset );
257 if ( sUrl.startsWith( GDRIVE_BASE_URL )
258 || sUrl.startsWith( ALFRESCO_CLOUD_BASE_URL )
259 || sUrl.startsWith( ONEDRIVE_BASE_URL ) )
261 m_xBTRepoRefresh->clicked();
263 sUrl = m_xCurrentDetails->getUrl().GetHost( INetURLObject::DecodeMechanism::WithCharset );
264 INetURLObject aHostUrl( sUrl );
265 OUString sRepoId = aHostUrl.GetMark();
267 if ( !sRepoId.isEmpty() )
269 m_xDialog->response(RET_OK);
271 else
273 // TODO: repository id missing. Auth error?
276 else
278 m_xDialog->response(RET_OK);
282 IMPL_LINK( PlaceEditDialog, DelHdl, weld::Button&, /*rButton*/, void)
284 // ReUsing existing symbols...
285 m_xDialog->response(RET_NO);
288 IMPL_LINK_NOARG( PlaceEditDialog, EditHdl, DetailsContainer*, void )
290 if( !m_bLabelChanged )
292 if( !m_xEDUsername->get_text().isEmpty( ) )
294 OUString sLabel = SvtResId( STR_SVT_DEFAULT_SERVICE_LABEL );
295 OUString sUser = m_xEDUsername->get_text();
297 int nLength = sUser.indexOf( '@' );
298 if( nLength < 0 )
299 nLength = sUser.getLength();
301 sLabel = sLabel.replaceFirst( "$user$", sUser.subView( 0, nLength ) );
302 sLabel = sLabel.replaceFirst( "$service$", m_xLBServerType->get_active_text() );
304 m_xEDServerName->set_text( sLabel );
305 m_bLabelChanged = false;
307 else
309 m_xEDServerName->set_text( m_xLBServerType->get_active_text( ) );
313 OUString sUrl = GetServerUrl( );
314 OUString sName = m_xEDServerName->get_text().trim();
315 m_xBTOk->set_sensitive( !sName.isEmpty( ) && !sUrl.isEmpty( ) );
318 IMPL_LINK_NOARG( PlaceEditDialog, ModifyHdl, weld::Entry&, void )
320 EditHdl(nullptr);
323 IMPL_LINK_NOARG( PlaceEditDialog, EditLabelHdl, weld::Entry&, void )
325 m_bLabelChanged = true;
326 EditHdl(nullptr);
329 IMPL_LINK_NOARG( PlaceEditDialog, EditUsernameHdl, weld::Entry&, void )
331 for ( auto& rxDetailsContainer : m_aDetailsContainers )
333 rxDetailsContainer->setUsername( m_xEDUsername->get_text() );
334 rxDetailsContainer->setPassword( m_xEDPassword->get_text() );
337 EditHdl(nullptr);
340 IMPL_LINK_NOARG( PlaceEditDialog, SelectTypeHdl, weld::ComboBox&, void )
342 SelectType(false);
345 void PlaceEditDialog::SelectType(bool bSkipSeparator)
347 if ( m_xLBServerType->get_active_text() == "--------------------" )
349 if (bSkipSeparator)
350 m_xLBServerType->set_active(m_nCurrentType);
351 else
352 m_xLBServerType->set_active(-1);
353 return;
356 if (m_xCurrentDetails)
357 m_xCurrentDetails->set_visible(false);
359 const int nPos = m_xLBServerType->get_active( );
360 m_xCurrentDetails = m_aDetailsContainers[nPos];
361 m_nCurrentType = nPos;
363 m_xCurrentDetails->set_visible(true);
365 m_xCBPassword->set_visible( m_bShowPassword && m_xCurrentDetails->enableUserCredentials() );
366 m_xEDPassword->set_visible( m_bShowPassword && m_xCurrentDetails->enableUserCredentials() );
367 m_xFTPasswordLabel->set_visible( m_bShowPassword && m_xCurrentDetails->enableUserCredentials() );
368 m_xEDUsername->set_visible( m_xCurrentDetails->enableUserCredentials() );
369 m_xFTUsernameLabel->set_visible( m_xCurrentDetails->enableUserCredentials() );
371 m_xDialog->resize_to_request();
373 EditHdl(nullptr);
376 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */