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 : InfoBox( 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 : InfoBox( 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 (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(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 = new svx::SvxRadioButtonListBox(*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, HIB_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(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 : sal_uInt16 nPos = (sal_uInt16)m_pRadioLB->GetEntryCount();
228 0 : while ( nPos-- )
229 : {
230 0 : SvTreeListEntry* pEntry = m_pRadioLB->GetEntry( nPos );
231 0 : delete (OUString*)pEntry->GetUserData();
232 : }
233 :
234 0 : delete m_pRadioLB;
235 0 : }
236 :
237 0 : SvxPathSelectDialog::~SvxPathSelectDialog()
238 : {
239 0 : sal_uInt16 nPos = m_pPathLB->GetEntryCount();
240 0 : while ( nPos-- )
241 0 : delete (OUString*)m_pPathLB->GetEntryData(nPos);
242 0 : }
243 :
244 0 : OUString SvxMultiPathDialog::GetPath() const
245 : {
246 0 : OUString sNewPath;
247 0 : sal_Unicode cDelim = SVT_SEARCHPATH_DELIMITER;
248 :
249 0 : OUString sWritable;
250 0 : for ( sal_uInt16 i = 0; i < m_pRadioLB->GetEntryCount(); ++i )
251 : {
252 0 : SvTreeListEntry* pEntry = m_pRadioLB->GetEntry(i);
253 0 : if ( m_pRadioLB->GetCheckButtonState( pEntry ) == SV_BUTTON_CHECKED )
254 0 : sWritable = *(OUString*)pEntry->GetUserData();
255 : else
256 : {
257 0 : if ( !sNewPath.isEmpty() )
258 0 : sNewPath += OUString(cDelim);
259 0 : sNewPath += *(OUString*)pEntry->GetUserData();
260 : }
261 : }
262 0 : if ( !sNewPath.isEmpty() )
263 0 : sNewPath += OUString(cDelim);
264 0 : sNewPath += sWritable;
265 :
266 0 : return sNewPath;
267 : }
268 :
269 0 : OUString SvxPathSelectDialog::GetPath() const
270 : {
271 0 : OUString sNewPath;
272 0 : sal_Unicode cDelim = SVT_SEARCHPATH_DELIMITER;
273 :
274 0 : for ( sal_uInt16 i = 0; i < m_pPathLB->GetEntryCount(); ++i )
275 : {
276 0 : if ( !sNewPath.isEmpty() )
277 0 : sNewPath += OUString(cDelim);
278 0 : sNewPath += *(OUString*)m_pPathLB->GetEntryData(i);
279 : }
280 :
281 0 : return sNewPath;
282 : }
283 :
284 0 : void SvxMultiPathDialog::SetPath( const OUString& rPath )
285 : {
286 0 : sal_Unicode cDelim = SVT_SEARCHPATH_DELIMITER;
287 0 : sal_uInt16 nCount = comphelper::string::getTokenCount(rPath, cDelim);
288 :
289 0 : for ( sal_uInt16 i = 0; i < nCount; ++i )
290 : {
291 0 : OUString sPath = rPath.getToken( i, cDelim );
292 0 : OUString sSystemPath;
293 : sal_Bool bIsSystemPath =
294 0 : ::utl::LocalFileHelper::ConvertURLToSystemPath( sPath, sSystemPath );
295 :
296 0 : OUString sEntry( '\t' );
297 0 : sEntry += (bIsSystemPath ? sSystemPath : OUString(sPath));
298 0 : SvTreeListEntry* pEntry = m_pRadioLB->InsertEntry( sEntry );
299 0 : OUString* pURL = new OUString( sPath );
300 0 : pEntry->SetUserData( pURL );
301 0 : }
302 :
303 0 : if (nCount > 0)
304 : {
305 0 : SvTreeListEntry* pEntry = m_pRadioLB->GetEntry( nCount - 1 );
306 0 : if ( pEntry )
307 : {
308 0 : m_pRadioLB->SetCheckButtonState( pEntry, SV_BUTTON_CHECKED );
309 0 : m_pRadioLB->HandleEntryChecked( pEntry );
310 : }
311 : }
312 :
313 0 : SelectHdl_Impl( NULL );
314 0 : }
315 :
316 0 : void SvxPathSelectDialog::SetPath(const OUString& rPath)
317 : {
318 0 : sal_Unicode cDelim = SVT_SEARCHPATH_DELIMITER;
319 0 : sal_uInt16 nPos, nCount = comphelper::string::getTokenCount(rPath, cDelim);
320 :
321 0 : for ( sal_uInt16 i = 0; i < nCount; ++i )
322 : {
323 0 : OUString sPath = rPath.getToken( i, cDelim );
324 0 : OUString sSystemPath;
325 : sal_Bool bIsSystemPath =
326 0 : ::utl::LocalFileHelper::ConvertURLToSystemPath( sPath, sSystemPath );
327 :
328 0 : if ( bIsSystemPath )
329 0 : nPos = m_pPathLB->InsertEntry( sSystemPath, LISTBOX_APPEND );
330 : else
331 0 : nPos = m_pPathLB->InsertEntry( sPath, LISTBOX_APPEND );
332 0 : m_pPathLB->SetEntryData( nPos, new OUString( sPath ) );
333 0 : }
334 :
335 0 : SelectHdl_Impl( NULL );
336 0 : }
337 :
338 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|