| /************************************************************** |
| * |
| * 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 <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> |
| #include <view.hxx> |
| #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> |
| #include <docsh.hxx> |
| #include <doc.hxx> |
| #include <wrtsh.hxx> |
| #include <fmtsrnd.hxx> |
| #include <pagedesc.hxx> |
| #include <fmtanchr.hxx> |
| #include <fmtornt.hxx> |
| #include <fmtfsize.hxx> |
| #include <editeng/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( sal_False ); |
| m_aExampleContainerWIN.Show(sal_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(sal_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( ::svt::WizardTypes::CommitPageReason _eReason ) |
| { |
| //now insert the frame and the greeting |
| SwMailMergeConfigItem& rConfigItem = m_pWizard->GetConfigItem(); |
| if(::svt::WizardTypes::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_AT_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(sal_uInt16 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(sal_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(sal_uInt16 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(sal_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( sal_True ); |
| m_aExampleContainerWIN.Show(sal_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; |
| sal_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; |
| } |