| /************************************************************** |
| * |
| * 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 "dbinsdlg.hxx" |
| |
| #include <memory> |
| |
| #include <float.h> |
| |
| #include <hintids.hxx> |
| #include <com/sun/star/lang/XMultiServiceFactory.hpp> |
| #include <com/sun/star/container/XNameAccess.hpp> |
| #include <com/sun/star/sdbc/XDataSource.hpp> |
| #include <com/sun/star/sdbc/XRow.hpp> |
| #include <com/sun/star/sdbcx/XTablesSupplier.hpp> |
| #include <com/sun/star/sdbcx/XColumnsSupplier.hpp> |
| #include <com/sun/star/sdb/XQueriesSupplier.hpp> |
| #include <com/sun/star/sdb/CommandType.hpp> |
| #include <com/sun/star/sdb/XColumn.hpp> |
| #include <com/sun/star/sdb/XDatabaseAccess.hpp> |
| #include <com/sun/star/sdbc/DataType.hpp> |
| #include <com/sun/star/sdbc/ResultSetType.hpp> |
| #include <com/sun/star/beans/XPropertySet.hpp> |
| #include <com/sun/star/util/XNumberFormatter.hpp> |
| #include <com/sun/star/util/XNumberFormatTypes.hpp> |
| #include <com/sun/star/sdbc/XRowSet.hpp> |
| #include <comphelper/processfactory.hxx> |
| #include <editeng/langitem.hxx> |
| #include <svl/numuno.hxx> |
| #include <svl/stritem.hxx> |
| #include <vcl/msgbox.hxx> |
| #include <vcl/svapp.hxx> |
| #include <vcl/mnemonic.hxx> |
| #include <svl/style.hxx> |
| #include <svl/zformat.hxx> |
| #include <svx/htmlmode.hxx> |
| #include <editeng/unolingu.hxx> |
| #include <sfx2/app.hxx> |
| #include <svl/itemset.hxx> |
| #include <editeng/brshitem.hxx> |
| #include <editeng/boxitem.hxx> |
| #include <svx/rulritem.hxx> |
| #include <swdbtoolsclient.hxx> |
| #include <tabledlg.hxx> |
| #include <fmtclds.hxx> |
| #include <tabcol.hxx> |
| #include <uiitems.hxx> |
| #include <viewopt.hxx> |
| #include <uitool.hxx> |
| #include <wrtsh.hxx> |
| #include <wview.hxx> |
| #include <docsh.hxx> |
| #include <dbmgr.hxx> |
| #include <tblafmt.hxx> |
| #include <cellatr.hxx> |
| #include <swtable.hxx> |
| #include <dbfld.hxx> |
| #include <fmtcol.hxx> |
| #include <section.hxx> |
| #include <swwait.hxx> |
| #include <modcfg.hxx> |
| #include <swmodule.hxx> |
| #include <poolfmt.hxx> |
| #include <crsskip.hxx> |
| |
| #include <dbinsdlg.hrc> |
| #include <dbui.hrc> |
| |
| #include <cmdid.h> |
| #include <helpid.h> |
| #include <cfgid.h> |
| #include <SwStyleNameMapper.hxx> |
| #include <comphelper/uno3.hxx> |
| #include "tabsh.hxx" |
| #include "swabstdlg.hxx" |
| #include "table.hrc" |
| #include <unomid.h> |
| #include <IDocumentMarkAccess.hxx> |
| |
| |
| namespace swui |
| { |
| SwAbstractDialogFactory * GetFactory(); |
| } |
| |
| using namespace ::com::sun::star; |
| using namespace ::com::sun::star::uno; |
| using namespace ::com::sun::star::container; |
| using namespace ::com::sun::star::lang; |
| using namespace ::com::sun::star::sdb; |
| using namespace ::com::sun::star::sdbc; |
| using namespace ::com::sun::star::sdbcx; |
| using namespace ::com::sun::star::beans; |
| |
| // tblafmt.hxx |
| SV_IMPL_PTRARR( _SwTableAutoFmtTbl, SwTableAutoFmt* ) |
| |
| const char cDBFldStart = '<'; |
| const char cDBFldEnd = '>'; |
| |
| // Hilfsstruktur fuers einfuegen von Datenbankspalten als Felder oder Text |
| struct _DB_Column |
| { |
| enum ColType { DB_FILLTEXT, DB_COL_FIELD, DB_COL_TEXT, DB_SPLITPARA } eColType; |
| |
| union { |
| String* pText; |
| SwField* pField; |
| sal_uLong nFormat; |
| } DB_ColumnData; |
| const SwInsDBColumn* pColInfo; |
| |
| _DB_Column() |
| { |
| pColInfo = 0; |
| DB_ColumnData.pText = 0; |
| eColType = DB_SPLITPARA; |
| } |
| |
| _DB_Column( const String& rTxt ) |
| { |
| pColInfo = 0; |
| DB_ColumnData.pText = new String( rTxt ); |
| eColType = DB_FILLTEXT; |
| } |
| |
| _DB_Column( const SwInsDBColumn& rInfo, sal_uLong nFormat ) |
| { |
| pColInfo = &rInfo; |
| DB_ColumnData.nFormat = nFormat; |
| eColType = DB_COL_TEXT; |
| } |
| |
| _DB_Column( const SwInsDBColumn& rInfo, SwDBField& rFld ) |
| { |
| pColInfo = &rInfo; |
| DB_ColumnData.pField = &rFld; |
| eColType = DB_COL_FIELD; |
| } |
| |
| ~_DB_Column() |
| { |
| if( DB_COL_FIELD == eColType ) |
| delete DB_ColumnData.pField; |
| else if( DB_FILLTEXT == eColType ) |
| delete DB_ColumnData.pText; |
| } |
| }; |
| |
| typedef _DB_Column* _DB_ColumnPtr; |
| SV_DECL_PTRARR_DEL( _DB_Columns, _DB_ColumnPtr, 32, 32 ) |
| SV_IMPL_PTRARR( _DB_Columns, _DB_ColumnPtr ) |
| |
| SV_IMPL_OP_PTRARR_SORT( SwInsDBColumns, SwInsDBColumnPtr ) |
| |
| /* */ |
| |
| #define DBCOLUMN_CONFIG_VERSION1 1 |
| #define DBCOLUMN_CONFIG_VERSION DBCOLUMN_CONFIG_VERSION1 |
| #define DBCOLUMN_MAXDATA 5 |
| |
| struct _DB_ColumnConfigData |
| { |
| SwInsDBColumns aDBColumns; |
| rtl::OUString sSource, sTable, sEdit, sTblList, sTmplNm, sTAutoFmtNm; |
| sal_Bool bIsTable : 1, |
| bIsField : 1, |
| bIsHeadlineOn : 1, |
| bIsEmptyHeadln : 1; |
| |
| _DB_ColumnConfigData() |
| { |
| bIsTable = bIsHeadlineOn = sal_True; |
| bIsField = bIsEmptyHeadln = sal_False; |
| } |
| |
| ~_DB_ColumnConfigData(); |
| private: |
| _DB_ColumnConfigData( const _DB_ColumnConfigData& ); |
| _DB_ColumnConfigData& operator =( const _DB_ColumnConfigData& ); |
| }; |
| |
| /* */ |
| |
| int SwInsDBColumn::operator<( const SwInsDBColumn& rCmp ) const |
| { |
| return 0 > GetAppCollator().compareString( sColumn, rCmp.sColumn ); |
| } |
| /* --------------------------------------------------------------------------- |
| |
| ---------------------------------------------------------------------------*/ |
| SwInsertDBColAutoPilot::SwInsertDBColAutoPilot( SwView& rView, |
| Reference<XDataSource> xDataSource, |
| Reference<sdbcx::XColumnsSupplier> xColSupp, |
| const SwDBData& rData ) |
| : SfxModalDialog( rView.GetWindow(), SW_RES( DLG_AP_INSERT_DB_SEL )), |
| ConfigItem(C2U("Office.Writer/InsertData/DataSet"), CONFIG_MODE_DELAYED_UPDATE), |
| aFtInsertData( this, SW_RES( FT_INSERT_DATA )), |
| aRbAsTable( this, SW_RES( RB_AS_TABLE )), |
| aRbAsField( this, SW_RES( RB_AS_FIELD )), |
| aRbAsText( this, SW_RES( RB_AS_TEXT )), |
| |
| aFlHead( this, SW_RES( FL_HEAD )), |
| aFtDbColumn( this, SW_RES( FT_DB_COLUMN )), |
| |
| aLbTblDbColumn( this, SW_RES( LB_TBL_DB_COLUMN )), |
| aLbTxtDbColumn( this, SW_RES( LB_TXT_DB_COLUMN )), |
| |
| aFlFormat( this, SW_RES( FL_FORMAT )), |
| aRbDbFmtFromDb( this, SW_RES( RB_DBFMT_FROM_DB )), |
| aRbDbFmtFromUsr( this, SW_RES( RB_DBFMT_FROM_USR )), |
| aLbDbFmtFromUsr( this, &rView, SW_RES( LB_DBFMT_FROM_USR )), |
| |
| aIbDbcolToEdit( this, SW_RES( IB_DBCOL_TOEDIT )), |
| aEdDbText( this, SW_RES( ED_DB_TEXT )), |
| aFtDbParaColl( this, SW_RES( FT_DB_PARA_COLL )), |
| aLbDbParaColl( this, SW_RES( LB_DB_PARA_COLL )), |
| |
| aIbDbcolAllTo( this, SW_RES( IB_DBCOL_ALL_TO )), |
| aIbDbcolOneTo( this, SW_RES( IB_DBCOL_ONE_TO )), |
| aIbDbcolOneFrom( this, SW_RES( IB_DBCOL_ONE_FROM )), |
| aIbDbcolAllFrom( this, SW_RES( IB_DBCOL_ALL_FROM )), |
| aFtTableCol( this, SW_RES( FT_TABLE_COL )), |
| aLbTableCol( this, SW_RES( LB_TABLE_COL )), |
| aCbTableHeadon( this, SW_RES( CB_TABLE_HEADON )), |
| aRbHeadlColnms( this, SW_RES( RB_HEADL_COLNMS )), |
| aRbHeadlEmpty( this, SW_RES( RB_HEADL_EMPTY )), |
| aPbTblFormat( this, SW_RES( PB_TBL_FORMAT )), |
| aPbTblAutofmt( this, SW_RES( PB_TBL_AUTOFMT )), |
| |
| aBtOk( this, SW_RES( BT_OK )), |
| aBtCancel( this, SW_RES( BT_CANCEL )), |
| aBtHelp( this, SW_RES( BT_HELP )), |
| |
| aFlBottom( this, SW_RES( FL_BOTTOM )), |
| |
| aDBData(rData), |
| |
| aOldNumFmtLnk( aLbDbFmtFromUsr.GetSelectHdl() ), |
| sNoTmpl( SW_RES( STR_NOTEMPL )), |
| pView( &rView ), |
| pTAutoFmt( 0 ), |
| pTblSet( 0 ), |
| pRep( 0 ) |
| { |
| FreeResource(); |
| |
| nGBFmtLen = aFlFormat.GetText().Len(); |
| |
| if(xColSupp.is()) |
| { |
| SwWrtShell& rSh = pView->GetWrtShell(); |
| Locale aDocLocale( SvxCreateLocale( rSh.GetCurLang() )); |
| SvNumberFormatter* pNumFmtr = rSh.GetNumberFormatter(); |
| SvNumberFormatsSupplierObj* pNumFmt = new SvNumberFormatsSupplierObj( pNumFmtr ); |
| Reference< util::XNumberFormatsSupplier > xDocNumFmtsSupplier = pNumFmt; |
| Reference< util::XNumberFormats > xDocNumberFormats = xDocNumFmtsSupplier->getNumberFormats(); |
| Reference< util::XNumberFormatTypes > xDocNumberFormatTypes(xDocNumberFormats, UNO_QUERY); |
| |
| Reference<XPropertySet> xSourceProps(xDataSource, UNO_QUERY); |
| Reference< util::XNumberFormats > xNumberFormats; |
| if(xSourceProps.is()) |
| { |
| Any aFormats = xSourceProps->getPropertyValue(C2U("NumberFormatsSupplier")); |
| if(aFormats.hasValue()) |
| { |
| Reference< util::XNumberFormatsSupplier> xSuppl; |
| aFormats >>= xSuppl; |
| if(xSuppl.is()) |
| { |
| xNumberFormats = xSuppl->getNumberFormats( ); |
| } |
| } |
| } |
| Reference <XNameAccess> xCols = xColSupp->getColumns(); |
| Sequence<rtl::OUString> aColNames = xCols->getElementNames(); |
| const rtl::OUString* pColNames = aColNames.getConstArray(); |
| long nCount = aColNames.getLength(); |
| for (long n = 0; n < nCount; n++) |
| { |
| SwInsDBColumn* pNew = new SwInsDBColumn( pColNames[n], (sal_uInt16)n ); |
| Any aCol = xCols->getByName(pColNames[n]); |
| Reference <XPropertySet> xCol; |
| aCol >>= xCol; |
| Any aType = xCol->getPropertyValue(C2S("Type")); |
| sal_Int32 eDataType = 0; |
| aType >>= eDataType; |
| switch(eDataType) |
| { |
| case DataType::BIT: |
| case DataType::BOOLEAN: |
| case DataType::TINYINT: |
| case DataType::SMALLINT: |
| case DataType::INTEGER: |
| case DataType::BIGINT: |
| case DataType::FLOAT: |
| case DataType::REAL: |
| case DataType::DOUBLE: |
| case DataType::NUMERIC: |
| case DataType::DECIMAL: |
| case DataType::DATE: |
| case DataType::TIME: |
| case DataType::TIMESTAMP: |
| { |
| pNew->bHasFmt = sal_True; |
| Any aFormat = xCol->getPropertyValue(C2U("FormatKey")); |
| if(aFormat.hasValue()) |
| { |
| sal_Int32 nFmt = 0; |
| aFormat >>= nFmt; |
| if(xNumberFormats.is()) |
| { |
| try |
| { |
| Reference<XPropertySet> xNumProps = xNumberFormats->getByKey( nFmt ); |
| Any aFormatVal = xNumProps->getPropertyValue(C2U("FormatString")); |
| Any aLocale = xNumProps->getPropertyValue(C2U("Locale")); |
| rtl::OUString sFormat; |
| aFormatVal >>= sFormat; |
| lang::Locale aLoc; |
| aLocale >>= aLoc; |
| long nKey = xDocNumberFormats->queryKey( sFormat, aLoc, sal_True); |
| if(nKey < 0) |
| { |
| nKey = xDocNumberFormats->addNew( sFormat, aLoc ); |
| } |
| pNew->nDBNumFmt = nKey; |
| } |
| catch(const Exception& ) |
| { |
| DBG_ERROR("illegal number format key"); |
| } |
| } |
| } |
| else |
| { |
| pNew->nDBNumFmt = SwNewDBMgr::GetDbtoolsClient().getDefaultNumberFormat(xCol, |
| xDocNumberFormatTypes, aDocLocale); |
| } |
| |
| } |
| break; |
| } |
| if( !aDBColumns.Insert( pNew )) |
| { |
| ASSERT( !this, "Spaltenname mehrfach vergeben?" ); |
| delete pNew; |
| } |
| } |
| } |
| |
| // Absatzvorlagen-ListBox fuellen |
| { |
| SfxStyleSheetBasePool* pPool = pView->GetDocShell()->GetStyleSheetPool(); |
| pPool->SetSearchMask( SFX_STYLE_FAMILY_PARA, SFXSTYLEBIT_ALL ); |
| aLbDbParaColl.InsertEntry( sNoTmpl ); |
| |
| const SfxStyleSheetBase* pBase = pPool->First(); |
| while( pBase ) |
| { |
| aLbDbParaColl.InsertEntry( pBase->GetName() ); |
| pBase = pPool->Next(); |
| } |
| aLbDbParaColl.SelectEntryPos( 0 ); |
| } |
| |
| // steht der Cursor in einer Tabelle, darf NIE Tabelle auswaehlbar sein |
| if( pView->GetWrtShell().GetTableFmt() ) |
| { |
| aRbAsTable.Enable( sal_False ); |
| aRbAsField.Check( sal_True ); |
| aRbDbFmtFromDb.Check( sal_True ); |
| } |
| else |
| { |
| aRbAsTable.Check( sal_True ); |
| aRbDbFmtFromDb.Check( sal_True ); |
| aIbDbcolOneFrom.Enable( sal_False ); |
| aIbDbcolAllFrom.Enable( sal_False ); |
| } |
| |
| aRbAsTable.SetClickHdl( LINK(this, SwInsertDBColAutoPilot, PageHdl )); |
| aRbAsField.SetClickHdl( LINK(this, SwInsertDBColAutoPilot, PageHdl )); |
| aRbAsText.SetClickHdl( LINK(this, SwInsertDBColAutoPilot, PageHdl )); |
| |
| aRbDbFmtFromDb.SetClickHdl( LINK(this, SwInsertDBColAutoPilot, DBFormatHdl )); |
| aRbDbFmtFromUsr.SetClickHdl( LINK(this, SwInsertDBColAutoPilot, DBFormatHdl )); |
| |
| aPbTblFormat.SetClickHdl(LINK(this, SwInsertDBColAutoPilot, TblFmtHdl )); |
| aPbTblAutofmt.SetClickHdl(LINK(this, SwInsertDBColAutoPilot, AutoFmtHdl )); |
| |
| aIbDbcolAllTo.SetClickHdl( LINK(this, SwInsertDBColAutoPilot, TblToFromHdl )); |
| aIbDbcolOneTo.SetClickHdl( LINK(this, SwInsertDBColAutoPilot, TblToFromHdl )); |
| aIbDbcolOneFrom.SetClickHdl( LINK(this, SwInsertDBColAutoPilot, TblToFromHdl )); |
| aIbDbcolAllFrom.SetClickHdl( LINK(this, SwInsertDBColAutoPilot, TblToFromHdl )); |
| aIbDbcolToEdit.SetClickHdl( LINK(this, SwInsertDBColAutoPilot, TblToFromHdl )); |
| |
| aCbTableHeadon.SetClickHdl( LINK(this, SwInsertDBColAutoPilot, HeaderHdl )); |
| aRbHeadlColnms.SetClickHdl( LINK(this, SwInsertDBColAutoPilot, HeaderHdl )); |
| aRbHeadlEmpty.SetClickHdl( LINK(this, SwInsertDBColAutoPilot, HeaderHdl )); |
| |
| aLbTxtDbColumn.SetSelectHdl( LINK( this, SwInsertDBColAutoPilot, SelectHdl )); |
| aLbTblDbColumn.SetSelectHdl( LINK( this, SwInsertDBColAutoPilot, SelectHdl )); |
| aLbDbFmtFromUsr.SetSelectHdl( LINK( this, SwInsertDBColAutoPilot, SelectHdl )); |
| aLbTableCol.SetSelectHdl( LINK( this, SwInsertDBColAutoPilot, SelectHdl )); |
| |
| aLbTxtDbColumn.SetDoubleClickHdl( LINK( this, SwInsertDBColAutoPilot, DblClickHdl )); |
| aLbTblDbColumn.SetDoubleClickHdl( LINK( this, SwInsertDBColAutoPilot, DblClickHdl )); |
| aLbTableCol.SetDoubleClickHdl( LINK( this, SwInsertDBColAutoPilot, DblClickHdl )); |
| |
| for( sal_uInt16 n = 0; n < aDBColumns.Count(); ++n ) |
| { |
| const String& rS = aDBColumns[ n ]->sColumn; |
| aLbTblDbColumn.InsertEntry( rS, n ); |
| aLbTxtDbColumn.InsertEntry( rS, n ); |
| } |
| aLbTxtDbColumn.SelectEntryPos( 0 ); |
| aLbTblDbColumn.SelectEntryPos( 0 ); |
| |
| // read configuration |
| Load(); |
| |
| // Controls initialisieren: |
| PageHdl( aRbAsTable.IsChecked() ? &aRbAsTable : &aRbAsField ); |
| } |
| /* --------------------------------------------------------------------------- |
| |
| ---------------------------------------------------------------------------*/ |
| SwInsertDBColAutoPilot::~SwInsertDBColAutoPilot() |
| { |
| delete pTblSet; |
| delete pRep; |
| |
| // delete pConfig; |
| delete pTAutoFmt; |
| } |
| /* --------------------------------------------------------------------------- |
| |
| ---------------------------------------------------------------------------*/ |
| IMPL_LINK( SwInsertDBColAutoPilot, PageHdl, Button*, pButton ) |
| { |
| sal_Bool bShowTbl = pButton == &aRbAsTable; |
| |
| String sTxt( pButton->GetText() ); |
| aFlHead.SetText( MnemonicGenerator::EraseAllMnemonicChars( sTxt ) ); |
| |
| aLbTxtDbColumn.Show( !bShowTbl ); |
| aIbDbcolToEdit.Show( !bShowTbl ); |
| aEdDbText.Show( !bShowTbl ); |
| aFtDbParaColl.Show( !bShowTbl ); |
| aLbDbParaColl.Show( !bShowTbl ); |
| |
| aLbTblDbColumn.Show( bShowTbl ); |
| aIbDbcolAllTo.Show( bShowTbl ); |
| aIbDbcolOneTo.Show( bShowTbl ); |
| aIbDbcolOneFrom.Show( bShowTbl ); |
| aIbDbcolAllFrom.Show( bShowTbl ); |
| aFtTableCol.Show( bShowTbl ); |
| aLbTableCol.Show( bShowTbl ); |
| aCbTableHeadon.Show( bShowTbl ); |
| aRbHeadlColnms.Show( bShowTbl ); |
| aRbHeadlEmpty.Show( bShowTbl ); |
| aPbTblFormat.Show( bShowTbl ); |
| aPbTblAutofmt.Show( bShowTbl ); |
| |
| if( bShowTbl ) |
| aPbTblFormat.Enable( 0 != aLbTableCol.GetEntryCount() ); |
| |
| SelectHdl( bShowTbl ? &aLbTblDbColumn : &aLbTxtDbColumn ); |
| |
| return 0; |
| } |
| /* --------------------------------------------------------------------------- |
| |
| ---------------------------------------------------------------------------*/ |
| IMPL_LINK( SwInsertDBColAutoPilot, DBFormatHdl, Button*, pButton ) |
| { |
| sal_uInt16 nFndPos; |
| ListBox& rBox = aRbAsTable.IsChecked() |
| ? ( 0 == aLbTableCol.GetEntryData( 0 ) |
| ? aLbTblDbColumn |
| : aLbTableCol ) |
| : aLbTxtDbColumn; |
| |
| SwInsDBColumn aSrch( rBox.GetSelectEntry(), 0 ); |
| aDBColumns.Seek_Entry( &aSrch, &nFndPos ); |
| |
| sal_Bool bFromDB = &aRbDbFmtFromDb == pButton; |
| aDBColumns[ nFndPos ]->bIsDBFmt = bFromDB; |
| aLbDbFmtFromUsr.Enable( !bFromDB ); |
| |
| return 0; |
| } |
| /* --------------------------------------------------------------------------- |
| |
| ---------------------------------------------------------------------------*/ |
| IMPL_LINK( SwInsertDBColAutoPilot, TblToFromHdl, Button*, pButton ) |
| { |
| sal_Bool bChgEnable = sal_True, bEnableTo = sal_True, bEnableFrom = sal_True; |
| aLbTblDbColumn.SetUpdateMode( sal_False ); |
| aLbTableCol.SetUpdateMode( sal_False ); |
| |
| if( pButton == &aIbDbcolAllTo ) |
| { |
| bEnableTo = sal_False; |
| |
| sal_uInt16 n, nInsPos = aLbTableCol.GetSelectEntryPos(), |
| nCnt = aLbTblDbColumn.GetEntryCount(); |
| if( LISTBOX_APPEND == nInsPos ) |
| for( n = 0; n < nCnt; ++n ) |
| aLbTableCol.InsertEntry( aLbTblDbColumn.GetEntry( n ), |
| LISTBOX_APPEND ); |
| else |
| for( n = 0; n < nCnt; ++n, ++nInsPos ) |
| aLbTableCol.InsertEntry( aLbTblDbColumn.GetEntry( n ), nInsPos ); |
| aLbTblDbColumn.Clear(); |
| aLbTableCol.SelectEntryPos( nInsPos ); |
| aLbTblDbColumn.SelectEntryPos( LISTBOX_APPEND ); |
| } |
| else if( pButton == &aIbDbcolOneTo && |
| LISTBOX_ENTRY_NOTFOUND != aLbTblDbColumn.GetSelectEntryPos() ) |
| { |
| sal_uInt16 nInsPos = aLbTableCol.GetSelectEntryPos(), |
| nDelPos = aLbTblDbColumn.GetSelectEntryPos(), |
| nTopPos = aLbTblDbColumn.GetTopEntry(); |
| aLbTableCol.InsertEntry( aLbTblDbColumn.GetEntry( nDelPos ), nInsPos ); |
| aLbTblDbColumn.RemoveEntry( nDelPos ); |
| |
| aLbTableCol.SelectEntryPos( nInsPos ); |
| if( nDelPos >= aLbTblDbColumn.GetEntryCount() ) |
| nDelPos = aLbTblDbColumn.GetEntryCount() - 1; |
| aLbTblDbColumn.SelectEntryPos( nDelPos ); |
| aLbTblDbColumn.SetTopEntry( nTopPos ); |
| |
| bEnableTo = 0 != aLbTblDbColumn.GetEntryCount(); |
| } |
| else if( pButton == &aIbDbcolOneFrom ) |
| { |
| if( LISTBOX_ENTRY_NOTFOUND != aLbTableCol.GetSelectEntryPos() ) |
| { |
| sal_uInt16 nFndPos, nInsPos, |
| nDelPos = aLbTableCol.GetSelectEntryPos(), |
| nTopPos = aLbTableCol.GetTopEntry(); |
| |
| // die richtige InsertPos suchen!! |
| SwInsDBColumn aSrch( aLbTableCol.GetEntry( nDelPos ), 0 ); |
| aDBColumns.Seek_Entry( &aSrch, &nFndPos ); |
| if( !nFndPos || nFndPos == aDBColumns.Count()-1 ) |
| nInsPos = nFndPos; |
| else |
| { |
| nInsPos = LISTBOX_ENTRY_NOTFOUND; |
| while( ++nFndPos < aDBColumns.Count() && |
| LISTBOX_ENTRY_NOTFOUND == (nInsPos = aLbTblDbColumn. |
| GetEntryPos( String(aDBColumns[ nFndPos ]->sColumn ))) ) |
| ; |
| } |
| |
| aLbTblDbColumn.InsertEntry( aSrch.sColumn, nInsPos ); |
| aLbTableCol.RemoveEntry( nDelPos ); |
| |
| if( nInsPos >= aLbTblDbColumn.GetEntryCount() ) |
| nInsPos = aLbTblDbColumn.GetEntryCount() - 1; |
| aLbTblDbColumn.SelectEntryPos( nInsPos ); |
| |
| if( nDelPos >= aLbTableCol.GetEntryCount() ) |
| nDelPos = aLbTableCol.GetEntryCount() - 1; |
| aLbTableCol.SelectEntryPos( nDelPos ); |
| aLbTableCol.SetTopEntry( nTopPos ); |
| } |
| else |
| bEnableTo = 0 != aLbTblDbColumn.GetEntryCount(); |
| |
| bEnableFrom = 0 != aLbTableCol.GetEntryCount(); |
| } |
| else if( pButton == &aIbDbcolAllFrom ) |
| { |
| bEnableFrom = sal_False; |
| |
| aLbTblDbColumn.Clear(); |
| aLbTableCol.Clear(); |
| for( sal_uInt16 n = 0; n < aDBColumns.Count(); ++n ) |
| aLbTblDbColumn.InsertEntry( aDBColumns[ n ]->sColumn, n ); |
| aLbTblDbColumn.SelectEntryPos( 0 ); |
| } |
| else if( pButton == &aIbDbcolToEdit ) |
| { |
| bChgEnable = sal_False; |
| // Daten ins Edit moven: |
| String aFld( aLbTxtDbColumn.GetSelectEntry() ); |
| if( aFld.Len() ) |
| { |
| String aStr( aEdDbText.GetText() ); |
| sal_uInt16 nPos = (sal_uInt16)aEdDbText.GetSelection().Min(); |
| sal_uInt16 nSel = sal_uInt16(aEdDbText.GetSelection().Max()) - nPos; |
| if( nSel ) |
| // dann loesche erstmal die bestehende Selektion |
| aStr.Erase( nPos, nSel ); |
| |
| aFld.Insert( cDBFldStart, 0 ); |
| aFld += cDBFldEnd; |
| if( aStr.Len() ) |
| { |
| if( nPos ) // ein Space davor |
| { |
| sal_Unicode c = aStr.GetChar( nPos-1 ); |
| if( '\n' != c && '\r' != c ) |
| aFld.Insert( ' ', 0 ); |
| } |
| if( nPos < aStr.Len() ) // ein Space dahinter |
| { |
| sal_Unicode c = aStr.GetChar( nPos ); |
| if( '\n' != c && '\r' != c ) |
| aFld += ' '; |
| } |
| } |
| |
| aStr.Insert( aFld, nPos ); |
| aEdDbText.SetText( aStr ); |
| nPos = nPos + aFld.Len(); |
| aEdDbText.SetSelection( Selection( nPos )); |
| } |
| } |
| |
| if( bChgEnable ) |
| { |
| aIbDbcolOneTo.Enable( bEnableTo ); |
| aIbDbcolAllTo.Enable( bEnableTo ); |
| aIbDbcolOneFrom.Enable( bEnableFrom ); |
| aIbDbcolAllFrom.Enable( bEnableFrom ); |
| |
| aRbDbFmtFromDb.Enable( sal_False ); |
| aRbDbFmtFromUsr.Enable( sal_False ); |
| aLbDbFmtFromUsr.Enable( sal_False ); |
| |
| aPbTblFormat.Enable( bEnableFrom ); |
| } |
| aLbTblDbColumn.SetUpdateMode( sal_True ); |
| aLbTableCol.SetUpdateMode( sal_True ); |
| |
| return 0; |
| } |
| /* --------------------------------------------------------------------------- |
| |
| ---------------------------------------------------------------------------*/ |
| IMPL_LINK( SwInsertDBColAutoPilot, DblClickHdl, ListBox*, pBox ) |
| { |
| Button* pButton = 0; |
| if( pBox == &aLbTxtDbColumn ) |
| pButton = &aIbDbcolToEdit; |
| else if( pBox == &aLbTblDbColumn && aIbDbcolOneTo.IsEnabled() ) |
| pButton = &aIbDbcolOneTo; |
| else if( pBox == &aLbTableCol && aIbDbcolOneFrom.IsEnabled() ) |
| pButton = &aIbDbcolOneFrom; |
| |
| if( pButton ) |
| TblToFromHdl( pButton ); |
| |
| return 0; |
| } |
| /* --------------------------------------------------------------------------- |
| |
| ---------------------------------------------------------------------------*/ |
| IMPL_LINK( SwInsertDBColAutoPilot, TblFmtHdl, PushButton*, pButton ) |
| { |
| SwWrtShell& rSh = pView->GetWrtShell(); |
| sal_Bool bNewSet = sal_False; |
| if( !pTblSet ) |
| { |
| bNewSet = sal_True; |
| pTblSet = new SfxItemSet( rSh.GetAttrPool(), SwuiGetUITableAttrRange() ); |
| |
| //Ersteinmal die einfachen Attribute besorgen. |
| pTblSet->Put( SfxStringItem( FN_PARAM_TABLE_NAME, rSh.GetUniqueTblName() )); |
| pTblSet->Put( SfxUInt16Item( FN_PARAM_TABLE_HEADLINE, 1 ) ); |
| |
| pTblSet->Put( SfxUInt16Item( SID_BACKGRND_DESTINATION, |
| rSh.GetViewOptions()->GetTblDest() )); |
| |
| SvxBrushItem aBrush( RES_BACKGROUND ); |
| pTblSet->Put( aBrush ); |
| pTblSet->Put( aBrush, SID_ATTR_BRUSH_ROW ); |
| pTblSet->Put( aBrush, SID_ATTR_BRUSH_TABLE ); |
| |
| SvxBoxInfoItem aBoxInfo( SID_ATTR_BORDER_INNER ); |
| // Tabellenvariante, wenn mehrere Tabellenzellen selektiert |
| aBoxInfo.SetTable( sal_True ); |
| // Abstandsfeld immer anzeigen |
| aBoxInfo.SetDist( sal_True); |
| // Minimalgroesse in Tabellen und Absaetzen setzen |
| aBoxInfo.SetMinDist( sal_False ); |
| // Default-Abstand immer setzen |
| aBoxInfo.SetDefDist( MIN_BORDER_DIST ); |
| // Einzelne Linien koennen nur in Tabellen DontCare-Status haben |
| aBoxInfo.SetValid( VALID_DISABLE, sal_True ); |
| pTblSet->Put( aBoxInfo ); |
| |
| SwGetCurColNumPara aPara; |
| const sal_uInt16 nNum = rSh.GetCurColNum( &aPara ); |
| long nWidth; |
| |
| if( nNum ) |
| { |
| nWidth = aPara.pPrtRect->Width(); |
| const SwFmtCol& rCol = aPara.pFrmFmt->GetCol(); |
| const SwColumns& rCols = rCol.GetColumns(); |
| |
| //nStart und nEnd initialisieren fuer nNum == 0 |
| long nWidth1 = 0, |
| nStart1 = 0, |
| nEnd1 = nWidth; |
| for( sal_uInt16 i = 0; i < nNum; ++i ) |
| { |
| SwColumn* pCol = rCols[i]; |
| nStart1 = pCol->GetLeft() + nWidth1; |
| nWidth1 += (long)rCol.CalcColWidth( i, (sal_uInt16)nWidth ); |
| nEnd1 = nWidth1 - pCol->GetRight(); |
| } |
| if(nStart1 || nEnd1 != nWidth) |
| nWidth = nEnd1 - nStart1; |
| } |
| else |
| nWidth = rSh.GetAnyCurRect( |
| FRMTYPE_FLY_ANY & rSh.GetFrmType( 0, sal_True ) |
| ? RECT_FLY_PRT_EMBEDDED |
| : RECT_PAGE_PRT ).Width(); |
| |
| SwTabCols aTabCols; |
| aTabCols.SetRight( nWidth ); |
| aTabCols.SetRightMax( nWidth ); |
| pRep = new SwTableRep( aTabCols, sal_False ); |
| pRep->SetAlign( text::HoriOrientation::NONE ); |
| pRep->SetSpace( nWidth ); |
| pRep->SetWidth( nWidth ); |
| pRep->SetWidthPercent( 100 ); |
| pTblSet->Put( SwPtrItem( FN_TABLE_REP, pRep )); |
| |
| pTblSet->Put( SfxUInt16Item( SID_HTML_MODE, |
| ::GetHtmlMode( pView->GetDocShell() ))); |
| } |
| |
| if( aLbTableCol.GetEntryCount() != pRep->GetAllColCount() ) |
| { |
| // Anzahl der Spalten hat sich geaendert: dann muessen die |
| // TabCols angepasst werden |
| long nWidth = pRep->GetWidth(); |
| sal_uInt16 nCols = aLbTableCol.GetEntryCount() - 1; |
| SwTabCols aTabCols( nCols ); |
| aTabCols.SetRight( nWidth ); |
| aTabCols.SetRightMax( nWidth ); |
| if( nCols ) |
| for( sal_uInt16 n = 0, nStep = (sal_uInt16)(nWidth / (nCols+1)), nW = nStep; |
| n < nCols; ++n, nW = nW + nStep ) |
| { |
| aTabCols.Insert( nW, sal_False, n ); |
| } |
| delete pRep; |
| pRep = new SwTableRep( aTabCols, sal_False ); |
| pRep->SetAlign( text::HoriOrientation::NONE ); |
| pRep->SetSpace( nWidth ); |
| pRep->SetWidth( nWidth ); |
| pRep->SetWidthPercent( 100 ); |
| pTblSet->Put( SwPtrItem( FN_TABLE_REP, pRep )); |
| } |
| |
| SwAbstractDialogFactory* pFact = swui::GetFactory(); |
| DBG_ASSERT(pFact, "SwAbstractDialogFactory fail!"); |
| |
| SfxAbstractTabDialog* pDlg = pFact->CreateSwTableTabDlg( pButton, rSh.GetAttrPool(),pTblSet, &rSh, DLG_FORMAT_TABLE ); |
| DBG_ASSERT(pDlg, "Dialogdiet fail!"); |
| if( RET_OK == pDlg->Execute() ) |
| pTblSet->Put( *pDlg->GetOutputItemSet() ); |
| else if( bNewSet ) |
| { |
| delete pTblSet, pTblSet = 0; |
| delete pRep, pRep = 0; |
| } |
| delete pDlg; |
| |
| return 0; |
| } |
| /* --------------------------------------------------------------------------- |
| |
| ---------------------------------------------------------------------------*/ |
| IMPL_LINK( SwInsertDBColAutoPilot, AutoFmtHdl, PushButton*, pButton ) |
| { |
| SwAbstractDialogFactory* pFact = swui::GetFactory(); |
| DBG_ASSERT(pFact, "SwAbstractDialogFactory fail!"); |
| |
| AbstractSwAutoFormatDlg* pDlg = pFact->CreateSwAutoFormatDlg(pButton, pView->GetWrtShellPtr(),DLG_AUTOFMT_TABLE, sal_False, pTAutoFmt); |
| DBG_ASSERT(pDlg, "Dialogdiet fail!"); |
| if( RET_OK == pDlg->Execute()) |
| pDlg->FillAutoFmtOfIndex( pTAutoFmt ); |
| delete pDlg; |
| return 0; |
| } |
| /* --------------------------------------------------------------------------- |
| |
| ---------------------------------------------------------------------------*/ |
| IMPL_LINK( SwInsertDBColAutoPilot, SelectHdl, ListBox*, pBox ) |
| { |
| ListBox* pGetBox = pBox == &aLbDbFmtFromUsr |
| ? ( aRbAsTable.IsChecked() |
| ? ( 0 == aLbTableCol.GetEntryData( 0 ) |
| ? &aLbTblDbColumn |
| : &aLbTableCol ) |
| : &aLbTxtDbColumn ) |
| : pBox; |
| |
| sal_uInt16 nFndPos; |
| SwInsDBColumn aSrch( pGetBox->GetSelectEntry(), 0 ); |
| aDBColumns.Seek_Entry( &aSrch, &nFndPos ); |
| |
| if( pBox == &aLbDbFmtFromUsr ) |
| { |
| if( aSrch.sColumn.getLength() ) |
| { |
| aOldNumFmtLnk.Call( pBox ); |
| aDBColumns[ nFndPos ]->nUsrNumFmt = aLbDbFmtFromUsr.GetFormat(); |
| } |
| } |
| else |
| { |
| // an der FormatGroupBox den ausgewaehlten FeldNamen setzen, damit |
| // klar ist, welches Feld ueber das Format eingestellt wird! |
| String sTxt( aFlFormat.GetText().Copy( 0, nGBFmtLen )); |
| if( !aSrch.sColumn.getLength() ) |
| { |
| aRbDbFmtFromDb.Enable( sal_False ); |
| aRbDbFmtFromUsr.Enable( sal_False ); |
| aLbDbFmtFromUsr.Enable( sal_False ); |
| } |
| else |
| { |
| sal_Bool bEnableFmt = aDBColumns[ nFndPos ]->bHasFmt; |
| aRbDbFmtFromDb.Enable( bEnableFmt ); |
| aRbDbFmtFromUsr.Enable( bEnableFmt ); |
| |
| if( bEnableFmt ) |
| { |
| (( sTxt += C2S(" (" )) += String(aSrch.sColumn) ) += (sal_Unicode)')'; |
| } |
| |
| sal_Bool bIsDBFmt = aDBColumns[ nFndPos ]->bIsDBFmt; |
| aRbDbFmtFromDb.Check( bIsDBFmt ); |
| aRbDbFmtFromUsr.Check( !bIsDBFmt ); |
| aLbDbFmtFromUsr.Enable( !bIsDBFmt ); |
| if( !bIsDBFmt ) |
| aLbDbFmtFromUsr.SetDefFormat( aDBColumns[ nFndPos ]->nUsrNumFmt ); |
| } |
| |
| aFlFormat.SetText( sTxt ); |
| |
| // um spaeter zu wissen, welche ListBox die "aktive" war, wird sich |
| // im 1. Eintrag ein Flag gemerkt, |
| void* pPtr = pBox == &aLbTableCol ? &aLbTableCol : 0; |
| aLbTableCol.SetEntryData( 0, pPtr ); |
| } |
| return 0; |
| } |
| /* --------------------------------------------------------------------------- |
| |
| ---------------------------------------------------------------------------*/ |
| IMPL_LINK( SwInsertDBColAutoPilot, HeaderHdl, Button*, pButton ) |
| { |
| if( pButton == &aCbTableHeadon ) |
| { |
| sal_Bool bEnable = aCbTableHeadon.IsChecked(); |
| |
| aRbHeadlColnms.Enable( bEnable ); |
| aRbHeadlEmpty.Enable( bEnable ); |
| } |
| return 0; |
| } |
| /* --------------------------------------------------------------------------- |
| |
| ---------------------------------------------------------------------------*/ |
| static void lcl_InsTextInArr( const String& rTxt, _DB_Columns& rColArr ) |
| { |
| _DB_Column* pNew; |
| sal_uInt16 nSttPos = 0, nFndPos; |
| while( STRING_NOTFOUND != ( nFndPos = rTxt.Search( '\x0A', nSttPos )) ) |
| { |
| if( 1 < nFndPos ) |
| { |
| pNew = new _DB_Column( rTxt.Copy( nSttPos, nFndPos -1 ) ); |
| rColArr.Insert( pNew, rColArr.Count() ); |
| } |
| pNew = new _DB_Column; |
| rColArr.Insert( pNew, rColArr.Count() ); |
| nSttPos = nFndPos + 1; |
| } |
| if( nSttPos < rTxt.Len() ) |
| { |
| pNew = new _DB_Column( rTxt.Copy( nSttPos ) ); |
| rColArr.Insert( pNew, rColArr.Count() ); |
| } |
| } |
| /* --------------------------------------------------------------------------- |
| |
| ---------------------------------------------------------------------------*/ |
| sal_Bool SwInsertDBColAutoPilot::SplitTextToColArr( const String& rTxt, |
| _DB_Columns& rColArr, |
| sal_Bool bInsField ) |
| { |
| // aus dem Text wieder die einzelnen Datenbank - Spalten erzeugen |
| // und dann in einem Array speichern |
| // Die Datenbankspalten stehen in <> und muessen im Array der Spalten |
| // vorhanden sein: |
| String sTxt( rTxt ); |
| sal_uInt16 nFndPos, nEndPos, nSttPos = 0; |
| |
| while( STRING_NOTFOUND != ( nFndPos = sTxt.Search( cDBFldStart, nSttPos ))) |
| { |
| nSttPos = nFndPos + 1; |
| if( STRING_NOTFOUND != ( nEndPos = sTxt.Search( cDBFldEnd, nSttPos+1 ))) |
| { |
| // Text in <> geklammert gefunden: was ist es denn: |
| SwInsDBColumn aSrch( sTxt.Copy( nSttPos, nEndPos - nSttPos ), 0); |
| if( aDBColumns.Seek_Entry( &aSrch, &nFndPos ) ) |
| { |
| // das ist ein gueltiges Feld |
| // also sicher den Text "davor": |
| const SwInsDBColumn& rFndCol = *aDBColumns[ nFndPos ]; |
| |
| _DB_Column* pNew; |
| |
| if( 1 < nSttPos ) |
| { |
| ::lcl_InsTextInArr( sTxt.Copy( 0, nSttPos-1 ), rColArr ); |
| sTxt.Erase( 0, nSttPos-1 ); |
| } |
| |
| sTxt.Erase( 0, (xub_StrLen)(rFndCol.sColumn.getLength() + 2) ); |
| nSttPos = 0; |
| |
| sal_uInt16 nSubType = 0; |
| sal_uLong nFormat; |
| if( rFndCol.bHasFmt ) |
| { |
| if( rFndCol.bIsDBFmt ) |
| nFormat = rFndCol.nDBNumFmt; |
| else |
| { |
| nFormat = rFndCol.nUsrNumFmt; |
| nSubType = nsSwExtendedSubType::SUB_OWN_FMT; |
| } |
| } |
| else |
| nFormat = 0; |
| |
| if( bInsField ) |
| { |
| SwWrtShell& rSh = pView->GetWrtShell(); |
| SwDBFieldType aFldType( rSh.GetDoc(), aSrch.sColumn, |
| aDBData ); |
| pNew = new _DB_Column( rFndCol, *new SwDBField( |
| (SwDBFieldType*)rSh.InsertFldType( aFldType ), |
| nFormat ) ); |
| if( nSubType ) |
| pNew->DB_ColumnData.pField->SetSubType( nSubType ); |
| } |
| else |
| pNew = new _DB_Column( rFndCol, nFormat ); |
| |
| rColArr.Insert( pNew, rColArr.Count() ); |
| } |
| } |
| } |
| |
| // den letzten Text nicht vergessen |
| if( sTxt.Len() ) |
| ::lcl_InsTextInArr( sTxt, rColArr ); |
| |
| return 0 != rColArr.Count(); |
| } |
| /* --------------------------------------------------------------------------- |
| |
| ---------------------------------------------------------------------------*/ |
| void SwInsertDBColAutoPilot::DataToDoc( const Sequence<Any>& rSelection, |
| Reference< XDataSource> xSource, |
| Reference< XConnection> xConnection, |
| Reference< sdbc::XResultSet > xResultSet ) |
| { |
| const Any* pSelection = rSelection.getLength() ? rSelection.getConstArray() : 0; |
| SwWrtShell& rSh = pView->GetWrtShell(); |
| |
| //with the drag and drop interface no result set is initially available |
| sal_Bool bDisposeResultSet = sal_False; |
| // we don't have a cursor, so we have to create our own RowSet |
| if ( !xResultSet.is() ) |
| { |
| xResultSet = SwNewDBMgr::createCursor(aDBData.sDataSource,aDBData.sCommand,aDBData.nCommandType,xConnection); |
| bDisposeResultSet = xResultSet.is(); |
| } |
| |
| Reference< sdbc::XRow > xRow(xResultSet, UNO_QUERY); |
| if ( !xRow.is() ) |
| return; |
| |
| rSh.StartAllAction(); |
| sal_Bool bUndo = rSh.DoesUndo(); |
| if( bUndo ) |
| rSh.StartUndo( UNDO_EMPTY ); |
| |
| sal_Bool bAsTable = aRbAsTable.IsChecked(); |
| SvNumberFormatter& rNumFmtr = *rSh.GetNumberFormatter(); |
| |
| if( rSh.HasSelection() ) |
| rSh.DelRight(); |
| |
| ::std::auto_ptr<SwWait> pWait; |
| |
| Reference< XColumnsSupplier > xColsSupp( xResultSet, UNO_QUERY ); |
| Reference <XNameAccess> xCols = xColsSupp->getColumns(); |
| |
| do{ // middle checked loop!! |
| if( bAsTable ) // Daten als Tabelle einfuegen |
| { |
| rSh.DoUndo( sal_False ); |
| |
| sal_uInt16 n, nRows = 0, nCols = aLbTableCol.GetEntryCount(); |
| if( aCbTableHeadon.IsChecked() ) |
| nRows++; |
| |
| if( pSelection ) |
| nRows = nRows + (sal_uInt16)rSelection.getLength(); |
| else |
| ++nRows; |
| |
| // bereite das Array fuer die ausgewaehlten Spalten auf |
| SwInsDBColumns_SAR aColFlds( 255 >= nCols ? (sal_uInt8)nCols : 255, 5 ); |
| for( n = 0; n < nCols; ++n ) |
| { |
| sal_uInt16 nFndPos; |
| SwInsDBColumn aSrch( aLbTableCol.GetEntry( n ), 0 ); |
| if( aDBColumns.Seek_Entry( &aSrch, &nFndPos ) ) |
| aColFlds.Insert( aDBColumns[ nFndPos ], n ); |
| else { |
| ASSERT( !this, "Datenbankspalte nicht mehr gefunden" ); |
| } |
| } |
| |
| if( nCols != aColFlds.Count() ) |
| { |
| ASSERT( !this, "nicht alle Datenbankspalten gefunden" ); |
| nCols = aColFlds.Count(); |
| } |
| |
| if(!nRows || !nCols) |
| { |
| ASSERT( !this, "wrong parameters" ); |
| break; |
| } |
| |
| const SwModuleOptions* pModOpt = SW_MOD()->GetModuleConfig(); |
| |
| sal_Bool bHTML = 0 != (::GetHtmlMode( pView->GetDocShell() ) & HTMLMODE_ON); |
| rSh.InsertTable( |
| pModOpt->GetInsTblFlags(bHTML), |
| nRows, nCols, text::HoriOrientation::FULL, (pSelection ? pTAutoFmt : 0) ); |
| rSh.MoveTable( GetfnTablePrev(), GetfnTableStart() ); |
| |
| if( pSelection && pTblSet ) |
| SetTabSet(); |
| |
| SfxItemSet aTblSet( rSh.GetAttrPool(), RES_BOXATR_FORMAT, |
| RES_BOXATR_VALUE ); |
| sal_Bool bIsAutoUpdateCells = rSh.IsAutoUpdateCells(); |
| rSh.SetAutoUpdateCells( sal_False ); |
| |
| |
| if( aCbTableHeadon.IsChecked() ) |
| { |
| for( n = 0; n < nCols; ++n ) |
| { |
| if( aRbHeadlColnms.IsChecked() ) |
| { |
| rSh.SwEditShell::Insert2( aColFlds[ n ]->sColumn ); |
| } |
| rSh.GoNextCell(); |
| } |
| } |
| else |
| rSh.SetRowsToRepeat( 0 ); |
| |
| for( sal_Int32 i = 0 ; ; ++i ) |
| { |
| sal_Bool bBreak = sal_False; |
| try |
| { |
| if(pSelection) |
| { |
| sal_Int32 nPos = 0; |
| pSelection[i] >>= nPos; |
| bBreak = !xResultSet->absolute(nPos); |
| } |
| else if(!i) |
| bBreak = !xResultSet->first(); |
| } |
| catch(const Exception& ) |
| { |
| bBreak = sal_True; |
| } |
| if(bBreak) |
| break; |
| |
| for( n = 0; n < nCols; ++n ) |
| { |
| // beim aller erstenmal KEIN GoNextCell, weil wir schon |
| // drin stehen. Auch nicht nach dem Insert das GoNextCell, |
| // weil am Ende eine leere Zeile einfuegt wird. |
| if( i || n ) |
| rSh.GoNextCell(); |
| |
| const SwInsDBColumn* pEntry = aColFlds[ n ]; |
| |
| Reference< XColumn > xColumn; |
| xCols->getByName(pEntry->sColumn) >>= xColumn; |
| Reference< XPropertySet > xColumnProps( xColumn, UNO_QUERY ); |
| sal_Int32 eDataType = 0; |
| if( xColumnProps.is() ) |
| { |
| Any aType = xColumnProps->getPropertyValue(C2U("Type")); |
| aType >>= eDataType; |
| } |
| try |
| { |
| if( pEntry->bHasFmt ) |
| { |
| SwTblBoxNumFormat aNumFmt( |
| pEntry->bIsDBFmt ? pEntry->nDBNumFmt |
| : pEntry->nUsrNumFmt ); |
| aTblSet.Put(aNumFmt); |
| if( xColumn.is() ) |
| { |
| double fVal = xColumn->getDouble(); |
| if( xColumn->wasNull() ) |
| aTblSet.ClearItem( RES_BOXATR_VALUE ); |
| else |
| { |
| if(rNumFmtr.GetType(aNumFmt.GetValue()) & NUMBERFORMAT_DATE) |
| { |
| ::Date aStandard(1,1,1900); |
| if (*rNumFmtr.GetNullDate() != aStandard) |
| fVal += (aStandard - *rNumFmtr.GetNullDate()); |
| } |
| aTblSet.Put( SwTblBoxValue( fVal )); |
| } |
| } |
| else |
| aTblSet.ClearItem( RES_BOXATR_VALUE ); |
| rSh.SetTblBoxFormulaAttrs( aTblSet ); |
| } |
| //#i60207# don't insert binary data as string - creates a loop |
| else if( DataType::BINARY == eDataType || |
| DataType::VARBINARY == eDataType || |
| DataType::LONGVARBINARY== eDataType || |
| DataType::SQLNULL == eDataType || |
| DataType::OTHER == eDataType || |
| DataType::OBJECT == eDataType || |
| DataType::DISTINCT == eDataType || |
| DataType::STRUCT == eDataType || |
| DataType::ARRAY == eDataType || |
| DataType::BLOB == eDataType || |
| DataType::CLOB == eDataType || |
| DataType::REF == eDataType |
| ) |
| { |
| // do nothing |
| } |
| else |
| { |
| rtl::OUString sVal = xColumn->getString(); |
| if(!xColumn->wasNull()) |
| { |
| rSh.SwEditShell::Insert2( sVal ); |
| } |
| } |
| } |
| catch(Exception& |
| #ifdef DBG_UTIL |
| aExcept |
| #endif |
| ) |
| { |
| DBG_ERROR(ByteString(String(aExcept.Message), gsl_getSystemTextEncoding()).GetBuffer()); |
| } |
| } |
| |
| if( !pSelection ) |
| { |
| if ( !xResultSet->next() ) |
| break; |
| } |
| else if( i+1 >= rSelection.getLength() ) |
| break; |
| |
| if( 10 == i ) |
| pWait = ::std::auto_ptr<SwWait>(new SwWait( *pView->GetDocShell(), true )); |
| } |
| |
| rSh.MoveTable( GetfnTableCurr(), GetfnTableStart() ); |
| if( !pSelection && ( pTblSet || pTAutoFmt )) |
| { |
| if( pTblSet ) |
| SetTabSet(); |
| |
| if( pTAutoFmt ) |
| rSh.SetTableAutoFmt( *pTAutoFmt ); |
| } |
| rSh.SetAutoUpdateCells( bIsAutoUpdateCells ); |
| } |
| else // Daten als Felder/Text einfuegen |
| { |
| _DB_Columns aColArr; |
| if( SplitTextToColArr( aEdDbText.GetText(), aColArr, aRbAsField.IsChecked() ) ) |
| { |
| // jetzt kann bei jedem Datensatz einfach ueber das Array iteriert |
| // und die Daten eingefuegt werden |
| |
| if( !rSh.IsSttPara() ) |
| rSh.SwEditShell::SplitNode(); |
| if( !rSh.IsEndPara() ) |
| { |
| rSh.SwEditShell::SplitNode(); |
| rSh.SwCrsrShell::Left(1,CRSR_SKIP_CHARS); |
| } |
| |
| rSh.DoUndo( sal_False ); |
| |
| SwTxtFmtColl* pColl = 0; |
| { |
| String sTmplNm( aLbDbParaColl.GetSelectEntry() ); |
| if( sNoTmpl != sTmplNm ) |
| { |
| pColl = rSh.FindTxtFmtCollByName( sTmplNm ); |
| if( !pColl ) |
| { |
| sal_uInt16 nId = SwStyleNameMapper::GetPoolIdFromUIName( sTmplNm, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL ); |
| if( USHRT_MAX != nId ) |
| pColl = rSh.GetTxtCollFromPool( nId ); |
| else |
| pColl = rSh.MakeTxtFmtColl( sTmplNm ); |
| } |
| rSh.SetTxtFmtColl( pColl ); |
| } |
| } |
| |
| // fuers Einfuegen als Felder -> nach jedem Datensatz ein |
| // "NextField" einfuegen |
| SwDBFormatData aDBFormatData; |
| Reference< XMultiServiceFactory > xMgr( ::comphelper::getProcessServiceFactory() ); |
| if( xMgr.is() ) |
| { |
| Reference<XInterface> xInstance = xMgr->createInstance( C2U( "com.sun.star.util.NumberFormatter" )); |
| aDBFormatData.xFormatter = Reference<util::XNumberFormatter>(xInstance, UNO_QUERY) ; |
| } |
| |
| Reference<XPropertySet> xSourceProps(xSource, UNO_QUERY); |
| if(xSourceProps.is()) |
| { |
| Any aFormats = xSourceProps->getPropertyValue(C2U("NumberFormatsSupplier")); |
| if(aFormats.hasValue()) |
| { |
| Reference< util::XNumberFormatsSupplier> xSuppl; |
| aFormats >>= xSuppl; |
| if(xSuppl.is()) |
| { |
| Reference< XPropertySet > xSettings = xSuppl->getNumberFormatSettings(); |
| Any aNull = xSettings->getPropertyValue(C2U("NullDate")); |
| aNull >>= aDBFormatData.aNullDate; |
| if(aDBFormatData.xFormatter.is()) |
| aDBFormatData.xFormatter->attachNumberFormatsSupplier(xSuppl); |
| } |
| } |
| } |
| aDBFormatData.aLocale = SvxCreateLocale( rSh.GetCurLang() ); |
| SwDBNextSetField aNxtDBFld( (SwDBNextSetFieldType*)rSh. |
| GetFldType( 0, RES_DBNEXTSETFLD ), |
| C2S("1"), aEmptyStr, aDBData ); |
| |
| |
| sal_Bool bSetCrsr = sal_True; |
| sal_uInt16 n = 0, nCols = aColArr.Count(); |
| ::sw::mark::IMark* pMark = NULL; |
| for( sal_Int32 i = 0 ; ; ++i ) |
| { |
| sal_Bool bBreak = sal_False; |
| try |
| { |
| if(pSelection) |
| { |
| sal_Int32 nPos = 0; |
| pSelection[i] >>= nPos; |
| bBreak = !xResultSet->absolute(nPos); |
| } |
| else if(!i) |
| bBreak = !xResultSet->first(); |
| } |
| catch(Exception&) |
| { |
| bBreak = sal_True; |
| } |
| |
| if(bBreak) |
| break; |
| |
| |
| for( n = 0; n < nCols; ++n ) |
| { |
| _DB_Column* pDBCol = aColArr[ n ]; |
| String sIns; |
| switch( pDBCol->eColType ) |
| { |
| case _DB_Column::DB_FILLTEXT: |
| sIns = *pDBCol->DB_ColumnData.pText; |
| break; |
| |
| case _DB_Column::DB_SPLITPARA: |
| rSh.SplitNode(); |
| // wenn nicht die gleiche Vorlage die Follow Vorlage |
| // ist, dann muss die ausgewaehlte neu gesetzt werden |
| if( pColl && &pColl->GetNextTxtFmtColl() != pColl ) |
| rSh.SetTxtFmtColl( pColl ); |
| break; |
| |
| case _DB_Column::DB_COL_FIELD: |
| { |
| SwDBField *const pFld = static_cast<SwDBField *>( |
| pDBCol->DB_ColumnData.pField->CopyField()); |
| double nValue = DBL_MAX; |
| |
| Reference< XPropertySet > xColumnProps; |
| xCols->getByName(pDBCol->pColInfo->sColumn) >>= xColumnProps; |
| |
| pFld->SetExpansion( SwNewDBMgr::GetDBField( |
| xColumnProps, |
| aDBFormatData, |
| &nValue ) ); |
| if( DBL_MAX != nValue ) |
| { |
| Any aType = xColumnProps->getPropertyValue(C2U("Type")); |
| sal_Int32 eDataType = 0; |
| aType >>= eDataType; |
| if( DataType::DATE == eDataType || DataType::TIME == eDataType || |
| DataType::TIMESTAMP == eDataType) |
| |
| { |
| ::Date aStandard(1,1,1900); |
| ::Date aCompare(aDBFormatData.aNullDate.Day , |
| aDBFormatData.aNullDate.Month, |
| aDBFormatData.aNullDate.Year); |
| if(aStandard != aCompare) |
| nValue += (aStandard - aCompare); |
| } |
| pFld->ChgValue( nValue, sal_True ); |
| } |
| pFld->SetInitialized(); |
| |
| rSh.Insert( *pFld ); |
| delete pFld; |
| } |
| break; |
| |
| case _DB_Column::DB_COL_TEXT: |
| { |
| double nValue = DBL_MAX; |
| Reference< XPropertySet > xColumnProps; |
| xCols->getByName(pDBCol->pColInfo->sColumn) >>= xColumnProps; |
| sIns = SwNewDBMgr::GetDBField( |
| xColumnProps, |
| aDBFormatData, |
| &nValue ); |
| if( pDBCol->DB_ColumnData.nFormat && |
| DBL_MAX != nValue ) |
| { |
| Color* pCol; |
| if(rNumFmtr.GetType(pDBCol->DB_ColumnData.nFormat) & NUMBERFORMAT_DATE) |
| { |
| ::Date aStandard(1,1,1900); |
| if (*rNumFmtr.GetNullDate() != aStandard) |
| nValue += (aStandard - *rNumFmtr.GetNullDate()); |
| } |
| rNumFmtr.GetOutputString( nValue, |
| pDBCol->DB_ColumnData.nFormat, |
| sIns, &pCol ); |
| } |
| } |
| break; |
| } |
| |
| if( sIns.Len() ) |
| rSh.Insert( sIns ); |
| |
| if( bSetCrsr && sIns.Len() ) |
| { |
| // zum Anfang und eine Mark setzen, damit der |
| // Cursor am Ende wieder auf Anfangsposition |
| // gesetzt werden kann. |
| |
| // rSh.SwCrsrShell::MovePara( fnParaCurr, fnParaStart ); |
| rSh.SwCrsrShell::MovePara( |
| GetfnParaCurr(), GetfnParaStart() ); |
| pMark = rSh.SetBookmark( |
| KeyCode(), |
| ::rtl::OUString(), |
| ::rtl::OUString(), IDocumentMarkAccess::UNO_BOOKMARK ); |
| // rSh.SwCrsrShell::MovePara( fnParaCurr, fnParaEnd ); |
| rSh.SwCrsrShell::MovePara( |
| GetfnParaCurr(), GetfnParaEnd() ); |
| bSetCrsr = sal_False; |
| } |
| } |
| |
| if( !pSelection ) |
| { |
| sal_Bool bNext = xResultSet->next(); |
| if(!bNext) |
| break; |
| } |
| else if( i+1 >= rSelection.getLength() ) |
| break; |
| |
| if( aRbAsField.IsChecked() ) |
| rSh.Insert( aNxtDBFld ); |
| |
| if( !rSh.IsSttPara() ) |
| rSh.SwEditShell::SplitNode(); |
| |
| if( 10 == i ) |
| pWait = ::std::auto_ptr<SwWait>(new SwWait( *pView->GetDocShell(), true )); |
| } |
| |
| if( !bSetCrsr && pMark != NULL) |
| { |
| rSh.SetMark(); |
| rSh.GotoMark( pMark ); |
| rSh.getIDocumentMarkAccess()->deleteMark( pMark ); |
| break; |
| } |
| } |
| } |
| // write configuration |
| Commit(); |
| }while( sal_False ); // middle checked loop |
| |
| if( bUndo ) |
| { |
| rSh.DoUndo( sal_True ); |
| rSh.AppendUndoForInsertFromDB( bAsTable ); |
| rSh.EndUndo( UNDO_EMPTY ); |
| } |
| rSh.ClearMark(); |
| rSh.EndAllAction(); |
| |
| if ( bDisposeResultSet ) |
| ::comphelper::disposeComponent(xResultSet); |
| } |
| void SwInsertDBColAutoPilot::SetTabSet() |
| { |
| SwWrtShell& rSh = pView->GetWrtShell(); |
| const SfxPoolItem* pItem; |
| |
| if( pTAutoFmt ) |
| { |
| if( pTAutoFmt->IsFrame() ) |
| { |
| // Umrandung kommt vom AutoFormat |
| pTblSet->ClearItem( RES_BOX ); |
| pTblSet->ClearItem( SID_ATTR_BORDER_INNER ); |
| } |
| if( pTAutoFmt->IsBackground() ) |
| { |
| pTblSet->ClearItem( RES_BACKGROUND ); |
| pTblSet->ClearItem( SID_ATTR_BRUSH_ROW ); |
| pTblSet->ClearItem( SID_ATTR_BRUSH_TABLE ); |
| } |
| } |
| else |
| { |
| // die Defaults wieder entfernen, es macht keinen Sinn sie zu setzen |
| SvxBrushItem aBrush( RES_BACKGROUND ); |
| static sal_uInt16 __READONLY_DATA aIds[3] = |
| { RES_BACKGROUND, SID_ATTR_BRUSH_ROW, SID_ATTR_BRUSH_TABLE }; |
| for( int i = 0; i < 3; ++i ) |
| if( SFX_ITEM_SET == pTblSet->GetItemState( aIds[ i ], |
| sal_False, &pItem ) && *pItem == aBrush ) |
| pTblSet->ClearItem( aIds[ i ] ); |
| } |
| |
| if( SFX_ITEM_SET == pTblSet->GetItemState( FN_PARAM_TABLE_NAME, sal_False, |
| &pItem ) && ((const SfxStringItem*)pItem)->GetValue() == |
| rSh.GetTableFmt()->GetName() ) |
| pTblSet->ClearItem( FN_PARAM_TABLE_NAME ); |
| |
| rSh.MoveTable( GetfnTableCurr(), GetfnTableStart() ); |
| rSh.SetMark(); |
| rSh.MoveTable( GetfnTableCurr(), GetfnTableEnd() ); |
| |
| ItemSetToTableParam( *pTblSet, rSh ); |
| |
| rSh.ClearMark(); |
| rSh.MoveTable( GetfnTableCurr(), GetfnTableStart() ); |
| } |
| |
| /* */ |
| |
| |
| _DB_ColumnConfigData::~_DB_ColumnConfigData() {} |
| |
| /* -----------------------------05.12.00 16:15-------------------------------- |
| |
| ---------------------------------------------------------------------------*/ |
| static Sequence<rtl::OUString> lcl_createSourceNames(const String& rNodeName) |
| { |
| Sequence<rtl::OUString> aSourceNames(11); |
| rtl::OUString* pNames = aSourceNames.getArray(); |
| |
| String sTmp( rNodeName ); |
| const xub_StrLen nPos = sTmp.Len(); |
| pNames[0] = sTmp.ReplaceAscii( nPos, STRING_MAXLEN, |
| RTL_CONSTASCII_STRINGPARAM( "/DataSource" )); |
| pNames[1] = sTmp.ReplaceAscii( nPos, STRING_MAXLEN, |
| RTL_CONSTASCII_STRINGPARAM( "/Command" )); |
| pNames[2] = sTmp.ReplaceAscii( nPos, STRING_MAXLEN, |
| RTL_CONSTASCII_STRINGPARAM( "/CommandType" )); |
| pNames[3] = sTmp.ReplaceAscii( nPos, STRING_MAXLEN, |
| RTL_CONSTASCII_STRINGPARAM( "/ColumnsToText" )); |
| pNames[4] = sTmp.ReplaceAscii( nPos, STRING_MAXLEN, |
| RTL_CONSTASCII_STRINGPARAM( "/ColumnsToTable" )); |
| pNames[5] = sTmp.ReplaceAscii( nPos, STRING_MAXLEN, |
| RTL_CONSTASCII_STRINGPARAM( "/ParaStyle" )); |
| pNames[6] = sTmp.ReplaceAscii( nPos, STRING_MAXLEN, |
| RTL_CONSTASCII_STRINGPARAM( "/TableAutoFormat" )); |
| pNames[7] = sTmp.ReplaceAscii( nPos, STRING_MAXLEN, |
| RTL_CONSTASCII_STRINGPARAM( "/IsTable" )); |
| pNames[8] = sTmp.ReplaceAscii( nPos, STRING_MAXLEN, |
| RTL_CONSTASCII_STRINGPARAM( "/IsField" )); |
| pNames[9] = sTmp.ReplaceAscii( nPos, STRING_MAXLEN, |
| RTL_CONSTASCII_STRINGPARAM( "/IsHeadlineOn" )); |
| pNames[10] = sTmp.ReplaceAscii( nPos, STRING_MAXLEN, |
| RTL_CONSTASCII_STRINGPARAM( "/IsEmptyHeadline" )); |
| return aSourceNames; |
| } |
| /* -----------------------------05.12.00 16:25-------------------------------- |
| |
| ---------------------------------------------------------------------------*/ |
| static Sequence<rtl::OUString> lcl_CreateSubNames( const String& rSubNodeName ) |
| { |
| Sequence<rtl::OUString> aSubSourceNames(6); |
| rtl::OUString* pNames = aSubSourceNames.getArray(); |
| String sTmp( rSubNodeName ); |
| const xub_StrLen nPos = sTmp.Len(); |
| pNames[0] = sTmp.ReplaceAscii( nPos, STRING_MAXLEN, |
| RTL_CONSTASCII_STRINGPARAM( "/ColumnName" )); |
| pNames[1] = sTmp.ReplaceAscii( nPos, STRING_MAXLEN, |
| RTL_CONSTASCII_STRINGPARAM( "/ColumnIndex" )); |
| pNames[2] = sTmp.ReplaceAscii( nPos, STRING_MAXLEN, |
| RTL_CONSTASCII_STRINGPARAM( "/IsNumberFormat" )); |
| pNames[3] = sTmp.ReplaceAscii( nPos, STRING_MAXLEN, |
| RTL_CONSTASCII_STRINGPARAM( "/IsNumberFormatFromDataBase" )); |
| pNames[4] = sTmp.ReplaceAscii( nPos, STRING_MAXLEN, |
| RTL_CONSTASCII_STRINGPARAM( "/NumberFormat" )); |
| pNames[5] = sTmp.ReplaceAscii( nPos, STRING_MAXLEN, |
| RTL_CONSTASCII_STRINGPARAM( "/NumberFormatLocale" )); |
| return aSubSourceNames; |
| } |
| /* -----------------------------06.12.00 13:03-------------------------------- |
| |
| ---------------------------------------------------------------------------*/ |
| static rtl::OUString lcl_CreateUniqueName(const Sequence<rtl::OUString>& aNames) |
| { |
| sal_Int32 nIdx = aNames.getLength(); |
| const rtl::OUString* pNames = aNames.getConstArray(); |
| rtl::OUString sTest(C2U("_")); |
| rtl::OUString sRet; |
| while(sal_True) |
| { |
| sRet = sTest; sRet += rtl::OUString::valueOf(nIdx++); |
| sal_Bool bFound = sal_False; |
| for(sal_Int32 i = 0; i < aNames.getLength(); i++) |
| { |
| if(pNames[i] == sRet) |
| { |
| bFound = sal_True; |
| break; |
| } |
| } |
| if(!bFound) |
| break; |
| } |
| return sRet; |
| } |
| /* -----------------------------05.12.00 15:00-------------------------------- |
| |
| ---------------------------------------------------------------------------*/ |
| void SwInsertDBColAutoPilot::Notify( const ::com::sun::star::uno::Sequence< rtl::OUString >& ) {} |
| |
| void SwInsertDBColAutoPilot::Commit() |
| { |
| Sequence <rtl::OUString> aNames = GetNodeNames(rtl::OUString()); |
| const rtl::OUString* pNames = aNames.getArray(); |
| //remove entries that contain this data source + table at first |
| for(sal_Int32 nNode = 0; nNode < aNames.getLength(); nNode++) |
| { |
| Sequence<rtl::OUString> aSourceNames(2); |
| rtl::OUString* pSourceNames = aSourceNames.getArray(); |
| pSourceNames[0] = pNames[nNode]; |
| pSourceNames[0] += C2U("/DataSource"); |
| pSourceNames[1] = pNames[nNode]; |
| pSourceNames[1] += C2U("/Command"); |
| Sequence<Any> aSourceProperties = GetProperties(aSourceNames); |
| const Any* pSourceProps = aSourceProperties.getArray(); |
| rtl::OUString sSource, sCommand; |
| pSourceProps[0] >>= sSource; |
| pSourceProps[1] >>= sCommand; |
| if(sSource.equals(aDBData.sDataSource) && sCommand.equals(aDBData.sCommand)) |
| { |
| Sequence<rtl::OUString> aElements(1); |
| aElements.getArray()[0] = pNames[nNode]; |
| ClearNodeElements(rtl::OUString(), aElements); |
| } |
| } |
| |
| aNames = GetNodeNames(rtl::OUString()); |
| rtl::OUString sNewNode = lcl_CreateUniqueName(aNames); |
| Sequence<rtl::OUString> aNodeNames = lcl_createSourceNames(sNewNode); |
| Sequence<PropertyValue> aValues(aNodeNames.getLength()); |
| PropertyValue* pValues = aValues.getArray(); |
| const rtl::OUString* pNodeNames = aNodeNames.getConstArray(); |
| rtl::OUString sSlash(C2U("/")); |
| for(sal_Int32 i = 0; i < aNodeNames.getLength(); i++) |
| { |
| pValues[i].Name = sSlash; |
| pValues[i].Name += pNodeNames[i]; |
| } |
| |
| pValues[0].Value <<= rtl::OUString(aDBData.sDataSource); |
| pValues[1].Value <<= rtl::OUString(aDBData.sCommand); |
| pValues[2].Value <<= aDBData.nCommandType; |
| pValues[3].Value <<= rtl::OUString(aEdDbText.GetText()); |
| |
| String sTmp; |
| for( sal_uInt16 n = 0, nCnt = aLbTableCol.GetEntryCount(); n < nCnt; ++n ) |
| ( sTmp += aLbTableCol.GetEntry( n ) ) += '\x0a'; |
| |
| if( sTmp.Len() ) |
| pValues[4].Value <<= rtl::OUString(sTmp); |
| |
| if( sNoTmpl != (sTmp = aLbDbParaColl.GetSelectEntry()) ) |
| pValues[5].Value <<= rtl::OUString(sTmp); |
| |
| if( pTAutoFmt ) |
| pValues[6].Value <<= rtl::OUString(pTAutoFmt->GetName()); |
| |
| const Type& rBoolType = ::getBooleanCppuType(); |
| sal_Bool bTmp = aRbAsTable.IsChecked(); |
| pValues[7].Value.setValue(&bTmp, rBoolType); |
| |
| bTmp = aRbAsField.IsChecked(); |
| pValues[8].Value.setValue(&bTmp, rBoolType); |
| |
| bTmp = aCbTableHeadon.IsChecked(); |
| pValues[9].Value.setValue(&bTmp, rBoolType); |
| |
| bTmp = aRbHeadlEmpty.IsChecked(); |
| pValues[10].Value.setValue(&bTmp, rBoolType); |
| |
| SetSetProperties(rtl::OUString(), aValues); |
| |
| sNewNode += C2U("/ColumnSet"); |
| String sDelim( String::CreateFromAscii( "/__" )); |
| |
| LanguageType ePrevLang = (LanguageType)-1; |
| rtl::OUString sPrevLang; |
| |
| SvNumberFormatter& rNFmtr = *pView->GetWrtShell().GetNumberFormatter(); |
| for(sal_uInt16 nCol = 0; nCol < aDBColumns.Count(); nCol++) |
| { |
| rtl::OUString sColumnNode = sNewNode; |
| SwInsDBColumn* pColumn = aDBColumns[nCol]; |
| String sColumnInsertNode(sColumnNode); |
| sColumnInsertNode += sDelim; |
| if( nCol < 100 ) |
| sColumnInsertNode += '0'; |
| if( nCol < 10 ) |
| sColumnInsertNode += '0'; |
| sColumnInsertNode += String::CreateFromInt32( nCol ); |
| |
| Sequence <rtl::OUString> aSubNodeNames = lcl_CreateSubNames(sColumnInsertNode); |
| Sequence<PropertyValue> aSubValues(aSubNodeNames.getLength()); |
| PropertyValue* pSubValues = aSubValues.getArray(); |
| const rtl::OUString* pSubNodeNames = aSubNodeNames.getConstArray(); |
| sal_Int32 i; |
| |
| for( i = 0; i < aSubNodeNames.getLength(); i++) |
| pSubValues[i].Name = pSubNodeNames[i]; |
| pSubValues[0].Value <<= pColumn->sColumn; |
| pSubValues[1].Value <<= i; |
| |
| sal_Bool bVal = pColumn->bHasFmt; |
| pSubValues[2].Value.setValue(&bVal, rBoolType); |
| bVal = pColumn->bIsDBFmt; |
| pSubValues[3].Value.setValue(&bVal, rBoolType); |
| |
| SwStyleNameMapper::FillUIName( RES_POOLCOLL_STANDARD, sTmp ); |
| const SvNumberformat* pNF = rNFmtr.GetEntry( pColumn->nUsrNumFmt ); |
| LanguageType eLang; |
| if( pNF ) |
| { |
| pSubValues[4].Value <<= rtl::OUString(pNF->GetFormatstring()); |
| eLang = pNF->GetLanguage(); |
| } |
| else |
| { |
| pSubValues[4].Value <<= rtl::OUString(sTmp); |
| eLang = (LanguageType)GetAppLanguage(); |
| } |
| |
| if( eLang != ePrevLang ) |
| { |
| Locale aLocale; |
| aLocale = SvxLanguageToLocale( aLocale, eLang ); |
| (( sPrevLang = aLocale.Country ) += rtl::OUString( '-' )) += aLocale.Language; |
| ePrevLang = eLang; |
| } |
| |
| pSubValues[5].Value <<= sPrevLang; |
| SetSetProperties(sColumnNode, aSubValues); |
| } |
| } |
| /* -----------------------------05.12.00 15:00-------------------------------- |
| |
| ---------------------------------------------------------------------------*/ |
| void SwInsertDBColAutoPilot::Load() |
| { |
| Sequence <rtl::OUString> aNames = GetNodeNames(rtl::OUString()); |
| const rtl::OUString* pNames = aNames.getArray(); |
| SvNumberFormatter& rNFmtr = *pView->GetWrtShell().GetNumberFormatter(); |
| for(sal_Int32 nNode = 0; nNode < aNames.getLength(); nNode++) |
| { |
| //search for entries with the appropriate data source and table |
| Sequence<rtl::OUString> aSourceNames = lcl_createSourceNames(pNames[nNode]); |
| |
| Sequence< Any> aDataSourceProps = GetProperties(aSourceNames); |
| const Any* pDataSourceProps = aDataSourceProps.getConstArray(); |
| rtl::OUString sSource, sCommand; |
| sal_Int16 nCommandType; |
| pDataSourceProps[0] >>= sSource; |
| pDataSourceProps[1] >>= sCommand; |
| pDataSourceProps[2] >>= nCommandType; |
| if(sSource.equals(aDBData.sDataSource) && sCommand.equals(aDBData.sCommand)) |
| { |
| _DB_ColumnConfigData* pNewData = new _DB_ColumnConfigData; |
| pNewData->sSource = sSource; |
| pNewData->sTable = sCommand; |
| |
| pDataSourceProps[3] >>= pNewData->sEdit; |
| pDataSourceProps[4] >>= pNewData->sTblList; |
| pDataSourceProps[5] >>= pNewData->sTmplNm; |
| pDataSourceProps[6] >>= pNewData->sTAutoFmtNm; |
| if(pDataSourceProps[7].hasValue()) |
| pNewData->bIsTable = *(sal_Bool*)pDataSourceProps[7].getValue(); |
| if(pDataSourceProps[8].hasValue()) |
| pNewData->bIsField = *(sal_Bool*)pDataSourceProps[8].getValue(); |
| if(pDataSourceProps[9].hasValue()) |
| pNewData->bIsHeadlineOn = *(sal_Bool*)pDataSourceProps[9].getValue(); |
| if(pDataSourceProps[10].hasValue()) |
| pNewData->bIsEmptyHeadln = *(sal_Bool*)pDataSourceProps[10].getValue(); |
| |
| rtl::OUString sSubNodeName(pNames[nNode]); |
| sSubNodeName += C2U("/ColumnSet/"); |
| Sequence <rtl::OUString> aSubNames = GetNodeNames(sSubNodeName); |
| const rtl::OUString* pSubNames = aSubNames.getConstArray(); |
| for(sal_Int32 nSub = 0; nSub < aSubNames.getLength(); nSub++) |
| { |
| rtl::OUString sSubSubNodeName(sSubNodeName); |
| sSubSubNodeName += pSubNames[nSub]; |
| Sequence <rtl::OUString> aSubNodeNames = lcl_CreateSubNames(sSubSubNodeName); |
| Sequence< Any> aSubProps = GetProperties(aSubNodeNames); |
| const Any* pSubProps = aSubProps.getConstArray(); |
| |
| rtl::OUString sColumn; |
| pSubProps[0] >>= sColumn; |
| //check for existance of the loaded column name |
| sal_Bool bFound = sal_False; |
| for(sal_Int32 nRealColumn = 0; nRealColumn < aDBColumns.Count(); nRealColumn++) |
| { |
| if(aDBColumns[(sal_uInt16)nRealColumn]->sColumn == sColumn) |
| { |
| bFound = sal_True; |
| break; |
| } |
| } |
| if(!bFound) |
| continue; |
| sal_Int16 nIndex = 0; |
| pSubProps[1] >>= nIndex; |
| SwInsDBColumnPtr pInsDBColumn = new SwInsDBColumn(sColumn, nIndex); |
| if(pSubProps[2].hasValue()) |
| pInsDBColumn->bHasFmt = *(sal_Bool*)pSubProps[2].getValue(); |
| if(pSubProps[3].hasValue()) |
| pInsDBColumn->bIsDBFmt = *(sal_Bool*)pSubProps[3].getValue(); |
| |
| pSubProps[4] >>= pInsDBColumn->sUsrNumFmt; |
| rtl::OUString sNumberFormatLocale; |
| pSubProps[5] >>= sNumberFormatLocale; |
| |
| Locale aLocale; |
| aLocale.Language = sNumberFormatLocale.copy(0, 2); |
| aLocale.Country = sNumberFormatLocale.copy(3, 2); |
| pInsDBColumn->eUsrNumFmtLng = SvxLocaleToLanguage( aLocale ); |
| |
| pInsDBColumn->nUsrNumFmt = rNFmtr.GetEntryKey( pInsDBColumn->sUsrNumFmt, |
| pInsDBColumn->eUsrNumFmtLng ); |
| |
| // pInsDBColumn->nDBNumFmt |
| |
| pNewData->aDBColumns.Insert(pInsDBColumn); |
| } |
| sal_uInt16 n = 0; |
| String sTmp( pNewData->sTblList ); |
| if( sTmp.Len() ) |
| { |
| do { |
| String sEntry( sTmp.GetToken( 0, '\x0a', n ) ); |
| //preselect column - if they still exist! |
| if(aLbTblDbColumn.GetEntryPos(sEntry) != LISTBOX_ENTRY_NOTFOUND) |
| { |
| aLbTableCol.InsertEntry( sEntry ); |
| aLbTblDbColumn.RemoveEntry( sEntry ); |
| } |
| } while( n < sTmp.Len() ); |
| |
| if( !aLbTblDbColumn.GetEntryCount() ) |
| { |
| aIbDbcolAllTo.Enable( sal_False ); |
| aIbDbcolOneTo.Enable( sal_False ); |
| } |
| aIbDbcolOneFrom.Enable( sal_True ); |
| aIbDbcolAllFrom.Enable( sal_True ); |
| } |
| aEdDbText.SetText( pNewData->sEdit ); |
| |
| sTmp = pNewData->sTmplNm; |
| if( sTmp.Len() ) |
| aLbDbParaColl.SelectEntry( sTmp ); |
| else |
| aLbDbParaColl.SelectEntryPos( 0 ); |
| |
| if( pTAutoFmt ) |
| delete pTAutoFmt, pTAutoFmt = 0; |
| sTmp = pNewData->sTAutoFmtNm; |
| if( sTmp.Len() ) |
| { |
| // dann erstmal die AutoFmt-Datei laden und das Autoformat suchen |
| SwTableAutoFmtTbl aAutoFmtTbl; |
| aAutoFmtTbl.Load(); |
| for( sal_uInt16 nAutoFmt = aAutoFmtTbl.Count(); nAutoFmt; ) |
| if( sTmp == aAutoFmtTbl[ --nAutoFmt ]->GetName() ) |
| { |
| pTAutoFmt = new SwTableAutoFmt( *aAutoFmtTbl[ nAutoFmt ] ); |
| break; |
| } |
| } |
| |
| aRbAsTable.Check( pNewData->bIsTable ); |
| aRbAsField.Check( pNewData->bIsField ); |
| aRbAsText.Check( !pNewData->bIsTable && !pNewData->bIsField ); |
| |
| aCbTableHeadon.Check( pNewData->bIsHeadlineOn ); |
| aRbHeadlColnms.Check( !pNewData->bIsEmptyHeadln ); |
| aRbHeadlEmpty.Check( pNewData->bIsEmptyHeadln ); |
| HeaderHdl(&aCbTableHeadon); |
| |
| // jetzt noch die benutzerdefinierten Numberformat Strings in die |
| // Shell kopieren. Nur diese sind dann als ID verfuegbar |
| for( n = 0; n < aDBColumns.Count() ; ++n ) |
| { |
| SwInsDBColumn& rSet = *aDBColumns[ n ]; |
| for( sal_uInt16 m = 0; m < pNewData->aDBColumns.Count() ; ++m ) |
| { |
| SwInsDBColumn& rGet = *pNewData->aDBColumns[ m ]; |
| if(rGet.sColumn == rSet.sColumn) |
| { |
| if( rGet.bHasFmt && !rGet.bIsDBFmt ) |
| { |
| rSet.bIsDBFmt = sal_False; |
| rSet.nUsrNumFmt = rNFmtr.GetEntryKey( rGet.sUsrNumFmt, |
| rGet.eUsrNumFmtLng ); |
| if( NUMBERFORMAT_ENTRY_NOT_FOUND == rSet.nUsrNumFmt ) |
| { |
| xub_StrLen nCheckPos; |
| short nType; |
| String sTmpFmt = rGet.sUsrNumFmt; |
| rNFmtr.PutEntry( sTmpFmt, nCheckPos, nType, |
| rSet.nUsrNumFmt, rGet.eUsrNumFmtLng ); |
| rGet.sUsrNumFmt = sTmpFmt; |
| } |
| } |
| break; |
| } |
| } |
| } |
| |
| // steht der Cursor in einer Tabelle, darf NIE Tabelle auswaehlbar sein |
| if( !aRbAsTable.IsEnabled() && aRbAsTable.IsChecked() ) |
| aRbAsField.Check( sal_True ); |
| delete pNewData; |
| break; |
| } |
| } |
| } |
| |