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