Line data Source code
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 <tools/urlobj.hxx>
21 : #include <vcl/msgbox.hxx>
22 : #include <sfx2/filedlghelper.hxx>
23 :
24 : #include "multipat.hxx"
25 : #include <dialmgr.hxx>
26 :
27 : #include <cuires.hrc>
28 : #include <comphelper/processfactory.hxx>
29 : #include <comphelper/string.hxx>
30 : #include <com/sun/star/lang/XMultiServiceFactory.hpp>
31 : #include <com/sun/star/ui/dialogs/FolderPicker.hpp>
32 : #include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp>
33 :
34 : #include <unotools/localfilehelper.hxx>
35 : #include <unotools/pathoptions.hxx>
36 : #include "svtools/treelistentry.hxx"
37 :
38 : using namespace ::com::sun::star::lang;
39 : using namespace ::com::sun::star::ui::dialogs;
40 : using namespace ::com::sun::star::uno;
41 :
42 0 : IMPL_LINK_NOARG(SvxMultiPathDialog, SelectHdl_Impl)
43 : {
44 0 : sal_uLong nCount = m_pRadioLB->GetEntryCount();
45 0 : bool bIsSelected = m_pRadioLB->FirstSelected() != NULL;
46 0 : bool bEnable = nCount > 1;
47 0 : m_pDelBtn->Enable(bEnable && bIsSelected);
48 0 : return 0;
49 : }
50 :
51 0 : IMPL_LINK_NOARG(SvxPathSelectDialog, SelectHdl_Impl)
52 : {
53 0 : sal_uLong nCount = m_pPathLB->GetEntryCount();
54 0 : bool bIsSelected = m_pPathLB->GetSelectEntryPos() != LISTBOX_ENTRY_NOTFOUND;
55 0 : bool bEnable = nCount > 1;
56 0 : m_pDelBtn->Enable(bEnable && bIsSelected);
57 0 : return 0;
58 : }
59 :
60 0 : IMPL_LINK( SvxMultiPathDialog, CheckHdl_Impl, svx::SvxRadioButtonListBox *, pBox )
61 : {
62 : SvTreeListEntry* pEntry =
63 0 : pBox ? pBox->GetEntry( pBox->GetCurMousePoint() ) : m_pRadioLB->FirstSelected();
64 0 : if ( pEntry )
65 0 : m_pRadioLB->HandleEntryChecked( pEntry );
66 0 : return 0;
67 : }
68 :
69 0 : IMPL_LINK_NOARG(SvxMultiPathDialog, AddHdl_Impl)
70 : {
71 0 : Reference < XComponentContext > xContext( ::comphelper::getProcessComponentContext() );
72 0 : Reference < XFolderPicker2 > xFolderPicker = FolderPicker::create(xContext);
73 :
74 0 : if ( xFolderPicker->execute() == ExecutableDialogResults::OK )
75 : {
76 0 : INetURLObject aPath( xFolderPicker->getDirectory() );
77 0 : aPath.removeFinalSlash();
78 0 : OUString aURL = aPath.GetMainURL( INetURLObject::NO_DECODE );
79 0 : OUString sInsPath;
80 0 : ::utl::LocalFileHelper::ConvertURLToSystemPath( aURL, sInsPath );
81 :
82 0 : sal_uLong nPos = m_pRadioLB->GetEntryPos( sInsPath, 1 );
83 0 : if ( 0xffffffff == nPos ) //See svtools/source/contnr/svtabbx.cxx SvTabListBox::GetEntryPos
84 : {
85 0 : OUString sNewEntry( '\t' );
86 0 : sNewEntry += sInsPath;
87 0 : SvTreeListEntry* pEntry = m_pRadioLB->InsertEntry( sNewEntry );
88 0 : OUString* pData = new OUString( aURL );
89 0 : pEntry->SetUserData( pData );
90 : }
91 : else
92 : {
93 0 : OUString sMsg( CUI_RES( RID_MULTIPATH_DBL_ERR ) );
94 0 : sMsg = sMsg.replaceFirst( "%1", sInsPath );
95 0 : ScopedVclPtr<InfoBox>::Create( this, sMsg )->Execute();
96 : }
97 :
98 0 : SelectHdl_Impl( NULL );
99 : }
100 0 : return 0;
101 : }
102 :
103 0 : IMPL_LINK_NOARG(SvxPathSelectDialog, AddHdl_Impl)
104 : {
105 0 : Reference < XComponentContext > xContext( ::comphelper::getProcessComponentContext() );
106 0 : Reference < XFolderPicker2 > xFolderPicker = FolderPicker::create(xContext);
107 :
108 0 : if ( xFolderPicker->execute() == ExecutableDialogResults::OK )
109 : {
110 0 : INetURLObject aPath( xFolderPicker->getDirectory() );
111 0 : aPath.removeFinalSlash();
112 0 : OUString aURL = aPath.GetMainURL( INetURLObject::NO_DECODE );
113 0 : OUString sInsPath;
114 0 : ::utl::LocalFileHelper::ConvertURLToSystemPath( aURL, sInsPath );
115 :
116 0 : if ( LISTBOX_ENTRY_NOTFOUND != m_pPathLB->GetEntryPos( sInsPath ) )
117 : {
118 0 : OUString sMsg( CUI_RES( RID_MULTIPATH_DBL_ERR ) );
119 0 : sMsg = sMsg.replaceFirst( "%1", sInsPath );
120 0 : ScopedVclPtr<InfoBox>::Create( this, sMsg )->Execute();
121 : }
122 : else
123 : {
124 0 : sal_uInt16 nPos = m_pPathLB->InsertEntry( sInsPath, LISTBOX_APPEND );
125 0 : m_pPathLB->SetEntryData( nPos, new OUString( aURL ) );
126 : }
127 :
128 0 : SelectHdl_Impl( NULL );
129 : }
130 0 : return 0;
131 : }
132 :
133 0 : IMPL_LINK_NOARG(SvxMultiPathDialog, DelHdl_Impl)
134 : {
135 0 : SvTreeListEntry* pEntry = m_pRadioLB->FirstSelected();
136 0 : delete static_cast<OUString*>(pEntry->GetUserData());
137 0 : bool bChecked = m_pRadioLB->GetCheckButtonState( pEntry ) == SV_BUTTON_CHECKED;
138 0 : sal_uLong nPos = m_pRadioLB->GetEntryPos( pEntry );
139 0 : m_pRadioLB->RemoveEntry( pEntry );
140 0 : sal_uLong nCnt = m_pRadioLB->GetEntryCount();
141 0 : if ( nCnt )
142 : {
143 0 : nCnt--;
144 0 : if ( nPos > nCnt )
145 0 : nPos = nCnt;
146 0 : pEntry = m_pRadioLB->GetEntry( nPos );
147 0 : if ( bChecked )
148 : {
149 0 : m_pRadioLB->SetCheckButtonState( pEntry, SV_BUTTON_CHECKED );
150 0 : m_pRadioLB->HandleEntryChecked( pEntry );
151 : }
152 : else
153 0 : m_pRadioLB->Select( pEntry );
154 : }
155 :
156 0 : SelectHdl_Impl( NULL );
157 0 : return 0;
158 : }
159 :
160 0 : IMPL_LINK_NOARG(SvxPathSelectDialog, DelHdl_Impl)
161 : {
162 0 : sal_uInt16 nPos = m_pPathLB->GetSelectEntryPos();
163 0 : m_pPathLB->RemoveEntry( nPos );
164 0 : sal_uInt16 nCnt = m_pPathLB->GetEntryCount();
165 :
166 0 : if ( nCnt )
167 : {
168 0 : nCnt--;
169 :
170 0 : if ( nPos > nCnt )
171 0 : nPos = nCnt;
172 0 : m_pPathLB->SelectEntryPos( nPos );
173 : }
174 :
175 0 : SelectHdl_Impl( NULL );
176 0 : return 0;
177 : }
178 :
179 0 : SvxMultiPathDialog::SvxMultiPathDialog(vcl::Window* pParent)
180 0 : : ModalDialog(pParent, "MultiPathDialog", "cui/ui/multipathdialog.ui")
181 : {
182 0 : get(m_pAddBtn, "add");
183 0 : get(m_pDelBtn, "delete");
184 :
185 0 : SvSimpleTableContainer* pRadioLBContainer = get<SvSimpleTableContainer>("paths");
186 0 : Size aSize(LogicToPixel(Size(195, 77), MAP_APPFONT));
187 0 : pRadioLBContainer->set_width_request(aSize.Width());
188 0 : pRadioLBContainer->set_height_request(aSize.Height());
189 0 : m_pRadioLB = VclPtr<svx::SvxRadioButtonListBox>::Create(*pRadioLBContainer, 0);
190 :
191 : static long aStaticTabs[]= { 2, 0, 12 };
192 0 : m_pRadioLB->SvSimpleTable::SetTabs( aStaticTabs );
193 0 : OUString sHeader(get<FixedText>("pathlist")->GetText());
194 0 : m_pRadioLB->SetQuickHelpText( sHeader );
195 0 : sHeader = "\t" + sHeader;
196 0 : m_pRadioLB->InsertHeaderEntry( sHeader, HEADERBAR_APPEND, HeaderBarItemBits::LEFT );
197 :
198 0 : m_pRadioLB->SetSelectHdl( LINK( this, SvxMultiPathDialog, SelectHdl_Impl ) );
199 0 : m_pRadioLB->SetCheckButtonHdl( LINK( this, SvxMultiPathDialog, CheckHdl_Impl ) );
200 0 : m_pAddBtn->SetClickHdl( LINK( this, SvxMultiPathDialog, AddHdl_Impl ) );
201 0 : m_pDelBtn->SetClickHdl( LINK( this, SvxMultiPathDialog, DelHdl_Impl ) );
202 :
203 0 : SelectHdl_Impl( NULL );
204 :
205 0 : m_pRadioLB->ShowTable();
206 0 : }
207 :
208 0 : SvxPathSelectDialog::SvxPathSelectDialog(vcl::Window* pParent)
209 0 : : ModalDialog(pParent, "SelectPathDialog", "cui/ui/selectpathdialog.ui")
210 : {
211 0 : get(m_pAddBtn, "add");
212 0 : get(m_pDelBtn, "delete");
213 0 : get(m_pPathLB, "paths");
214 0 : Size aSize(LogicToPixel(Size(189, 80), MAP_APPFONT));
215 0 : m_pPathLB->set_width_request(aSize.Width());
216 0 : m_pPathLB->set_height_request(aSize.Height());
217 :
218 0 : m_pPathLB->SetSelectHdl( LINK( this, SvxPathSelectDialog, SelectHdl_Impl ) );
219 0 : m_pAddBtn->SetClickHdl( LINK( this, SvxPathSelectDialog, AddHdl_Impl ) );
220 0 : m_pDelBtn->SetClickHdl( LINK( this, SvxPathSelectDialog, DelHdl_Impl ) );
221 :
222 0 : SelectHdl_Impl( NULL );
223 0 : }
224 :
225 0 : SvxMultiPathDialog::~SvxMultiPathDialog()
226 : {
227 0 : disposeOnce();
228 0 : }
229 :
230 0 : void SvxMultiPathDialog::dispose()
231 : {
232 0 : if (m_pRadioLB)
233 : {
234 0 : sal_uInt16 nPos = (sal_uInt16)m_pRadioLB->GetEntryCount();
235 0 : while ( nPos-- )
236 : {
237 0 : SvTreeListEntry* pEntry = m_pRadioLB->GetEntry( nPos );
238 0 : delete static_cast<OUString*>(pEntry->GetUserData());
239 : }
240 : }
241 :
242 0 : m_pRadioLB.disposeAndClear();
243 0 : m_pAddBtn.clear();
244 0 : m_pDelBtn.clear();
245 0 : ModalDialog::dispose();
246 0 : }
247 :
248 0 : SvxPathSelectDialog::~SvxPathSelectDialog()
249 : {
250 0 : disposeOnce();
251 0 : }
252 :
253 0 : void SvxPathSelectDialog::dispose()
254 : {
255 0 : if (m_pPathLB)
256 : {
257 0 : sal_uInt16 nPos = m_pPathLB->GetEntryCount();
258 0 : while ( nPos-- )
259 0 : delete static_cast<OUString*>(m_pPathLB->GetEntryData(nPos));
260 : }
261 0 : m_pPathLB.clear();
262 0 : m_pAddBtn.clear();
263 0 : m_pDelBtn.clear();
264 0 : ModalDialog::dispose();
265 0 : }
266 :
267 0 : OUString SvxMultiPathDialog::GetPath() const
268 : {
269 0 : OUString sNewPath;
270 0 : sal_Unicode cDelim = SVT_SEARCHPATH_DELIMITER;
271 :
272 0 : OUString sWritable;
273 0 : for ( sal_uLong i = 0; i < m_pRadioLB->GetEntryCount(); ++i )
274 : {
275 0 : SvTreeListEntry* pEntry = m_pRadioLB->GetEntry(i);
276 0 : if ( m_pRadioLB->GetCheckButtonState( pEntry ) == SV_BUTTON_CHECKED )
277 0 : sWritable = *static_cast<OUString*>(pEntry->GetUserData());
278 : else
279 : {
280 0 : if ( !sNewPath.isEmpty() )
281 0 : sNewPath += OUString(cDelim);
282 0 : sNewPath += *static_cast<OUString*>(pEntry->GetUserData());
283 : }
284 : }
285 0 : if ( !sNewPath.isEmpty() )
286 0 : sNewPath += OUString(cDelim);
287 0 : sNewPath += sWritable;
288 :
289 0 : return sNewPath;
290 : }
291 :
292 0 : OUString SvxPathSelectDialog::GetPath() const
293 : {
294 0 : OUString sNewPath;
295 0 : sal_Unicode cDelim = SVT_SEARCHPATH_DELIMITER;
296 :
297 0 : for ( sal_Int32 i = 0; i < m_pPathLB->GetEntryCount(); ++i )
298 : {
299 0 : if ( !sNewPath.isEmpty() )
300 0 : sNewPath += OUString(cDelim);
301 0 : sNewPath += *static_cast<OUString*>(m_pPathLB->GetEntryData(i));
302 : }
303 :
304 0 : return sNewPath;
305 : }
306 :
307 0 : void SvxMultiPathDialog::SetPath( const OUString& rPath )
308 : {
309 0 : sal_Unicode cDelim = SVT_SEARCHPATH_DELIMITER;
310 0 : sal_uInt16 nCount = comphelper::string::getTokenCount(rPath, cDelim);
311 :
312 0 : for ( sal_uInt16 i = 0; i < nCount; ++i )
313 : {
314 0 : OUString sPath = rPath.getToken( i, cDelim );
315 0 : OUString sSystemPath;
316 : bool bIsSystemPath =
317 0 : ::utl::LocalFileHelper::ConvertURLToSystemPath( sPath, sSystemPath );
318 :
319 0 : OUString sEntry( '\t' );
320 0 : sEntry += (bIsSystemPath ? sSystemPath : OUString(sPath));
321 0 : SvTreeListEntry* pEntry = m_pRadioLB->InsertEntry( sEntry );
322 0 : OUString* pURL = new OUString( sPath );
323 0 : pEntry->SetUserData( pURL );
324 0 : }
325 :
326 0 : if (nCount > 0)
327 : {
328 0 : SvTreeListEntry* pEntry = m_pRadioLB->GetEntry( nCount - 1 );
329 0 : if ( pEntry )
330 : {
331 0 : m_pRadioLB->SetCheckButtonState( pEntry, SV_BUTTON_CHECKED );
332 0 : m_pRadioLB->HandleEntryChecked( pEntry );
333 : }
334 : }
335 :
336 0 : SelectHdl_Impl( NULL );
337 0 : }
338 :
339 0 : void SvxPathSelectDialog::SetPath(const OUString& rPath)
340 : {
341 0 : sal_Unicode cDelim = SVT_SEARCHPATH_DELIMITER;
342 0 : sal_uInt16 nPos, nCount = comphelper::string::getTokenCount(rPath, cDelim);
343 :
344 0 : for ( sal_uInt16 i = 0; i < nCount; ++i )
345 : {
346 0 : OUString sPath = rPath.getToken( i, cDelim );
347 0 : OUString sSystemPath;
348 : bool bIsSystemPath =
349 0 : ::utl::LocalFileHelper::ConvertURLToSystemPath( sPath, sSystemPath );
350 :
351 0 : if ( bIsSystemPath )
352 0 : nPos = m_pPathLB->InsertEntry( sSystemPath, LISTBOX_APPEND );
353 : else
354 0 : nPos = m_pPathLB->InsertEntry( sPath, LISTBOX_APPEND );
355 0 : m_pPathLB->SetEntryData( nPos, new OUString( sPath ) );
356 0 : }
357 :
358 0 : SelectHdl_Impl( NULL );
359 0 : }
360 :
361 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|