/************************************************************************* * * $RCSfile: asciiopt.cxx,v $ * * $Revision: 1.1.1.1 $ * * last change: $Author: hr $ $Date: 2000-09-18 16:44:53 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses * * - GNU Lesser General Public License Version 2.1 * - Sun Industry Standards Source License Version 1.1 * * Sun Microsystems Inc., October, 2000 * * GNU Lesser General Public License Version 2.1 * ============================================= * Copyright 2000 by Sun Microsystems, Inc. * 901 San Antonio Road, Palo Alto, CA 94303, USA * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License version 2.1, as published by the Free Software Foundation. * * This library 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 for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA * * * Sun Industry Standards Source License Version 1.1 * ================================================= * The contents of this file are subject to the Sun Industry Standards * Source License Version 1.1 (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.openoffice.org/license.html. * * Software provided under this License is provided on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. * See the License for the specific provisions governing your rights and * obligations concerning the Software. * * The Initial Developer of the Original Code is: Sun Microsystems, Inc. * * Copyright: 2000 by Sun Microsystems, Inc. * * All Rights Reserved. * * Contributor(s): _______________________________________ * * ************************************************************************/ #ifdef PCH #include "ui_pch.hxx" #endif #pragma hdrstop #ifndef PCH #include "segmentc.hxx" #endif #include "global.hxx" #include "scresid.hxx" #include "impex.hxx" #include "asciiopt.hxx" #include "asciiopt.hrc" #include //------------------------------------------------------------------------ #define ASCIIDLG_MAXFIELDS 256 #ifdef WIN #define ASCIIDLG_MAXROWS 10000 #else #define ASCIIDLG_MAXROWS 32000 #endif // da max. 5 Decimalstellen #define ASCIIDLG_1COL_SIZE 5 #define ASCIIDLG_LASTCOL_SIZE 10000 static const sal_Char __FAR_DATA pStrFix[] = "FIX"; static const sal_Char __FAR_DATA pStrMrg[] = "MRG"; // Liste der CharSet-Werte passend zum String SCSTR_CHARSET_USER static CharSet eCharSetList[] = { RTL_TEXTENCODING_MS_1252, // "Ansi" RTL_TEXTENCODING_APPLE_ROMAN, // "Mac" RTL_TEXTENCODING_IBM_850, // "IBMPC" RTL_TEXTENCODING_IBM_437, // "IBMPC (437)" RTL_TEXTENCODING_IBM_850, // "IBMPC (850)" RTL_TEXTENCODING_IBM_860, // "IBMPC (860)" RTL_TEXTENCODING_IBM_861, // "IBMPC (861)" RTL_TEXTENCODING_IBM_863, // "IBMPC (863)" RTL_TEXTENCODING_IBM_865, // "IBMPC (865)" RTL_TEXTENCODING_DONTKNOW }; // "System" (handled in GetCharSetFromList) // Liste der Spaltentypen passend zum String SCSTR_COLUMN_USER static BYTE nColTypeList[] = { SC_COL_STANDARD, SC_COL_TEXT, SC_COL_DMY, SC_COL_MDY, SC_COL_YMD, SC_COL_ENGLISH, SC_COL_SKIP }; SEG_EOFGLOBALS() #pragma SEG_FUNCDEF(asciiopt_07) String lcl_GetCharsetString(CharSet eCharSet) //! nach global oder so verschieben { const sal_Char* pChar; switch (eCharSet) { case RTL_TEXTENCODING_MS_1252: pChar = "ANSI"; break; case RTL_TEXTENCODING_APPLE_ROMAN: pChar = "MAC"; break; // IBMPC == IBMPC_850 case RTL_TEXTENCODING_IBM_437: pChar = "IBMPC_437"; break; case RTL_TEXTENCODING_IBM_850: pChar = "IBMPC_850"; break; case RTL_TEXTENCODING_IBM_860: pChar = "IBMPC_860"; break; case RTL_TEXTENCODING_IBM_861: pChar = "IBMPC_861"; break; case RTL_TEXTENCODING_IBM_863: pChar = "IBMPC_863"; break; case RTL_TEXTENCODING_IBM_865: pChar = "IBMPC_865"; break; default: pChar = "SYSTEM"; break; } return String::CreateFromAscii(pChar); } CharSet lcl_GetCharSetFromList( USHORT nPos ) { CharSet eRet = eCharSetList[nPos]; if (eRet == RTL_TEXTENCODING_DONTKNOW) eRet = gsl_getSystemTextEncoding(); return eRet; } //------------------------------------------------------------------------ #pragma SEG_FUNCDEF(asciiopt_01) ScAsciiOptions::ScAsciiOptions() : bFixedLen ( FALSE ), aFieldSeps ( ';' ), bMergeFieldSeps ( FALSE ), cTextSep ( 34 ), eCharSet ( gsl_getSystemTextEncoding() ), nStartRow ( 1 ), nInfoCount ( 0 ), pColStart ( NULL ), pColFormat ( NULL ) { } #pragma SEG_FUNCDEF(asciiopt_02) ScAsciiOptions::ScAsciiOptions(const ScAsciiOptions& rOpt) : bFixedLen ( rOpt.bFixedLen ), aFieldSeps ( rOpt.aFieldSeps ), bMergeFieldSeps ( rOpt.bMergeFieldSeps ), cTextSep ( rOpt.cTextSep ), eCharSet ( rOpt.eCharSet ), nStartRow ( rOpt.nStartRow ), nInfoCount ( rOpt.nInfoCount ) { if (nInfoCount) { pColStart = new xub_StrLen[nInfoCount]; pColFormat = new BYTE[nInfoCount]; for (USHORT i=0; i= 1 ) { bFixedLen = bMergeFieldSeps = FALSE; aFieldSeps.Erase(); aToken = rString.GetToken(0,','); if ( aToken.EqualsAscii(pStrFix) ) bFixedLen = TRUE; nSub = aToken.GetTokenCount('/'); for ( i=0; i= 2 ) { aToken = rString.GetToken(1,','); sal_Int32 nVal = aToken.ToInt32(); cTextSep = (sal_Unicode) nVal; } // // Zeichensatz // if ( nCount >= 3 ) { aToken = rString.GetToken(2,','); eCharSet = GetCharsetValue( aToken ); } // // Startzeile // if ( nCount >= 4 ) { aToken = rString.GetToken(3,','); nStartRow = aToken.ToInt32(); } // // Spalten-Infos // if ( nCount >= 5 ) { delete[] pColStart; delete[] pColFormat; aToken = rString.GetToken(4,','); nSub = aToken.GetTokenCount('/'); nInfoCount = nSub / 2; if (nInfoCount) { pColStart = new xub_StrLen[nInfoCount]; pColFormat = new BYTE[nInfoCount]; for (USHORT nInfo=0; nInfoCompareEqual( aStr, rList.GetToken(i,'\t'), INTN_COMPARE_IGNORECASE ) ) { c = (sal_Unicode)rList.GetToken(i+1,'\t').ToInt32(); } if (!c) c = (sal_Unicode) aStr.ToInt32(); // Ascii } return c; } #pragma SEG_FUNCDEF(asciiopt_0d) ScImportAsciiDlg::ScImportAsciiDlg( Window* pParent,String aDatName, SvStream* pInStream, sal_Unicode cSep ) : ModalDialog ( pParent, ScResId( RID_SCDLG_ASCII ) ), 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 ) ), aFtRow ( this, ScResId( FT_AT_ROW ) ), aNfRow ( this, ScResId( NF_AT_ROW ) ), aTableBox ( this, ScResId( CTR_TABLE ) ), aFtCharSet ( this, ScResId( FT_CHARSET ) ), aLbCharSet ( this, ScResId( LB_CHARSET ) ), aGbSepOpt ( this, ScResId( GB_SEPOPT ) ), aFtTextSep ( this, ScResId( FT_TEXTSEP ) ), aCbTextSep ( this, ScResId( CB_TEXTSEP ) ), aGbFieldOpt ( this, ScResId( GB_FIELDOPT ) ), aCkbAsOnce ( this, ScResId( CB_ASONCE) ), aFtType ( this, ScResId( FT_TYPE ) ), aLbType ( this, ScResId( LB_TYPE1 ) ), aScrollbar ( this, ScResId( SB_COLUMN ) ), aVScroll ( this, ScResId( SB_ROW ) ), aGbWidth ( this, ScResId( GB_WIDTH ) ), aBtnOk ( this, ScResId( BTN_OK ) ), aBtnCancel ( this, ScResId( BTN_CANCEL ) ), aBtnHelp ( this, ScResId( BTN_HELP ) ), aStringCol ( ScResId( STR_COL ) ), aStringTo ( ScResId( STR_TO ) ), aCharSetUser( ScResId( SCSTR_CHARSET_USER ) ), aColumnUser ( ScResId( SCSTR_COLUMN_USER ) ), aFldSepList ( ScResId( SCSTR_FIELDSEP ) ), aTextSepList( ScResId( SCSTR_TEXTSEP ) ) { String aName = GetText(); aName.AppendAscii(RTL_CONSTASCII_STRINGPARAM(" - [")); aName += aDatName; aName += ']'; SetText( aName ); FreeResource(); bVFlag=FALSE; String aSizeString = String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("00000")); Font aTBFont=System::GetStandardFont( STDFONT_FIXED ); Size aTBSize=aTableBox.GetFont().GetSize(); aTBSize.Width()=aTBFont.GetSize().Width(); aTBFont.SetSize(aTBSize); aTableBox.SetFont(aTBFont); pDatStream=pInStream; aTableBox.InsertCol(0,2); aTableBox.InsertRow(0,4); aTableBox.SetNumOfCharsForCol(0,aSizeString.Len()); switch(cSep) { case '\t' :aCkbTab .Check();break; case ';' :aCkbSemicolon .Check();break; case ',' :aCkbComma .Check();break; case ' ' :aCkbSpace .Check();break; default :aCkbOther .Check(); aEdOther.SetText(cSep); break; } nArrayEndPos=0; USHORT nField; if(pDatStream!=NULL) { pRowPosArray=new ULONG[ASCIIDLG_MAXROWS+2]; if(pRowPosArray!=NULL) { ULONG *pPtrRowPos=pRowPosArray; for(nField=0;nFieldSetBufferSize(ASCIIDLG_MAXROWS); pDatStream->SetStreamCharSet( gsl_getSystemTextEncoding() ); //!??? pDatStream->Seek( 0 ); for ( USHORT j=0; j < SC_ASCIIOPT_PREVIEW_LINES; j++ ) { pRowPosArray[nArrayEndPos++]=pDatStream->Tell(); if(!pDatStream->ReadLine( aPreviewLine[j] )) { bVFlag=TRUE; aVScroll.SetPageSize( aTableBox.GetYMaxVisChars()-1); aVScroll.SetThumbPos(0); aVScroll.SetRange( Range( 0, j) ); aVScroll.SetVisibleSize(j); break; } } } nScrollPos = 0; nUsedCols = 0; pEndValues = new USHORT[ASCIIDLG_MAXFIELDS]; pFlags = new BYTE[ASCIIDLG_MAXFIELDS]; for (nField=0; nFieldInsertEntry(aToken); aTableBox.InsertContextEntry(100+i,aToken); } pType->SetSelectHdl( LINK( this, ScImportAsciiDlg, ColTypeHdl ) ); aTableBox.SetModifyColHdl(LINK( this, ScImportAsciiDlg, ColTypeHdl ) ); aScrollbar.SetRange( Range( 0, ASCIIDLG_MAXFIELDS ) ); // initial getrennt aScrollbar.SetPageSize( aTableBox.GetXMaxVisChars() ); //aScrollbar.SetVisibleSize( 3 ); aScrollbar.SetScrollHdl( LINK( this, ScImportAsciiDlg, ScrollHdl ) ); if(!bVFlag) { aVScroll.SetRange( Range( 0, ASCIIDLG_MAXROWS ) ); // initial getrennt aVScroll.SetPageSize( aTableBox.GetYMaxVisChars()-2 ); aVScroll.SetVisibleSize(aTableBox.GetYMaxVisChars()-1); } aVScroll.SetScrollHdl( LINK( this, ScImportAsciiDlg, ScrollHdl ) ); aRbSeparated.SetClickHdl( LINK( this, ScImportAsciiDlg, VarFixHdl ) ); aRbFixed.SetClickHdl( LINK( this, ScImportAsciiDlg, VarFixHdl ) ); CheckScrollPos(); CheckColTypes(FALSE); CheckValues(); CheckDisable(); VarFixHdl(&aRbFixed); } #pragma SEG_FUNCDEF(asciiopt_0e) ScImportAsciiDlg::~ScImportAsciiDlg() { delete[] pEndValues; delete[] pFlags; delete[] pRowPosArray; } #pragma SEG_FUNCDEF(asciiopt_0f) IMPL_LINK( ScImportAsciiDlg, VarFixHdl, void *, pCtr ) { if((RadioButton *)pCtr==&aRbFixed ||(RadioButton *)pCtr==&aRbSeparated ) { aTableBox.ClearTable(); aTableBox.InsertRow(0,4); aTableBox.InsertCol(0,2); aTableBox.SetNumOfCharsForCol(0,ASCIIDLG_1COL_SIZE); for (int i=0; i0)); } DelimitedPreview(); // Preview mit neuen Einstellungen CheckScrollRange(); ScrollHdl(&aScrollbar); } return 0; } #pragma SEG_FUNCDEF(asciiopt_10) IMPL_LINK( ScImportAsciiDlg, ScrollHdl, void*, pScroll ) { if((ScrollBar *)pScroll==&aScrollbar) { long nNew = aScrollbar.GetThumbPos(); if ( nNew >= 0) { nScrollPos = (USHORT) nNew; CheckScrollPos(); CheckColTypes(FALSE); CheckValues(); String aSizeString('W'); aTableBox.SetXTablePos((short)(nNew * aTableBox.GetTextWidth(aSizeString))); } } else if((ScrollBar *)pScroll==&aVScroll) { BOOL bVFlag1=bVFlag; if(pDatStream !=NULL && pRowPosArray!=NULL) UpdateVertical(); if(bVFlag!=bVFlag1) UpdateVertical(); CheckScrollPos(); CheckColTypes(FALSE); CheckValues(); CheckScrollRange(); //CheckDisable(); } return 0; } #pragma SEG_FUNCDEF(asciiopt_11) IMPL_LINK( ScImportAsciiDlg, CharSetHdl, void*, EMPTY_ARG ) { if ( aLbCharSet.GetSelectEntryCount() == 1 ) { USHORT nSel = aLbCharSet.GetSelectEntryPos(); eCharSet = lcl_GetCharSetFromList(nSel); CheckValues(); // Preview anpassen } return 0; } #pragma SEG_FUNCDEF(asciiopt_12) IMPL_LINK( ScImportAsciiDlg, ColTypeHdl, void*, pCtr ) { CheckColTypes( TRUE, pCtr); return 0; } #pragma SEG_FUNCDEF(asciiopt_13) IMPL_LINK( ScImportAsciiDlg, SelectHdl, ScTableWithRuler*, pModified ) { long nPos=aTableBox.GetSelectedCol(); if(aTableBox.GetSelectedCol()>0) { if ( nPos-1 < ASCIIDLG_MAXFIELDS ) { BYTE nType = pFlags[nPos-1]; USHORT nCount = sizeof(nColTypeList) / sizeof(BYTE); USHORT nPos1 = nCount-1; for (USHORT j=0; jnMaxSize) { aScrollbar.SetThumbPos(0); } } #pragma SEG_FUNCDEF(asciiopt_14) void ScImportAsciiDlg::CheckValues( BOOL bReadVal, USHORT nEditField ) { // String aSizeString = String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("999")); USHORT i; if ( !aRbFixed.IsChecked() ) { DelimitedPreview(); // nur Preview anpassen return; } aTableBox.RulerEnabled(); // Dialog anpassen USHORT nNumOfCols=aTableBox.GetNumberOfCols(); xub_StrLen nVal = 0; USHORT nRowNum=aVScroll.GetThumbPos()+1; String aField; for ( USHORT j=0; j < SC_ASCIIOPT_PREVIEW_LINES; j++ ) { aField = String::CreateFromInt32( nRowNum++ ); String aPreviewConv( aPreviewLine[j], eCharSet ); aTableBox.SetDataAtRowCol(j+1,0,aField); //aTableBox.SetNumOfCharsForCol(0,aField.Len()+2); String aPrevStr; if(nNumOfCols>2) nVal= 0; xub_StrLen nPrevious = 0; for (i=0; iaTableBox.GetNumOfCharsForCol(i+1)) { aTableBox.SetNumOfCharsForCol(i+1, aPrevStr.Len()); } } aTableBox.SetDataAtRowCol(j+1,i+1,aPrevStr); nPrevious += aTableBox.GetNumOfCharsForCol(nPos); } } } aTableBox.SetNumOfCharsForCol(0,aField.Len()+2); nNumOfCols=aTableBox.GetNumberOfCols(); for (i=0; iSetText(aStr); } */ } void ScImportAsciiDlg::UpdateVertical() { ByteString aString; ULONG nRows=0; ULONG nNew=0; double fNew; if(!bVFlag && aVScroll.GetType()==SCROLL_DRAG) { bVFlag=TRUE; pDatStream->Seek(0); ULONG *pPtrRowPos=pRowPosArray; *pPtrRowPos++=0; SetPointer(Pointer(POINTER_WAIT)); while(pDatStream->ReadLine(aString)) { nRows++; if(nRows>ASCIIDLG_MAXROWS) break; *pPtrRowPos++=pDatStream->Tell(); } fNew=((double) (aVScroll.GetThumbPos())*nRows)/ASCIIDLG_MAXROWS; nNew =(ULONG) fNew; aVScroll.SetPageSize( aTableBox.GetYMaxVisChars()-1); aVScroll.SetThumbPos(nNew); aVScroll.SetRange( Range( 0, nRows) ); SetPointer(Pointer(POINTER_ARROW)); } nNew=aVScroll.GetThumbPos(); if(bVFlag || nNew<=nArrayEndPos) pDatStream->Seek(pRowPosArray[nNew]); for ( USHORT j=0; j < SC_ASCIIOPT_PREVIEW_LINES; j++ ) { if(!bVFlag && nNew+j>=nArrayEndPos) { pRowPosArray[nNew+j]=pDatStream->Tell(); nArrayEndPos=(USHORT) nNew+j; } if(!pDatStream->ReadLine( aPreviewLine[j] )&& !bVFlag) { bVFlag=TRUE; aVScroll.SetPageSize( aTableBox.GetYMaxVisChars()-1); aVScroll.SetThumbPos(nNew-1); aVScroll.SetRange( Range( 0, nArrayEndPos) ); } } } #pragma SEG_FUNCDEF(asciiopt_16) void ScImportAsciiDlg::CheckColTypes(BOOL bReadVal,void *pCtr) { USHORT i, nPos; BYTE nType = SC_COL_STANDARD; if((ScTableWithRuler*) pCtr== &aTableBox) { USHORT nNumOfCols=aTableBox.GetNumberOfCols(); for (i=1; iCompareEqual( aUser, aCharSetUser.GetToken(i), INTN_COMPARE_IGNORECASE ) ) { nPos = i; } eCharSet = lcl_GetCharSetFromList(nPos); } #pragma SEG_FUNCDEF(asciiopt_1a) void ScImportAsciiDlg::GetOptions( ScAsciiOptions& rOpt ) { BOOL bFix = aRbFixed.IsChecked(); rOpt.SetCharSet( eCharSet ); rOpt.SetFixedLen( bFix ); USHORT nRow=(USHORT)aNfRow.GetText().ToInt32(); rOpt.SetStartRow(nRow); if ( bFix ) { nUsedCols=aTableBox.GetNumberOfCols(); xub_StrLen* pOptStart = new xub_StrLen[ nUsedCols+1 ]; BYTE* pOptType = new BYTE[ nUsedCols+1 ]; USHORT nCount = 0; xub_StrLen nLastEnd = 0; xub_StrLen nStart = 0; xub_StrLen nEnd = 0; for (USHORT i=1; i nStart ) { pOptStart[nCount] = nStart; pOptType[nCount] = pFlags[i-1]; ++nCount; nLastEnd = nEnd; } nStart +=aTableBox.GetNumOfCharsForCol(i); } pOptStart[nCount] = ASCIIDLG_LASTCOL_SIZE;//fuer den Rest //pOptStart[nCount] = nLastEnd; // den Rest ueberspringen pOptType[nCount] = SC_COL_SKIP; ++nCount; rOpt.SetColInfo( nCount, pOptStart, pOptType ); delete[] pOptStart; delete[] pOptType; } else { sal_Unicode cTextSep = lcl_CharFromCombo( aCbTextSep, aTextSepList ); String aSeps; if(aCkbTab.IsChecked()) aSeps+='\t'; if(aCkbSemicolon.IsChecked()) aSeps+=';'; if(aCkbComma.IsChecked()) aSeps+=','; if(aCkbSpace.IsChecked()) aSeps+=' '; if(aCkbOther.IsChecked()) { aSeps+=aEdOther.GetText().GetChar(0); } rOpt.SetMergeSeps(aCkbAsOnce.IsChecked()); rOpt.SetFieldSeps( aSeps ); rOpt.SetTextSep( cTextSep ); // Spaltentypen xub_StrLen* pColNum = new xub_StrLen[ASCIIDLG_MAXFIELDS]; BYTE* pColType = new BYTE[ASCIIDLG_MAXFIELDS]; USHORT nCount = 0; for (USHORT i=0; i