diff options
Diffstat (limited to 'sw/source/ui/dbui/mmlayoutpage.cxx')
-rw-r--r-- | sw/source/ui/dbui/mmlayoutpage.cxx | 823 |
1 files changed, 823 insertions, 0 deletions
diff --git a/sw/source/ui/dbui/mmlayoutpage.cxx b/sw/source/ui/dbui/mmlayoutpage.cxx new file mode 100644 index 000000000000..958b9497a08a --- /dev/null +++ b/sw/source/ui/dbui/mmlayoutpage.cxx @@ -0,0 +1,823 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: mmlayoutpage.cxx,v $ + * $Revision: 1.21 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sw.hxx" +#ifdef SW_DLLIMPLEMENTATION +#undef SW_DLLIMPLEMENTATION +#endif +#include <swtypes.hxx> +#include <mmlayoutpage.hxx> +#include <mailmergewizard.hxx> +#include <mmconfigitem.hxx> +#include <mailmergehelper.hxx> +#include <unotools.hxx> +#include <unotools/tempfile.hxx> +#include <uitool.hxx> +#include <svx/dlgutil.hxx> +#ifndef _VIEW_HXX +#include <view.hxx> +#endif +#include <swundo.hxx> +#include <sfx2/dispatch.hxx> +#include <svl/stritem.hxx> +#include <sfx2/docfilt.hxx> +#include <com/sun/star/text/XParagraphCursor.hpp> +#include <com/sun/star/view/XViewSettingsSupplier.hpp> +#include <com/sun/star/view/DocumentZoomType.hpp> +#include <fldmgr.hxx> +#include <fldbas.hxx> +#include <poolfmt.hxx> +#include <unotxdoc.hxx> +#ifndef _DOCSH_HXX +#include <docsh.hxx> +#endif +#include <doc.hxx> +#include <wrtsh.hxx> +#include <fmtsrnd.hxx> +#include <pagedesc.hxx> +#include <fmtanchr.hxx> +#include <fmtornt.hxx> +#include <fmtfsize.hxx> +#include <svx/boxitem.hxx> +#include <svl/urihelper.hxx> +#include <shellio.hxx> +#include <osl/file.hxx> +#include <unoprnms.hxx> + +#include <mmlayoutpage.hrc> +#include <dbui.hrc> +#include <unomid.h> + +using namespace osl; +using namespace svt; +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::text; +using namespace ::com::sun::star::frame; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::view; + +#define DEFAULT_LEFT_DISTANCE (MM50*5) // 2,5 cm +#define DEFAULT_TOP_DISTANCE (MM50*11) // 5,5 cm +#define GREETING_TOP_DISTANCE (MM50*25) //12,5 cm +#define DEFAULT_ADDRESS_WIDTH (MM50*15)// 7,5 cm +#define DEFAULT_ADDRESS_HEIGHT (MM50*7) // 3,5cm + +/*-- 15.04.2004 08:16:35--------------------------------------------------- + + -----------------------------------------------------------------------*/ +SwMailMergeLayoutPage::SwMailMergeLayoutPage( SwMailMergeWizard* _pParent) : + svt::OWizardPage( _pParent, SW_RES(DLG_MM_LAYOUT_PAGE)), +#ifdef MSC +#pragma warning (disable : 4355) +#endif + m_aHeaderFI( this, SW_RES( FI_HEADER )), + m_aPositionFL( this, SW_RES( FL_POSITION )), + m_aAlignToBodyCB( this, SW_RES( CB_ALIGN )), + m_aLeftFT( this, SW_RES( FT_LEFT )), + m_aLeftMF( this, SW_RES( MF_LEFT )), + m_aTopFT( this, SW_RES( FT_TOP )), + m_aTopMF( this, SW_RES( MF_TOP )), + m_aGreetingLineFL( this, SW_RES( FL_GREETINGLINE )), + m_aUpFT( this, SW_RES( FT_UP )), + m_aUpPB( this, SW_RES( MF_UP )), + m_aDownFT( this, SW_RES( FT_DOWN )), + m_aDownPB( this, SW_RES( PB_DOWN )), + m_aExampleContainerWIN( this, SW_RES( WIN_EXAMPLECONTAINER )), + m_aExampleWIN( this, 0 ), + m_aZoomFT( this, SW_RES( FT_ZOOM )), + m_aZoomLB( this, SW_RES( LB_ZOOM )), +#ifdef MSC +#pragma warning (default : 4355) +#endif + m_pExampleFrame(0), + m_pExampleWrtShell(0), + m_pAddressBlockFormat(0), + m_bIsGreetingInserted(false), + m_pWizard(_pParent) +{ + FreeResource(); + m_aExampleWIN.SetPosSizePixel(m_aExampleContainerWIN.GetPosPixel(), + m_aExampleContainerWIN.GetSizePixel()); + + + const SfxFilter *pSfxFlt = SwIoSystem::GetFilterOfFormat( + String::CreateFromAscii( FILTER_XML ), + SwDocShell::Factory().GetFilterContainer() ); + //save the current document into a temporary file + { + //temp file needs it's own block + //creating with extension is not supported by a static method :-( + String sLeading; + String sExt(pSfxFlt->GetDefaultExtension()); + sExt.EraseLeadingChars('*'); + utl::TempFile aTempFile( sLeading, &sExt ); + m_sExampleURL = aTempFile.GetURL(); + aTempFile.EnableKillingFile(); + } + SwView* pView = m_pWizard->GetSwView(); + uno::Sequence< beans::PropertyValue > aValues(1); + beans::PropertyValue* pValues = aValues.getArray(); + pValues[0].Name = C2U("FilterName"); + pValues[0].Value <<= ::rtl::OUString(pSfxFlt->GetFilterName()); + + uno::Reference< frame::XStorable > xStore( pView->GetDocShell()->GetModel(), uno::UNO_QUERY); + xStore->storeToURL( m_sExampleURL, aValues ); + + Link aLink(LINK(this, SwMailMergeLayoutPage, PreviewLoadedHdl_Impl)); + m_pExampleFrame = new SwOneExampleFrame( m_aExampleWIN, + EX_SHOW_DEFAULT_PAGE, &aLink, &m_sExampleURL ); + + m_aExampleWIN.Show( FALSE ); + m_aExampleContainerWIN.Show(TRUE); + + m_aLeftMF.SetValue(m_aLeftMF.Normalize(DEFAULT_LEFT_DISTANCE), FUNIT_TWIP); + m_aTopMF.SetValue(m_aTopMF.Normalize(DEFAULT_TOP_DISTANCE), FUNIT_TWIP); + + m_aZoomLB.InsertEntry(String::CreateFromAscii("50 %"), 1); + m_aZoomLB.InsertEntry(String::CreateFromAscii("75 %"), 2); + m_aZoomLB.InsertEntry(String::CreateFromAscii("100 %"), 3); + m_aZoomLB.SelectEntryPos(0); //page size + m_aZoomLB.SetSelectHdl(LINK(this, SwMailMergeLayoutPage, ZoomHdl_Impl)); + + Link aFrameHdl = LINK(this, SwMailMergeLayoutPage, ChangeAddressHdl_Impl); + m_aLeftMF.SetUpHdl(aFrameHdl); + m_aLeftMF.SetDownHdl(aFrameHdl); + m_aLeftMF.SetLoseFocusHdl(aFrameHdl); + m_aTopMF.SetUpHdl(aFrameHdl); + m_aTopMF.SetDownHdl(aFrameHdl); + m_aTopMF.SetLoseFocusHdl(aFrameHdl); + + FieldUnit eFieldUnit = ::GetDfltMetric(sal_False); + ::SetFieldUnit( m_aLeftMF, eFieldUnit ); + ::SetFieldUnit( m_aTopMF, eFieldUnit ); + + Link aUpDownHdl = LINK(this, SwMailMergeLayoutPage, GreetingsHdl_Impl ); + m_aUpPB.SetClickHdl(aUpDownHdl); + m_aDownPB.SetClickHdl(aUpDownHdl); + m_aAlignToBodyCB.SetClickHdl(LINK(this, SwMailMergeLayoutPage, AlignToTextHdl_Impl)); + m_aAlignToBodyCB.Check(); +} +/*-- 15.04.2004 08:17:11--------------------------------------------------- + + -----------------------------------------------------------------------*/ +SwMailMergeLayoutPage::~SwMailMergeLayoutPage() +{ + delete m_pExampleFrame; + File::remove( m_sExampleURL ); + +} +/*-- 27.05.2004 13:41:04--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwMailMergeLayoutPage::ActivatePage() +{ + SwMailMergeConfigItem& rConfigItem = m_pWizard->GetConfigItem(); + sal_Bool bGreetingLine = rConfigItem.IsGreetingLine(sal_False) && !rConfigItem.IsGreetingInserted(); + sal_Bool bAddressBlock = rConfigItem.IsAddressBlock() && !rConfigItem.IsAddressInserted(); + + m_aPositionFL.Enable(bAddressBlock); + m_aLeftFT.Enable(bAddressBlock); + m_aTopFT.Enable(bAddressBlock); + m_aLeftMF.Enable(bAddressBlock); + m_aTopMF.Enable(bAddressBlock); + AlignToTextHdl_Impl( &m_aAlignToBodyCB ); + + m_aGreetingLineFL.Enable(bGreetingLine); + m_aUpPB.Enable(bGreetingLine); + m_aDownPB.Enable(bGreetingLine); + m_aUpFT.Enable(bGreetingLine); + m_aDownFT.Enable(bGreetingLine); + + //check if greeting and/or address frame have to be inserted/removed + if(m_pExampleWrtShell) // initially there's nothing to check + { + if(!rConfigItem.IsGreetingInserted() && + m_bIsGreetingInserted != (0 != bGreetingLine) ) + { + if( m_bIsGreetingInserted ) + { + m_pExampleWrtShell->DelFullPara(); + m_bIsGreetingInserted = false; + } + else + { + InsertGreeting(*m_pExampleWrtShell, m_pWizard->GetConfigItem(), true); + m_bIsGreetingInserted = true; + } + } + if(!rConfigItem.IsAddressInserted() && + rConfigItem.IsAddressBlock() != ( 0 != m_pAddressBlockFormat )) + { + if( m_pAddressBlockFormat ) + { + m_pExampleWrtShell->Push(); + m_pExampleWrtShell->GotoFly( m_pAddressBlockFormat->GetName() ); + m_pExampleWrtShell->DelRight(); + m_pAddressBlockFormat = 0; + m_pExampleWrtShell->Pop(FALSE); + } + else + { + long nLeft = static_cast< long >(m_aLeftMF.Denormalize(m_aLeftMF.GetValue(FUNIT_TWIP))); + long nTop = static_cast< long >(m_aTopMF.Denormalize(m_aTopMF.GetValue(FUNIT_TWIP))); + m_pAddressBlockFormat = InsertAddressFrame( + *m_pExampleWrtShell, m_pWizard->GetConfigItem(), + Point(nLeft, nTop), + m_aAlignToBodyCB.IsChecked(), true); + } + } + + } +} +/*-- 11.05.2004 10:41:26--------------------------------------------------- + + -----------------------------------------------------------------------*/ +sal_Bool SwMailMergeLayoutPage::commitPage( CommitPageReason _eReason ) +{ + //now insert the frame and the greeting + SwMailMergeConfigItem& rConfigItem = m_pWizard->GetConfigItem(); + if(eTravelForward == _eReason) + { + long nLeft = static_cast< long >(m_aLeftMF.Denormalize(m_aLeftMF.GetValue(FUNIT_TWIP))); + long nTop = static_cast< long >(m_aTopMF.Denormalize(m_aTopMF.GetValue(FUNIT_TWIP))); + InsertAddressAndGreeting( + m_pWizard->GetSwView(), + rConfigItem, + Point(nLeft, nTop), + m_aAlignToBodyCB.IsChecked()); + } + return sal_True; +} +/*-- 24.06.2004 09:50:26--------------------------------------------------- + + -----------------------------------------------------------------------*/ +SwFrmFmt* SwMailMergeLayoutPage::InsertAddressAndGreeting(SwView* pView, + SwMailMergeConfigItem& rConfigItem, + const Point& rAddressPosition, + bool bAlignToBody) +{ + SwFrmFmt* pAddressBlockFormat = 0; + pView->GetWrtShell().StartUndo(UNDO_INSERT); + if(rConfigItem.IsAddressBlock() && !rConfigItem.IsAddressInserted()) + { + //insert the frame + Point aAddressPosition(DEFAULT_LEFT_DISTANCE, DEFAULT_TOP_DISTANCE); + if(rAddressPosition.X() > 0 && rAddressPosition.Y() > 0) + aAddressPosition = rAddressPosition; + pAddressBlockFormat = InsertAddressFrame( pView->GetWrtShell(), + rConfigItem, + aAddressPosition, bAlignToBody, false); + rConfigItem.SetAddressInserted(pAddressBlockFormat->GetName()); + } + //now the greeting + if(rConfigItem.IsGreetingLine(sal_False) && !rConfigItem.IsGreetingInserted()) + { + InsertGreeting( pView->GetWrtShell(), rConfigItem, false); + rConfigItem.SetGreetingInserted(); + } + pView->GetWrtShell().EndUndo(UNDO_INSERT); + return pAddressBlockFormat; +} +/*-- 11.05.2004 12:49:04--------------------------------------------------- + + -----------------------------------------------------------------------*/ +SwFrmFmt* SwMailMergeLayoutPage::InsertAddressFrame( + SwWrtShell& rShell, + SwMailMergeConfigItem& rConfigItem, + const Point& rDestination, + bool bAlignLeft, + bool bExample) +{ + // insert the address block and the greeting line + SfxItemSet aSet(rShell.GetAttrPool(), RES_ANCHOR, RES_ANCHOR, + RES_VERT_ORIENT, RES_VERT_ORIENT, + RES_HORI_ORIENT, RES_HORI_ORIENT, + RES_BOX, RES_BOX, + RES_FRM_SIZE, RES_FRM_SIZE, + RES_SURROUND, RES_SURROUND, + 0 ); + aSet.Put(SwFmtAnchor(FLY_PAGE, 1)); + if(bAlignLeft) + aSet.Put(SwFmtHoriOrient( 0, text::HoriOrientation::NONE, text::RelOrientation::PAGE_PRINT_AREA )); + else + aSet.Put(SwFmtHoriOrient( rDestination.X(), text::HoriOrientation::NONE, text::RelOrientation::PAGE_FRAME )); + aSet.Put(SwFmtVertOrient( rDestination.Y(), text::VertOrientation::NONE, text::RelOrientation::PAGE_FRAME )); + aSet.Put(SwFmtFrmSize( ATT_MIN_SIZE, DEFAULT_ADDRESS_WIDTH, DEFAULT_ADDRESS_HEIGHT )); + // the example gets a border around the frame, the real document doesn't get one + if(!bExample) + aSet.Put(SvxBoxItem( RES_BOX )); + aSet.Put(SwFmtSurround( SURROUND_NONE )); + + rShell.NewFlyFrm(aSet, sal_True ); + SwFrmFmt* pRet = rShell.GetFlyFrmFmt(); + ASSERT( pRet, "Fly not inserted" ); + + rShell.UnSelectFrm(); + const Sequence< ::rtl::OUString> aBlocks = rConfigItem.GetAddressBlocks(); + if(bExample) + { + rShell.Insert(aBlocks[0]); + } + else + { + //the placeholders should be replaced by the appropriate fields + SwFldMgr aFldMgr(&rShell); + //create a database string source.command.commandtype.column + const SwDBData& rData = rConfigItem.GetCurrentDBData(); + String sDBName(rData.sDataSource); + sDBName += DB_DELIM; + sDBName += String(rData.sCommand); + sDBName += DB_DELIM; + String sDatabaseConditionPrefix(sDBName); + sDatabaseConditionPrefix.SearchAndReplaceAll(DB_DELIM, '.'); + sDBName += String::CreateFromInt32(rData.nCommandType); + sDBName += DB_DELIM; + + // if only the country is in an address line the + // paragraph has to be hidden depending on the + // IsIncludeCountry()/GetExcludeCountry() settings + + sal_Bool bIncludeCountry = rConfigItem.IsIncludeCountry(); + sal_Bool bHideEmptyParagraphs = rConfigItem.IsHideEmptyParagraphs(); + const ::rtl::OUString rExcludeCountry = rConfigItem.GetExcludeCountry(); + bool bSpecialReplacementForCountry = (!bIncludeCountry || rExcludeCountry.getLength()); + + const ResStringArray& rHeaders = rConfigItem.GetDefaultAddressHeaders(); + String sCountryColumn = rHeaders.GetString(MM_PART_COUNTRY); + Sequence< ::rtl::OUString> aAssignment = + rConfigItem.GetColumnAssignment( rConfigItem.GetCurrentDBData() ); + const ::rtl::OUString* pAssignment = aAssignment.getConstArray(); + if(aAssignment.getLength() > MM_PART_COUNTRY && aAssignment[MM_PART_COUNTRY].getLength()) + sCountryColumn = aAssignment[MM_PART_COUNTRY]; + // + String sHideParagraphsExpression; + SwAddressIterator aIter(aBlocks[0]); + while(aIter.HasMore()) + { + SwMergeAddressItem aItem = aIter.Next(); + if(aItem.bIsColumn) + { + String sConvertedColumn = aItem.sText; + for(USHORT nColumn = 0; + nColumn < rHeaders.Count() && nColumn < aAssignment.getLength(); + ++nColumn) + { + if(rHeaders.GetString(nColumn) == aItem.sText && + pAssignment[nColumn].getLength()) + { + sConvertedColumn = pAssignment[nColumn]; + break; + } + } + String sDB(sDBName); + sDB += sConvertedColumn; + + if(sHideParagraphsExpression.Len()) + sHideParagraphsExpression.AppendAscii(" AND "); + sHideParagraphsExpression += '!'; + sHideParagraphsExpression += '['; + sHideParagraphsExpression += sDatabaseConditionPrefix; + sHideParagraphsExpression += sConvertedColumn; + sHideParagraphsExpression += ']'; + + if( bSpecialReplacementForCountry && sCountryColumn == sConvertedColumn ) + { + // now insert a hidden paragraph field + String sExpression; + if( rExcludeCountry.getLength() ) + { + sExpression = sDatabaseConditionPrefix; + sExpression.Insert('[', 0); + sExpression += sCountryColumn; + sExpression.AppendAscii("]"); + + String sCondition(sExpression); + sCondition.AppendAscii(" != \""); + sCondition += String(rExcludeCountry); + sCondition += '\"'; + + SwInsertFld_Data aData(TYP_CONDTXTFLD, 0, sCondition, sExpression, 0, &rShell ); + aFldMgr.InsertFld( aData ); + } + else + { + SwInsertFld_Data aData(TYP_HIDDENPARAFLD, 0, sExpression, aEmptyStr, 0, &rShell ); + aFldMgr.InsertFld( aData ); + } + } + else + { + SwInsertFld_Data aData(TYP_DBFLD, 0, sDB, aEmptyStr, 0, &rShell ); + aFldMgr.InsertFld( aData ); + } + } + else if(!aItem.bIsReturn) + { + rShell.Insert(aItem.sText); + } + else + { + if(bHideEmptyParagraphs) + { + SwInsertFld_Data aData(TYP_HIDDENPARAFLD, 0, sHideParagraphsExpression, aEmptyStr, 0, &rShell ); + aFldMgr.InsertFld( aData ); + } + sHideParagraphsExpression.Erase(); + //now add a new paragraph + rShell.SplitNode(); + } + } + if(bHideEmptyParagraphs && sHideParagraphsExpression.Len()) + { + SwInsertFld_Data aData(TYP_HIDDENPARAFLD, 0, sHideParagraphsExpression, aEmptyStr, 0, &rShell ); + aFldMgr.InsertFld( aData ); + } + } + return pRet; +} + +/*-- 12.05.2004 12:20:19--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwMailMergeLayoutPage::InsertGreeting(SwWrtShell& rShell, SwMailMergeConfigItem& rConfigItem, bool bExample) +{ + //set the cursor to the desired position - if no text content is here then + //new paragraphs are inserted + const SwRect& rPageRect = rShell.GetAnyCurRect(RECT_PAGE); + const Point aGreetingPos( DEFAULT_LEFT_DISTANCE + rPageRect.Left(), GREETING_TOP_DISTANCE ); + + const sal_Bool bRet = rShell.SetShadowCrsrPos( aGreetingPos, FILL_SPACE ); + + if(!bRet) + { + //there's already text at the desired position + //go to start of the doc, directly! + rShell.SttEndDoc(TRUE); + //and go by paragraph until the position is reached + long nYPos = rShell.GetCharRect().Top(); + while(nYPos < GREETING_TOP_DISTANCE) + { + if(!rShell.FwdPara()) + break; + nYPos = rShell.GetCharRect().Top(); + } + //text needs to be appended + while(nYPos < GREETING_TOP_DISTANCE) + { + if(!rShell.AppendTxtNode()) + break; + nYPos = rShell.GetCharRect().Top(); + } + } + else + { + //we may end up inside of a paragraph if the left margin is not at DEFAULT_LEFT_DISTANCE + rShell.MovePara(GetfnParaCurr(), GetfnParaStart()); + } + bool bSplitNode = rShell.GetText().Len() > 0; +// rShell.SetTxtFmtColl( rShell.GetTxtCollFromPool( RES_POOLCOLL_GREETING ) ); + sal_Int32 nMoves = rConfigItem.GetGreetingMoves(); + if( !bExample && 0 != nMoves ) + { + if(nMoves < 0) + { + rShell.MoveParagraph( nMoves ); + } + else + while(nMoves) + { + sal_Bool bMoved = rShell.MoveParagraph( 1 ); + if(!bMoved) + { + //insert a new paragraph before the greeting line + rShell.SplitNode(); + } + --nMoves; + } + } + //now insert the greeting text - if we have any? + const sal_Bool bIndividual = rConfigItem.IsIndividualGreeting(sal_False); + String sGreeting; + if(bIndividual) + { + //lock expression fields - prevents hiding of the paragraph to insert into + rShell.LockExpFlds(); + if(bExample) + { + for(sal_Int8 eGender = SwMailMergeConfigItem::FEMALE; + eGender <= SwMailMergeConfigItem::NEUTRAL; ++eGender) + { + Sequence< ::rtl::OUString > aEntries = + rConfigItem.GetGreetings((SwMailMergeConfigItem::Gender)eGender); + sal_Int32 nCurrent = rConfigItem.GetCurrentGreeting((SwMailMergeConfigItem::Gender)eGender); + if( nCurrent >= 0 && nCurrent < aEntries.getLength()) + { + sGreeting = aEntries[nCurrent]; + rShell.Insert(sGreeting); + break; + } + } + } + else + { + SwFldMgr aFldMgr(&rShell); + //three paragraphs, each with an appropriate hidden paragraph field + //are to be inserted + + //name of the gender column + String sGenderColumn = rConfigItem.GetAssignedColumn(MM_PART_GENDER); + String sNameColumn = rConfigItem.GetAssignedColumn(MM_PART_LASTNAME); + + const ::rtl::OUString& rFemaleGenderValue = rConfigItem.GetFemaleGenderValue(); + sal_Bool bHideEmptyParagraphs = rConfigItem.IsHideEmptyParagraphs(); + const SwDBData& rData = rConfigItem.GetCurrentDBData(); + String sConditionBase(rData.sDataSource); + sConditionBase += '.'; + sConditionBase += String(rData.sCommand); + sConditionBase += '.'; + //split the name column from here + String sNameColumnBase(sConditionBase); + + sConditionBase += String(sGenderColumn); + sConditionBase += ']'; + sConditionBase.Insert('[', 0); + + sNameColumnBase += String(sNameColumn); + sNameColumnBase += ']'; + sNameColumnBase.Insert('[', 0); + + String sDBName(rData.sDataSource); + sDBName += DB_DELIM; + sDBName += String(rData.sCommand); + sDBName += DB_DELIM; + sDBName += String::CreateFromInt32(rData.nCommandType); + sDBName += DB_DELIM; + +// Female: [database.sGenderColumn] != "rFemaleGenderValue" && [database.NameColumn] +// Male: [database.sGenderColumn] == "rFemaleGenderValue" && [database.rGenderColumn] +// Neutral: [database.sNameColumn] + DBG_ASSERT(sGenderColumn.Len() && rFemaleGenderValue.getLength(), + "gender settings not available - how to form the condition?"); + //column used as lastname + for(sal_Int8 eGender = SwMailMergeConfigItem::FEMALE; + eGender <= SwMailMergeConfigItem::NEUTRAL; ++eGender) + { + Sequence< ::rtl::OUString> aEntries = rConfigItem.GetGreetings((SwMailMergeConfigItem::Gender)eGender); + sal_Int32 nCurrent = rConfigItem.GetCurrentGreeting((SwMailMergeConfigItem::Gender)eGender); + if( nCurrent >= 0 && nCurrent < aEntries.getLength()) + { + sGreeting = aEntries[nCurrent]; + String sCondition(sConditionBase); + String sHideParagraphsExpression; + switch(eGender) + { + case SwMailMergeConfigItem::FEMALE: + sCondition.AppendAscii(" != \""); + sCondition += String(rFemaleGenderValue); + sCondition.AppendAscii("\" OR NOT "); + sCondition += String(sNameColumnBase); + + sHideParagraphsExpression += '!'; + sHideParagraphsExpression += sNameColumnBase; + break; + case SwMailMergeConfigItem::MALE: + sCondition.AppendAscii(" == \""); + sCondition += String(rFemaleGenderValue); + sCondition.AppendAscii("\" OR NOT "); + sCondition += String(sNameColumnBase); + break; + case SwMailMergeConfigItem::NEUTRAL: + sCondition = sNameColumnBase; + break; + } + + if(bHideEmptyParagraphs && sHideParagraphsExpression.Len()) + { + String sComplete( sCondition ); + sComplete.Insert('(', 0); + sComplete.AppendAscii( ") OR ("); + sComplete += sHideParagraphsExpression; + sComplete += ')'; + SwInsertFld_Data aData(TYP_HIDDENPARAFLD, 0, sComplete, aEmptyStr, 0, &rShell ); + aFldMgr.InsertFld( aData ); + } + else + { + SwInsertFld_Data aData(TYP_HIDDENPARAFLD, 0, sCondition, aEmptyStr, 0, &rShell ); + aFldMgr.InsertFld( aData ); + } + //now the text has to be inserted + const ResStringArray& rHeaders = rConfigItem.GetDefaultAddressHeaders(); + Sequence< ::rtl::OUString> aAssignment = + rConfigItem.GetColumnAssignment( rConfigItem.GetCurrentDBData() ); + const ::rtl::OUString* pAssignment = aAssignment.getConstArray(); + SwAddressIterator aIter(sGreeting); + while(aIter.HasMore()) + { + SwMergeAddressItem aItem = aIter.Next(); + if(aItem.bIsColumn) + { + String sDB(sDBName); + String sConvertedColumn = aItem.sText; + for(USHORT nColumn = 0; + nColumn < rHeaders.Count() && nColumn < aAssignment.getLength(); + ++nColumn) + { + if(rHeaders.GetString(nColumn) == aItem.sText && + pAssignment[nColumn].getLength()) + { + sConvertedColumn = pAssignment[nColumn]; + break; + } + } + sDB += sConvertedColumn; + SwInsertFld_Data aData(TYP_DBFLD, 0, sDB, aEmptyStr, 0, &rShell ); + aFldMgr.InsertFld( aData ); + } + else + { + rShell.Insert(aItem.sText); + } + } + //now add a new paragraph + rShell.SplitNode(); + } + } + + } + rShell.UnlockExpFlds(); + } + else + { + Sequence< ::rtl::OUString> aEntries = rConfigItem.GetGreetings(SwMailMergeConfigItem::NEUTRAL); + sal_Int32 nCurrent = rConfigItem.GetCurrentGreeting(SwMailMergeConfigItem::NEUTRAL); + if( nCurrent >= 0 && nCurrent < aEntries.getLength()) + sGreeting = aEntries[nCurrent]; + rShell.Insert(sGreeting); + } + // now insert a new paragraph here if necessary + if(bSplitNode) + { + rShell.Push(); + rShell.SplitNode(); + rShell.Pop(FALSE); + } + //put the cursor to the start of the paragraph + rShell.SttPara(); + + DBG_ASSERT(0 == rShell.GetTableFmt(), "What to do with a table here?"); +} +/*-- 10.05.2004 09:34:25--------------------------------------------------- + + -----------------------------------------------------------------------*/ +IMPL_LINK(SwMailMergeLayoutPage, PreviewLoadedHdl_Impl, void*, EMPTYARG) +{ + m_aExampleWIN.Show( TRUE ); + m_aExampleContainerWIN.Show(FALSE); + + Reference< XModel > & xModel = m_pExampleFrame->GetModel(); + //now the ViewOptions should be set properly + Reference< XViewSettingsSupplier > xSettings(xModel->getCurrentController(), UNO_QUERY); + m_xViewProperties = xSettings->getViewSettings(); + Reference< XUnoTunnel > xDocTunnel(xModel, UNO_QUERY); + SwXTextDocument* pXDoc = reinterpret_cast<SwXTextDocument*>(xDocTunnel->getSomething(SwXTextDocument::getUnoTunnelId())); + SwDocShell* pDocShell = pXDoc->GetDocShell(); + m_pExampleWrtShell = pDocShell->GetWrtShell(); + DBG_ASSERT(m_pExampleWrtShell, "No SwWrtShell found!"); + if(!m_pExampleWrtShell) + return 0; + + SwMailMergeConfigItem& rConfigItem = m_pWizard->GetConfigItem(); + if(rConfigItem.IsAddressBlock()) + { + m_pAddressBlockFormat = InsertAddressFrame( + *m_pExampleWrtShell, rConfigItem, + Point(DEFAULT_LEFT_DISTANCE, DEFAULT_TOP_DISTANCE), + m_aAlignToBodyCB.IsChecked(), true); + } + if(rConfigItem.IsGreetingLine(sal_False)) + { + InsertGreeting(*m_pExampleWrtShell, rConfigItem, true); + m_bIsGreetingInserted = true; + } + + Any aZoom; + aZoom <<= (sal_Int16)DocumentZoomType::ENTIRE_PAGE; + m_xViewProperties->setPropertyValue(C2U(SW_PROP_NAME_STR(UNO_NAME_ZOOM_TYPE)), aZoom); + + +// m_pExampleWrtShell->SetTxtFmtColl( rSh.GetTxtCollFromPool( RES_POOLCOLL_STANDARD ) ); + const SwFmtFrmSize& rPageSize = m_pExampleWrtShell->GetPageDesc( + m_pExampleWrtShell->GetCurPageDesc()).GetMaster().GetFrmSize(); + m_aLeftMF.SetMax(rPageSize.GetWidth() - DEFAULT_LEFT_DISTANCE); + m_aTopMF.SetMax(rPageSize.GetHeight() - DEFAULT_TOP_DISTANCE); + return 0; +} +/*-- 10.05.2004 14:05:24--------------------------------------------------- + + -----------------------------------------------------------------------*/ +IMPL_LINK(SwMailMergeLayoutPage, ZoomHdl_Impl, ListBox*, pBox) +{ + if(m_pExampleWrtShell) + { + sal_Int16 eType = DocumentZoomType::BY_VALUE; + short nZoom = 50; + switch(pBox->GetSelectEntryPos()) + { + case 0 : eType = DocumentZoomType::ENTIRE_PAGE; break; + case 1 : nZoom = 50; break; + case 2 : nZoom = 75; break; + case 3 : nZoom = 100; break; + } + Any aZoom; + aZoom <<= eType; + m_xViewProperties->setPropertyValue(C2U(SW_PROP_NAME_STR(UNO_NAME_ZOOM_TYPE)), aZoom); + aZoom <<= nZoom; + m_xViewProperties->setPropertyValue(C2U(SW_PROP_NAME_STR(UNO_NAME_ZOOM_VALUE)), aZoom); + + } + return 0; +} + + +/*-- 10.05.2004 15:56:51--------------------------------------------------- + + -----------------------------------------------------------------------*/ +IMPL_LINK(SwMailMergeLayoutPage, ChangeAddressHdl_Impl, MetricField*, EMPTYARG) +{ + if(m_pExampleWrtShell && m_pAddressBlockFormat) + { + long nLeft = static_cast< long >(m_aLeftMF.Denormalize(m_aLeftMF.GetValue(FUNIT_TWIP))); + long nTop = static_cast< long >(m_aTopMF.Denormalize(m_aTopMF.GetValue(FUNIT_TWIP))); + + SfxItemSet aSet(m_pExampleWrtShell->GetAttrPool(), RES_ANCHOR, RES_ANCHOR, + RES_VERT_ORIENT, RES_VERT_ORIENT, + RES_HORI_ORIENT, RES_HORI_ORIENT, + 0 ); + if(m_aAlignToBodyCB.IsChecked()) + aSet.Put(SwFmtHoriOrient( 0, text::HoriOrientation::NONE, text::RelOrientation::PAGE_PRINT_AREA )); + else + aSet.Put(SwFmtHoriOrient( nLeft, text::HoriOrientation::NONE, text::RelOrientation::PAGE_FRAME )); + aSet.Put(SwFmtVertOrient( nTop, text::VertOrientation::NONE, text::RelOrientation::PAGE_FRAME )); + m_pExampleWrtShell->GetDoc()->SetFlyFrmAttr( *m_pAddressBlockFormat, aSet ); + } + return 0; +} + +/*-- 10.05.2004 16:13:36--------------------------------------------------- + + -----------------------------------------------------------------------*/ +IMPL_LINK(SwMailMergeLayoutPage, GreetingsHdl_Impl, PushButton*, pButton) +{ + bool bDown = pButton == &m_aDownPB; + BOOL bMoved = m_pExampleWrtShell->MoveParagraph( bDown ? 1 : -1 ); + if (bMoved || bDown) + m_pWizard->GetConfigItem().MoveGreeting(bDown ? 1 : -1 ); + if(!bMoved && bDown) + { + //insert a new paragraph before the greeting line + m_pExampleWrtShell->SplitNode(); + } + + return 0; +} +/*-- 15.07.2004 16:05:30--------------------------------------------------- + + -----------------------------------------------------------------------*/ +IMPL_LINK(SwMailMergeLayoutPage, AlignToTextHdl_Impl, CheckBox*, pBox) +{ + sal_Bool bCheck = pBox->IsChecked() && pBox->IsEnabled(); + m_aLeftFT.Enable(!bCheck); + m_aLeftMF.Enable(!bCheck); + ChangeAddressHdl_Impl( 0 ); + return 0; +} |