diff options
Diffstat (limited to 'padmin/source/fontentry.cxx')
-rw-r--r-- | padmin/source/fontentry.cxx | 671 |
1 files changed, 671 insertions, 0 deletions
diff --git a/padmin/source/fontentry.cxx b/padmin/source/fontentry.cxx new file mode 100644 index 000000000000..d76171e704c1 --- /dev/null +++ b/padmin/source/fontentry.cxx @@ -0,0 +1,671 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: fontentry.cxx,v $ + * $Revision: 1.17 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include "fontentry.hxx" +#include "helper.hxx" +#include "padialog.hrc" +#include "vcl/strhelper.hxx" + +#include "vcl/msgbox.hxx" +#include "vcl/fontmanager.hxx" + +#include "osl/thread.h" + +#include "tools/config.hxx" + +using namespace padmin; +using namespace osl; +using namespace rtl; +using namespace psp; + +#if 0 +static void CreateAfmFile( const INetURLObject& rFontFile ) +{ + rtl_TextEncoding aEncoding = gsl_getSystemTextEncoding(); + + INetURLObject aFontMap( rFontFile.GetPath(), INET_PROT_FILE, INetURLObject::ENCODE_ALL ); + aFontMap.Append( String( RTL_CONSTASCII_USTRINGPARAM( "Fontmap" ) ) ); + INetURLObject aAfmFile( rFontFile ); + aAfmFile.setExtension( String::CreateFromAscii( "afm", 3 ) ); + + + SvFileStream aMap( aFontMap.PathToFileName(), STREAM_WRITE | STREAM_TRUNC ); + if( aMap.IsOpen() ) + { + SvFileStream aRead( rFontFile.GetFull(), STREAM_READ ); + ByteString aLine; + ByteString aFullName; + int nPos; + while( ! aRead.IsEof() && + ( nPos = aLine.Search( "/FullName" ) ) == STRING_NOTFOUND ) + aRead.ReadLine( aLine ); + aRead.Close(); + if( nPos != STRING_NOTFOUND ) + { + aLine.Erase( 0, nPos ); + aFullName = aLine.GetToken( 1, '(' ).GetToken( 0, ')' ); + + aLine = '/'; + aLine += aFullName; + aLine += ' '; + aLine += '('; + aLine += ByteString( rFontFile.GetName(), aEncoding ); + aLine += ')'; + aLine += ';'; + + aMap.WriteLine( aLine ); + } + aMap.Close(); + pid_t nPID = fork(); + if( ! nPID ) + { + INetURLObject aTmp( rFontFile ); + aTmp.CutName(); + ByteString aEnv( "GS_LIB=" ); + aEnv += ByteString( aTmp.PathToFileName(), aEncoding ); + putenv( const_cast<char*>(aEnv.GetBuffer()) ); + + int nDescr = open( ByteString( aAfmFile.PathToFileName(), aEncoding ).GetBuffer(), + O_CREAT | O_TRUNC| O_WRONLY, + 00755 ); +#if OSL_DEBUG_LEVEL > 1 + if( nDescr < 0 ) + fprintf( stderr, "open( %s ) failed because of %d\n", ByteString( aAfmFile.GetFull(), aEncoding ).GetBuffer(), errno ); +#endif + if( dup2( nDescr, STDOUT_FILENO ) > 0 ) + { + execlp( "gs", + "-q", + "-dNODISPLAY", + "--", "printafm.ps", + aFullName.GetBuffer(), + NULL ); + } +#if OSL_DEBUG_LEVEL > 1 + else + fprintf( stderr, "dup2( %d, %d ) failed because of %d\n", nDescr, STDOUT_FILENO, errno ); +#endif + _exit( 0 ); + } + if( nPID > 0 ) + waitpid( nPID, NULL, 0 ); + MetricConverter::ConvertAFM( aAfmFile ); + } + + struct stat aStat; + ByteString aSysFile( aAfmFile.PathToFileName(), aEncoding ); + if( stat( aSysFile.GetBuffer(), &aStat ) || ! aStat.st_size ) + unlink( aSysFile.GetBuffer() ); +#if OSL_DEBUG_LEVEL > 1 + fprintf( stderr, " %s\n", ! access( aSysFile.GetBuffer(), F_OK ) ? "success" : "failed" ); +#endif + unlink( ByteString( aFontMap.PathToFileName(), aEncoding ).GetBuffer() ); +} + +#endif + +FontNameDlg::FontNameDlg( Window *pParent ) : + ModalDialog( pParent, PaResId( RID_FONTNAMEDIALOG ) ), + m_aOKButton( this, PaResId( RID_FNTNM_BTN_OK ) ), + m_aRenameButton( this, PaResId( RID_FNTNM_BTN_RENAME ) ), + m_aRemoveButton( this, PaResId( RID_FNTNM_BTN_REMOVE ) ), + m_aImportButton( this, PaResId( RID_FNTNM_BTN_IMPORT ) ), + m_aFontBox( this, PaResId( RID_FNTNM_LB_FONTS ) ), + m_aFixedText( this, PaResId( RID_FNTNM_FIXED ) ), + m_aRenameString( PaResId( RID_FNTNM_STR_RENAME ) ), + m_aRenameTTCString( PaResId( RID_FNTNM_STR_TTCRENAME ) ), + m_aNoRenameString( PaResId( RID_FNTNM_STR_NOTRENAMABLE ) ), + m_rFontManager( PrintFontManager::get() ) +{ + FreeResource(); + + m_aFontBox.EnableMultiSelection( TRUE ); + + m_aOKButton.SetClickHdl( LINK( this, FontNameDlg, ClickBtnHdl ) ); + m_aRenameButton.SetClickHdl( LINK( this, FontNameDlg, ClickBtnHdl ) ); + m_aRemoveButton.SetClickHdl( LINK( this, FontNameDlg, ClickBtnHdl ) ); + m_aImportButton.SetClickHdl( LINK( this, FontNameDlg, ClickBtnHdl ) ); + m_aFontBox.setDelPressedLink( LINK( this, FontNameDlg, DelPressedHdl ) ); + m_aFontBox.SetSelectHdl( LINK( this, FontNameDlg, SelectHdl ) ); + + init(); +} + +FontNameDlg::~FontNameDlg() +{ +} + +String FontNameDlg::fillFontEntry( FastPrintFontInfo& rInfo, const String& rFile, bool bAddRegular ) +{ + static String aThinTxt( PaResId( RID_TXT_FONT_THIN ) ); + static String aUltraLightTxt( PaResId( RID_TXT_FONT_ULTRALIGHT ) ); + static String aLightTxt( PaResId( RID_TXT_FONT_LIGHT ) ); + static String aSemiLightTxt( PaResId( RID_TXT_FONT_SEMILIGHT ) ); + static String aSemiBoldTxt( PaResId( RID_TXT_FONT_SEMIBOLD ) ); + static String aBoldTxt( PaResId( RID_TXT_FONT_BOLD ) ); + static String aUltraBoldTxt( PaResId( RID_TXT_FONT_ULTRABOLD ) ); + + static String aItalicTxt( PaResId( RID_TXT_FONT_ITALIC ) ); + static String aObliqueTxt( PaResId( RID_TXT_FONT_OBLIQUE ) ); + + static String aUltraCondensedTxt( PaResId( RID_TXT_FONT_ULTRACONDENSED ) ); + static String aExtraCondensedTxt( PaResId( RID_TXT_FONT_EXTRACONDENSED ) ); + static String aCondensedTxt( PaResId( RID_TXT_FONT_CONDENSED ) ); + static String aSemiCondensedTxt( PaResId( RID_TXT_FONT_SEMICONDENSED ) ); + static String aSemiExpandedTxt( PaResId( RID_TXT_FONT_SEMIEXPANDED ) ); + static String aExpandedTxt( PaResId( RID_TXT_FONT_EXPANDED ) ); + static String aExtraExpandedTxt( PaResId( RID_TXT_FONT_EXTRAEXPANDED ) ); + static String aUltraExpandedTxt( PaResId( RID_TXT_FONT_ULTRAEXPANDED ) ); + + static String aRegularTxt( PaResId( RID_TXT_FONT_REGULAR ) ); + + String aEntry( rInfo.m_aFamilyName ); + bool bWeight = true, bItalic = true, bWidth = true; + switch( rInfo.m_eWeight ) + { + case weight::Thin: aEntry.AppendAscii( ", " ); aEntry.Append( aThinTxt ); break; + case weight::UltraLight: aEntry.AppendAscii( ", " ); aEntry.Append( aUltraLightTxt ); break; + case weight::Light: aEntry.AppendAscii( ", " ); aEntry.Append( aLightTxt ); break; + case weight::SemiLight: aEntry.AppendAscii( ", " ); aEntry.Append( aSemiLightTxt ); break; + case weight::SemiBold: aEntry.AppendAscii( ", " ); aEntry.Append( aSemiBoldTxt ); break; + case weight::Bold: aEntry.AppendAscii( ", " ); aEntry.Append( aBoldTxt ); break; + case weight::UltraBold: aEntry.AppendAscii( ", " ); aEntry.Append( aUltraBoldTxt ); break; + default: + bWeight = false; + break; + } + switch( rInfo.m_eItalic ) + { + case italic::Oblique: aEntry.AppendAscii( ", " ); aEntry.Append( aObliqueTxt ); break; + case italic::Italic: aEntry.AppendAscii( ", " ); aEntry.Append( aItalicTxt ); break; + default: + bItalic = false; + break; + } + switch( rInfo.m_eWidth ) + { + case width::UltraCondensed: aEntry.AppendAscii( ", " ); aEntry.Append( aUltraCondensedTxt ); break; + case width::ExtraCondensed: aEntry.AppendAscii( ", " ); aEntry.Append( aExtraCondensedTxt ); break; + case width::Condensed: aEntry.AppendAscii( ", " ); aEntry.Append( aCondensedTxt ); break; + case width::SemiCondensed: aEntry.AppendAscii( ", " ); aEntry.Append( aSemiCondensedTxt ); break; + case width::SemiExpanded: aEntry.AppendAscii( ", " ); aEntry.Append( aSemiExpandedTxt ); break; + case width::Expanded: aEntry.AppendAscii( ", " ); aEntry.Append( aExpandedTxt ); break; + case width::ExtraExpanded: aEntry.AppendAscii( ", " ); aEntry.Append( aExtraExpandedTxt ); break; + case width::UltraExpanded: aEntry.AppendAscii( ", " ); aEntry.Append( aUltraExpandedTxt ); break; + default: + bWidth = false; + break; + } + + if( bAddRegular && ! bItalic && ! bWidth && ! bWeight ) + { + aEntry.AppendAscii( ", " ); + aEntry.Append( aRegularTxt ); + } + + aEntry.AppendAscii( " (" ); + aEntry.Append( rFile ); + aEntry.AppendAscii( ")" ); + return aEntry; +} + +String FontNameDlg::fillFontEntry( const ::std::list< FastPrintFontInfo >& rInfos, const String& rFile ) +{ + String aEntry; + bool bFirst = true; + for( ::std::list< FastPrintFontInfo >::const_iterator it = rInfos.begin(); it != rInfos.end(); ++it ) + { + if( ! bFirst ) + aEntry.AppendAscii( " & " ); + aEntry.Append( String( it->m_aFamilyName ) ); + bFirst = false; + } + + aEntry.AppendAscii( " (" ); + aEntry.Append( rFile ); + aEntry.AppendAscii( ")" ); + return aEntry; +} + +void FontNameDlg::init() +{ + ::std::list< fontID > aFonts; + m_rFontManager.getFontList( aFonts ); + m_aFontBox.Clear(); + m_aRemoveButton.Enable( FALSE ); + m_aRenameButton.Enable( FALSE ); + + ::std::hash_map< OUString, int, OUStringHash > aFamilies; + ::std::list< fontID >::iterator font_it; + for( font_it = aFonts.begin(); font_it != aFonts.end(); ++font_it ) + { + if( m_rFontManager.isPrivateFontFile( *font_it ) ) + { + const OUString& rFamily( m_rFontManager.getFontFamily( *font_it ) ); + if( aFamilies.find( rFamily ) == aFamilies.end() ) + aFamilies[rFamily] = 0; + aFamilies[rFamily]++; + } + } + + for( font_it = aFonts.begin(); font_it != aFonts.end(); ++font_it ) + { + if( m_rFontManager.isPrivateFontFile( *font_it ) ) + { + OString aFile( m_rFontManager.getFontFileSysPath( *font_it ) ); + int nLast = aFile.lastIndexOf( '/' ); + if( nLast != -1 ) + aFile = aFile.copy( nLast+1 ); + + FastPrintFontInfo aInfo; + m_rFontManager.getFontFastInfo( *font_it, aInfo ); + std::list< fontID > aDups; + String aEntry; + if( m_rFontManager.getFileDuplicates( *font_it, aDups ) ) + { + FastPrintFontInfo aDupInfo; + std::list< FastPrintFontInfo > aInfos; + aInfos.push_back( aInfo ); + for( std::list< fontID >::iterator dup = aDups.begin(); dup != aDups.end(); ++dup ) + { + m_rFontManager.getFontFastInfo( *dup, aDupInfo ); + aInfos.push_back( aDupInfo ); + aFonts.remove( *dup ); + } + aEntry = fillFontEntry( aInfos, String( ByteString( aFile ), osl_getThreadTextEncoding() ) ); + } + else + aEntry = fillFontEntry( aInfo, String( ByteString( aFile ), osl_getThreadTextEncoding() ), aFamilies[ aInfo.m_aFamilyName ] > 1 ); + USHORT nEntry = m_aFontBox.InsertEntry( aEntry ); + m_aFontBox.SetEntryData( nEntry, (void*)(*font_it) ); + } + } +} + +IMPL_LINK( FontNameDlg, SelectHdl, ListBox*, pBox ) +{ + if( pBox == &m_aFontBox ) + { + BOOL bEnable = m_aFontBox.GetSelectEntryCount() ? TRUE : FALSE; + m_aRemoveButton.Enable( bEnable ); + m_aRenameButton.Enable( bEnable ); + } + return 0; +} + +IMPL_LINK( FontNameDlg, DelPressedHdl, ListBox*, pBox ) +{ + if( pBox == &m_aFontBox && m_aRemoveButton.IsEnabled() ) + { + ClickBtnHdl( &m_aRemoveButton ); + } + return 0; +} + +IMPL_LINK( FontNameDlg, ClickBtnHdl, Button*, pButton ) +{ + + int i; + + if( pButton == &m_aOKButton ) + { + EndDialog(); + } + else if( pButton == &m_aRemoveButton && AreYouSure( this, RID_QUERY_REMOVEFONTFROMLIST ) && m_aFontBox.GetSelectEntryCount() ) + { + ::std::list< fontID > aRemoveIDs; + for( i = 0; i < m_aFontBox.GetSelectEntryCount(); i++ ) + { + int nSelect = m_aFontBox.GetSelectEntryPos( i ); + aRemoveIDs.push_back( (fontID)(sal_IntPtr)m_aFontBox.GetEntryData( nSelect ) ); + } + m_rFontManager.removeFonts( aRemoveIDs ); + init(); + } + else if( pButton == &m_aImportButton ) + { + FontImportDialog aDialog( this ); + aDialog.Execute(); + init(); + } + else if( pButton == &m_aRenameButton && m_aFontBox.GetSelectEntryCount() ) + { + for( i = 0; i < m_aFontBox.GetSelectEntryCount(); i++ ) + { + fontID aFont = (fontID)(sal_IntPtr)m_aFontBox.GetEntryData( m_aFontBox.GetSelectEntryPos( i ) ); + if( ! m_rFontManager.checkChangeFontPropertiesPossible( aFont ) ) + { + String aErrorText( m_aNoRenameString ); + aErrorText.SearchAndReplace( String( RTL_CONSTASCII_USTRINGPARAM( "%s" ) ), m_aFontBox.GetSelectEntry( i ) ); + ErrorBox aBox( this, WB_OK | WB_DEF_OK, aErrorText ); + aBox.Execute(); + continue; + } + ::std::list< fontID > aDuplicates; + m_rFontManager.getFileDuplicates( aFont, aDuplicates ); + aDuplicates.push_front( aFont ); + int nFonts = aDuplicates.size(); + for( int n = 0; n < nFonts; n++ ) + { + aFont = aDuplicates.front(); + aDuplicates.pop_front(); + String aFamily( m_rFontManager.getFontFamily( aFont ) ); + ::std::list< OUString > aAlternatives; + m_rFontManager.getAlternativeFamilyNames( aFont, aAlternatives ); + ::std::list< String > aChoices; + while( aAlternatives.size() ) + { + aChoices.push_back( aAlternatives.front() ); + aAlternatives.pop_front(); + } + String aQueryTxt( m_aRenameString ); + if( nFonts > 1 ) + { + aQueryTxt = m_aRenameTTCString; + aQueryTxt.SearchAndReplace( String( RTL_CONSTASCII_USTRINGPARAM( "%d1" ) ), String::CreateFromInt32( n+1 ) ); + aQueryTxt.SearchAndReplace( String( RTL_CONSTASCII_USTRINGPARAM( "%d2" ) ), String::CreateFromInt32( nFonts ) ); + } + aQueryTxt.SearchAndReplace( String( RTL_CONSTASCII_USTRINGPARAM( "%s" ) ), aFamily ); + QueryString aQuery( this, aQueryTxt, aFamily, aChoices ); + if( aQuery.Execute() ) + { + aFamily.SearchAndReplaceAll( '-', ' ' ); + aFamily.SearchAndReplaceAll( '?', ' ' ); + aFamily.SearchAndReplaceAll( '*', ' ' ); + aFamily = WhitespaceToSpace( aFamily ); + if( aFamily.Len() ) + { + String aXLFD = m_rFontManager.getFontXLFD( aFont ); + aXLFD.SetToken( 2, '-', aFamily ); + m_rFontManager.changeFontProperties( aFont, aXLFD ); + } + } + } + } + init(); + } + return 0; +} + +//-------------------------------------------------- + +FontImportDialog::FontImportDialog( Window* pParent ) : + ModalDialog( pParent, PaResId( RID_FONTIMPORT_DIALOG ) ), + m_aOKBtn( this, PaResId( RID_FIMP_BTN_OK ) ), + m_aCancelBtn( this, PaResId( RID_FIMP_BTN_CANCEL ) ), + m_aSelectAllBtn( this, PaResId( RID_FIMP_BTN_SELECTALL ) ), + m_aNewFontsBox( this, PaResId( RID_FIMP_BOX_NEWFONTS ) ), + m_aFromFL( this, PaResId( RID_FIMP_FL_FROM ) ), + m_aFromDirEdt( this, PaResId( RID_FIMP_EDT_FROM ) ), + m_aFromBtn( this, PaResId( RID_FIMP_BTN_FROM ) ), + m_aSubDirsBox( this, PaResId( RID_FIMP_BOX_SUBDIRS ) ), + m_aTargetOptFL( this, PaResId( RID_FIMP_FL_TARGETOPTS ) ), + m_aLinkOnlyBox( this, PaResId( RID_FIMP_BOX_LINKONLY ) ), + m_aFixedText( this, PaResId( RID_FIMP_TXT_HELP ) ), + m_bOverwriteAll( false ), + m_bOverwriteNone( false ), + m_pProgress( NULL ), + m_aImportOperation( PaResId( RID_FIMP_STR_IMPORTOP ) ), + m_aOverwriteQueryText( PaResId( RID_FIMP_STR_QUERYOVERWRITE ) ), + m_aOverwriteAllText( PaResId( RID_FIMP_STR_OVERWRITEALL ) ), + m_aOverwriteNoneText( PaResId( RID_FIMP_STR_OVERWRITENONE ) ), + m_aNoAfmText( PaResId( RID_FIMP_STR_NOAFM ) ), + m_aAfmCopyFailedText( PaResId( RID_FIMP_STR_AFMCOPYFAILED ) ), + m_aFontCopyFailedText( PaResId( RID_FIMP_STR_FONTCOPYFAILED ) ), + m_aNoWritableFontsDirText( PaResId( RID_FIMP_STR_NOWRITEABLEFONTSDIR ) ), + m_aFontsImportedText( PaResId( RID_FIMP_STR_NUMBEROFFONTSIMPORTED ) ), + m_rFontManager( ::psp::PrintFontManager::get() ) +{ + FreeResource(); + + m_aNewFontsBox.EnableMultiSelection( TRUE ); + + m_aOKBtn.SetClickHdl( LINK( this, FontImportDialog, ClickBtnHdl ) ); + m_aSelectAllBtn.SetClickHdl( LINK( this, FontImportDialog, ClickBtnHdl ) ); + m_aFromBtn.SetClickHdl( LINK( this, FontImportDialog, ClickBtnHdl ) ); + m_aFromDirEdt.SetModifyHdl( LINK( this, FontImportDialog, ModifyHdl ) ); + m_aRefreshTimer.SetTimeoutHdl( LINK( this, FontImportDialog, RefreshTimeoutHdl ) ); + m_aRefreshTimer.SetTimeout( 2000 ); + m_aLinkOnlyBox.Check( FALSE ); + m_aSubDirsBox.Check( TRUE ); + m_aSubDirsBox.SetToggleHdl( LINK( this, FontImportDialog, ToggleHdl ) ); + + Config& rPadminRC( getPadminRC() ); + rPadminRC.SetGroup( "FontImport" ); + m_aFromDirEdt.SetText( String( rPadminRC.ReadKey( "FromPath" ), RTL_TEXTENCODING_UTF8 ) ); + RefreshTimeoutHdl( NULL ); +} + +FontImportDialog::~FontImportDialog() +{ + Config& rPadminRC( getPadminRC() ); + rPadminRC.SetGroup( "FontImport" ); + rPadminRC.WriteKey( "FromPath", ByteString( m_aFromDirEdt.GetText(), RTL_TEXTENCODING_UTF8 ) ); +} + +void FontImportDialog::importFontsFailed( ::psp::PrintFontManager::ImportFontCallback::FailCondition eReason ) +{ + String aText; + switch( eReason ) + { + case psp::PrintFontManager::ImportFontCallback::NoWritableDirectory: + aText = m_aNoWritableFontsDirText; + break; + default: + break; + } + ErrorBox aBox( m_pProgress ? (Window*)m_pProgress : (Window*)this, WB_OK | WB_DEF_OK, aText ); + aBox.Execute(); +} + +void FontImportDialog::progress( const ::rtl::OUString& rFile ) +{ + m_pProgress->setValue( ++m_nFont ); + m_pProgress->setFilename( rFile ); +} + +bool FontImportDialog::queryOverwriteFile( const ::rtl::OUString& rFile ) +{ + bool bRet = false; + + if( m_bOverwriteNone ) + return false; + if( m_bOverwriteAll ) + return true; + + String aText( m_aOverwriteQueryText ); + aText.SearchAndReplace( String( RTL_CONSTASCII_USTRINGPARAM( "%s" ) ), rFile ); + + QueryBox aQueryBox( m_pProgress ? (Window*)m_pProgress : (Window*)this, WB_YES_NO | WB_DEF_NO, aText ); + aQueryBox.AddButton( m_aOverwriteAllText, 20, 0 ); + aQueryBox.AddButton( m_aOverwriteNoneText, 21, 0 ); + + int nResult = aQueryBox.Execute(); + switch( nResult ) + { + case BUTTONID_YES: bRet = true; break; + case BUTTONID_NO: bRet = false; break; + case 20: bRet = m_bOverwriteAll = true; break; + case 21: bRet = false; m_bOverwriteNone = true; break; + } + + return bRet; +} + +void FontImportDialog::importFontFailed( const ::rtl::OUString& rFile, ::psp::PrintFontManager::ImportFontCallback::FailCondition eReason ) +{ + String aText; + switch( eReason ) + { + case psp::PrintFontManager::ImportFontCallback::NoAfmMetric: + aText = m_aNoAfmText; + break; + case psp::PrintFontManager::ImportFontCallback::AfmCopyFailed: + aText = m_aAfmCopyFailedText; + break; + case psp::PrintFontManager::ImportFontCallback::FontCopyFailed: + aText = m_aFontCopyFailedText; + break; + default: + break; + } + aText.SearchAndReplace( String( RTL_CONSTASCII_USTRINGPARAM( "%s" ) ), rFile ); + ErrorBox aBox( m_pProgress ? (Window*)m_pProgress : (Window*)this, WB_OK | WB_DEF_OK, aText ); + aBox.Execute(); +} + +bool FontImportDialog::isCanceled() +{ + return m_pProgress->isCanceled(); +} + +IMPL_LINK( FontImportDialog, ModifyHdl, Edit*, EMPTYARG ) +{ + m_aRefreshTimer.Start(); + return 0; +} + +IMPL_LINK( FontImportDialog, RefreshTimeoutHdl, void*, EMPTYARG ) +{ + rtl_TextEncoding aEncoding = osl_getThreadTextEncoding(); + std::list< String > aFiles; + m_aNewFonts.clear(); + OUString aDirectory( m_aFromDirEdt.GetText() ); + FindFiles( aDirectory, aFiles, String( RTL_CONSTASCII_USTRINGPARAM( "PFA;PFB;TTF;TTC" ) ), m_aSubDirsBox.IsChecked() ); + OString aDir( OUStringToOString( aDirectory, aEncoding ) ); + aDir += "/"; + while( aFiles.begin() != aFiles.end() ) + { + OString aFont( aDir ); + aFont += OUStringToOString( aFiles.front(), aEncoding ); + aFiles.pop_front(); + ::std::list< FastPrintFontInfo > aInfos; + if( m_rFontManager.getImportableFontProperties( aFont, aInfos ) ) + m_aNewFonts[ aFont ] = aInfos; + } + fillFontBox(); + return 0; +} + +void FontImportDialog::fillFontBox() +{ + rtl_TextEncoding aEncoding = osl_getThreadTextEncoding(); + m_aNewFontsBox.Clear(); + + ::std::hash_map< OUString, int, OUStringHash > aFamilies; + ::std::hash_map< OString, ::std::list< FastPrintFontInfo >, OStringHash >::iterator it; + for( it = m_aNewFonts.begin(); it != m_aNewFonts.end(); ++it ) + { + const OUString& rFamily( it->second.front().m_aFamilyName ); + if( aFamilies.find( rFamily ) == aFamilies.end() ) + aFamilies[rFamily] = 0; + aFamilies[rFamily]++; + } + + for( it = m_aNewFonts.begin(); it != m_aNewFonts.end(); ++it ) + { + OString aFileName( it->first.copy( it->first.lastIndexOf( '/' )+1 ) ); + OUString aFile( OStringToOUString( aFileName, aEncoding ) ); + String aEntry; + if( it->second.size() == 1 ) + aEntry = FontNameDlg::fillFontEntry( it->second.front(), aFile, aFamilies[ it->second.front().m_aFamilyName ] > 1 ); + else + aEntry = FontNameDlg::fillFontEntry( it->second, aFile ); + USHORT nPos = m_aNewFontsBox.InsertEntry( aEntry ); + m_aNewFontsBox.SetEntryData( nPos, (void*)&(it->first) ); + } +} + +void FontImportDialog::copyFonts() +{ + ::std::list< OString > aFiles; + for( int i = 0; i < m_aNewFontsBox.GetSelectEntryCount(); i++ ) + { + OString* pFile = (OString*)m_aNewFontsBox.GetEntryData( m_aNewFontsBox.GetSelectEntryPos( i ) ); + aFiles.push_back( *pFile ); + } + + int nSuccess = 0; + if( aFiles.size() ) + { + m_nFont = 0; + m_pProgress = new ProgressDialog( this ); + m_pProgress->setRange( 0, aFiles.size() ); + m_pProgress->startOperation( m_aImportOperation ); + m_pProgress->Show( TRUE ); + m_pProgress->setValue( 0 ); + m_pProgress->Invalidate(); + m_pProgress->Sync(); + nSuccess = m_rFontManager.importFonts( aFiles, m_aLinkOnlyBox.IsChecked() ? true : false, this ); + m_pProgress->Show( FALSE ); + delete m_pProgress; + m_pProgress = NULL; + } + String aText( m_aFontsImportedText ); + aText.SearchAndReplace( String( RTL_CONSTASCII_USTRINGPARAM( "%d" ) ), String::CreateFromInt32( nSuccess ) ); + InfoBox aBox( this, aText ); + aBox.Execute(); +} + +IMPL_LINK( FontImportDialog, ClickBtnHdl, Button*, pButton ) +{ + if( pButton == &m_aFromBtn ) + { + String aPath( m_aFromDirEdt.GetText() ); + if( chooseDirectory( aPath ) ) + { + m_aFromDirEdt.SetText( aPath ); + RefreshTimeoutHdl( NULL ); + } + } + else if( pButton == &m_aOKBtn ) + { + copyFonts(); + EndDialog( 0 ); + } + else if( pButton == &m_aSelectAllBtn ) + { + m_aNewFontsBox.SetUpdateMode( FALSE ); + for( int i = 0; i < m_aNewFontsBox.GetEntryCount(); i++ ) + m_aNewFontsBox.SelectEntryPos( i, TRUE ); + m_aNewFontsBox.SetUpdateMode( TRUE ); + } + return 0; +} + +IMPL_LINK( FontImportDialog, ToggleHdl, CheckBox*, pBox ) +{ + if( pBox == &m_aSubDirsBox ) + { + RefreshTimeoutHdl( NULL ); + } + + return 0; +} |