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 <vcl/svapp.hxx>
21 : #include <vcl/button.hxx>
22 : #include <vcl/fixed.hxx>
23 : #include <vcl/edit.hxx>
24 : #include <vcl/lstbox.hxx>
25 : #include <svtools/svtresid.hxx>
26 : #include <filedlg2.hxx>
27 : #include <svtools/filedlg.hxx>
28 : #include <svtools/filedlg2.hrc>
29 : #include <vcl/msgbox.hxx>
30 : #include <osl/security.hxx>
31 : #include <comphelper/string.hxx>
32 :
33 : #include <svtools/stdctrl.hxx>
34 :
35 : #ifdef _MSC_VER
36 : #pragma optimize ("", off)
37 : #endif
38 :
39 : #include <svtools/helpid.hrc>
40 :
41 : using namespace com::sun::star;
42 : using namespace com::sun::star::uno;
43 :
44 : typedef ::std::vector< UniString* > UniStringList;
45 :
46 : #define INITCONTROL( p, ControlClass, nBits, aPos, aSize, aTitel, rHelpId ) \
47 : p = new ControlClass( GetPathDialog(), WinBits( nBits ) ); \
48 : p->SetHelpId( rHelpId ); \
49 : p->SetPosSizePixel( aPos, aSize ); \
50 : p->SetText( aTitel ); \
51 : p->Show();
52 :
53 :
54 0 : inline sal_Bool IsPrintable( sal_Unicode c )
55 : {
56 0 : return c >= 32 && c != 127 ? sal_True : sal_False;
57 : }
58 :
59 : long
60 0 : KbdListBox::PreNotify( NotifyEvent& rNEvt )
61 : {
62 0 : if ( rNEvt.GetType() == EVENT_KEYINPUT )
63 : {
64 0 : KeyEvent aKeyEvt = *rNEvt.GetKeyEvent();
65 0 : sal_Unicode cCharCode = aKeyEvt.GetCharCode();
66 :
67 0 : if ( IsPrintable ( cCharCode ) )
68 : {
69 0 : sal_uInt16 nCurrentPos = GetSelectEntryPos();
70 0 : sal_uInt16 nEntries = GetEntryCount();
71 :
72 0 : for ( sal_uInt16 i = 1; i < nEntries; i++ )
73 : {
74 0 : UniString aEntry = GetEntry ( (i + nCurrentPos) % nEntries );
75 0 : aEntry = comphelper::string::stripStart(aEntry, ' ');
76 0 : aEntry.ToUpperAscii();
77 0 : UniString aCompare = rtl::OUString(cCharCode);
78 0 : aCompare.ToUpperAscii();
79 :
80 0 : if ( aEntry.CompareTo( aCompare, 1 ) == COMPARE_EQUAL )
81 : {
82 0 : SelectEntryPos ( (i + nCurrentPos) % nEntries );
83 : break;
84 : }
85 0 : }
86 : }
87 : else
88 0 : if ( aKeyEvt.GetKeyCode().GetCode() == KEY_RETURN )
89 : {
90 0 : DoubleClick();
91 : }
92 : }
93 :
94 0 : return ListBox::PreNotify ( rNEvt );
95 : }
96 :
97 0 : ImpPathDialog::ImpPathDialog( PathDialog* pDlg, RESOURCE_TYPE nType, sal_Bool bCreateDir )
98 : {
99 0 : pSvPathDialog = pDlg;
100 0 : nDirCount = 0;
101 :
102 : // initialize Controls if not used as a base class
103 0 : if ( nType == WINDOW_PATHDIALOG )
104 : {
105 0 : InitControls();
106 0 : if( pNewDirBtn )
107 0 : pNewDirBtn->Enable( bCreateDir );
108 : }
109 :
110 0 : pDlg->SetHelpId( HID_FILEDLG_PATHDLG );
111 0 : }
112 :
113 0 : ImpPathDialog::~ImpPathDialog()
114 : {
115 0 : delete pEdit;
116 0 : delete pDirTitel;
117 0 : delete pDirList;
118 0 : delete pDirPath;
119 0 : delete pDriveList;
120 0 : delete pDriveTitle;
121 0 : delete pLoadBtn;
122 0 : delete pOkBtn;
123 0 : delete pCancelBtn;
124 0 : delete pNewDirBtn;
125 : # if defined(UNX)
126 0 : delete pHomeBtn;
127 : # endif
128 0 : }
129 :
130 0 : void ImpPathDialog::InitControls()
131 : {
132 0 : PathDialog* pDlg = GetPathDialog();
133 0 : pDlg->SetText( SVT_RESSTR(STR_FILEDLG_SELECT) );
134 :
135 0 : Size a3Siz = pDlg->LogicToPixel( Size( 3, 3 ), MAP_APPFONT );
136 0 : Size a6Siz = pDlg->LogicToPixel( Size( 6, 6 ), MAP_APPFONT );
137 0 : Size aBtnSiz = pDlg->LogicToPixel( Size( 50, 14 ), MAP_APPFONT );
138 0 : Size aFTSiz = pDlg->LogicToPixel( Size( 142, 10 ), MAP_APPFONT );
139 0 : Size aEDSiz = pDlg->LogicToPixel( Size( 142, 12 ), MAP_APPFONT );
140 0 : Point aPnt( a6Siz.Width(), a6Siz.Height() );
141 0 : long nLbH1 = pDlg->LogicToPixel( Size( 0, 93 ), MAP_APPFONT ).Height();
142 0 : long nH = 0;
143 0 : UniString aEmptyStr;
144 :
145 0 : INITCONTROL( pDirTitel, FixedText, 0,
146 : aPnt, aFTSiz, SVT_RESSTR( STR_FILEDLG_DIR ), HID_FILEDLG_DIR );
147 0 : aPnt.Y() += aFTSiz.Height() + a3Siz.Height();
148 :
149 0 : INITCONTROL( pEdit, Edit, WB_BORDER, aPnt, aEDSiz, aPath.GetFull(), HID_FILEDLG_EDIT );
150 :
151 0 : aPnt.Y() += aEDSiz.Height() + a3Siz.Height();
152 : #ifndef UNX
153 : long nLbH2 = pDlg->LogicToPixel( Size( 0, 60 ), MAP_APPFONT ).Height();
154 : INITCONTROL( pDirList, KbdListBox, WB_AUTOHSCROLL | WB_BORDER,
155 : aPnt, Size( aEDSiz.Width(), nLbH1 ), aEmptyStr, HID_FILEDLG_DIRS );
156 : aPnt.Y() += nLbH1 + a6Siz.Height();
157 : INITCONTROL( pDriveTitle, FixedText, 0,
158 : aPnt, aFTSiz, SVT_RESSTR( STR_FILEDLG_DRIVES ), HID_FILEDLG_DRIVE );
159 : aPnt.Y() += aFTSiz.Height() + a3Siz.Height();
160 : INITCONTROL( pDriveList, ListBox, WB_DROPDOWN,
161 : aPnt, Size( aEDSiz.Width(), nLbH2 ), aEmptyStr, HID_FILEDLG_DRIVES );
162 : nH = aPnt.Y() + aEDSiz.Height() + a6Siz.Height();
163 : #else
164 0 : long nNewH = nLbH1 + 3 * a3Siz.Height() +
165 0 : aFTSiz.Height() + aEDSiz.Height();
166 0 : INITCONTROL( pDirList, KbdListBox, WB_AUTOHSCROLL | WB_BORDER,
167 : aPnt, Size( aEDSiz.Width(), nNewH ), aEmptyStr, HID_FILEDLG_DIRS );
168 0 : nH = aPnt.Y() + nNewH + a6Siz.Height();
169 0 : pDriveTitle = NULL;
170 0 : pDriveList = NULL;
171 : #endif
172 :
173 0 : long nExtraWidth = pDlg->GetTextWidth( String( RTL_CONSTASCII_USTRINGPARAM( "(W)" ) ) )+10;
174 0 : String aOkStr = Button::GetStandardText( BUTTON_OK );
175 0 : long nTextWidth = pDlg->GetTextWidth( aOkStr )+nExtraWidth;
176 0 : if( nTextWidth > aBtnSiz.Width() )
177 0 : aBtnSiz.Width() = nTextWidth;
178 :
179 0 : String aCancelStr = Button::GetStandardText( BUTTON_CANCEL );
180 0 : nTextWidth = pDlg->GetTextWidth( aCancelStr )+nExtraWidth;
181 0 : if( nTextWidth > aBtnSiz.Width() )
182 0 : aBtnSiz.Width() = nTextWidth;
183 :
184 0 : String aNewDirStr( SVT_RESSTR( STR_FILEDLG_NEWDIR ) );
185 0 : nTextWidth = pDlg->GetTextWidth( aNewDirStr )+nExtraWidth;
186 0 : if( nTextWidth > aBtnSiz.Width() )
187 0 : aBtnSiz.Width() = nTextWidth;
188 : #if defined(UNX)
189 0 : String aHomeDirStr( SVT_RESSTR( STR_FILEDLG_HOME ) );
190 0 : nTextWidth = pDlg->GetTextWidth( aHomeDirStr )+nExtraWidth;
191 0 : if( nTextWidth > aBtnSiz.Width() )
192 0 : aBtnSiz.Width() = nTextWidth;
193 : #endif
194 :
195 0 : aPnt.X() = 2 * a6Siz.Width() + aEDSiz.Width();
196 0 : aPnt.Y() = a6Siz.Height();
197 0 : INITCONTROL( pOkBtn, PushButton, WB_DEFBUTTON,
198 : aPnt, aBtnSiz, aOkStr, "" );
199 0 : aPnt.Y() += aBtnSiz.Height() + a3Siz.Height();
200 0 : INITCONTROL( pCancelBtn, CancelButton, 0,
201 : aPnt, aBtnSiz, aCancelStr, "" );
202 0 : aPnt.Y() += aBtnSiz.Height() + a3Siz.Height();
203 0 : INITCONTROL( pNewDirBtn, PushButton, WB_DEFBUTTON,
204 : aPnt, aBtnSiz, aNewDirStr, HID_FILEDLG_NEWDIR );
205 : #if defined(UNX)
206 0 : aPnt.Y() += aBtnSiz.Height() + a3Siz.Height();
207 0 : INITCONTROL( pHomeBtn, PushButton, WB_DEFBUTTON,
208 : aPnt, aBtnSiz, aHomeDirStr, HID_FILEDLG_HOME );
209 : #else
210 : pHomeBtn = NULL;
211 : #endif
212 :
213 0 : pDirPath = 0;
214 0 : pLoadBtn = 0;
215 : // Dialogbreite == OKBtn-Position + OKBtn-Breite + Rand
216 0 : long nW = aPnt.X() + aBtnSiz.Width() + a6Siz.Width();
217 :
218 0 : pDlg->SetOutputSizePixel( Size( nW, nH ) ); // Groesse ggf. auch Resource wird geplaettet?
219 :
220 0 : if (pDirList)
221 0 : pDirList->SetDoubleClickHdl(LINK( this, ImpPathDialog, DblClickHdl) );
222 :
223 0 : if (pDirList)
224 0 : pDirList->SetSelectHdl( LINK( this, ImpPathDialog, SelectHdl ) );
225 :
226 0 : if (pDriveList)
227 0 : pDriveList->SetSelectHdl( LINK( this, ImpPathDialog, SelectHdl ) );
228 :
229 0 : if (pOkBtn)
230 0 : pOkBtn->SetClickHdl( LINK( this, ImpPathDialog, ClickHdl) );
231 :
232 0 : if (pCancelBtn)
233 0 : pCancelBtn->SetClickHdl( LINK( this, ImpPathDialog, ClickHdl) );
234 :
235 0 : if (pHomeBtn)
236 0 : pHomeBtn->SetClickHdl( LINK( this, ImpPathDialog, ClickHdl) );
237 :
238 0 : if (pNewDirBtn)
239 0 : pNewDirBtn->SetClickHdl( LINK( this, ImpPathDialog, ClickHdl) );
240 :
241 0 : nOwnChildren = pDlg->GetChildCount();
242 0 : }
243 :
244 :
245 :
246 0 : IMPL_LINK( ImpPathDialog, SelectHdl, ListBox *, p )
247 : {
248 0 : if( p == pDriveList )
249 : {
250 0 : UniString aDrive( pDriveList->GetSelectEntry(), 0, 2);
251 0 : aDrive += '\\';
252 0 : SetPath( aDrive );
253 : }
254 : else
255 0 : if( p == pDirList )
256 : {
257 : // isolate the pure name of the entry
258 : // removing trainling stuff and leading spaces
259 0 : UniString aEntry( pDirList->GetSelectEntry() );
260 0 : aEntry = comphelper::string::stripStart(aEntry, ' ');
261 :
262 0 : sal_uInt16 nPos = aEntry.Search( '/' );
263 0 : aEntry.Erase( nPos );
264 :
265 : // build the absolute path to the selected item
266 0 : DirEntry aNewPath;
267 0 : aNewPath.ToAbs();
268 :
269 0 : sal_uInt16 nCurPos = pDirList->GetSelectEntryPos();
270 :
271 : // Wird nach oben gewechselt
272 0 : if( nCurPos < nDirCount )
273 0 : aNewPath = aNewPath[nDirCount-nCurPos-1];
274 : else
275 0 : aNewPath += aEntry;
276 :
277 0 : pEdit->SetText( aNewPath.GetFull() );
278 : }
279 :
280 0 : return 0;
281 : }
282 :
283 :
284 0 : IMPL_LINK( ImpPathDialog, ClickHdl, Button*, pBtn )
285 : {
286 0 : if ( pBtn == pOkBtn || pBtn == pLoadBtn )
287 : {
288 0 : DirEntry aFile( pEdit->GetText() );
289 :
290 : // Existiert File / File ueberschreiben
291 0 : if( IsFileOk( aFile ) )
292 : {
293 : // Ja, dann kompletten Pfad mit Filenamen merken und Dialog beenden
294 0 : aPath = aFile;
295 0 : aPath.ToAbs();
296 0 : GetPathDialog()->EndDialog( sal_True );
297 : }
298 : else
299 : {
300 0 : DirEntry aCheck( aPath );
301 0 : aCheck += aFile;
302 0 : if( aCheck.Exists() )
303 : {
304 0 : aCheck.ToAbs();
305 0 : SetPath( aCheck.GetFull() );
306 0 : pEdit->SetSelection( Selection( 0x7FFFFFFF, 0x7FFFFFFF ) );
307 0 : }
308 0 : }
309 : }
310 0 : else if ( pBtn == pCancelBtn )
311 : {
312 0 : GetPathDialog()->EndDialog( sal_False );
313 : }
314 0 : else if ( pBtn == pHomeBtn )
315 : {
316 0 : ::rtl::OUString aHomeDir;
317 0 : osl::Security aSecurity;
318 0 : if ( aSecurity.getHomeDir( aHomeDir ) )
319 : {
320 0 : DirEntry aFile ( aHomeDir );
321 0 : if ( IsFileOk( aFile ) )
322 : {
323 0 : aFile.ToAbs();
324 0 : SetPath( aFile.GetFull() );
325 0 : }
326 0 : }
327 : }
328 0 : else if ( pBtn == pNewDirBtn )
329 : {
330 0 : DirEntry aFile( pEdit->GetText() );
331 0 : if( ! aFile.Exists() && ! FileStat( aFile ).IsKind( FSYS_KIND_WILD ) )
332 0 : aFile.MakeDir();
333 :
334 0 : if( IsFileOk ( aFile ) )
335 : {
336 0 : aFile.ToAbs();
337 0 : SetPath( aFile.GetFull() );
338 0 : }
339 : }
340 :
341 0 : return 0;
342 : }
343 :
344 :
345 0 : IMPL_LINK( ImpPathDialog, DblClickHdl, ListBox*, pBox )
346 : {
347 : // isolate the pure name of the entry
348 : // removing trainling stuff and leading spaces
349 0 : UniString aEntry( pBox->GetSelectEntry() );
350 :
351 0 : aEntry = comphelper::string::stripStart(aEntry, ' ');
352 0 : sal_uInt16 nPos = aEntry.Search( '/' );
353 0 : aEntry.Erase( nPos );
354 :
355 : // build the absolute path to the selected item
356 0 : DirEntry aNewPath;
357 0 : aNewPath.ToAbs();
358 0 : if( pBox == pDirList )
359 : {
360 0 : sal_uInt16 nCurPos = pDirList->GetSelectEntryPos();
361 :
362 : // Wenn es schon das aktuelle ist, dann mache nichts
363 0 : if( nCurPos == nDirCount-1 )
364 0 : return 0;
365 :
366 : // Wird nach oben gewechselt
367 0 : if( nCurPos < nDirCount )
368 0 : aNewPath = aNewPath[nDirCount-nCurPos-1];
369 : else
370 0 : aNewPath += aEntry;
371 : }
372 : else
373 0 : aNewPath += aEntry;
374 :
375 0 : pSvPathDialog->EnterWait();
376 :
377 0 : if( FileStat( aNewPath ).GetKind() & FSYS_KIND_DIR )
378 : {
379 : // Neuen Pfad setzen und Listboxen updaten
380 0 : aPath = aNewPath;
381 0 : if( !aPath.SetCWD( sal_True ) )
382 : {
383 0 : ErrorBox aBox( GetPathDialog(),
384 : WB_OK_CANCEL | WB_DEF_OK,
385 0 : SVT_RESSTR( STR_FILEDLG_CANTCHDIR ) );
386 0 : if( aBox.Execute() == RET_CANCEL )
387 0 : GetPathDialog()->EndDialog( sal_False );
388 : }
389 0 : UpdateEntries( sal_True );
390 : }
391 :
392 0 : pSvPathDialog->LeaveWait();
393 0 : return 0;
394 : }
395 :
396 0 : void ImpPathDialog::UpdateEntries( const sal_Bool )
397 : {
398 0 : UniString aTabString;
399 0 : DirEntry aTmpPath;
400 0 : aTmpPath.ToAbs();
401 :
402 0 : nDirCount = aTmpPath.Level();
403 :
404 0 : pDirList->SetUpdateMode( sal_False );
405 0 : pDirList->Clear();
406 :
407 0 : for( sal_uInt16 i = nDirCount; i > 0; i-- )
408 : {
409 0 : UniString aName( aTabString );
410 0 : aName += aTmpPath[i-1].GetName();
411 0 : pDirList->InsertEntry( aName );
412 0 : aTabString.AppendAscii( " ", 2 );
413 0 : }
414 :
415 : // scan the directory
416 0 : DirEntry aCurrent;
417 0 : aCurrent.ToAbs();
418 :
419 0 : Dir aDir( aCurrent, FSYS_KIND_DIR|FSYS_KIND_FILE );
420 :
421 0 : sal_uInt16 nEntries = aDir.Count();
422 0 : if( nEntries )
423 : {
424 0 : UniStringList aSortDirList;
425 : const comphelper::string::NaturalStringSorter& rSorter =
426 0 : ::vcl::unohelper::getNaturalStringSorterForAppLocale();
427 0 : for ( sal_uInt16 n = 0; n < nEntries; n++ )
428 : {
429 0 : DirEntry& rEntry = aDir[n];
430 0 : UniString aName( rEntry.GetName() );
431 0 : if( aName.Len() && ( aName.GetChar(0) != '.' ) && rEntry.Exists() )
432 : {
433 0 : if( FileStat( rEntry ).GetKind() & FSYS_KIND_DIR )
434 : {
435 0 : size_t l = 0;
436 0 : for( l = 0; l < aSortDirList.size(); l++ )
437 0 : if( rSorter.compare( *aSortDirList[ l ], aName ) > 0 )
438 0 : break;
439 0 : if ( l < aSortDirList.size() ) {
440 0 : UniStringList::iterator it = aSortDirList.begin();
441 0 : ::std::advance( it, l );
442 0 : aSortDirList.insert( it, new UniString( aName ) );
443 : } else {
444 0 : aSortDirList.push_back( new UniString( aName ) );
445 : }
446 : }
447 : }
448 0 : }
449 :
450 0 : for( size_t l = 0; l < aSortDirList.size(); l++ )
451 : {
452 0 : UniString aEntryStr( aTabString );
453 0 : aEntryStr += *aSortDirList[ l ];
454 0 : pDirList->InsertEntry( aEntryStr );
455 0 : delete aSortDirList[ l ];
456 0 : }
457 : }
458 :
459 0 : UpdateDirs( aTmpPath );
460 0 : }
461 :
462 0 : void ImpPathDialog::UpdateDirs( const DirEntry& rTmpPath )
463 : {
464 0 : pDirList->SelectEntryPos( nDirCount-1 );
465 : pDirList->SetTopEntry( nDirCount > 1
466 : ? nDirCount - 2
467 0 : : nDirCount - 1 );
468 0 : pDirList->SetUpdateMode( sal_True );
469 0 : pDirList->Invalidate();
470 0 : pDirList->Update();
471 :
472 0 : UniString aDirName = rTmpPath.GetFull();
473 0 : if( pDirPath )
474 0 : pDirPath->SetText( aDirName );
475 : else
476 0 : pEdit->SetText( aDirName );
477 0 : }
478 :
479 0 : sal_Bool ImpPathDialog::IsFileOk( const DirEntry& rDirEntry )
480 : {
481 0 : if( FileStat( rDirEntry ).GetKind() & (FSYS_KIND_WILD | FSYS_KIND_DEV) )
482 0 : return sal_False;
483 : else
484 : {
485 : // Datei vorhanden ?
486 0 : if( ! rDirEntry.Exists() )
487 : {
488 0 : UniString aQueryTxt( SVT_RESSTR( STR_FILEDLG_ASKNEWDIR ) );
489 0 : aQueryTxt.SearchAndReplaceAscii( "%s", rDirEntry.GetFull() );
490 0 : QueryBox aQuery( GetPathDialog(),
491 : WB_YES_NO | WB_DEF_YES,
492 0 : aQueryTxt );
493 0 : if( aQuery.Execute() == RET_YES )
494 0 : rDirEntry.MakeDir();
495 : else
496 0 : return sal_False;
497 : }
498 0 : if( !FileStat( rDirEntry ).IsKind( FSYS_KIND_DIR ) )
499 : {
500 0 : UniString aBoxText( SVT_RESSTR( STR_FILEDLG_CANTOPENDIR ) );
501 0 : aBoxText.AppendAscii( "\n[" );
502 0 : aBoxText += rDirEntry.GetFull();
503 0 : aBoxText.AppendAscii( "]" );
504 0 : InfoBox aBox( GetPathDialog(), aBoxText );
505 0 : aBox.Execute();
506 0 : return sal_False;
507 : }
508 : }
509 0 : return GetPathDialog()->OK() != 0;
510 : }
511 :
512 :
513 0 : void ImpPathDialog::PreExecute()
514 : {
515 : // Neues Verzeichnis setzen und Listboxen updaten
516 0 : aPath.SetCWD( sal_True );
517 0 : UpdateEntries( sal_True );
518 :
519 : // Zusaetzliche Buttons anordnen
520 0 : Point aPos;
521 0 : Size aSize;
522 : long nDY;
523 0 : if( pLoadBtn )
524 : {
525 0 : aPos = pLoadBtn->GetPosPixel();
526 0 : aSize = pLoadBtn->GetSizePixel();
527 0 : nDY = pLoadBtn->GetSizePixel().Height() * 2;
528 : }
529 : else
530 : {
531 0 : aPos = pCancelBtn->GetPosPixel();
532 0 : aSize = pCancelBtn->GetSizePixel();
533 0 : nDY = pCancelBtn->GetPosPixel().Y() - pOkBtn->GetPosPixel().Y();
534 : }
535 :
536 : // Standard-Controls anpassen
537 0 : long nMaxWidth = 0;
538 :
539 : // Maximale Breite ermitteln
540 0 : sal_uInt16 nChildren = GetPathDialog()->GetChildCount();
541 : sal_uInt16 n;
542 0 : for ( n = nOwnChildren; n < nChildren; n++ )
543 : {
544 0 : Window* pChild = GetPathDialog()->GetChild( n );
545 0 : pChild = pChild->GetWindow( WINDOW_CLIENT );
546 0 : if( pChild->GetType() != WINDOW_WINDOW )
547 : {
548 0 : long nWidth = pChild->GetTextWidth( pChild->GetText() ) + 12;
549 0 : if( nMaxWidth < nWidth )
550 0 : nMaxWidth = nWidth;
551 0 : nWidth = pChild->GetSizePixel().Width();
552 0 : if( nMaxWidth < nWidth )
553 0 : nMaxWidth = nWidth;
554 : }
555 : }
556 :
557 0 : if( nMaxWidth > aSize.Width() )
558 : {
559 0 : Size aDlgSize = GetPathDialog()->GetOutputSizePixel();
560 0 : GetPathDialog()->SetOutputSizePixel( Size( aDlgSize.Width()+nMaxWidth-aSize.Width(), aDlgSize.Height() ) );
561 0 : aSize.Width() = nMaxWidth;
562 :
563 0 : if( pOkBtn )
564 0 : pOkBtn->SetSizePixel( aSize );
565 0 : if( pCancelBtn )
566 0 : pCancelBtn->SetSizePixel( aSize );
567 0 : if( pLoadBtn )
568 0 : pLoadBtn->SetSizePixel( aSize );
569 : }
570 : else
571 0 : nMaxWidth = aSize.Width();
572 :
573 0 : for ( n = nOwnChildren; n < nChildren; n++ )
574 : {
575 0 : Window* pChild = GetPathDialog()->GetChild( n );
576 0 : pChild = pChild->GetWindow( WINDOW_CLIENT );
577 0 : if( pChild->GetType() != WINDOW_WINDOW )
578 : {
579 0 : aPos.Y() += nDY;
580 0 : pChild->SetPosSizePixel( aPos, aSize );
581 : }
582 : else
583 : {
584 0 : Size aDlgSize = GetPathDialog()->GetOutputSizePixel();
585 0 : long nExtra = Min( aDlgSize.Height(), (long)160);
586 0 : GetPathDialog()->SetOutputSizePixel( Size( aDlgSize.Width()+nExtra, aDlgSize.Height() ) );
587 0 : Size aSz( nExtra, nExtra );
588 0 : aSz.Width() -= 8;
589 0 : aSz.Height() -= 8;
590 0 : Point aCtrlPos( aDlgSize.Width() + 2, (aDlgSize.Height()-aSz.Height())/2 );
591 0 : pChild->SetPosSizePixel( aCtrlPos, aSz );
592 : }
593 : }
594 :
595 : // Laufwerke-LB fuellen
596 0 : if( pDriveList )
597 : {
598 0 : DirEntry aTmpDirEntry;
599 0 : Dir aDir( aTmpDirEntry, FSYS_KIND_BLOCK );
600 :
601 0 : sal_uInt16 nCount = aDir.Count(), i;
602 0 : for( i = 0; i < nCount; ++i )
603 : {
604 0 : DirEntry& rEntry = aDir[i];
605 0 : UniString aStr = rEntry.GetFull( FSYS_STYLE_HOST, sal_False );
606 :
607 0 : UniString aVolume = rEntry.GetVolume() ;
608 0 : aStr.ToUpperAscii();
609 0 : if ( aVolume.Len() )
610 : {
611 0 : aStr += ' ';
612 0 : aStr += aVolume;
613 : }
614 0 : pDriveList->InsertEntry( aStr );
615 :
616 0 : }
617 0 : UniString aPathStr = aPath.GetFull();
618 :
619 0 : for ( i = 0; i < pDriveList->GetEntryCount(); ++i )
620 : {
621 0 : UniString aEntry = pDriveList->GetEntry(i);
622 0 : xub_StrLen nLen = aEntry.Len();
623 0 : nLen = nLen > 2 ? 2 : nLen;
624 0 : if ( aEntry.CompareIgnoreCaseToAscii( aPathStr, nLen ) == COMPARE_EQUAL )
625 : {
626 0 : pDriveList->SelectEntryPos(i);
627 : break;
628 : }
629 0 : }
630 : }
631 0 : }
632 :
633 0 : void ImpPathDialog::PostExecute()
634 : {
635 0 : }
636 :
637 0 : void ImpPathDialog::SetPath( UniString const & rPath )
638 : {
639 0 : aPath = DirEntry( rPath );
640 :
641 0 : pSvPathDialog->EnterWait();
642 :
643 0 : DirEntry aFile( rPath );
644 : // Falls der Pfad eine Wildcard oder einen Filenamen enthaelt
645 : // -> abschneiden und merken
646 0 : if( FileStat( aFile ).GetKind() & (FSYS_KIND_FILE | FSYS_KIND_WILD) || !aFile.Exists() )
647 0 : aFile.CutName();
648 :
649 : // Neue Maske und neues Verzeichnis setzen, und Listboxen updaten
650 0 : pEdit->SetText( rPath );
651 0 : aFile.SetCWD( sal_True );
652 0 : UpdateEntries( sal_True );
653 :
654 0 : pSvPathDialog->LeaveWait();
655 0 : }
656 :
657 0 : UniString ImpPathDialog::GetPath() const
658 : {
659 0 : DirEntry aFile( pEdit->GetText() );
660 0 : aFile.ToAbs();
661 0 : return aFile.GetFull();
662 : }
663 :
664 0 : void ImpSvFileDlg::CreatePathDialog( PathDialog* pSvDlg, bool bCreate )
665 : {
666 0 : delete pDlg;
667 0 : pDlg = new ImpPathDialog( pSvDlg, WINDOW_PATHDIALOG, bCreate );
668 0 : }
669 :
670 :
671 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|