blob: 93b0da7b94ec53e9e133fa98ea33f75bc060bc39 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sw.hxx"
#ifdef SW_DLLIMPLEMENTATION
#undef SW_DLLIMPLEMENTATION
#endif
#include <hintids.hxx>
#include <rtl/textenc.h>
#include <i18npool/mslangid.hxx>
#include <com/sun/star/i18n/ScriptType.hpp>
#include <unotools/lingucfg.hxx>
#include <fontcfg.hxx>
#include <swmodule.hxx>
#include <editeng/unolingu.hxx>
#include <sfx2/printer.hxx>
#include <editeng/flstitem.hxx>
#include <svx/dlgutil.hxx>
#include <editeng/fontitem.hxx>
#include <editeng/langitem.hxx>
#include <editeng/scripttypeitem.hxx>
#include <swtypes.hxx>
#include <ascfldlg.hxx>
#include <shellio.hxx>
#include <docsh.hxx>
#include <doc.hxx>
#include <errhdl.hxx>
#ifndef _DIALOG_HRC
#include <dialog.hrc>
#endif
#ifndef _ASCFLDLG_HRC
#include <ascfldlg.hrc>
#endif
#include "vcl/metric.hxx"
using namespace ::com::sun::star;
const sal_Unicode cDialogExtraDataClose = '}';
const char __FAR_DATA sDialogImpExtraData[] = "EncImpDlg:{";
const char __FAR_DATA sDialogExpExtraData[] = "EncExpDlg:{";
const sal_uInt16 nDialogExtraDataLen = 11; // 12345678901
SwAsciiFilterDlg::SwAsciiFilterDlg( Window* pParent, SwDocShell& rDocSh,
SvStream* pStream )
: SfxModalDialog( pParent, SW_RES( DLG_ASCII_FILTER )),
aFL( this, SW_RES( FL_1 )),
aCharSetFT( this, SW_RES( FT_CHARSET )),
aCharSetLB( this, SW_RES( LB_CHARSET )),
aFontFT( this, SW_RES( FT_FONT )),
aFontLB( this, SW_RES( LB_FONT )),
aLanguageFT( this, SW_RES( FT_LANGUAGE )),
aLanguageLB( this, SW_RES( LB_LANGUAGE )),
aCRLF_FT( this, SW_RES( FT_CRLF )),
aCRLF_RB( this, SW_RES( RB_CRLF )),
aCR_RB( this, SW_RES( RB_CR )),
aLF_RB( this, SW_RES( RB_LF )),
aOkPB( this, SW_RES( PB_OK )),
aCancelPB( this, SW_RES( PB_CANCEL )),
aHelpPB( this, SW_RES( PB_HELP )),
sSystemCharSet( SW_RES( STR_SYS_CHARSET )),
bSaveLineStatus( sal_True )
{
FreeResource();
SwAsciiOptions aOpt;
{
const String& rFindNm = String::CreateFromAscii(
pStream ? sDialogImpExtraData
: sDialogExpExtraData);
sal_uInt16 nEnd, nStt = GetExtraData().Search( rFindNm );
if( STRING_NOTFOUND != nStt )
{
nStt += nDialogExtraDataLen;
nEnd = GetExtraData().Search( cDialogExtraDataClose, nStt );
if( STRING_NOTFOUND != nEnd )
{
aOpt.ReadUserData( GetExtraData().Copy( nStt, nEnd - nStt ));
nStt -= nDialogExtraDataLen;
GetExtraData().Erase( nStt, nEnd - nStt + 1 );
}
}
}
// read the first chars and check the charset, (language - with L&H)
if( pStream )
{
char aBuffer[ 4098 ];
sal_uLong nOldPos = pStream->Tell();
sal_uLong nBytesRead = pStream->Read( aBuffer, 4096 );
pStream->Seek( nOldPos );
if( nBytesRead <= 4096 )
{
aBuffer[ nBytesRead ] = '0';
aBuffer[ nBytesRead+1 ] = '0';
}
sal_Bool bCR = sal_False, bLF = sal_False, bNoNormalChar = sal_False,
bNullChar = sal_False;
for( sal_uInt16 nCnt = 0; nCnt < nBytesRead; ++nCnt )
switch( aBuffer[ nCnt ] )
{
case 0x0: bNullChar = sal_True; break;
case 0xA: bLF = sal_True; break;
case 0xD: bCR = sal_True; break;
case 0xC:
case 0x1A:
case 0x9: break;
default:
if( 0x20 > aBuffer[ nCnt ] )
bNoNormalChar = sal_True;
}
if( !bNullChar )
{
if( bCR )
{
if( bLF )
{
aOpt.SetParaFlags( LINEEND_CRLF );
// have to check if of CharSet is type of ANSI
// aOpt.SetCharSet( CHARSET_ANSI );
}
else
{
aOpt.SetParaFlags( LINEEND_CR );
// have to check if CharSet is type of MAC
// aOpt.SetCharSet( CHARSET_MAC );
}
}
else if( bLF )
{
aOpt.SetParaFlags( LINEEND_LF );
// have to check if of CharSet is type of ANSI
// aOpt.SetCharSet( CHARSET_ANSI );
}
}
SwDoc* pDoc = rDocSh.GetDoc();
sal_uInt16 nAppScriptType = GetI18NScriptTypeOfLanguage( (sal_uInt16)GetAppLanguage() );
{
sal_Bool bDelPrinter = sal_False;
SfxPrinter* pPrt = pDoc ? pDoc->getPrinter(false) : 0;
if( !pPrt )
{
SfxItemSet* pSet = new SfxItemSet( rDocSh.GetPool(),
SID_PRINTER_NOTFOUND_WARN, SID_PRINTER_NOTFOUND_WARN,
SID_PRINTER_CHANGESTODOC, SID_PRINTER_CHANGESTODOC,
0 );
pPrt = new SfxPrinter( pSet );
bDelPrinter = sal_True;
}
// get the set of disctinct available family names
std::set< String > aFontNames;
int nFontNames = pPrt->GetDevFontCount();
for( int i = 0; i < nFontNames; i++ )
{
FontInfo aInf( pPrt->GetDevFont( i ) );
aFontNames.insert( aInf.GetName() );
}
// insert to listbox
for( std::set< String >::const_iterator it = aFontNames.begin();
it != aFontNames.end(); ++it )
{
aFontLB.InsertEntry( *it );
}
if( !aOpt.GetFontName().Len() )
{
if(pDoc)
{
sal_uInt16 nFontRes = RES_CHRATR_FONT;
if(SCRIPTTYPE_ASIAN == nAppScriptType)
nFontRes = RES_CHRATR_CJK_FONT;
else if(SCRIPTTYPE_COMPLEX == nAppScriptType)
nFontRes = RES_CHRATR_CTL_FONT;
aOpt.SetFontName( ((SvxFontItem&)pDoc->GetDefault(
nFontRes )).GetFamilyName() );
}
else
{
sal_uInt16 nFontType = FONT_STANDARD;
if(SCRIPTTYPE_ASIAN == nAppScriptType)
nFontType = FONT_STANDARD_CJK;
else if(SCRIPTTYPE_COMPLEX == nAppScriptType)
nFontType = FONT_STANDARD_CTL;
aOpt.SetFontName(SW_MOD()->GetStdFontConfig()->GetFontFor(nFontType));
}
}
aFontLB.SelectEntry( aOpt.GetFontName() );
if( bDelPrinter )
delete pPrt;
}
// initialisiere Sprache
{
if( !aOpt.GetLanguage() )
{
if(pDoc)
{
sal_uInt16 nWhich = GetWhichOfScript( RES_CHRATR_LANGUAGE, nAppScriptType);
aOpt.SetLanguage( ((SvxLanguageItem&)pDoc->
GetDefault( nWhich )).GetLanguage());
}
else
{
SvtLinguOptions aLinguOpt;
SvtLinguConfig().GetOptions( aLinguOpt );
switch(nAppScriptType)
{
case SCRIPTTYPE_ASIAN:
aOpt.SetLanguage(MsLangId::resolveSystemLanguageByScriptType(aLinguOpt.nDefaultLanguage_CJK, SCRIPTTYPE_ASIAN));
break;
case SCRIPTTYPE_COMPLEX:
aOpt.SetLanguage(MsLangId::resolveSystemLanguageByScriptType(aLinguOpt.nDefaultLanguage_CTL, SCRIPTTYPE_COMPLEX));
break;
//SCRIPTTYPE_LATIN:
default:
aOpt.SetLanguage(MsLangId::resolveSystemLanguageByScriptType(aLinguOpt.nDefaultLanguage, SCRIPTTYPE_LATIN));
}
}
}
aLanguageLB.SetLanguageList( LANG_LIST_ALL, sal_True, sal_False );
aLanguageLB.SelectLanguage( aOpt.GetLanguage() );
}
}
else
{
// hide the used Control for the Export and move the
// other behind the charset controls
aFontFT.Hide();
aFontLB.Hide();
aLanguageFT.Hide();
aLanguageLB.Hide();
long nY = aFontFT.GetPosPixel().Y() + 1;
Point aPos( aCRLF_FT.GetPosPixel() ); aPos.Y() = nY;
aCRLF_FT.SetPosPixel( aPos );
aPos = aCRLF_RB.GetPosPixel(); aPos.Y() = nY;
aCRLF_RB.SetPosPixel( aPos );
aPos = aCR_RB.GetPosPixel(); aPos.Y() = nY;
aCR_RB.SetPosPixel( aPos );
aPos = aLF_RB.GetPosPixel(); aPos.Y() = nY;
aLF_RB.SetPosPixel( aPos );
Size aSize = GetSizePixel();
Size aTmpSz( 6, 6 );
aTmpSz = LogicToPixel(aTmpSz, MAP_APPFONT);
aSize.Height() = aHelpPB.GetPosPixel().Y() +
aHelpPB.GetSizePixel().Height() + aTmpSz.Height();
SetSizePixel( aSize );
}
// initialisiere Zeichensatz
aCharSetLB.FillFromTextEncodingTable( pStream != NULL );
aCharSetLB.SelectTextEncoding( aOpt.GetCharSet() );
aCharSetLB.SetSelectHdl( LINK( this, SwAsciiFilterDlg, CharSetSelHdl ));
aCRLF_RB.SetToggleHdl( LINK( this, SwAsciiFilterDlg, LineEndHdl ));
aLF_RB.SetToggleHdl( LINK( this, SwAsciiFilterDlg, LineEndHdl ));
aCR_RB.SetToggleHdl( LINK( this, SwAsciiFilterDlg, LineEndHdl ));
SetCRLF( aOpt.GetParaFlags() );
aCRLF_RB.SaveValue();
aLF_RB.SaveValue();
aCR_RB.SaveValue();
}
SwAsciiFilterDlg::~SwAsciiFilterDlg()
{
}
void SwAsciiFilterDlg::FillOptions( SwAsciiOptions& rOptions )
{
sal_uLong nCCode = aCharSetLB.GetSelectTextEncoding();
String sFont;
sal_uLong nLng = 0;
if( aFontLB.IsVisible() )
{
sFont = aFontLB.GetSelectEntry();
nLng = (sal_uLong)aLanguageLB.GetSelectLanguage();
}
rOptions.SetFontName( sFont );
rOptions.SetCharSet( rtl_TextEncoding( nCCode ) );
rOptions.SetLanguage( sal_uInt16( nLng ) );
rOptions.SetParaFlags( GetCRLF() );
// JP: Task #71802# save the user settings
String sData;
rOptions.WriteUserData( sData );
if( sData.Len() )
{
const String& rFindNm = String::CreateFromAscii(
aFontLB.IsVisible() ? sDialogImpExtraData
: sDialogExpExtraData);
sal_uInt16 nEnd, nStt = GetExtraData().Search( rFindNm );
if( STRING_NOTFOUND != nStt )
{
// called twice, so remove "old" settings
nEnd = GetExtraData().Search( cDialogExtraDataClose,
nStt + nDialogExtraDataLen );
if( STRING_NOTFOUND != nEnd )
GetExtraData().Erase( nStt, nEnd - nStt + 1 );
}
String sTmp(GetExtraData());
sTmp += rFindNm;
sTmp += sData;
sTmp += cDialogExtraDataClose;
GetExtraData() = sTmp;
}
}
void SwAsciiFilterDlg::SetCRLF( LineEnd eEnd )
{
switch( eEnd )
{
case LINEEND_CR: aCR_RB.Check(); break;
case LINEEND_CRLF: aCRLF_RB.Check(); break;
case LINEEND_LF: aLF_RB.Check(); break;
}
}
LineEnd SwAsciiFilterDlg::GetCRLF() const
{
LineEnd eEnd;
if( aCR_RB.IsChecked() )
eEnd = LINEEND_CR;
else if( aLF_RB.IsChecked() )
eEnd = LINEEND_LF;
else
eEnd = LINEEND_CRLF;
return eEnd;
}
IMPL_LINK( SwAsciiFilterDlg, CharSetSelHdl, SvxTextEncodingBox*, pBox )
{
LineEnd eOldEnd = GetCRLF(), eEnd = (LineEnd)-1;
LanguageType nLng = aFontLB.IsVisible()
? aLanguageLB.GetSelectLanguage()
: LANGUAGE_SYSTEM,
nOldLng = nLng;
rtl_TextEncoding nChrSet = pBox->GetSelectTextEncoding();
if( nChrSet == gsl_getSystemTextEncoding() )
eEnd = GetSystemLineEnd();
else
{
switch( nChrSet )
{
case RTL_TEXTENCODING_MS_1252:
#ifdef UNX
eEnd = LINEEND_LF;
#else
eEnd = LINEEND_CRLF; // ANSI
#endif
break;
case RTL_TEXTENCODING_APPLE_ROMAN: // MAC
eEnd = LINEEND_CR;
break;
case RTL_TEXTENCODING_IBM_850: // DOS
eEnd = LINEEND_CRLF;
break;
case RTL_TEXTENCODING_APPLE_ARABIC:
case RTL_TEXTENCODING_APPLE_CENTEURO:
case RTL_TEXTENCODING_APPLE_CROATIAN:
case RTL_TEXTENCODING_APPLE_CYRILLIC:
case RTL_TEXTENCODING_APPLE_DEVANAGARI:
case RTL_TEXTENCODING_APPLE_FARSI:
case RTL_TEXTENCODING_APPLE_GREEK:
case RTL_TEXTENCODING_APPLE_GUJARATI:
case RTL_TEXTENCODING_APPLE_GURMUKHI:
case RTL_TEXTENCODING_APPLE_HEBREW:
case RTL_TEXTENCODING_APPLE_ICELAND:
case RTL_TEXTENCODING_APPLE_ROMANIAN:
case RTL_TEXTENCODING_APPLE_THAI:
case RTL_TEXTENCODING_APPLE_TURKISH:
case RTL_TEXTENCODING_APPLE_UKRAINIAN:
case RTL_TEXTENCODING_APPLE_CHINSIMP:
case RTL_TEXTENCODING_APPLE_CHINTRAD:
case RTL_TEXTENCODING_APPLE_JAPANESE:
case RTL_TEXTENCODING_APPLE_KOREAN:
eEnd = LINEEND_CR;
break;
}
}
bSaveLineStatus = sal_False;
if( eEnd != (LineEnd)-1 ) // changed?
{
if( eOldEnd != eEnd )
SetCRLF( eEnd );
}
else
{
// restore old user choise (not the automatic!)
aCRLF_RB.Check( aCRLF_RB.GetSavedValue() );
aCR_RB.Check( aCR_RB.GetSavedValue() );
aLF_RB.Check( aLF_RB.GetSavedValue() );
}
bSaveLineStatus = sal_True;
if( nOldLng != nLng && aFontLB.IsVisible() )
aLanguageLB.SelectLanguage( nLng );
return 0;
}
IMPL_LINK( SwAsciiFilterDlg, LineEndHdl, RadioButton*, pBtn )
{
if( bSaveLineStatus )
pBtn->SaveValue();
return 0;
}