blob: 7231a1a18f8270b4edb13354a8c36ce7028d3f00 [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_sc.hxx"
#undef SC_DLLIMPLEMENTATION
#include "global.hxx"
#include "scresid.hxx"
#include "impex.hxx"
#include "scuiasciiopt.hxx"
#include "asciiopt.hrc"
#include <tools/debug.hxx>
#include <rtl/tencinfo.h>
#include <unotools/transliterationwrapper.hxx>
// ause
#include "editutil.hxx"
#include <optutil.hxx>
#include <com/sun/star/uno/Any.hxx>
#include <com/sun/star/uno/Sequence.hxx>
#include "miscuno.hxx"
//! TODO make dynamic
const SCSIZE ASCIIDLG_MAXROWS = MAXROWCOUNT;
using namespace rtl;
using namespace com::sun::star::uno;
// Defines - CSV Import Preserve Options
#define FIXED_WIDTH "FixedWidth"
#define FROM_ROW "FromRow"
#define CHAR_SET "CharSet"
#define SEPARATORS "Separators"
#define TEXT_SEPARATORS "TextSeparators"
#define MERGE_DELIMITERS "MergeDelimiters"
#define QUOTED_AS_TEXT "QuotedFieldAsText"
#define DETECT_SPECIAL_NUM "DetectSpecialNumbers"
#define LANGUAGE "Language"
#define SEP_PATH "Office.Calc/Dialogs/CSVImport"
// ============================================================================
void lcl_FillCombo( ComboBox& rCombo, const String& rList, sal_Unicode cSelect )
{
xub_StrLen i;
xub_StrLen nCount = rList.GetTokenCount('\t');
for ( i=0; i<nCount; i+=2 )
rCombo.InsertEntry( rList.GetToken(i,'\t') );
if ( cSelect )
{
String aStr;
for ( i=0; i<nCount; i+=2 )
if ( (sal_Unicode)rList.GetToken(i+1,'\t').ToInt32() == cSelect )
aStr = rList.GetToken(i,'\t');
if (!aStr.Len())
aStr = cSelect; // Ascii
rCombo.SetText(aStr);
}
}
sal_Unicode lcl_CharFromCombo( ComboBox& rCombo, const String& rList )
{
sal_Unicode c = 0;
String aStr = rCombo.GetText();
if ( aStr.Len() )
{
xub_StrLen nCount = rList.GetTokenCount('\t');
for ( xub_StrLen i=0; i<nCount; i+=2 )
{
if ( ScGlobal::GetpTransliteration()->isEqual( aStr, rList.GetToken(i,'\t') ) )//CHINA001 if ( ScGlobal::GetpTransliteration()->isEqual( aStr, rList.GetToken(i,'\t') ) )
c = (sal_Unicode)rList.GetToken(i+1,'\t').ToInt32();
}
if (!c && aStr.Len())
{
sal_Unicode cFirst = aStr.GetChar( 0 );
// #i24235# first try the first character of the string directly
if( (aStr.Len() == 1) || (cFirst < '0') || (cFirst > '9') )
c = cFirst;
else // keep old behaviour for compatibility (i.e. "39" -> "'")
c = (sal_Unicode) aStr.ToInt32(); // Ascii
}
}
return c;
}
static void load_Separators( OUString &sFieldSeparators, OUString &sTextSeparators,
bool &bMergeDelimiters, bool& bQuotedAsText, bool& bDetectSpecialNum,
bool &bFixedWidth, sal_Int32 &nFromRow, sal_Int32 &nCharSet,
sal_Int32& nLanguage )
{
Sequence<Any>aValues;
const Any *pProperties;
Sequence<OUString> aNames(9);
OUString* pNames = aNames.getArray();
ScLinkConfigItem aItem( OUString::createFromAscii( SEP_PATH ) );
pNames[0] = OUString::createFromAscii( MERGE_DELIMITERS );
pNames[1] = OUString::createFromAscii( SEPARATORS );
pNames[2] = OUString::createFromAscii( TEXT_SEPARATORS );
pNames[3] = OUString::createFromAscii( FIXED_WIDTH );
pNames[4] = OUString::createFromAscii( FROM_ROW );
pNames[5] = OUString::createFromAscii( CHAR_SET );
pNames[6] = OUString::createFromAscii( QUOTED_AS_TEXT );
pNames[7] = OUString::createFromAscii( DETECT_SPECIAL_NUM );
pNames[8] = OUString::createFromAscii( LANGUAGE );
aValues = aItem.GetProperties( aNames );
pProperties = aValues.getConstArray();
if( pProperties[1].hasValue() )
pProperties[1] >>= sFieldSeparators;
if( pProperties[2].hasValue() )
pProperties[2] >>= sTextSeparators;
if( pProperties[0].hasValue() )
bMergeDelimiters = ScUnoHelpFunctions::GetBoolFromAny( pProperties[0] );
if( pProperties[3].hasValue() )
bFixedWidth = ScUnoHelpFunctions::GetBoolFromAny( pProperties[3] );
if( pProperties[4].hasValue() )
pProperties[4] >>= nFromRow;
if( pProperties[5].hasValue() )
pProperties[5] >>= nCharSet;
if ( pProperties[6].hasValue() )
pProperties[6] >>= bQuotedAsText;
if ( pProperties[7].hasValue() )
pProperties[7] >>= bDetectSpecialNum;
if ( pProperties[8].hasValue() )
pProperties[8] >>= nLanguage;
}
static void save_Separators(
String maSeparators, String maTxtSep, bool bMergeDelimiters, bool bQuotedAsText,
bool bDetectSpecialNum, bool bFixedWidth, sal_Int32 nFromRow, sal_Int32 nCharSet, sal_Int32 nLanguage )
{
OUString sFieldSeparators = OUString( maSeparators );
OUString sTextSeparators = OUString( maTxtSep );
Sequence<Any> aValues;
Any *pProperties;
Sequence<OUString> aNames(9);
OUString* pNames = aNames.getArray();
ScLinkConfigItem aItem( OUString::createFromAscii( SEP_PATH ) );
pNames[0] = OUString::createFromAscii( MERGE_DELIMITERS );
pNames[1] = OUString::createFromAscii( SEPARATORS );
pNames[2] = OUString::createFromAscii( TEXT_SEPARATORS );
pNames[3] = OUString::createFromAscii( FIXED_WIDTH );
pNames[4] = OUString::createFromAscii( FROM_ROW );
pNames[5] = OUString::createFromAscii( CHAR_SET );
pNames[6] = OUString::createFromAscii( QUOTED_AS_TEXT );
pNames[7] = OUString::createFromAscii( DETECT_SPECIAL_NUM );
pNames[8] = OUString::createFromAscii( LANGUAGE );
aValues = aItem.GetProperties( aNames );
pProperties = aValues.getArray();
pProperties[1] <<= sFieldSeparators;
pProperties[2] <<= sTextSeparators;
ScUnoHelpFunctions::SetBoolInAny( pProperties[0], bMergeDelimiters );
ScUnoHelpFunctions::SetBoolInAny( pProperties[3], bFixedWidth );
pProperties[4] <<= nFromRow;
pProperties[5] <<= nCharSet;
pProperties[6] <<= static_cast<sal_Bool>(bQuotedAsText);
pProperties[7] <<= static_cast<sal_Bool>(bDetectSpecialNum);
pProperties[8] <<= nLanguage;
aItem.PutProperties(aNames, aValues);
}
// ----------------------------------------------------------------------------
ScImportAsciiDlg::ScImportAsciiDlg( Window* pParent,String aDatName,
SvStream* pInStream, sal_Unicode cSep ) :
ModalDialog ( pParent, ScResId( RID_SCDLG_ASCII ) ),
mpDatStream ( pInStream ),
mnStreamPos( pInStream ? pInStream->Tell() : 0 ),
mpRowPosArray( NULL ),
mnRowPosCount(0),
aFlFieldOpt ( this, ScResId( FL_FIELDOPT ) ),
aFtCharSet ( this, ScResId( FT_CHARSET ) ),
aLbCharSet ( this, ScResId( LB_CHARSET ) ),
aFtCustomLang( this, ScResId( FT_CUSTOMLANG ) ),
aLbCustomLang( this, ScResId( LB_CUSTOMLANG ) ),
aFtRow ( this, ScResId( FT_AT_ROW ) ),
aNfRow ( this, ScResId( NF_AT_ROW ) ),
aFlSepOpt ( this, ScResId( FL_SEPOPT ) ),
aRbFixed ( this, ScResId( RB_FIXED ) ),
aRbSeparated( this, ScResId( RB_SEPARATED ) ),
aCkbTab ( this, ScResId( CKB_TAB ) ),
aCkbSemicolon(this, ScResId( CKB_SEMICOLON ) ),
aCkbComma ( this, ScResId( CKB_COMMA ) ),
aCkbSpace ( this, ScResId( CKB_SPACE ) ),
aCkbOther ( this, ScResId( CKB_OTHER ) ),
aEdOther ( this, ScResId( ED_OTHER ) ),
aCkbAsOnce ( this, ScResId( CB_ASONCE) ),
aFlOtherOpt ( this, ScResId( FL_OTHER_OPTIONS ) ),
aFtTextSep ( this, ScResId( FT_TEXTSEP ) ),
aCbTextSep ( this, ScResId( CB_TEXTSEP ) ),
aCkbQuotedAsText( this, ScResId(CB_QUOTED_AS_TEXT) ),
aCkbDetectNumber( this, ScResId(CB_DETECT_SPECIAL_NUMBER) ),
aFlWidth ( this, ScResId( FL_WIDTH ) ),
aFtType ( this, ScResId( FT_TYPE ) ),
aLbType ( this, ScResId( LB_TYPE1 ) ),
maTableBox ( this, ScResId( CTR_TABLEBOX ) ),
aBtnOk ( this, ScResId( BTN_OK ) ),
aBtnCancel ( this, ScResId( BTN_CANCEL ) ),
aBtnHelp ( this, ScResId( BTN_HELP ) ),
aCharSetUser( ScResId( SCSTR_CHARSET_USER ) ),
aColumnUser ( ScResId( SCSTR_COLUMN_USER ) ),
aTextSepList( ScResId( SCSTR_TEXTSEP ) ),
mcTextSep ( ScAsciiOptions::cDefaultTextSep ),
maStrTextToColumns( ScResId( STR_TEXTTOCOLUMNS ) ),
mbFileImport(true)
{
FreeResource();
mbFileImport = aDatName.Len() > 0;
String aName = GetText();
// aDatName is empty if invoked during paste from clipboard.
if (mbFileImport)
{
aName.AppendAscii(RTL_CONSTASCII_STRINGPARAM(" - ["));
aName += aDatName;
aName += ']';
}
SetText( aName );
OUString sFieldSeparators;
OUString sTextSeparators;
bool bMergeDelimiters = false;
bool bFixedWidth = false;
bool bQuotedFieldAsText = false;
bool bDetectSpecialNum = false;
sal_Int32 nFromRow = 1;
sal_Int32 nCharSet = -1;
sal_Int32 nLanguage = 0;
if (mbFileImport)
// load separators only when importing csv files.
load_Separators (sFieldSeparators, sTextSeparators, bMergeDelimiters,
bQuotedFieldAsText, bDetectSpecialNum, bFixedWidth, nFromRow, nCharSet, nLanguage);
else
{
// #i115474# otherwise use sensible defaults
sFieldSeparators = OUString( cSep );
sTextSeparators = OUString( ScAsciiOptions::cDefaultTextSep );
}
maFieldSeparators = String(sFieldSeparators);
if( bMergeDelimiters )
aCkbAsOnce.Check();
if (bQuotedFieldAsText)
aCkbQuotedAsText.Check();
if (bDetectSpecialNum)
aCkbDetectNumber.Check();
if( bFixedWidth )
aRbFixed.Check();
if( nFromRow != 1 )
aNfRow.SetValue( nFromRow );
ByteString bString(maFieldSeparators,RTL_TEXTENCODING_MS_1252);
const sal_Char *aSep = bString.GetBuffer();
int len = maFieldSeparators.Len();
for (int i = 0; i < len; ++i)
{
switch( aSep[i] )
{
case '\t': aCkbTab.Check(); break;
case ';': aCkbSemicolon.Check(); break;
case ',': aCkbComma.Check(); break;
case ' ': aCkbSpace.Check(); break;
default:
aCkbOther.Check();
aEdOther.SetText( aEdOther.GetText() + OUString( aSep[i] ) );
}
}
// Get Separators from the dialog
maFieldSeparators = GetSeparators();
// Clipboard is always Unicode, else detect.
rtl_TextEncoding ePreselectUnicode = (mbFileImport ?
RTL_TEXTENCODING_DONTKNOW : RTL_TEXTENCODING_UNICODE);
// Sniff for Unicode / not
if( ePreselectUnicode == RTL_TEXTENCODING_DONTKNOW && mpDatStream )
{
Seek( 0 );
mpDatStream->StartReadingUnicodeText( RTL_TEXTENCODING_DONTKNOW );
sal_uLong nUniPos = mpDatStream->Tell();
switch (nUniPos)
{
case 2:
ePreselectUnicode = RTL_TEXTENCODING_UNICODE; // UTF-16
break;
case 3:
ePreselectUnicode = RTL_TEXTENCODING_UTF8; // UTF-8
break;
case 0:
{
sal_uInt16 n;
*mpDatStream >> n;
// Assume that normal ASCII/ANSI/ISO/etc. text doesn't start with
// control characters except CR,LF,TAB
if ( (n & 0xff00) < 0x2000 )
{
switch ( n & 0xff00 )
{
case 0x0900 :
case 0x0a00 :
case 0x0d00 :
break;
default:
ePreselectUnicode = RTL_TEXTENCODING_UNICODE; // UTF-16
}
}
mpDatStream->Seek(0);
}
break;
default:
; // nothing
}
mnStreamPos = mpDatStream->Tell();
}
aNfRow.SetModifyHdl( LINK( this, ScImportAsciiDlg, FirstRowHdl ) );
// *** Separator characters ***
lcl_FillCombo( aCbTextSep, aTextSepList, mcTextSep );
aCbTextSep.SetText( sTextSeparators );
Link aSeparatorHdl =LINK( this, ScImportAsciiDlg, SeparatorHdl );
aCbTextSep.SetSelectHdl( aSeparatorHdl );
aCbTextSep.SetModifyHdl( aSeparatorHdl );
aCkbTab.SetClickHdl( aSeparatorHdl );
aCkbSemicolon.SetClickHdl( aSeparatorHdl );
aCkbComma.SetClickHdl( aSeparatorHdl );
aCkbAsOnce.SetClickHdl( aSeparatorHdl );
aCkbQuotedAsText.SetClickHdl( aSeparatorHdl );
aCkbDetectNumber.SetClickHdl( aSeparatorHdl );
aCkbSpace.SetClickHdl( aSeparatorHdl );
aCkbOther.SetClickHdl( aSeparatorHdl );
aEdOther.SetModifyHdl( aSeparatorHdl );
// *** text encoding ListBox ***
// all encodings allowed, including Unicode, but subsets are excluded
aLbCharSet.FillFromTextEncodingTable( sal_True );
// Insert one "SYSTEM" entry for compatibility in AsciiOptions and system
// independent document linkage.
aLbCharSet.InsertTextEncoding( RTL_TEXTENCODING_DONTKNOW, aCharSetUser );
aLbCharSet.SelectTextEncoding( ePreselectUnicode == RTL_TEXTENCODING_DONTKNOW ?
gsl_getSystemTextEncoding() : ePreselectUnicode );
if( nCharSet >= 0 && ePreselectUnicode == RTL_TEXTENCODING_DONTKNOW )
aLbCharSet.SelectEntryPos( static_cast<sal_uInt16>(nCharSet) );
SetSelectedCharSet();
aLbCharSet.SetSelectHdl( LINK( this, ScImportAsciiDlg, CharSetHdl ) );
aLbCustomLang.SetLanguageList(
LANG_LIST_ALL | LANG_LIST_ONLY_KNOWN, false, false);
aLbCustomLang.InsertLanguage(LANGUAGE_SYSTEM);
aLbCustomLang.SelectLanguage(static_cast<LanguageType>(nLanguage), true);
// *** column type ListBox ***
xub_StrLen nCount = aColumnUser.GetTokenCount();
for (xub_StrLen i=0; i<nCount; i++)
aLbType.InsertEntry( aColumnUser.GetToken( i ) );
aLbType.SetSelectHdl( LINK( this, ScImportAsciiDlg, LbColTypeHdl ) );
aFtType.Disable();
aLbType.Disable();
// *** table box preview ***
maTableBox.SetUpdateTextHdl( LINK( this, ScImportAsciiDlg, UpdateTextHdl ) );
maTableBox.InitTypes( aLbType );
maTableBox.SetColTypeHdl( LINK( this, ScImportAsciiDlg, ColTypeHdl ) );
aRbSeparated.SetClickHdl( LINK( this, ScImportAsciiDlg, RbSepFixHdl ) );
aRbFixed.SetClickHdl( LINK( this, ScImportAsciiDlg, RbSepFixHdl ) );
SetupSeparatorCtrls();
RbSepFixHdl( &aRbFixed );
UpdateVertical();
maTableBox.Execute( CSVCMD_NEWCELLTEXTS );
aEdOther.SetAccessibleName(aCkbOther.GetText());
aEdOther.SetAccessibleRelationLabeledBy(&aCkbOther);
}
ScImportAsciiDlg::~ScImportAsciiDlg()
{
delete[] mpRowPosArray;
}
// ----------------------------------------------------------------------------
bool ScImportAsciiDlg::GetLine( sal_uLong nLine, String &rText )
{
if (nLine >= ASCIIDLG_MAXROWS || !mpDatStream)
return false;
bool bRet = true;
bool bFixed = aRbFixed.IsChecked();
if (!mpRowPosArray)
mpRowPosArray = new sal_uLong[ASCIIDLG_MAXROWS + 2];
if (!mnRowPosCount) // complete re-fresh
{
memset( mpRowPosArray, 0, sizeof(mpRowPosArray[0]) * (ASCIIDLG_MAXROWS+2));
Seek(0);
mpDatStream->StartReadingUnicodeText( mpDatStream->GetStreamCharSet() );
mnStreamPos = mpDatStream->Tell();
mpRowPosArray[mnRowPosCount] = mnStreamPos;
}
if (nLine >= mnRowPosCount)
{
// need to work out some more line information
do
{
if (!Seek( mpRowPosArray[mnRowPosCount]) ||
mpDatStream->GetError() != ERRCODE_NONE ||
mpDatStream->IsEof())
{
bRet = false;
break;
}
mpDatStream->ReadCsvLine( rText, !bFixed, maFieldSeparators,
mcTextSep);
mnStreamPos = mpDatStream->Tell();
mpRowPosArray[++mnRowPosCount] = mnStreamPos;
} while (nLine >= mnRowPosCount &&
mpDatStream->GetError() == ERRCODE_NONE &&
!mpDatStream->IsEof());
if (mpDatStream->IsEof() &&
mnStreamPos == mpRowPosArray[mnRowPosCount-1])
{
// the very end, not even an empty line read
bRet = false;
--mnRowPosCount;
}
}
else
{
Seek( mpRowPosArray[nLine]);
mpDatStream->ReadCsvLine( rText, !bFixed, maFieldSeparators, mcTextSep);
mnStreamPos = mpDatStream->Tell();
}
// #107455# If the file content isn't unicode, ReadUniStringLine
// may try to seek beyond the file's end and cause a CANTSEEK error
// (depending on the stream type). The error code has to be cleared,
// or further read operations (including non-unicode) will fail.
if ( mpDatStream->GetError() == ERRCODE_IO_CANTSEEK )
mpDatStream->ResetError();
return bRet;
}
void ScImportAsciiDlg::GetOptions( ScAsciiOptions& rOpt )
{
rOpt.SetCharSet( meCharSet );
rOpt.SetCharSetSystem( mbCharSetSystem );
rOpt.SetLanguage(aLbCustomLang.GetSelectLanguage());
rOpt.SetFixedLen( aRbFixed.IsChecked() );
rOpt.SetStartRow( (long)aNfRow.GetValue() );
maTableBox.FillColumnData( rOpt );
if( aRbSeparated.IsChecked() )
{
rOpt.SetFieldSeps( GetSeparators() );
rOpt.SetMergeSeps( aCkbAsOnce.IsChecked() );
rOpt.SetTextSep( lcl_CharFromCombo( aCbTextSep, aTextSepList ) );
}
rOpt.SetQuotedAsText(aCkbQuotedAsText.IsChecked());
rOpt.SetDetectSpecialNumber(aCkbDetectNumber.IsChecked());
}
void ScImportAsciiDlg::SetTextToColumnsMode()
{
SetText( maStrTextToColumns );
aFtCharSet.Disable();
aLbCharSet.Disable();
aFtCustomLang.Disable();
aLbCustomLang.SelectLanguage(LANGUAGE_SYSTEM);
aLbCustomLang.Disable();
aFtRow.Disable();
aNfRow.Disable();
// Quoted field as text option is not used for text-to-columns mode.
aCkbQuotedAsText.Check(false);
aCkbQuotedAsText.Disable();
// Always detect special numbers for text-to-columns mode.
aCkbDetectNumber.Check();
aCkbDetectNumber.Disable();
}
void ScImportAsciiDlg::SaveParameters()
{
if (!mbFileImport)
// We save parameters only for file import.
return;
save_Separators( maFieldSeparators, aCbTextSep.GetText(), aCkbAsOnce.IsChecked(),
aCkbQuotedAsText.IsChecked(), aCkbDetectNumber.IsChecked(),
aRbFixed.IsChecked(),
static_cast<sal_Int32>(aNfRow.GetValue()),
static_cast<sal_Int32>(aLbCharSet.GetSelectEntryPos()),
static_cast<sal_Int32>(aLbCustomLang.GetSelectLanguage()) );
}
void ScImportAsciiDlg::SetSelectedCharSet()
{
meCharSet = aLbCharSet.GetSelectTextEncoding();
mbCharSetSystem = (meCharSet == RTL_TEXTENCODING_DONTKNOW);
if( mbCharSetSystem )
meCharSet = gsl_getSystemTextEncoding();
}
String ScImportAsciiDlg::GetSeparators() const
{
String aSepChars;
if( aCkbTab.IsChecked() )
aSepChars += '\t';
if( aCkbSemicolon.IsChecked() )
aSepChars += ';';
if( aCkbComma.IsChecked() )
aSepChars += ',';
if( aCkbSpace.IsChecked() )
aSepChars += ' ';
if( aCkbOther.IsChecked() )
aSepChars += aEdOther.GetText();
return aSepChars;
}
void ScImportAsciiDlg::SetupSeparatorCtrls()
{
sal_Bool bEnable = aRbSeparated.IsChecked();
aCkbTab.Enable( bEnable );
aCkbSemicolon.Enable( bEnable );
aCkbComma.Enable( bEnable );
aCkbSpace.Enable( bEnable );
aCkbOther.Enable( bEnable );
aEdOther.Enable( bEnable );
aCkbAsOnce.Enable( bEnable );
aFtTextSep.Enable( bEnable );
aCbTextSep.Enable( bEnable );
}
void ScImportAsciiDlg::UpdateVertical()
{
mnRowPosCount = 0;
if (mpDatStream)
mpDatStream->SetStreamCharSet(meCharSet);
}
// ----------------------------------------------------------------------------
IMPL_LINK( ScImportAsciiDlg, RbSepFixHdl, RadioButton*, pButton )
{
DBG_ASSERT( pButton, "ScImportAsciiDlg::RbSepFixHdl - missing sender" );
if( (pButton == &aRbFixed) || (pButton == &aRbSeparated) )
{
SetPointer( Pointer( POINTER_WAIT ) );
if( aRbFixed.IsChecked() )
maTableBox.SetFixedWidthMode();
else
maTableBox.SetSeparatorsMode();
SetPointer( Pointer( POINTER_ARROW ) );
SetupSeparatorCtrls();
}
return 0;
}
IMPL_LINK( ScImportAsciiDlg, SeparatorHdl, Control*, pCtrl )
{
DBG_ASSERT( pCtrl, "ScImportAsciiDlg::SeparatorHdl - missing sender" );
DBG_ASSERT( !aRbFixed.IsChecked(), "ScImportAsciiDlg::SeparatorHdl - not allowed in fixed width" );
/* #i41550# First update state of the controls. The GetSeparators()
function needs final state of the check boxes. */
if( (pCtrl == &aCkbOther) && aCkbOther.IsChecked() )
aEdOther.GrabFocus();
else if( pCtrl == &aEdOther )
aCkbOther.Check( aEdOther.GetText().Len() > 0 );
String aOldFldSeps( maFieldSeparators);
maFieldSeparators = GetSeparators();
sal_Unicode cOldSep = mcTextSep;
mcTextSep = lcl_CharFromCombo( aCbTextSep, aTextSepList );
// Any separator changed may result in completely different lines due to
// embedded line breaks.
if (cOldSep != mcTextSep || aOldFldSeps != maFieldSeparators)
UpdateVertical();
maTableBox.Execute( CSVCMD_NEWCELLTEXTS );
return 0;
}
IMPL_LINK( ScImportAsciiDlg, CharSetHdl, SvxTextEncodingBox*, pCharSetBox )
{
DBG_ASSERT( pCharSetBox, "ScImportAsciiDlg::CharSetHdl - missing sender" );
if( (pCharSetBox == &aLbCharSet) && (pCharSetBox->GetSelectEntryCount() == 1) )
{
SetPointer( Pointer( POINTER_WAIT ) );
CharSet eOldCharSet = meCharSet;
SetSelectedCharSet();
// switching char-set invalidates 8bit -> String conversions
if (eOldCharSet != meCharSet)
UpdateVertical();
maTableBox.Execute( CSVCMD_NEWCELLTEXTS );
SetPointer( Pointer( POINTER_ARROW ) );
}
return 0;
}
IMPL_LINK( ScImportAsciiDlg, FirstRowHdl, NumericField*, pNumField )
{
DBG_ASSERT( pNumField, "ScImportAsciiDlg::FirstRowHdl - missing sender" );
maTableBox.Execute( CSVCMD_SETFIRSTIMPORTLINE, sal::static_int_cast<sal_Int32>( pNumField->GetValue() - 1 ) );
return 0;
}
IMPL_LINK( ScImportAsciiDlg, LbColTypeHdl, ListBox*, pListBox )
{
DBG_ASSERT( pListBox, "ScImportAsciiDlg::LbColTypeHdl - missing sender" );
if( pListBox == &aLbType )
maTableBox.Execute( CSVCMD_SETCOLUMNTYPE, pListBox->GetSelectEntryPos() );
return 0;
}
IMPL_LINK( ScImportAsciiDlg, UpdateTextHdl, ScCsvTableBox*, EMPTYARG )
{
sal_Int32 nBaseLine = maTableBox.GetFirstVisLine();
sal_Int32 nRead = maTableBox.GetVisLineCount();
// If mnRowPosCount==0, this is an initializing call, read ahead for row
// count and resulting scroll bar size and position to be able to scroll at
// all. When adding lines, read only the amount of next lines to be
// displayed.
if (!mnRowPosCount || nRead > CSV_PREVIEW_LINES)
nRead = CSV_PREVIEW_LINES;
sal_Int32 i;
for (i = 0; i < nRead; i++)
{
if (!GetLine( nBaseLine + i, maPreviewLine[i]))
break;
}
for (; i < CSV_PREVIEW_LINES; i++)
maPreviewLine[i].Erase();
maTableBox.Execute( CSVCMD_SETLINECOUNT, mnRowPosCount);
bool bMergeSep = (aCkbAsOnce.IsChecked() == sal_True);
maTableBox.SetUniStrings( maPreviewLine, maFieldSeparators, mcTextSep, bMergeSep);
return 0;
}
IMPL_LINK( ScImportAsciiDlg, ColTypeHdl, ScCsvTableBox*, pTableBox )
{
DBG_ASSERT( pTableBox, "ScImportAsciiDlg::ColTypeHdl - missing sender" );
sal_Int32 nType = pTableBox->GetSelColumnType();
sal_Int32 nTypeCount = aLbType.GetEntryCount();
bool bEmpty = (nType == CSV_TYPE_MULTI);
bool bEnable = ((0 <= nType) && (nType < nTypeCount)) || bEmpty;
aFtType.Enable( bEnable );
aLbType.Enable( bEnable );
Link aSelHdl = aLbType.GetSelectHdl();
aLbType.SetSelectHdl( Link() );
if( bEmpty )
aLbType.SetNoSelection();
else if( bEnable )
aLbType.SelectEntryPos( static_cast< sal_uInt16 >( nType ) );
aLbType.SetSelectHdl( aSelHdl );
return 0;
}