LCOV - code coverage report
Current view: top level - libreoffice/svtools/source/dialogs - filedlg2.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 0 358 0.0 %
Date: 2012-12-27 Functions: 0 20 0.0 %
Legend: Lines: hit not hit

          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: */

Generated by: LCOV version 1.10