summaryrefslogtreecommitdiff
path: root/sw/source/core/uibase/app/applab.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/core/uibase/app/applab.cxx')
-rw-r--r--sw/source/core/uibase/app/applab.cxx403
1 files changed, 403 insertions, 0 deletions
diff --git a/sw/source/core/uibase/app/applab.cxx b/sw/source/core/uibase/app/applab.cxx
new file mode 100644
index 000000000000..4118e705b98c
--- /dev/null
+++ b/sw/source/core/uibase/app/applab.cxx
@@ -0,0 +1,403 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * 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 .
+ */
+
+#include <cstdarg>
+
+#include <hintids.hxx>
+
+#include <comphelper/string.hxx>
+#include <vcl/svapp.hxx>
+#include <vcl/wrkwin.hxx>
+#include <vcl/msgbox.hxx>
+#include <sfx2/app.hxx>
+#include <sfx2/dispatch.hxx>
+#include <sfx2/printer.hxx>
+#include <sfx2/request.hxx>
+#include <sfx2/linkmgr.hxx>
+#include <editeng/pbinitem.hxx>
+#include <editeng/ulspitem.hxx>
+#include <editeng/lrspitem.hxx>
+#include <editeng/boxitem.hxx>
+#include <editeng/paperinf.hxx>
+#include <editeng/protitem.hxx>
+#include <com/sun/star/frame/XStorable.hpp>
+#include <com/sun/star/frame/XModel.hpp>
+#include <fmthdft.hxx>
+#include <fmtanchr.hxx>
+#include <fmtfsize.hxx>
+#include <fmtornt.hxx>
+#include <swwait.hxx>
+#include <gloshdl.hxx>
+#include <mdiexp.hxx>
+#include <frmatr.hxx>
+#include <paratr.hxx>
+#include <swmodule.hxx>
+#include <view.hxx>
+#include <docsh.hxx>
+#include <fldbas.hxx>
+#include <swundo.hxx>
+#include <wrtsh.hxx>
+#include <cmdid.h>
+#include <dbmgr.hxx>
+#include <fmtcol.hxx>
+#include <expfld.hxx>
+#include <fldmgr.hxx>
+#include <label.hxx>
+#include <labimg.hxx>
+#include <section.hxx>
+#include <pagedesc.hxx>
+#include <poolfmt.hxx>
+
+#include <app.hrc>
+#include <poolfmt.hrc>
+#include "swabstdlg.hxx"
+#include "envelp.hrc"
+#include <misc.hrc>
+
+#include <IDocumentDeviceAccess.hxx>
+
+#include <boost/scoped_ptr.hpp>
+
+using namespace ::com::sun::star;
+
+// is in appenv.cxx
+extern OUString InsertLabEnvText( SwWrtShell& , SwFldMgr& , const OUString& );
+
+const char MASTER_LABEL[] = "MasterLabel";
+
+static const SwFrmFmt *lcl_InsertBCText( SwWrtShell& rSh, const SwLabItem& rItem,
+ SwFrmFmt &rFmt,
+ sal_uInt16 nCol, sal_uInt16 nRow )
+{
+ SfxItemSet aSet(rSh.GetAttrPool(), RES_ANCHOR, RES_ANCHOR,
+ RES_VERT_ORIENT, RES_VERT_ORIENT, RES_HORI_ORIENT, RES_HORI_ORIENT, 0 );
+ sal_uInt16 nPhyPageNum, nVirtPageNum;
+ rSh.GetPageNum( nPhyPageNum, nVirtPageNum );
+
+ //anchor frame to page
+ aSet.Put( SwFmtAnchor( FLY_AT_PAGE, nPhyPageNum ) );
+ aSet.Put( SwFmtHoriOrient( rItem.lLeft + nCol * rItem.lHDist,
+ text::HoriOrientation::NONE, text::RelOrientation::PAGE_FRAME ) );
+ aSet.Put( SwFmtVertOrient( rItem.lUpper + nRow * rItem.lVDist,
+ text::VertOrientation::NONE, text::RelOrientation::PAGE_FRAME ) );
+ const SwFrmFmt *pFmt = rSh.NewFlyFrm(aSet, sal_True, &rFmt ); // Insert Fly
+ OSL_ENSURE( pFmt, "Fly not inserted" );
+
+ rSh.UnSelectFrm(); //Frame was selected automatically
+
+ rSh.SetTxtFmtColl( rSh.GetTxtCollFromPool( RES_POOLCOLL_STANDARD ) );
+
+ if(!rItem.bSynchron || !(nCol|nRow))
+ {
+ SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
+ OSL_ENSURE(pFact, "Dialogdiet fail!");
+ ::GlossarySetActGroup fnSetActGroup = pFact->SetGlossaryActGroupFunc();
+ if ( fnSetActGroup )
+ (*fnSetActGroup)( rItem.sGlossaryGroup );
+ SwGlossaryHdl* pGlosHdl = rSh.GetView().GetGlosHdl();
+ pGlosHdl->SetCurGroup(rItem.sGlossaryGroup, sal_True);
+ pGlosHdl->InsertGlossary( rItem.sGlossaryBlockName );
+ }
+
+ return pFmt;
+}
+
+static const SwFrmFmt *lcl_InsertLabText( SwWrtShell& rSh, const SwLabItem& rItem,
+ SwFrmFmt &rFmt, SwFldMgr& rFldMgr,
+ sal_uInt16 nCol, sal_uInt16 nRow, sal_Bool bLast )
+{
+ SfxItemSet aSet(rSh.GetAttrPool(), RES_ANCHOR, RES_ANCHOR,
+ RES_VERT_ORIENT, RES_VERT_ORIENT, RES_HORI_ORIENT, RES_HORI_ORIENT, 0 );
+ sal_uInt16 nPhyPageNum, nVirtPageNum;
+ rSh.GetPageNum( nPhyPageNum, nVirtPageNum );
+
+ //anchor frame to page
+ aSet.Put( SwFmtAnchor( FLY_AT_PAGE, nPhyPageNum ) );
+ aSet.Put( SwFmtHoriOrient( rItem.lLeft + nCol * rItem.lHDist,
+ text::HoriOrientation::NONE, text::RelOrientation::PAGE_FRAME ) );
+ aSet.Put( SwFmtVertOrient( rItem.lUpper + nRow * rItem.lVDist,
+ text::VertOrientation::NONE, text::RelOrientation::PAGE_FRAME ) );
+ const SwFrmFmt *pFmt = rSh.NewFlyFrm(aSet, sal_True, &rFmt ); // Insert Fly
+ OSL_ENSURE( pFmt, "Fly not inserted" );
+
+ rSh.UnSelectFrm(); //Frame was selected automatically
+
+ rSh.SetTxtFmtColl( rSh.GetTxtCollFromPool( RES_POOLCOLL_STANDARD ) );
+
+ // If applicable "next dataset"
+ OUString sDBName;
+ if( (!rItem.bSynchron || !(nCol|nRow)) && !(sDBName = InsertLabEnvText( rSh, rFldMgr, rItem.aWriting )).isEmpty() && !bLast )
+ {
+ sDBName = comphelper::string::setToken(sDBName, 3, DB_DELIM, "True");
+ SwInsertFld_Data aData(TYP_DBNEXTSETFLD, 0, sDBName, aEmptyOUStr, 0, &rSh );
+ rFldMgr.InsertFld( aData );
+ }
+
+ return pFmt;
+}
+
+void SwModule::InsertLab(SfxRequest& rReq, sal_Bool bLabel)
+{
+ static sal_uInt16 nLabelTitleNo = 0;
+ static sal_uInt16 nBCTitleNo = 0;
+
+ // Create DB-Manager
+ boost::scoped_ptr<SwNewDBMgr> pNewDBMgr(new SwNewDBMgr);
+
+ // Read SwLabItem from Config
+ SwLabCfgItem aLabCfg(bLabel);
+
+ // Move up Dialog
+ SfxItemSet aSet( GetPool(), FN_LABEL, FN_LABEL, 0 );
+ aSet.Put( aLabCfg.GetItem() );
+
+ SwAbstractDialogFactory* pDialogFactory = SwAbstractDialogFactory::Create();
+ OSL_ENSURE(pDialogFactory, "SwAbstractDialogFactory fail!");
+
+ boost::scoped_ptr<AbstractSwLabDlg> pDlg(pDialogFactory->CreateSwLabDlg(0, aSet, pNewDBMgr.get(), bLabel));
+ OSL_ENSURE(pDlg, "Dialogdiet fail!");
+
+ if ( RET_OK == pDlg->Execute() )
+ {
+ // Read dialog, store item in config
+ const SwLabItem& rItem = (const SwLabItem&) pDlg->
+ GetOutputItemSet()->Get(FN_LABEL);
+ aLabCfg.GetItem() = rItem;
+ aLabCfg.Commit();
+
+ // Create new document
+ SfxObjectShellLock xDocSh( new SwDocShell( SFX_CREATE_MODE_STANDARD));
+ xDocSh->DoInitNew( 0 );
+
+ // Printer
+ Printer *pPrt = pDlg->GetPrt();
+ if (pPrt)
+ {
+ SwDocShell *pDocSh = (SwDocShell*)(&*xDocSh);
+ pDocSh->getIDocumentDeviceAccess()->setJobsetup(pPrt->GetJobSetup());
+ }
+
+ SfxViewFrame* pViewFrame = SfxViewFrame::DisplayNewDocument( *xDocSh, rReq );
+
+ SwView *pNewView = (SwView*) pViewFrame->GetViewShell();
+ pNewView->AttrChangedNotify( &pNewView->GetWrtShell() );// So that SelectShell is being called.
+
+ // Set document title
+ OUString aTmp;
+ if(bLabel)
+ {
+ aTmp = SW_RES( STR_LAB_TITLE);
+ aTmp += OUString::number(++nLabelTitleNo );
+ }
+ else
+ {
+ aTmp = pDlg->GetBusinessCardStr();
+ aTmp += OUString::number( ++nBCTitleNo );
+ }
+ xDocSh->SetTitle( aTmp );
+
+ pViewFrame->GetFrame().Appear();
+
+ // Determine Shell
+ SwWrtShell *pSh = pNewView->GetWrtShellPtr();
+ OSL_ENSURE( pSh, "missing WrtShell" );
+
+ { // block for locks the dispatcher!!
+
+ SwWait aWait( (SwDocShell&)*xDocSh, true );
+
+ SET_CURR_SHELL(pSh);
+ pSh->SetLabelDoc(rItem.bSynchron);
+ pSh->DoUndo( sal_False );
+ pSh->StartAllAction();
+
+ pSh->SetNewDoc(); // Avoid performance problems
+
+ SwPageDesc aDesc = pSh->GetPageDesc( 0 );
+ SwFrmFmt& rFmt = aDesc.GetMaster();
+
+ // Borders
+ SvxLRSpaceItem aLRMargin( RES_LR_SPACE );
+ SvxULSpaceItem aULMargin( RES_UL_SPACE );
+ aLRMargin.SetLeft ((sal_uInt16) rItem.lLeft );
+ aULMargin.SetUpper((sal_uInt16) rItem.lUpper);
+ aLRMargin.SetRight( 0 );
+ aULMargin.SetLower( 0 );
+ rFmt.SetFmtAttr(aLRMargin);
+ rFmt.SetFmtAttr(aULMargin);
+
+ // Header and footer
+ rFmt.SetFmtAttr(SwFmtHeader(sal_Bool(sal_False)));
+ aDesc.ChgHeaderShare(sal_False);
+ rFmt.SetFmtAttr(SwFmtFooter(sal_Bool(sal_False)));
+ aDesc.ChgFooterShare(sal_False);
+
+ aDesc.SetUseOn(nsUseOnPage::PD_ALL); // Site numbering
+
+ // Set page size
+ long lPgWidth, lPgHeight;
+ lPgWidth = (rItem.lPWidth > MINLAY ? rItem.lPWidth : MINLAY);
+ lPgHeight = (rItem.lPHeight > MINLAY ? rItem.lPHeight : MINLAY);
+ rFmt.SetFmtAttr( SwFmtFrmSize( ATT_FIX_SIZE, lPgWidth, lPgHeight ));
+ // Numbering type
+ SvxNumberType aType;
+ aType.SetNumberingType(SVX_NUM_NUMBER_NONE);
+ aDesc.SetNumType( aType );
+
+ // Followup template
+ const SwPageDesc &rFollow = pSh->GetPageDesc( pSh->GetCurPageDesc() );
+ aDesc.SetFollow( &rFollow );
+
+ pPrt = pSh->getIDocumentDeviceAccess()->getPrinter( true );
+ SvxPaperBinItem aItem( RES_PAPER_BIN );
+ aItem.SetValue((sal_Int8)pPrt->GetPaperBin());
+ rFmt.SetFmtAttr(aItem);
+
+ // Determine orientation of the resulting page
+ aDesc.SetLandscape(rItem.lPWidth > rItem.lPHeight);
+
+ pSh->ChgPageDesc( 0, aDesc );
+
+ // Insert frame
+ boost::scoped_ptr<SwFldMgr> pFldMgr(new SwFldMgr);
+ pFldMgr->SetEvalExpFlds(sal_False);
+
+ // Prepare border template
+ SwFrmFmt* pFmt = pSh->GetFrmFmtFromPool( RES_POOLFRM_LABEL );
+ sal_Int32 iResultWidth = rItem.lLeft + (rItem.nCols - 1) * rItem.lHDist + rItem.lWidth - rItem.lPWidth;
+ sal_Int32 iResultHeight = rItem.lUpper + (rItem.nRows - 1) * rItem.lVDist + rItem.lHeight - rItem.lPHeight;
+ sal_Int32 iWidth = (iResultWidth > 0 ? rItem.lWidth - (iResultWidth / rItem.nCols) - 1 : rItem.lWidth);
+ sal_Int32 iHeight = (iResultHeight > 0 ? rItem.lHeight - (iResultHeight / rItem.nRows) - 1 : rItem.lHeight);
+ SwFmtFrmSize aFrmSize( ATT_FIX_SIZE, iWidth, iHeight );
+ pFmt->SetFmtAttr( aFrmSize );
+
+ //frame represents label itself, no border space
+ SvxULSpaceItem aFrmNoULSpace( 0, 0, RES_UL_SPACE );
+ SvxLRSpaceItem aFrmNoLRSpace( 0, 0, 0, 0, RES_LR_SPACE );
+ pFmt->SetFmtAttr( aFrmNoULSpace );
+ pFmt->SetFmtAttr( aFrmNoLRSpace );
+
+ const SwFrmFmt *pFirstFlyFmt = 0;
+ if ( rItem.bPage )
+ {
+ SwFmtVertOrient aFrmVertOrient( pFmt->GetVertOrient() );
+ aFrmVertOrient.SetVertOrient( text::VertOrientation::TOP );
+ pFmt->SetFmtAttr(aFrmVertOrient);
+
+ for ( sal_uInt16 i = 0; i < rItem.nRows; ++i )
+ {
+ for ( sal_uInt16 j = 0; j < rItem.nCols; ++j )
+ {
+ pSh->Push();
+ const SwFrmFmt *pTmp = ( bLabel ?
+ lcl_InsertLabText( *pSh, rItem, *pFmt, *pFldMgr, j, i,
+ i == rItem.nRows - 1 && j == rItem.nCols - 1 ) :
+ lcl_InsertBCText( *pSh, rItem, *pFmt, j, i ) );
+ if (!(i|j))
+ {
+ pFirstFlyFmt = pTmp;
+
+ if (rItem.bSynchron)
+ {
+ // if there is no content in the fly then
+ // dont leave the fly!!!
+ pSh->Push();
+ pSh->SttDoc();
+ sal_Bool bInFly = 0 != pSh->WizzardGetFly();
+ pSh->Pop( bInFly );
+
+ if( bInFly )
+ pSh->EndDoc(sal_True); // select all content
+ // in the fly
+ else
+ pSh->SetMark(); // set only the mark
+
+ SwSectionData aSect(CONTENT_SECTION,
+ OUString(MASTER_LABEL));
+ pSh->InsertSection(aSect);
+ }
+ }
+ else if (rItem.bSynchron)
+ {
+ SwSectionData aSect(FILE_LINK_SECTION,
+ pSh->GetUniqueSectionName());
+ OUStringBuffer sLinkName;
+ sLinkName.append(sfx2::cTokenSeparator);
+ sLinkName.append(sfx2::cTokenSeparator);
+ sLinkName.append(MASTER_LABEL);
+ aSect.SetLinkFileName(sLinkName.makeStringAndClear());
+ aSect.SetProtectFlag(true);
+ pSh->Insert("."); // Dummytext to allocate the Section
+ pSh->SttDoc();
+ pSh->EndDoc(sal_True); // Select everything in the frame
+ pSh->InsertSection(aSect);
+ }
+ pSh->Pop( sal_False );
+ }
+ }
+ }
+ else
+ {
+ pFirstFlyFmt = bLabel ?
+ lcl_InsertLabText( *pSh, rItem, *pFmt, *pFldMgr,
+ static_cast< sal_uInt16 >(rItem.nCol - 1),
+ static_cast< sal_uInt16 >(rItem.nRow - 1), sal_True ) :
+ lcl_InsertBCText(*pSh, rItem, *pFmt,
+ static_cast< sal_uInt16 >(rItem.nCol - 1),
+ static_cast< sal_uInt16 >(rItem.nRow - 1));
+ }
+
+ //fill the user fields
+ if(!bLabel)
+ {
+ uno::Reference< frame::XModel > xModel = pSh->GetView().GetDocShell()->GetBaseModel();
+ OSL_ENSURE(pDialogFactory, "SwAbstractDialogFactory fail!");
+ SwLabDlgMethod SwLabDlgUpdateFieldInformation = pDialogFactory->GetSwLabDlgStaticMethod ();
+ SwLabDlgUpdateFieldInformation(xModel, rItem);
+ }
+
+ pFldMgr->SetEvalExpFlds(sal_True);
+ pFldMgr->EvalExpFlds(pSh);
+
+ pFldMgr.reset();
+
+ if (pFirstFlyFmt)
+ pSh->GotoFly(pFirstFlyFmt->GetName(), FLYCNTTYPE_ALL, sal_False);
+
+ pSh->EndAllAction();
+ pSh->DoUndo( sal_True );
+ }
+
+ if( rItem.aWriting.indexOf( '<' ) >= 0 )
+ {
+ // Open database browser on recently used database
+ ShowDBObj( *pNewView, pSh->GetDBData() );
+ }
+
+ if( rItem.bSynchron )
+ {
+ SfxDispatcher* pDisp = pViewFrame->GetDispatcher();
+ OSL_ENSURE(pDisp, "No dispatcher in frame?");
+ pDisp->Execute(FN_SYNC_LABELS, SFX_CALLMODE_ASYNCHRON);
+ }
+ rReq.SetReturnValue(SfxVoidItem(bLabel ? FN_LABEL : FN_BUSINESS_CARD));
+ }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */