LibreOffice Module svtools (master) 1
PlaceEditDialog.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
10#include <config_oauth2.h>
11
13
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>
19
21
22using namespace com::sun::star::uno;
23
24PlaceEditDialog::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_xBTDelete(m_xBuilder->weld_button("delete"))
36 , m_xBTRepoRefresh(m_xBuilder->weld_button("repositoriesRefresh"))
37 , m_xCBPassword(m_xBuilder->weld_check_button("rememberPassword"))
38 , m_xEDPassword(m_xBuilder->weld_entry("password"))
39 , m_xFTPasswordLabel(m_xBuilder->weld_label("passwordLabel"))
40 , m_xTypeGrid(m_xBuilder->weld_widget("TypeGrid"))
41
42 , m_xRepositoryBox(m_xBuilder->weld_widget("RepositoryDetails"))
43 , m_xFTRepository(m_xBuilder->weld_label("repositoryLabel"))
44 , m_xLBRepository(m_xBuilder->weld_combo_box("repositories"))
45
46 , m_xEDShare(m_xBuilder->weld_entry("share"))
47 , m_xFTShare(m_xBuilder->weld_label("shareLabel"))
48
49 , m_xDetailsGrid(m_xBuilder->weld_widget("Details"))
50 , m_xHostBox(m_xBuilder->weld_widget("HostDetails"))
51 , m_xEDHost(m_xBuilder->weld_entry("host"))
52 , m_xFTHost(m_xBuilder->weld_label("hostLabel"))
53 , m_xEDPort(m_xBuilder->weld_spin_button("port"))
54 , m_xFTPort(m_xBuilder->weld_label("portLabel"))
55 , m_xEDRoot(m_xBuilder->weld_entry("path"))
56 , m_xFTRoot(m_xBuilder->weld_label("pathLabel"))
57
58 , m_xCBDavs(m_xBuilder->weld_check_button("webdavs"))
59{
60 m_xBTOk->connect_clicked( LINK( this, PlaceEditDialog, OKHdl) );
61 m_xBTOk->set_sensitive( false );
62
63 m_xEDServerName->connect_changed( LINK( this, PlaceEditDialog, EditLabelHdl) );
64
65 // This constructor is called when user request a place creation, so
66 // delete button is hidden.
67 m_xBTDelete->hide();
68
69 m_xLBServerType->connect_changed( LINK( this, PlaceEditDialog, SelectTypeHdl ) );
70 m_xEDUsername->connect_changed( LINK( this, PlaceEditDialog, EditUsernameHdl ) );
71 m_xEDPassword->connect_changed( LINK( this, PlaceEditDialog, EditUsernameHdl ) );
72
73 InitDetails( );
74}
75
76PlaceEditDialog::PlaceEditDialog(weld::Window* pParent, const std::shared_ptr<Place>& rPlace)
77 : GenericDialogController(pParent, "svt/ui/placeedit.ui", "PlaceEditDialog")
78 , m_xCurrentDetails( )
79 , m_bLabelChanged( true )
80 , m_bShowPassword( false )
81 , m_xEDServerName(m_xBuilder->weld_entry("name"))
82 , m_xLBServerType(m_xBuilder->weld_combo_box("type"))
83 , m_xEDUsername(m_xBuilder->weld_entry("login"))
84 , m_xFTUsernameLabel(m_xBuilder->weld_label("loginLabel"))
85 , m_xBTOk(m_xBuilder->weld_button("ok"))
86 , m_xBTDelete(m_xBuilder->weld_button("delete"))
87 , m_xBTRepoRefresh(m_xBuilder->weld_button("repositoriesRefresh"))
88 , m_xCBPassword(m_xBuilder->weld_check_button("rememberPassword"))
89 , m_xEDPassword(m_xBuilder->weld_entry("password"))
90 , m_xFTPasswordLabel(m_xBuilder->weld_label("passwordLabel"))
91 , m_xTypeGrid(m_xBuilder->weld_widget("TypeGrid"))
92
93 , m_xRepositoryBox(m_xBuilder->weld_widget("RepositoryDetails"))
94 , m_xFTRepository(m_xBuilder->weld_label("repositoryLabel"))
95 , m_xLBRepository(m_xBuilder->weld_combo_box("repositories"))
96
97 , m_xEDShare(m_xBuilder->weld_entry("share"))
98 , m_xFTShare(m_xBuilder->weld_label("shareLabel"))
99
100 , m_xDetailsGrid(m_xBuilder->weld_widget("Details"))
101 , m_xHostBox(m_xBuilder->weld_widget("HostDetails"))
102 , m_xEDHost(m_xBuilder->weld_entry("host"))
103 , m_xFTHost(m_xBuilder->weld_label("hostLabel"))
104 , m_xEDPort(m_xBuilder->weld_spin_button("port"))
105 , m_xFTPort(m_xBuilder->weld_label("portLabel"))
106 , m_xEDRoot(m_xBuilder->weld_entry("path"))
107 , m_xFTRoot(m_xBuilder->weld_label("pathLabel"))
108
109 , m_xCBDavs(m_xBuilder->weld_check_button("webdavs"))
110{
111 m_xEDPassword->hide();
112 m_xFTPasswordLabel->hide();
113 m_xCBPassword->hide();
114
115 m_xBTOk->connect_clicked( LINK( this, PlaceEditDialog, OKHdl) );
116 m_xBTDelete->connect_clicked( LINK( this, PlaceEditDialog, DelHdl) );
117
118 m_xEDServerName->connect_changed( LINK( this, PlaceEditDialog, ModifyHdl) );
119 m_xLBServerType->connect_changed( LINK( this, PlaceEditDialog, SelectTypeHdl ) );
120
121 InitDetails( );
122
123 m_xEDServerName->set_text(rPlace->GetName());
124
125 // Fill the boxes with the URL parts
126 bool bSuccess = false;
127 for (size_t i = 0 ; i < m_aDetailsContainers.size( ) && !bSuccess; ++i)
128 {
129 INetURLObject& rUrl = rPlace->GetUrlObject();
130 bSuccess = m_aDetailsContainers[i]->setUrl( rUrl );
131 if ( bSuccess )
132 {
133 // Fill the Username field
134 if ( rUrl.HasUserData( ) )
135 {
136 m_xEDUsername->set_text( rUrl.GetUser(INetURLObject::DecodeMechanism::WithCharset) );
137 m_aDetailsContainers[i]->setUsername( rUrl.GetUser(INetURLObject::DecodeMechanism::WithCharset) );
138 }
139
140 m_xLBServerType->set_active(i);
141 SelectType(true);
142 }
143 }
144
145 // In edit mode user can't change connection type
146 m_xTypeGrid->hide();
147}
148
149PlaceEditDialog::~PlaceEditDialog()
150{
151}
152
153OUString PlaceEditDialog::GetServerUrl()
154{
155 OUString sUrl;
156 if (m_xCurrentDetails)
157 {
158 INetURLObject aUrl = m_xCurrentDetails->getUrl();
159 OUString sUsername = m_xEDUsername->get_text().trim();
160 if ( !sUsername.isEmpty( ) )
161 aUrl.SetUser( sUsername );
162 if ( !aUrl.HasError( ) )
164 }
165
166 return sUrl;
167}
168
169std::shared_ptr<Place> PlaceEditDialog::GetPlace()
170{
171 return std::make_shared<Place>(m_xEDServerName->get_text(), GetServerUrl(), true);
172}
173
174void PlaceEditDialog::InitDetails( )
175{
176 // Create CMIS controls for each server type
177
178 // Load the ServerType entries
179 bool bSkipGDrive = std::string_view( GDRIVE_CLIENT_ID ).empty() ||
180 std::string_view( GDRIVE_CLIENT_SECRET ).empty();
181 bool bSkipAlfresco = std::string_view( ALFRESCO_CLOUD_CLIENT_ID ).empty() ||
182 std::string_view( ALFRESCO_CLOUD_CLIENT_SECRET ).empty();
183 bool bSkipOneDrive= std::string_view( ONEDRIVE_CLIENT_ID ).empty() ||
184 std::string_view( ONEDRIVE_CLIENT_SECRET ).empty();
185
186 Sequence< OUString > aTypesUrlsList( officecfg::Office::Common::Misc::CmisServersUrls::get() );
187 Sequence< OUString > aTypesNamesList( officecfg::Office::Common::Misc::CmisServersNames::get() );
188
189 int nPos = 0;
190 auto nSize = std::min(aTypesUrlsList.getLength(), aTypesNamesList.getLength());
191 for ( sal_Int32 i = 0; i < nSize; ++i )
192 {
193 OUString sUrl = aTypesUrlsList[i].replaceFirst("<host", Concat2View("<" + SvtResId(STR_SVT_HOST))).replaceFirst("port>", Concat2View(SvtResId(STR_SVT_PORT) + ">"));
194
195 if ((sUrl == GDRIVE_BASE_URL && bSkipGDrive) ||
196 (sUrl.startsWith( ALFRESCO_CLOUD_BASE_URL) && bSkipAlfresco) ||
197 (sUrl == ONEDRIVE_BASE_URL && bSkipOneDrive))
198 {
199 // this service is not supported
200 continue;
201 }
202
203 m_xLBServerType->insert_text(nPos, aTypesNamesList[i].replaceFirst("Other CMIS", SvtResId(STR_SVT_OTHER_CMIS)));
204
205 std::shared_ptr<DetailsContainer> xCmisDetails(std::make_shared<CmisDetailsContainer>(this, sUrl));
206 xCmisDetails->setChangeHdl( LINK( this, PlaceEditDialog, EditHdl ) );
207 m_aDetailsContainers.push_back(xCmisDetails);
208
209 ++nPos;
210 }
211
212 // Create WebDAV / FTP / SSH details control
213 std::shared_ptr<DetailsContainer> xDavDetails(std::make_shared<DavDetailsContainer>(this));
214 xDavDetails->setChangeHdl( LINK( this, PlaceEditDialog, EditHdl ) );
215 m_aDetailsContainers.push_back(xDavDetails);
216
217 std::shared_ptr<DetailsContainer> xFtpDetails(std::make_shared<HostDetailsContainer>(this, 21, "ftp"));
218 xFtpDetails->setChangeHdl( LINK( this, PlaceEditDialog, EditHdl ) );
219 m_aDetailsContainers.push_back(xFtpDetails);
220
221 std::shared_ptr<DetailsContainer> xSshDetails(std::make_shared<HostDetailsContainer>(this, 22, "sftp"));
222 xSshDetails->setChangeHdl( LINK( this, PlaceEditDialog, EditHdl ) );
223 m_aDetailsContainers.push_back(xSshDetails);
224
225 // Remove Windows Share entry from dialog on Windows OS, where it's non-functional
226#if defined(_WIN32)
227 // nPos is the position of first item that is pre-defined in svtools/uiconfig/ui/placeedit.ui,
228 // after other CMIS types were inserted
229 m_xLBServerType->remove(nPos + 3);
230#else
231 // Create Windows Share control
232 std::shared_ptr<DetailsContainer> xSmbDetails(std::make_shared<SmbDetailsContainer>(this));
233 xSmbDetails->setChangeHdl( LINK( this, PlaceEditDialog, EditHdl ) );
234 m_aDetailsContainers.push_back(xSmbDetails);
235#endif
236
237 // Set default to first value
238 m_xLBServerType->set_active(0);
239
240 if (m_xLBServerType->get_active_text() == "--------------------" )
241 m_xLBServerType->set_active(1);
242
243 SelectType(true);
244}
245
246IMPL_LINK( PlaceEditDialog, OKHdl, weld::Button&, /*rBtn*/, void)
247{
248 if ( !m_xCurrentDetails )
249 return;
250
251 OUString sUrl = m_xCurrentDetails->getUrl().GetHost( INetURLObject::DecodeMechanism::WithCharset );
252
253 if ( sUrl.startsWith( GDRIVE_BASE_URL )
254 || sUrl.startsWith( ALFRESCO_CLOUD_BASE_URL )
255 || sUrl.startsWith( ONEDRIVE_BASE_URL ) )
256 {
257 m_xBTRepoRefresh->clicked();
258
259 sUrl = m_xCurrentDetails->getUrl().GetHost( INetURLObject::DecodeMechanism::WithCharset );
260 INetURLObject aHostUrl( sUrl );
261 OUString sRepoId = aHostUrl.GetMark();
262
263 if ( !sRepoId.isEmpty() )
264 {
265 m_xDialog->response(RET_OK);
266 }
267 else
268 {
269 // TODO: repository id missing. Auth error?
270 }
271 }
272 else
273 {
274 m_xDialog->response(RET_OK);
275 }
276}
277
278IMPL_LINK( PlaceEditDialog, DelHdl, weld::Button&, /*rButton*/, void)
279{
280 // ReUsing existing symbols...
281 m_xDialog->response(RET_NO);
282}
283
284IMPL_LINK_NOARG( PlaceEditDialog, EditHdl, DetailsContainer*, void )
285{
286 if( !m_bLabelChanged )
287 {
288 if( !m_xEDUsername->get_text().isEmpty( ) )
289 {
290 OUString sLabel = SvtResId( STR_SVT_DEFAULT_SERVICE_LABEL );
291 OUString sUser = m_xEDUsername->get_text();
292
293 int nLength = sUser.indexOf( '@' );
294 if( nLength < 0 )
295 nLength = sUser.getLength();
296
297 sLabel = sLabel.replaceFirst( "$user$", sUser.subView( 0, nLength ) );
298 sLabel = sLabel.replaceFirst( "$service$", m_xLBServerType->get_active_text() );
299
300 m_xEDServerName->set_text( sLabel );
301 m_bLabelChanged = false;
302 }
303 else
304 {
305 m_xEDServerName->set_text( m_xLBServerType->get_active_text( ) );
306 }
307 }
308
309 OUString sUrl = GetServerUrl( );
310 OUString sName = m_xEDServerName->get_text().trim();
311 m_xBTOk->set_sensitive( !sName.isEmpty( ) && !sUrl.isEmpty( ) );
312}
313
314IMPL_LINK_NOARG( PlaceEditDialog, ModifyHdl, weld::Entry&, void )
315{
316 EditHdl(nullptr);
317}
318
319IMPL_LINK_NOARG( PlaceEditDialog, EditLabelHdl, weld::Entry&, void )
320{
321 m_bLabelChanged = true;
322 EditHdl(nullptr);
323}
324
325IMPL_LINK_NOARG( PlaceEditDialog, EditUsernameHdl, weld::Entry&, void )
326{
327 for ( auto& rxDetailsContainer : m_aDetailsContainers )
328 {
329 rxDetailsContainer->setUsername( m_xEDUsername->get_text() );
330 rxDetailsContainer->setPassword( m_xEDPassword->get_text() );
331 }
332
333 EditHdl(nullptr);
334}
335
336IMPL_LINK_NOARG( PlaceEditDialog, SelectTypeHdl, weld::ComboBox&, void )
337{
338 SelectType(false);
339}
340
341void PlaceEditDialog::SelectType(bool bSkipSeparator)
342{
343 if ( m_xLBServerType->get_active_text() == "--------------------" )
344 {
345 if (bSkipSeparator)
346 m_xLBServerType->set_active(m_nCurrentType);
347 else
348 m_xLBServerType->set_active(-1);
349 return;
350 }
351
352 if (m_xCurrentDetails)
353 m_xCurrentDetails->set_visible(false);
354
355 const int nPos = m_xLBServerType->get_active( );
356 m_xCurrentDetails = m_aDetailsContainers[nPos];
357 m_nCurrentType = nPos;
358
359 m_xCurrentDetails->set_visible(true);
360
361 m_xCBPassword->set_visible( m_bShowPassword && m_xCurrentDetails->enableUserCredentials() );
362 m_xEDPassword->set_visible( m_bShowPassword && m_xCurrentDetails->enableUserCredentials() );
363 m_xFTPasswordLabel->set_visible( m_bShowPassword && m_xCurrentDetails->enableUserCredentials() );
364 m_xEDUsername->set_visible( m_xCurrentDetails->enableUserCredentials() );
365 m_xFTUsernameLabel->set_visible( m_xCurrentDetails->enableUserCredentials() );
366
367 m_xDialog->resize_to_request();
368
369 EditHdl(nullptr);
370}
371
372/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
IMPL_LINK(PlaceEditDialog, OKHdl, weld::Button &,, void)
IMPL_LINK_NOARG(PlaceEditDialog, EditHdl, DetailsContainer *, void)
Reference< XExecutableDialog > m_xDialog
OUString GetMainURL(DecodeMechanism eMechanism, rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8) const
bool HasError() const
OUString GetMark(DecodeMechanism eMechanism=DecodeMechanism::ToIUri, rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8) const
bool HasUserData() const
OUString GetUser(DecodeMechanism eMechanism=DecodeMechanism::ToIUri, rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8) const
bool SetUser(std::u16string_view rTheUser)
OUString sName
sal_uInt16 nPos
int i
OUString SvtResId(TranslateId aId)
Definition: svtresid.cxx:24
RET_OK
RET_NO
sal_Int32 nLength