1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
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/.
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")
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.
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
) );
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
) );
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
);
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
);
147 // In edit mode user can't change connection type
151 PlaceEditDialog::~PlaceEditDialog()
155 OUString
PlaceEditDialog::GetServerUrl()
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
);
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
) );
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
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
);
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
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);
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
);
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);
250 IMPL_LINK( PlaceEditDialog
, OKHdl
, weld::Button
&, /*rBtn*/, void)
252 if ( !m_xCurrentDetails
)
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
);
273 // TODO: repository id missing. Auth error?
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( '@' );
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;
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 )
323 IMPL_LINK_NOARG( PlaceEditDialog
, EditLabelHdl
, weld::Entry
&, void )
325 m_bLabelChanged
= true;
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() );
340 IMPL_LINK_NOARG( PlaceEditDialog
, SelectTypeHdl
, weld::ComboBox
&, void )
345 void PlaceEditDialog::SelectType(bool bSkipSeparator
)
347 if ( m_xLBServerType
->get_active_text() == "--------------------" )
350 m_xLBServerType
->set_active(m_nCurrentType
);
352 m_xLBServerType
->set_active(-1);
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();
376 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */