summaryrefslogtreecommitdiff
path: root/sw/source/ui/dbui/mmlayoutpage.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/ui/dbui/mmlayoutpage.cxx')
-rw-r--r--sw/source/ui/dbui/mmlayoutpage.cxx823
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;
+}