diff options
author | sb <sb@openoffice.org> | 2010-01-21 12:06:31 +0100 |
---|---|---|
committer | sb <sb@openoffice.org> | 2010-01-21 12:06:31 +0100 |
commit | 95e148a52fecd91726a2acb6233db2cc4edd32c3 (patch) | |
tree | 2c1e4829f0b5086e5fae575dfa42c448f83bd457 /sw/source | |
parent | 510f83e4ffdbdf0e89dc8ee3fe595d7b7d0613d4 (diff) | |
parent | fdde737ea0caf7450a6676f46651f78ee05321ab (diff) |
sb118: merged in DEV300_m70
Diffstat (limited to 'sw/source')
66 files changed, 2635 insertions, 2895 deletions
diff --git a/sw/source/core/access/accpage.cxx b/sw/source/core/access/accpage.cxx index 9d1f39acfc5b..bc2a74809420 100644 --- a/sw/source/core/access/accpage.cxx +++ b/sw/source/core/access/accpage.cxx @@ -129,8 +129,9 @@ void SwAccessiblePage::_InvalidateFocus() } SwAccessiblePage::SwAccessiblePage( SwAccessibleMap* pInitMap, - const SwFrm* pFrame ) : - SwAccessibleContext( pInitMap, AccessibleRole::PANEL, pFrame ) + const SwFrm* pFrame ) + : SwAccessibleContext( pInitMap, AccessibleRole::PANEL, pFrame ) + , bIsSelected( sal_False ) { DBG_ASSERT( pFrame != NULL, "need frame" ); DBG_ASSERT( pInitMap != NULL, "need map" ); diff --git a/sw/source/core/doc/doc.cxx b/sw/source/core/doc/doc.cxx index bac7d6f7ea0d..868c636987d9 100644..100755 --- a/sw/source/core/doc/doc.cxx +++ b/sw/source/core/doc/doc.cxx @@ -46,8 +46,11 @@ #include <comphelper/processfactory.hxx> #include <tools/urlobj.hxx> #include <tools/poly.hxx> +#include <tools/multisel.hxx> +#include <rtl/ustring.hxx> #include <vcl/virdev.hxx> #include <svl/itemiter.hxx> +#include <unotools/syslocale.hxx> #include <sfx2/printer.hxx> #include <svx/keepitem.hxx> #include <svx/cscoitem.hxx> @@ -56,6 +59,8 @@ #include <svx/forbiddencharacterstable.hxx> #include <svx/svdmodel.hxx> #include <unotools/charclass.hxx> +#include <unotools/localedatawrapper.hxx> + #include <swmodule.hxx> #include <fmtpdsc.hxx> #include <fmtanchr.hxx> @@ -95,20 +100,22 @@ #include <fldupde.hxx> #include <swbaslnk.hxx> #include <printdata.hxx> -#ifndef _CMDID_H +#include <swprtopt.hxx> #include <cmdid.h> // fuer den dflt - Printer in SetJob -#endif -#ifndef _STATSTR_HRC #include <statstr.hrc> // StatLine-String -#endif #include <comcore.hrc> #include <SwUndoTOXChange.hxx> #include <SwUndoFmt.hxx> #include <unocrsr.hxx> #include <docsh.hxx> -#include <docufld.hxx> +#include <docfld.hxx> // _SetGetExpFld +#include <docufld.hxx> // SwPostItField +#include <viewsh.hxx> +#include <shellres.hxx> +#include <txtfrm.hxx> #include <vector> +#include <map> #include <osl/diagnose.h> #include <osl/interlck.h> @@ -121,6 +128,8 @@ // <-- using namespace ::com::sun::star; +using ::rtl::OUString; + // Seiten-Deskriptoren SV_IMPL_PTRARR(SwPageDescs,SwPageDescPtr); @@ -1028,6 +1037,625 @@ const SwDocStat& SwDoc::GetDocStat() const return *pDocStat; } +/*************************************************************************/ + + +struct _PostItFld : public _SetGetExpFld +{ + _PostItFld( const SwNodeIndex& rNdIdx, const SwTxtFld* pFld, const SwIndex* pIdx = 0 ) + : _SetGetExpFld( rNdIdx, pFld, pIdx ) {} + + USHORT GetPageNo( const StringRangeEnumerator &rRangeEnum, + const std::set< sal_Int32 > &rPossiblePages, + USHORT& rVirtPgNo, USHORT& rLineNo ); + + SwPostItField* GetPostIt() const + { + return (SwPostItField*) GetFld()->GetFld().GetFld(); + } +}; + + +USHORT _PostItFld::GetPageNo( + const StringRangeEnumerator &rRangeEnum, + const std::set< sal_Int32 > &rPossiblePages, + /* out */ USHORT& rVirtPgNo, /* out */ USHORT& rLineNo ) +{ + //Problem: Wenn ein PostItFld in einem Node steht, der von mehr als + //einer Layout-Instanz repraesentiert wird, steht die Frage im Raum, + //ob das PostIt nur ein- oder n-mal gedruck werden soll. + //Wahrscheinlich nur einmal, als Seitennummer soll hier keine Zufaellige + //sondern die des ersten Auftretens des PostIts innerhalb des selektierten + //Bereichs ermittelt werden. + rVirtPgNo = 0; + USHORT nPos = GetCntnt(); + SwClientIter aIter( (SwModify &)GetFld()->GetTxtNode() ); + for( SwTxtFrm* pFrm = (SwTxtFrm*)aIter.First( TYPE( SwFrm )); + pFrm; pFrm = (SwTxtFrm*)aIter.Next() ) + { + if( pFrm->GetOfst() > nPos || + (pFrm->HasFollow() && pFrm->GetFollow()->GetOfst() <= nPos) ) + continue; + USHORT nPgNo = pFrm->GetPhyPageNum(); + if( rRangeEnum.hasValue( nPgNo, &rPossiblePages )) + { + rLineNo = (USHORT)(pFrm->GetLineCount( nPos ) + + pFrm->GetAllLines() - pFrm->GetThisLines()); + rVirtPgNo = pFrm->GetVirtPageNum(); + return nPgNo; + } + } + return 0; +} + + +bool lcl_GetPostIts( + IDocumentFieldsAccess* pIDFA, + _SetGetExpFlds * pSrtLst ) +{ + bool bHasPostIts = false; + + SwFieldType* pFldType = pIDFA->GetSysFldType( RES_POSTITFLD ); + DBG_ASSERT( pFldType, "kein PostItType ? "); + + if( pFldType->GetDepends() ) + { + // Modify-Object gefunden, trage alle Felder ins Array ein + SwClientIter aIter( *pFldType ); + SwClient* pLast; + const SwTxtFld* pTxtFld; + + for( pLast = aIter.First( TYPE(SwFmtFld)); pLast; pLast = aIter.Next() ) + { + if( 0 != ( pTxtFld = ((SwFmtFld*)pLast)->GetTxtFld() ) && + pTxtFld->GetTxtNode().GetNodes().IsDocNodes() ) + { + bHasPostIts = true; + if (pSrtLst) + { + SwNodeIndex aIdx( pTxtFld->GetTxtNode() ); + _PostItFld* pNew = new _PostItFld( aIdx, pTxtFld ); + pSrtLst->Insert( pNew ); + } + else + break; // we just wanted to check for the existence of postits ... + } + } + } + + return bHasPostIts; +} + + +static void lcl_FormatPostIt( + IDocumentContentOperations* pIDCO, + SwPaM& aPam, + SwPostItField* pField, + bool bNewPage, bool bIsFirstPostIt, + USHORT nPageNo, USHORT nLineNo ) +{ + static char __READONLY_DATA sTmp[] = " : "; + + DBG_ASSERT( ViewShell::GetShellRes(), "missing ShellRes" ); + + if (bNewPage) + { + pIDCO->InsertPoolItem( aPam, SvxFmtBreakItem( SVX_BREAK_PAGE_AFTER, RES_BREAK ), 0 ); + pIDCO->SplitNode( *aPam.GetPoint(), false ); + } + else if (!bIsFirstPostIt) + { + // add an empty line between different notes + pIDCO->SplitNode( *aPam.GetPoint(), false ); + pIDCO->SplitNode( *aPam.GetPoint(), false ); + } + + String aStr( ViewShell::GetShellRes()->aPostItPage ); + aStr.AppendAscii(sTmp); + + aStr += XubString::CreateFromInt32( nPageNo ); + aStr += ' '; + if( nLineNo ) + { + aStr += ViewShell::GetShellRes()->aPostItLine; + aStr.AppendAscii(sTmp); + aStr += XubString::CreateFromInt32( nLineNo ); + aStr += ' '; + } + aStr += ViewShell::GetShellRes()->aPostItAuthor; + aStr.AppendAscii(sTmp); + aStr += pField->GetPar1(); + aStr += ' '; + SvtSysLocale aSysLocale; + aStr += /*(LocaleDataWrapper&)*/aSysLocale.GetLocaleData().getDate( pField->GetDate() ); + pIDCO->InsertString( aPam, aStr ); + + pIDCO->SplitNode( *aPam.GetPoint(), false ); + aStr = pField->GetPar2(); +#if defined( WIN ) || defined( WNT ) || defined( PM2 ) + // Bei Windows und Co alle CR rausschmeissen + aStr.EraseAllChars( '\r' ); +#endif + pIDCO->InsertString( aPam, aStr ); +} + + +void SwDoc::CalculatePagesForPrinting( + /* out */ SwRenderData &rData, + const SwPrintUIOptions &rOptions, + bool bIsPDFExport, + sal_Int32 nDocPageCount ) +{ + DBG_ASSERT( pLayout, "no layout present" ); + if (!pLayout) + return; + + // properties to take into account when calcualting the set of pages + // (PDF export UI does not allow for selecting left or right pages only) + bool bPrintLeftPages = bIsPDFExport ? true : rOptions.IsPrintLeftPages(); + bool bPrintRightPages = bIsPDFExport ? true : rOptions.IsPrintRightPages(); + bool bPrintEmptyPages = rOptions.IsPrintEmptyPages( bIsPDFExport ); + + Range aPages( 1, nDocPageCount ); + + MultiSelection aMulti( aPages ); + aMulti.SetTotalRange( Range( 0, RANGE_MAX ) ); + aMulti.Select( aPages ); + + const SwPageFrm *pStPage = (SwPageFrm*)pLayout->Lower(); + const SwFrm *pEndPage = pStPage; + + USHORT nFirstPageNo = 0; + USHORT nLastPageNo = 0; + USHORT nPageNo = 1; + + for( USHORT i = 1; i <= (USHORT)aPages.Max(); ++i ) + { + if( i < (USHORT)aPages.Min() ) + { + if( !pStPage->GetNext() ) + break; + pStPage = (SwPageFrm*)pStPage->GetNext(); + pEndPage= pStPage; + } + else if( i == (USHORT)aPages.Min() ) + { + nFirstPageNo = i; + nLastPageNo = nFirstPageNo; + if( !pStPage->GetNext() || (i == (USHORT)aPages.Max()) ) + break; + pEndPage = pStPage->GetNext(); + } + else if( i > (USHORT)aPages.Min() ) + { + nLastPageNo = i; + if( !pEndPage->GetNext() || (i == (USHORT)aPages.Max()) ) + break; + pEndPage = pEndPage->GetNext(); + } + } + + DBG_ASSERT( nFirstPageNo, "first page not found! Should not happen!" ); + if (nFirstPageNo) + { +// HACK: Hier muss von der MultiSelection noch eine akzeptable Moeglichkeit +// geschaffen werden, alle Seiten von Seite x an zu deselektieren. +// Z.B. durch SetTotalRange .... + +// aMulti.Select( Range( nLastPageNo+1, SELECTION_MAX ), FALSE ); + MultiSelection aTmpMulti( Range( 1, nLastPageNo ) ); + long nTmpIdx = aMulti.FirstSelected(); + static long nEndOfSelection = SFX_ENDOFSELECTION; + while ( nEndOfSelection != nTmpIdx && nTmpIdx <= long(nLastPageNo) ) + { + aTmpMulti.Select( nTmpIdx ); + nTmpIdx = aMulti.NextSelected(); + } + aMulti = aTmpMulti; +// Ende des HACKs + + nPageNo = nFirstPageNo; + + std::set< sal_Int32 > &rValidPages = rData.GetValidPagesSet(); + std::map< sal_Int32, const SwPageFrm * > &rValidStartFrms = rData.GetValidStartFrames(); + rValidPages.clear(); + rValidStartFrms.clear(); + while ( pStPage ) + { + const BOOL bRightPg = pStPage->OnRightPage(); + if ( aMulti.IsSelected( nPageNo ) && + ( (bRightPg && bPrintRightPages) || + (!bRightPg && bPrintLeftPages) ) ) + { + // --> FME 2005-12-12 #b6354161# Feature - Print empty pages + if ( bPrintEmptyPages || pStPage->Frm().Height() ) + // <-- + { + // pStPage->GetUpper()->Paint( pStPage->Frm() ); + rValidPages.insert( nPageNo ); + rValidStartFrms[ nPageNo ] = pStPage; + } + } + + if ( pStPage == pEndPage ) + { + pStPage = 0; + } + else + { ++nPageNo; + pStPage = (SwPageFrm*)pStPage->GetNext(); + } + } + } + + + // + // now that we have identified the valid pages for printing according + // to the print settings we need to get the PageRange to use and + // use both results to get the actual pages to be printed + // (post-it settings need to be taken into account later on!) + // + + // get PageRange value to use + OUString aPageRange; + if (bIsPDFExport) + { + // ?? rOptions.getValue( C2U("Selection") ); + aPageRange = rOptions.getStringValue( "PageRange", OUString() ); + } + else + { + // PageContent : + // 0 -> print all pages (default if aPageRange is empty) + // 1 -> print range according to PageRange + // 2 -> print selection + const sal_Int32 nContent = rOptions.getIntValue( "PrintContent", 0 ); + if (1 == nContent) + aPageRange = rOptions.getStringValue( "PageRange", OUString() ); + if (2 == nContent) + { + // note that printing selections is actually implemented by copying + // the selection to a new temporary document and printing all of that one. + // Thus for Writer "PrintContent" must never be 2. + // See SwXTextDocument::GetRenderDoc for evaluating if a selection is to be + // printed and for creating the temporary document. + } + + // please note + } + if (aPageRange.getLength() == 0) // empty string -> print all + { + // set page range to print to 'all pages' + aPageRange = OUString::valueOf( (sal_Int32)1 ); + aPageRange += OUString::valueOf( (sal_Unicode)'-'); + aPageRange += OUString::valueOf( nDocPageCount ); + } + rData.SetPageRange( aPageRange ); + + // get vector of pages to print according to PageRange and valid pages set from above + // (result may be an empty vector, for example if the range string is not correct) + StringRangeEnumerator::getRangesFromString( + aPageRange, rData.GetPagesToPrint(), + 1, nDocPageCount, 0, &rData.GetValidPagesSet() ); +} + + +void SwDoc::UpdatePagesForPrintingWithPostItData( + /* out */ SwRenderData &rData, + const SwPrintUIOptions &rOptions, + bool /*bIsPDFExport*/, + sal_Int32 nDocPageCount ) +{ + + sal_Int16 nPostItMode = (sal_Int16) rOptions.getIntValue( "PrintAnnotationMode", 0 ); + DBG_ASSERT(nPostItMode == POSTITS_NONE || rData.HasPostItData(), + "print post-its without post-it data?" ); + const USHORT nPostItCount = rData.HasPostItData() ? rData.m_pPostItFields->Count() : 0; + if (nPostItMode != POSTITS_NONE && nPostItCount > 0) + { + SET_CURR_SHELL( rData.m_pPostItShell ); + + // clear document and move to end of it + SwPaM aPam( rData.m_pPostItDoc->GetNodes().GetEndOfContent() ); + aPam.Move( fnMoveBackward, fnGoDoc ); + aPam.SetMark(); + aPam.Move( fnMoveForward, fnGoDoc ); + rData.m_pPostItDoc->DeleteRange( aPam ); + + const StringRangeEnumerator aRangeEnum( rData.GetPageRange(), 1, nDocPageCount, 0 ); + + // For mode POSTITS_ENDPAGE: + // maps a physical page number to the page number in post-it document that holds + // the first post-it for that physical page . Needed to relate the correct start frames + // from the post-it doc to the physical page of the document + std::map< sal_Int32, sal_Int32 > aPostItLastStartPageNum; + + // add all post-its on valid pages within the the page range to the + // temporary post-it document. + // Since the array of post-it fileds is sorted by page and line number we will + // already get them in the correct order + USHORT nVirtPg = 0, nLineNo = 0, nLastPageNum = 0, nPhyPageNum = 0; + bool bIsFirstPostIt = true; + for (USHORT i = 0; i < nPostItCount; ++i) + { + _PostItFld& rPostIt = (_PostItFld&)*(*rData.m_pPostItFields)[ i ]; + nLastPageNum = nPhyPageNum; + nPhyPageNum = rPostIt.GetPageNo( + aRangeEnum, rData.GetValidPagesSet(), nVirtPg, nLineNo ); + if (nPhyPageNum) + { + // need to insert a page break? + // In POSTITS_ENDPAGE mode for each document page the following + // post-it page needs to start on a new page + const bool bNewPage = nPostItMode == POSTITS_ENDPAGE && + !bIsFirstPostIt && nPhyPageNum != nLastPageNum; + + lcl_FormatPostIt( rData.m_pPostItShell->GetDoc(), aPam, + rPostIt.GetPostIt(), bNewPage, bIsFirstPostIt, nVirtPg, nLineNo ); + bIsFirstPostIt = false; + + if (nPostItMode == POSTITS_ENDPAGE) + { + // get the correct number of current pages for the post-it document + rData.m_pPostItShell->CalcLayout(); + const sal_Int32 nPages = rData.m_pPostItDoc->GetPageCount(); + aPostItLastStartPageNum[ nPhyPageNum ] = nPages; + } + } + } + + // format post-it doc to get correct number of pages + rData.m_pPostItShell->CalcLayout(); + const sal_Int32 nPostItDocPageCount = rData.m_pPostItDoc->GetPageCount(); + + if (nPostItMode == POSTITS_ONLY || nPostItMode == POSTITS_ENDDOC) + { + // now add those post-it pages to the vector of pages to print + // or replace them if only post-its should be printed + + rData.GetPostItStartFrames().clear(); + if (nPostItMode == POSTITS_ENDDOC) + { + // set all values up to number of pages to print currently known to NULL, + // meaning none of the pages currently in the vector is from the + // post-it document, they are the documents pages. + rData.GetPostItStartFrames().resize( rData.GetPagesToPrint().size() ); + } + else if (nPostItMode == POSTITS_ONLY) + { + // no document page to be printed + rData.GetPagesToPrint().clear(); + } + + // now we just need to add the post-it pages to be printed to the end + // of the vector of pages to print and keep the GetValidStartFrames + // data conform with it + sal_Int32 nPageNum = 0; + const SwPageFrm * pPageFrm = (SwPageFrm*)rData.m_pPostItShell->GetLayout()->Lower(); + while( pPageFrm && nPageNum < nPostItDocPageCount ) + { + DBG_ASSERT( pPageFrm, "Empty page frame. How are we going to print this?" ); + ++nPageNum; + rData.GetPagesToPrint().push_back( 0 ); // a page number of 0 indicates this page is from the post-it doc + DBG_ASSERT( pPageFrm, "pPageFrm is NULL!" ); + rData.GetPostItStartFrames().push_back( pPageFrm ); + pPageFrm = (SwPageFrm*)pPageFrm->GetNext(); + } + DBG_ASSERT( nPageNum == nPostItDocPageCount, "unexpected number of pages" ); + } + else if (nPostItMode == POSTITS_ENDPAGE) + { + // the next step is to find all the start frames from the post-it + // document that should be printed for a given physical page of the document + std::map< sal_Int32, std::vector< const SwPageFrm * > > aPhysPageToPostItFrames; + + // ... thus, first collect all post-it doc start frames in a vector + sal_Int32 nPostItPageNum = 0; + std::vector< const SwPageFrm * > aAllPostItStartFrames; + const SwPageFrm * pPageFrm = (SwPageFrm*)rData.m_pPostItShell->GetLayout()->Lower(); + while( pPageFrm && sal_Int32(aAllPostItStartFrames.size()) < nPostItDocPageCount ) + { + DBG_ASSERT( pPageFrm, "Empty page frame. How are we going to print this?" ); + ++nPostItPageNum; + aAllPostItStartFrames.push_back( pPageFrm ); + pPageFrm = (SwPageFrm*)pPageFrm->GetNext(); + } + DBG_ASSERT( sal_Int32(aAllPostItStartFrames.size()) == nPostItDocPageCount, + "unexpected number of frames; does not match number of pages" ); + + // get a map that holds all post-it frames to be printed for a + // given physical page from the document + sal_Int32 nLastStartPageNum = 0; + std::map< sal_Int32, sal_Int32 >::const_iterator aIt; + for (aIt = aPostItLastStartPageNum.begin(); aIt != aPostItLastStartPageNum.end(); ++aIt) + { + const sal_Int32 nFrames = aIt->second - nLastStartPageNum; + const sal_Int32 nFirstStartPageNum = aIt == aPostItLastStartPageNum.begin() ? + 1 : aIt->second - nFrames + 1; + DBG_ASSERT( 1 <= nFirstStartPageNum && nFirstStartPageNum <= nPostItDocPageCount, + "page number for first frame out of range" ); + std::vector< const SwPageFrm * > aStartFrames; + for (sal_Int32 i = 0; i < nFrames; ++i) + { + const sal_Int32 nIdx = nFirstStartPageNum - 1 + i; // -1 because lowest page num is 1 + DBG_ASSERT( 0 <= nIdx && nIdx < sal_Int32(aAllPostItStartFrames.size()), + "index out of range" ); + aStartFrames.push_back( aAllPostItStartFrames[ nIdx ] ); + } + aPhysPageToPostItFrames[ aIt->first /* phys page num */ ] = aStartFrames; + nLastStartPageNum = aIt->second; + } + + + // ok, now that aPhysPageToPostItFrames can give the start frames for all + // post-it pages to be printed we need to merge those at the correct + // position into the GetPagesToPrint vector and build and maintain the + // GetValidStartFrames vector as well. + // Since inserting a larger number of entries in the middle of a vector + // isn't that efficient we will create new vectors by copying the required data + std::vector< sal_Int32 > aTmpPagesToPrint; + std::vector< const SwPageFrm * > aTmpPostItStartFrames; + const size_t nNum = rData.GetPagesToPrint().size(); + for (size_t i = 0 ; i < nNum; ++i) + { + // add the physical page to print from the document + const sal_Int32 nPhysPage = rData.GetPagesToPrint()[i]; + aTmpPagesToPrint.push_back( nPhysPage ); + aTmpPostItStartFrames.push_back( NULL ); + + // add the post-it document pages to print, i.e those + // post-it pages that have the data for the above physical page + const std::vector< const SwPageFrm * > &rPostItFrames = aPhysPageToPostItFrames[ nPhysPage ]; + const size_t nPostItFrames = rPostItFrames.size(); + for (size_t k = 0; k < nPostItFrames; ++k) + { + aTmpPagesToPrint.push_back( 0 ); + aTmpPostItStartFrames.push_back( rPostItFrames[k] ); + } + } + + // finally we need to assign those vectors to the resulting ones. + // swapping the data should be more efficient than assigning since + // we won't need the temporary vectors anymore + rData.GetPagesToPrint().swap( aTmpPagesToPrint ); + rData.GetPostItStartFrames().swap( aTmpPostItStartFrames ); + } + } +} + + +void SwDoc::CalculatePagePairsForProspectPrinting( + /* out */ SwRenderData &rData, + const SwPrintUIOptions &rOptions, + sal_Int32 nDocPageCount ) +{ + std::set< sal_Int32 > &rValidPagesSet = rData.GetValidPagesSet(); + std::map< sal_Int32, const SwPageFrm * > &rValidStartFrms = rData.GetValidStartFrames(); + std::vector< std::pair< sal_Int32, sal_Int32 > > &rPagePairs = rData.GetPagePairsForProspectPrinting(); + + rPagePairs.clear(); + rValidPagesSet.clear(); + rValidStartFrms.clear(); + + rtl::OUString aPageRange = rOptions.getStringValue( "PageRange", rtl::OUString() ); + StringRangeEnumerator aRange( aPageRange, 1, nDocPageCount, 0 ); + + DBG_ASSERT( pLayout, "no layout present" ); + if (!pLayout || aRange.size() <= 0) + return; + + const SwPageFrm *pStPage = (SwPageFrm*)pLayout->Lower(); + sal_Int32 i = 0; + for ( i = 1; pStPage && i < nDocPageCount; ++i ) + pStPage = (SwPageFrm*)pStPage->GetNext(); + if ( !pStPage ) // dann wars das + return; + + // currently for prospect printing all pages are valid to be printed + // thus we add them all to the respective map and set for later use + sal_Int32 nPageNum = 0; + const SwPageFrm *pPageFrm = (SwPageFrm*)pLayout->Lower(); + while( pPageFrm && nPageNum < nDocPageCount ) + { + DBG_ASSERT( pPageFrm, "Empty page frame. How are we going to print this?" ); + ++nPageNum; + rValidPagesSet.insert( nPageNum ); + rValidStartFrms[ nPageNum ] = pPageFrm; + pPageFrm = (SwPageFrm*)pPageFrm->GetNext(); + } + DBG_ASSERT( nPageNum == nDocPageCount, "unexpected number of pages" ); + + // properties to take into account when calcualting the set of pages + // Note: here bPrintLeftPages and bPrintRightPages refer to the (virtual) resulting pages + // of the prospect! + bool bPrintLeftPages = rOptions.IsPrintLeftPages(); + bool bPrintRightPages = rOptions.IsPrintRightPages(); + bool bPrintProspectRTL = rOptions.getIntValue( "PrintProspectRTL", 0 ) ? true : false; + + // get pages for prospect printing according to the 'PageRange' + // (duplicates and any order allowed!) + std::vector< sal_Int32 > aPagesToPrint; + StringRangeEnumerator::getRangesFromString( + aPageRange, aPagesToPrint, 1, nDocPageCount, 0 ); + + // now fill the vector for calculating the page pairs with the start frames + // from the above obtained vector + std::vector< const SwPageFrm * > aVec; + for ( i = 0; i < sal_Int32(aPagesToPrint.size()); ++i) + { + const sal_Int32 nPage = aPagesToPrint[i]; + const SwPageFrm *pFrm = rValidStartFrms[ nPage ]; + aVec.push_back( pFrm ); + } + + // just one page is special ... + if ( 1 == aVec.size() ) + aVec.insert( aVec.begin() + 1, 0 ); // insert a second empty page + else + { + // now extend the number of pages to fit a multiple of 4 + // (4 'normal' pages are needed for a single prospect paper + // with back and front) + while( aVec.size() & 3 ) + aVec.push_back( 0 ); + } + + // dann sorge mal dafuer, das alle Seiten in der richtigen + // Reihenfolge stehen: + USHORT nSPg = 0, nEPg = aVec.size(), nStep = 1; + if ( 0 == (nEPg & 1 )) // ungerade gibt es nicht! + --nEPg; + + if ( !bPrintLeftPages ) + ++nStep; + else if ( !bPrintRightPages ) + { + ++nStep; + ++nSPg, --nEPg; + } + + // the number of 'virtual' pages to be printed + sal_Int32 nCntPage = (( nEPg - nSPg ) / ( 2 * nStep )) + 1; + + for ( USHORT nPrintCount = 0; nSPg < nEPg && + nPrintCount < nCntPage; ++nPrintCount ) + { + pStPage = aVec[ nSPg ]; + const SwPageFrm* pNxtPage = nEPg < aVec.size() ? aVec[ nEPg ] : 0; + + short nRtlOfs = bPrintProspectRTL ? 1 : 0; + if ( 0 == (( nSPg + nRtlOfs) & 1 ) ) // switch for odd number in LTR, even number in RTL + { + const SwPageFrm* pTmp = pStPage; + pStPage = pNxtPage; + pNxtPage = pTmp; + } + + sal_Int32 nFirst = -1, nSecond = -1; + for ( int nC = 0; nC < 2; ++nC ) + { + sal_Int32 nPage = -1; + if ( pStPage ) + nPage = pStPage->GetPhyPageNum(); + if (nC == 0) + nFirst = nPage; + else + nSecond = nPage; + + pStPage = pNxtPage; + } + rPagePairs.push_back( std::pair< sal_Int32, sal_Int32 >(nFirst, nSecond) ); + + nSPg = nSPg + nStep; + nEPg = nEPg - nStep; + } + DBG_ASSERT( size_t(nCntPage) == rPagePairs.size(), "size mismatch for number of page pairs" ); + + // luckily prospect printing does not make use of post-its so far, + // thus we are done here. +} + + sal_uInt16 SwDoc::GetPageCount() const { return GetRootFrm() ? GetRootFrm()->GetPageNum() : 0; diff --git a/sw/source/core/doc/docdesc.cxx b/sw/source/core/doc/docdesc.cxx index 0aff3b40fc8a..70b39376b857 100644 --- a/sw/source/core/doc/docdesc.cxx +++ b/sw/source/core/doc/docdesc.cxx @@ -39,6 +39,7 @@ #include "svx/frmdiritem.hxx" #include <tools/urlobj.hxx> #include <sfx2/docfile.hxx> +#include <sfx2/printer.hxx> #include <unotools/localedatawrapper.hxx> #include <com/sun/star/document/PrinterIndependentLayout.hpp> #include <fmtfsize.hxx> diff --git a/sw/source/core/doc/docnew.cxx b/sw/source/core/doc/docnew.cxx index 57d017bd050e..c4eb79d5a31a 100644 --- a/sw/source/core/doc/docnew.cxx +++ b/sw/source/core/doc/docnew.cxx @@ -46,6 +46,7 @@ #include <sfx2/printer.hxx> #include <sfx2/docfile.hxx> #include <sfx2/frame.hxx> +#include <sfx2/viewfrm.hxx> #include <svl/macitem.hxx> #include <svx/svxids.hrc> @@ -169,15 +170,33 @@ SV_IMPL_PTRARR( SwGrfFmtColls, SwGrfFmtCollPtr) void StartGrammarChecking( SwDoc &rDoc ) { - uno::Reference< linguistic2::XProofreadingIterator > xGCIterator( rDoc.GetGCIterator() ); - if ( xGCIterator.is() ) + // check for a visible view + bool bVisible = false; + const SwDocShell *pDocShell = rDoc.GetDocShell(); + SfxViewFrame *pFrame = SfxViewFrame::GetFirst( pDocShell, 0, sal_False ); + while (pFrame && !bVisible) { - uno::Reference< lang::XComponent > xDoc( rDoc.GetDocShell()->GetBaseModel(), uno::UNO_QUERY ); - uno::Reference< text::XFlatParagraphIteratorProvider > xFPIP( xDoc, uno::UNO_QUERY ); + if (pFrame->IsVisible()) + bVisible = true; + pFrame = SfxViewFrame::GetNext( *pFrame, pDocShell, 0, sal_False ); + } - // start automatic background checking if not active already - if ( xFPIP.is() && !xGCIterator->isProofreading( xDoc ) ) - xGCIterator->startProofreading( xDoc, xFPIP ); + //!! only documents with visible views need to be checked + //!! (E.g. don't check temporary documents created for printing, see printing of notes and selections. + //!! Those get created on the fly and get hard deleted a bit later as well, and no one should have + //!! a uno reference to them) + if (bVisible) + { + uno::Reference< linguistic2::XProofreadingIterator > xGCIterator( rDoc.GetGCIterator() ); + if ( xGCIterator.is() ) + { + uno::Reference< lang::XComponent > xDoc( rDoc.GetDocShell()->GetBaseModel(), uno::UNO_QUERY ); + uno::Reference< text::XFlatParagraphIteratorProvider > xFPIP( xDoc, uno::UNO_QUERY ); + + // start automatic background checking if not active already + if ( xFPIP.is() && !xGCIterator->isProofreading( xDoc ) ) + xGCIterator->startProofreading( xDoc, xFPIP ); + } } } diff --git a/sw/source/core/doc/notxtfrm.cxx b/sw/source/core/doc/notxtfrm.cxx index 54139e06c340..460374578cf0 100644 --- a/sw/source/core/doc/notxtfrm.cxx +++ b/sw/source/core/doc/notxtfrm.cxx @@ -269,7 +269,7 @@ void lcl_ClearArea( const SwFrm &rFrm, |* *************************************************************************/ -void SwNoTxtFrm::Paint( const SwRect &rRect ) const +void SwNoTxtFrm::Paint( const SwRect &rRect, const SwPrtOptions * /*pPrintData*/ ) const { if ( Frm().IsEmpty() ) return; @@ -804,27 +804,27 @@ void lcl_correctlyAlignRect( SwRect& rAlignedGrfArea, const SwRect& rInArea, Out { if(!pOut) return; - Rectangle aPxRect = pOut->LogicToPixel( rInArea.SVRect() );
- Rectangle aNewPxRect( aPxRect );
- while( aNewPxRect.Left() < aPxRect.Left() )
- {
- rAlignedGrfArea.Left( rAlignedGrfArea.Left()+1 );
- aNewPxRect = pOut->LogicToPixel( rAlignedGrfArea.SVRect() );
- }
- while( aNewPxRect.Top() < aPxRect.Top() )
- {
- rAlignedGrfArea.Top( rAlignedGrfArea.Top()+1 );
- aNewPxRect = pOut->LogicToPixel( rAlignedGrfArea.SVRect() );
- }
- while( aNewPxRect.Bottom() > aPxRect.Bottom() )
- {
- rAlignedGrfArea.Bottom( rAlignedGrfArea.Bottom()-1 );
- aNewPxRect = pOut->LogicToPixel( rAlignedGrfArea.SVRect() );
- }
- while( aNewPxRect.Right() > aPxRect.Right() )
- {
- rAlignedGrfArea.Right( rAlignedGrfArea.Right()-1 );
- aNewPxRect = pOut->LogicToPixel( rAlignedGrfArea.SVRect() );
+ Rectangle aPxRect = pOut->LogicToPixel( rInArea.SVRect() ); + Rectangle aNewPxRect( aPxRect ); + while( aNewPxRect.Left() < aPxRect.Left() ) + { + rAlignedGrfArea.Left( rAlignedGrfArea.Left()+1 ); + aNewPxRect = pOut->LogicToPixel( rAlignedGrfArea.SVRect() ); + } + while( aNewPxRect.Top() < aPxRect.Top() ) + { + rAlignedGrfArea.Top( rAlignedGrfArea.Top()+1 ); + aNewPxRect = pOut->LogicToPixel( rAlignedGrfArea.SVRect() ); + } + while( aNewPxRect.Bottom() > aPxRect.Bottom() ) + { + rAlignedGrfArea.Bottom( rAlignedGrfArea.Bottom()-1 ); + aNewPxRect = pOut->LogicToPixel( rAlignedGrfArea.SVRect() ); + } + while( aNewPxRect.Right() > aPxRect.Right() ) + { + rAlignedGrfArea.Right( rAlignedGrfArea.Right()-1 ); + aNewPxRect = pOut->LogicToPixel( rAlignedGrfArea.SVRect() ); } } @@ -861,13 +861,13 @@ void SwNoTxtFrm::PaintPicture( OutputDevice* pOut, const SwRect &rGrfArea ) cons ::SwAlignGrfRect( &aAlignedGrfArea, *pOut ); } else //if( bIsChart ) - {
- //#i78025# charts own borders are not completely visible
- //the above pixel correction is not correct - at least not for charts
- //so a different pixel correction is choosen here
- //this might be a good idea for all other OLE objects also,
- //but as I cannot oversee the consequences I fix it only for charts for now
- lcl_correctlyAlignRect( aAlignedGrfArea, rGrfArea, pOut );
+ { + //#i78025# charts own borders are not completely visible + //the above pixel correction is not correct - at least not for charts + //so a different pixel correction is choosen here + //this might be a good idea for all other OLE objects also, + //but as I cannot oversee the consequences I fix it only for charts for now + lcl_correctlyAlignRect( aAlignedGrfArea, rGrfArea, pOut ); } if( pGrfNd ) diff --git a/sw/source/core/fields/dbfld.cxx b/sw/source/core/fields/dbfld.cxx index 7c6b991be535..642ca2ed2fdc 100644 --- a/sw/source/core/fields/dbfld.cxx +++ b/sw/source/core/fields/dbfld.cxx @@ -96,6 +96,10 @@ SwDBFieldType::SwDBFieldType(SwDoc* pDocPtr, const String& rNam, const SwDBData& sName += GetColumnName(); } //------------------------------------------------------------------------------ +SwDBFieldType::~SwDBFieldType() +{ +} +//------------------------------------------------------------------------------ SwFieldType* SwDBFieldType::Copy() const { diff --git a/sw/source/core/fields/docufld.cxx b/sw/source/core/fields/docufld.cxx index c4241a33c798..e1542a2d7141 100644 --- a/sw/source/core/fields/docufld.cxx +++ b/sw/source/core/fields/docufld.cxx @@ -1368,7 +1368,8 @@ BOOL SwDocInfoField::PutValue( const uno::Any& rAny, USHORT nWhichId ) SwHiddenTxtFieldType::SwHiddenTxtFieldType( sal_Bool bSetHidden ) : SwFieldType( RES_HIDDENTXTFLD ), bHidden( bSetHidden ) -{} +{ +} SwFieldType* SwHiddenTxtFieldType::Copy() const { diff --git a/sw/source/core/inc/cellfrm.hxx b/sw/source/core/inc/cellfrm.hxx index c8bbc7be70c6..0825ccc2dfd7 100644 --- a/sw/source/core/inc/cellfrm.hxx +++ b/sw/source/core/inc/cellfrm.hxx @@ -51,7 +51,7 @@ public: virtual BOOL GetCrsrOfst( SwPosition *, Point&, SwCrsrMoveState* = 0 ) const; virtual void Modify( SfxPoolItem*, SfxPoolItem* ); - virtual void Paint( const SwRect& ) const; + virtual void Paint( const SwRect&, const SwPrtOptions *pPrintData = NULL ) const; virtual void CheckDirection( BOOL bVert ); const SwTableBox *GetTabBox() const { return pTabBox; } diff --git a/sw/source/core/inc/flyfrm.hxx b/sw/source/core/inc/flyfrm.hxx index 4e3c196814c6..65dc532f4667 100644 --- a/sw/source/core/inc/flyfrm.hxx +++ b/sw/source/core/inc/flyfrm.hxx @@ -161,7 +161,7 @@ public: virtual void Modify( SfxPoolItem*, SfxPoolItem* ); // erfrage vom Client Informationen virtual BOOL GetInfo( SfxPoolItem& ) const; - virtual void Paint( const SwRect& ) const; + virtual void Paint( const SwRect&, const SwPrtOptions *pPrintData = NULL ) const; virtual Size ChgSize( const Size& aNewSize ); virtual BOOL GetCrsrOfst( SwPosition *, Point&, SwCrsrMoveState* = 0 ) const; diff --git a/sw/source/core/inc/frame.hxx b/sw/source/core/inc/frame.hxx index c9bbb72693ce..aa56e2db55d9 100644 --- a/sw/source/core/inc/frame.hxx +++ b/sw/source/core/inc/frame.hxx @@ -56,6 +56,7 @@ class SvxBrushItem; class SwSelectionList; struct SwPosition; struct SwCrsrMoveState; +class SwPrtOptions; // --> OD 2004-07-06 #i28701# class SwSortedObjs; @@ -828,7 +829,7 @@ public: SwCrsrMoveState* = 0 ) const; virtual BOOL GetCharRect( SwRect &, const SwPosition&, SwCrsrMoveState* = 0 ) const; - virtual void Paint( const SwRect& ) const; + virtual void Paint( const SwRect&, const SwPrtOptions *pPrintData = NULL ) const; // der "kurze Dienstweg" zwischen den Frames und der Formatierung. // Wer den void* falsch Casted ist selbst schuld! diff --git a/sw/source/core/inc/layfrm.hxx b/sw/source/core/inc/layfrm.hxx index 76262d18a894..e3ee5edf60c1 100644 --- a/sw/source/core/inc/layfrm.hxx +++ b/sw/source/core/inc/layfrm.hxx @@ -108,7 +108,7 @@ public: SwLayoutFrm( SwFrmFmt* ); ~SwLayoutFrm(); - virtual void Paint( const SwRect& ) const; + virtual void Paint( const SwRect&, const SwPrtOptions *pPrintData = NULL ) const; const SwFrm *Lower() const { return pLower; } SwFrm *Lower() { return pLower; } const SwCntntFrm *ContainsCntnt() const; diff --git a/sw/source/core/inc/notxtfrm.hxx b/sw/source/core/inc/notxtfrm.hxx index 81d63e733f9c..ff739b530758 100644 --- a/sw/source/core/inc/notxtfrm.hxx +++ b/sw/source/core/inc/notxtfrm.hxx @@ -59,7 +59,7 @@ public: ~SwNoTxtFrm(); virtual void Modify( SfxPoolItem*, SfxPoolItem* ); - virtual void Paint(const SwRect& ) const; + virtual void Paint(const SwRect&, const SwPrtOptions *pPrintData = NULL ) const; virtual BOOL GetCharRect( SwRect &, const SwPosition&, SwCrsrMoveState* = 0) const; BOOL GetCrsrOfst(SwPosition* pPos, Point& aPoint, diff --git a/sw/source/core/inc/rootfrm.hxx b/sw/source/core/inc/rootfrm.hxx index be5b8acd22da..fd7f97dcb5b3 100644 --- a/sw/source/core/inc/rootfrm.hxx +++ b/sw/source/core/inc/rootfrm.hxx @@ -200,7 +200,7 @@ public: virtual BOOL GetCrsrOfst( SwPosition *, Point&, SwCrsrMoveState* = 0 ) const; - virtual void Paint( const SwRect& ) const; + virtual void Paint( const SwRect&, const SwPrtOptions *pPrintData = NULL ) const; virtual SwTwips ShrinkFrm( SwTwips, BOOL bTst = FALSE, BOOL bInfo = FALSE ); virtual SwTwips GrowFrm ( SwTwips, BOOL bTst = FALSE, BOOL bInfo = FALSE ); #ifdef DBG_UTIL diff --git a/sw/source/core/inc/tabfrm.hxx b/sw/source/core/inc/tabfrm.hxx index b41ba4214aa0..bbd2931d7839 100644 --- a/sw/source/core/inc/tabfrm.hxx +++ b/sw/source/core/inc/tabfrm.hxx @@ -132,7 +132,7 @@ public: virtual void Modify( SfxPoolItem*, SfxPoolItem* ); virtual BOOL GetInfo( SfxPoolItem &rHnt ) const; - virtual void Paint( const SwRect& ) const; + virtual void Paint( const SwRect&, const SwPrtOptions *pPrintData = NULL ) const; virtual void CheckDirection( BOOL bVert ); virtual void Cut(); diff --git a/sw/source/core/inc/txtfrm.hxx b/sw/source/core/inc/txtfrm.hxx index 79cd2a1a574c..dc91b188e439 100644 --- a/sw/source/core/inc/txtfrm.hxx +++ b/sw/source/core/inc/txtfrm.hxx @@ -296,7 +296,7 @@ public: void PaintExtraData( const SwRect & rRect ) const; //Seitennummer usw. SwRect Paint(); - virtual void Paint( const SwRect & ) const; + virtual void Paint( const SwRect &, const SwPrtOptions *pPrintData = NULL ) const; virtual void Modify( SfxPoolItem*, SfxPoolItem* ); virtual sal_Bool GetInfo( SfxPoolItem & ) const; diff --git a/sw/source/core/inc/viewimp.hxx b/sw/source/core/inc/viewimp.hxx index eba323bd52a2..026b293a827c 100644 --- a/sw/source/core/inc/viewimp.hxx +++ b/sw/source/core/inc/viewimp.hxx @@ -57,6 +57,7 @@ struct SdrPaintProcRec; class SwAccessibleMap; class SdrObject; class Fraction; +class SwPrtOptions; // OD 12.12.2002 #103492# class SwPagePreviewLayout; // OD 15.01.2003 #103492# @@ -270,10 +271,11 @@ public: // direction at the outliner of the draw view for painting layers <hell> // and <heaven>. // OD 25.06.2003 #108784# - correct type of 1st parameter - void PaintLayer ( const SdrLayerID _nLayerID, - const SwRect& _rRect, - const Color* _pPageBackgrdColor = 0, - const bool _bIsPageRightToLeft = false ) const; + void PaintLayer( const SdrLayerID _nLayerID, + const SwPrtOptions *pPrintData, + const SwRect& _rRect, + const Color* _pPageBackgrdColor = 0, + const bool _bIsPageRightToLeft = false ) const; //wird als Link an die DrawEngine uebergeben, entscheidet was wie //gepaintet wird oder nicht. diff --git a/sw/source/core/layout/paintfrm.cxx b/sw/source/core/layout/paintfrm.cxx index a52423e24bc1..96e775b93d7c 100644 --- a/sw/source/core/layout/paintfrm.cxx +++ b/sw/source/core/layout/paintfrm.cxx @@ -2740,7 +2740,7 @@ void SwTabFrmPainter::Insert( SwLineEntry& rNew, bool bHori ) |* |*************************************************************************/ -void SwRootFrm::Paint( const SwRect& rRect ) const +void SwRootFrm::Paint( const SwRect& rRect, const SwPrtOptions *pPrintData ) const { ASSERT( Lower() && Lower()->IsPageFrm(), "Lower der Root keine Seite." ); @@ -2939,7 +2939,7 @@ void SwRootFrm::Paint( const SwRect& rRect ) const // OD 29.08.2002 #102450# - add 3rd parameter // OD 09.12.2002 #103045# - add 4th parameter for horizontal text direction. const IDocumentDrawModelAccess* pIDDMA = pSh->getIDocumentDrawModelAccess(); - pSh->Imp()->PaintLayer( pIDDMA->GetHellId(), aPaintRect, + pSh->Imp()->PaintLayer( pIDDMA->GetHellId(), pPrintData, aPaintRect, &aPageBackgrdColor, (pPage->IsRightToLeft() ? true : false) ); pLines->PaintLines( pSh->GetOut() ); pLines->LockLines( FALSE ); @@ -2972,7 +2972,7 @@ void SwRootFrm::Paint( const SwRect& rRect ) const { /// OD 29.08.2002 #102450# - add 3rd parameter // OD 09.12.2002 #103045# - add 4th parameter for horizontal text direction. - pSh->Imp()->PaintLayer( pSh->GetDoc()->GetHeavenId(), aPaintRect, + pSh->Imp()->PaintLayer( pSh->GetDoc()->GetHeavenId(), pPrintData, aPaintRect, &aPageBackgrdColor, (pPage->IsRightToLeft() ? true : false) ); } @@ -3190,7 +3190,7 @@ SwShortCut::SwShortCut( const SwFrm& rFrm, const SwRect& rRect ) } } -void SwLayoutFrm::Paint( const SwRect& rRect ) const +void SwLayoutFrm::Paint( const SwRect& rRect, const SwPrtOptions* /* pPrintData */ ) const { ViewShell *pSh = GetShell(); @@ -3478,7 +3478,7 @@ BOOL SwFlyFrm::IsPaint( SdrObject *pObj, const ViewShell *pSh ) /************************************************************************* |* SwCellFrm::Paint( const SwRect& ) const |*************************************************************************/ -void SwCellFrm::Paint( const SwRect& rRect ) const +void SwCellFrm::Paint( const SwRect& rRect, const SwPrtOptions* /* pPrintData */ ) const { if ( GetLayoutRowSpan() >= 1 ) SwLayoutFrm::Paint( rRect ); @@ -3497,7 +3497,7 @@ void SwCellFrm::Paint( const SwRect& rRect ) const void MA_FASTCALL lcl_PaintLowerBorders( const SwLayoutFrm *pLay, const SwRect &rRect, const SwPageFrm *pPage ); -void SwFlyFrm::Paint( const SwRect& rRect ) const +void SwFlyFrm::Paint( const SwRect& rRect, const SwPrtOptions* /* pPrintData */ ) const { //wegen der Ueberlappung von Rahmen und Zeichenobjekten muessen die //Flys ihre Umrandung (und die der Innenliegenden) direkt ausgeben. @@ -3732,7 +3732,7 @@ void SwFlyFrm::Paint( const SwRect& rRect ) const |* |*************************************************************************/ -void SwTabFrm::Paint( const SwRect& rRect ) const +void SwTabFrm::Paint( const SwRect& rRect, const SwPrtOptions* /* pPrintData */ ) const { if ( pGlobalShell->GetViewOptions()->IsTable() ) { @@ -6438,10 +6438,10 @@ void SwFrm::Retouche( const SwPageFrm * pPage, const SwRect &rRect ) const // OD 09.12.2002 #103045# - add 4th parameter for horizontal text direction. const IDocumentDrawModelAccess* pIDDMA = pSh->getIDocumentDrawModelAccess(); - pSh->Imp()->PaintLayer( pIDDMA->GetHellId(), + pSh->Imp()->PaintLayer( pIDDMA->GetHellId(), 0, aRetouchePart, &aPageBackgrdColor, (pPage->IsRightToLeft() ? true : false) ); - pSh->Imp()->PaintLayer( pIDDMA->GetHeavenId(), + pSh->Imp()->PaintLayer( pIDDMA->GetHeavenId(), 0, aRetouchePart, &aPageBackgrdColor, (pPage->IsRightToLeft() ? true : false) ); } @@ -6691,14 +6691,14 @@ Graphic SwFlyFrmFmt::MakeGraphic( ImageMap* pMap ) // OD 30.08.2002 #102450# - add 3rd parameter // OD 09.12.2002 #103045# - add 4th parameter for horizontal text direction. const IDocumentDrawModelAccess* pIDDMA = pSh->getIDocumentDrawModelAccess(); - pImp->PaintLayer( pIDDMA->GetHellId(), aOut, &aPageBackgrdColor, + pImp->PaintLayer( pIDDMA->GetHellId(), 0, aOut, &aPageBackgrdColor, (pFlyPage->IsRightToLeft() ? true : false) ); pLines->PaintLines( &aDev ); if ( pFly->IsFlyInCntFrm() ) pFly->Paint( aOut ); pLines->PaintLines( &aDev ); /// OD 30.08.2002 #102450# - add 3rd parameter - pImp->PaintLayer( pIDDMA->GetHeavenId(), aOut, &aPageBackgrdColor, + pImp->PaintLayer( pIDDMA->GetHeavenId(), 0, aOut, &aPageBackgrdColor, (pFlyPage->IsRightToLeft() ? true : false) ); pLines->PaintLines( &aDev ); DELETEZ( pLines ); diff --git a/sw/source/core/layout/unusedf.cxx b/sw/source/core/layout/unusedf.cxx index 994a4d9ce625..bbbf10a0901f 100644 --- a/sw/source/core/layout/unusedf.cxx +++ b/sw/source/core/layout/unusedf.cxx @@ -44,7 +44,7 @@ void SwFrm::Format( const SwBorderAttrs * ) ASSERT( FALSE, "Format() der Basisklasse gerufen." ); } -void SwFrm::Paint(const SwRect &) const +void SwFrm::Paint(const SwRect &, const SwPrtOptions * ) const { ASSERT( FALSE, "Paint() der Basisklasse gerufen." ); } diff --git a/sw/source/core/layout/wsfrm.cxx b/sw/source/core/layout/wsfrm.cxx index 4bf0ba0860a5..c6f6dd43e64d 100644 --- a/sw/source/core/layout/wsfrm.cxx +++ b/sw/source/core/layout/wsfrm.cxx @@ -101,6 +101,11 @@ SwFrm::SwFrm( SwModify *pMod ) : pNext( 0 ), pPrev( 0 ), pDrawObjs( 0 ) + , bInfBody( FALSE ) + , bInfTab ( FALSE ) + , bInfFly ( FALSE ) + , bInfFtn ( FALSE ) + , bInfSct ( FALSE ) { #ifdef DBG_UTIL bFlag01 = bFlag02 = bFlag03 = bFlag04 = bFlag05 = 0; diff --git a/sw/source/core/text/frmpaint.cxx b/sw/source/core/text/frmpaint.cxx index 05c142e1fd84..684db7afe4aa 100644 --- a/sw/source/core/text/frmpaint.cxx +++ b/sw/source/core/text/frmpaint.cxx @@ -600,7 +600,7 @@ sal_Bool SwTxtFrm::PaintEmpty( const SwRect &rRect, sal_Bool bCheck ) const * SwTxtFrm::Paint() *************************************************************************/ -void SwTxtFrm::Paint( const SwRect &rRect ) const +void SwTxtFrm::Paint( const SwRect &rRect, const SwPrtOptions * /*pPrintData*/ ) const { ResetRepaint(); diff --git a/sw/source/core/text/itrform2.cxx b/sw/source/core/text/itrform2.cxx index 22f454033929..34980ee0dba0 100644 --- a/sw/source/core/text/itrform2.cxx +++ b/sw/source/core/text/itrform2.cxx @@ -101,6 +101,7 @@ void SwTxtFormatter::CtorInitTxtFormatter( SwTxtFrm *pNewFrm, SwTxtFormatInfo *p pMulti = NULL; bOnceMore = sal_False; + bFlyInCntBase = sal_False; bChanges = sal_False; bTruncLines = sal_False; nCntEndHyph = 0; @@ -2106,7 +2107,10 @@ long SwTxtFormatter::CalcOptRepaint( xub_StrLen nOldLineEnd, bool lcl_BuildHiddenPortion( const SwTxtSizeInfo& rInf, xub_StrLen &rPos ) { // Only if hidden text should not be shown: - if ( rInf.GetVsh() && rInf.GetVsh()->GetWin() && rInf.GetOpt().IsShowHiddenChar() ) +// if ( rInf.GetVsh() && rInf.GetVsh()->GetWin() && rInf.GetOpt().IsShowHiddenChar() ) + const bool bShowInDocView = rInf.GetVsh() && rInf.GetVsh()->GetWin() && rInf.GetOpt().IsShowHiddenChar(); + const bool bShowForPrinting = rInf.GetOpt().IsShowHiddenChar( TRUE ) && rInf.GetOpt().IsPrinting(); + if (bShowInDocView || bShowForPrinting) return false; const SwScriptInfo& rSI = rInf.GetParaPortion()->GetScriptInfo(); diff --git a/sw/source/core/text/porrst.cxx b/sw/source/core/text/porrst.cxx index a0b859cf0e12..fe39264e416b 100644 --- a/sw/source/core/text/porrst.cxx +++ b/sw/source/core/text/porrst.cxx @@ -219,6 +219,7 @@ SwArrowPortion::SwArrowPortion( const SwTxtPaintInfo &rInf ) rInf.GetTxtFrm()->Prt().Right(); aPos.Y() = rInf.GetTxtFrm()->Frm().Top() + rInf.GetTxtFrm()->Prt().Bottom(); + SetWhichPor( POR_ARROW ); } void SwArrowPortion::Paint( const SwTxtPaintInfo &rInf ) const diff --git a/sw/source/core/unocore/unodraw.cxx b/sw/source/core/unocore/unodraw.cxx index 4f1b2c1770e3..3a22c81daaab 100644 --- a/sw/source/core/unocore/unodraw.cxx +++ b/sw/source/core/unocore/unodraw.cxx @@ -2737,12 +2737,14 @@ void SwXShape::_AdjustPositionProperties( const awt::Point _aPosition ) rtl::OUString aHoriOrientPropStr( RTL_CONSTASCII_USTRINGPARAM("HoriOrient") ); uno::Any aHoriOrient( getPropertyValue( aHoriOrientPropStr ) ); sal_Int16 eHoriOrient; - aHoriOrient >>= eHoriOrient; - if ( eHoriOrient != text::HoriOrientation::NONE ) + if (aHoriOrient >>= eHoriOrient) // may be void { - eHoriOrient = text::HoriOrientation::NONE; - aHoriOrient <<= eHoriOrient; - setPropertyValue( aHoriOrientPropStr, aHoriOrient ); + if ( eHoriOrient != text::HoriOrientation::NONE ) + { + eHoriOrient = text::HoriOrientation::NONE; + aHoriOrient <<= eHoriOrient; + setPropertyValue( aHoriOrientPropStr, aHoriOrient ); + } } // set x-position attribute aHoriPos <<= _aPosition.X; @@ -2765,12 +2767,14 @@ void SwXShape::_AdjustPositionProperties( const awt::Point _aPosition ) rtl::OUString aVertOrientPropStr( RTL_CONSTASCII_USTRINGPARAM("VertOrient") ); uno::Any aVertOrient( getPropertyValue( aVertOrientPropStr ) ); sal_Int16 eVertOrient; - aVertOrient >>= eVertOrient; - if ( eVertOrient != text::VertOrientation::NONE ) + if (aVertOrient >>= eVertOrient) // may be void { - eVertOrient = text::VertOrientation::NONE; - aVertOrient <<= eVertOrient; - setPropertyValue( aVertOrientPropStr, aVertOrient ); + if ( eVertOrient != text::VertOrientation::NONE ) + { + eVertOrient = text::VertOrientation::NONE; + aVertOrient <<= eVertOrient; + setPropertyValue( aVertOrientPropStr, aVertOrient ); + } } // set y-position attribute aVertPos <<= _aPosition.Y; diff --git a/sw/source/core/view/vdraw.cxx b/sw/source/core/view/vdraw.cxx index da9800c9068a..1b692f36ad8d 100644 --- a/sw/source/core/view/vdraw.cxx +++ b/sw/source/core/view/vdraw.cxx @@ -57,6 +57,7 @@ #include "viewimp.hxx" #include "dflyobj.hxx" #include "viewopt.hxx" +#include "swprtopt.hxx" #include "dcontact.hxx" #include "dview.hxx" #include "flyfrm.hxx" @@ -184,6 +185,7 @@ void SwViewImp::UnlockPaint() // outliner of the draw view for painting layers <hell> and <heaven>. // OD 25.06.2003 #108784# - correct type of 1st parameter void SwViewImp::PaintLayer( const SdrLayerID _nLayerID, + const SwPrtOptions * _pPrintData, const SwRect& , const Color* _pPageBackgrdColor, const bool _bIsPageRightToLeft ) const @@ -230,6 +232,12 @@ void SwViewImp::PaintLayer( const SdrLayerID _nLayerID, } pOutDev->Push( PUSH_LINECOLOR ); // #114231# + if (_pPrintData) + { + // hide drawings but not form controls (form controls are handled elsewhere) + SdrView &rSdrView = const_cast< SdrView & >(GetPageView()->GetView()); + rSdrView.setHideDraw( !_pPrintData->IsPrintDraw() ); + } GetPageView()->DrawLayer(_nLayerID, pOutDev); pOutDev->Pop(); diff --git a/sw/source/core/view/viewpg.cxx b/sw/source/core/view/viewpg.cxx index cad53470e95b..61594065c3db 100644..100755 --- a/sw/source/core/view/viewpg.cxx +++ b/sw/source/core/view/viewpg.cxx @@ -31,9 +31,11 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_sw.hxx" +#include <com/sun/star/uno/Sequence.hxx> #include <hintids.hxx> #include <vcl/window.hxx> +#include <vcl/oldprintadaptor.hxx> #include <sfx2/printer.hxx> #include <sfx2/progress.hxx> #include <pvprtdat.hxx> @@ -59,6 +61,10 @@ #include <IDocumentFieldsAccess.hxx> #include <IDocumentDeviceAccess.hxx> + +using namespace ::com::sun::star; + + // OD 12.12.2002 #103492# SwPagePreviewLayout* ViewShell::PagePreviewLayout() { @@ -87,671 +93,173 @@ void ViewShell::AdjustOptionsForPagePreview( const SwPrtOptions &_rPrintOptions return; } -// output print preview on printer -// OD 05.05.2003 #i14016# - consider empty pages on calculation of scaling -// and on calculation of paint offset. -void ViewShell::PrintPreViewPage( SwPrtOptions& rOptions, - USHORT nRowCol, SfxProgress& rProgress, - const SwPagePreViewPrtData* pPrtData ) -{ - if( !rOptions.aMulti.GetSelectCount() ) - return; - // wenn kein Drucker vorhanden ist, wird nicht gedruckt - SfxPrinter* pPrt = getIDocumentDeviceAccess()->getPrinter(false); - if( !pPrt || !pPrt->GetName().Len() ) +// print brochure +// OD 05.05.2003 #i14016# - consider empty pages on calculation of the scaling +// for a page to be printed. +void ViewShell::PrintProspect(
+ OutputDevice *pOutDev,
+ const SwPrintData &rPrintData, + sal_Int32 nRenderer // the index in the vector of prospect pages to be printed + )
+{ + const sal_Int32 nMaxRenderer = rPrintData.GetRenderData().GetPagePairsForProspectPrinting().size() - 1; +#if OSL_DEBUG_LEVEL > 1 + DBG_ASSERT( 0 <= nRenderer && nRenderer <= nMaxRenderer, "nRenderer out of bounds"); +#endif + Printer *pPrinter = dynamic_cast< Printer * >(pOutDev); + if (!pPrinter || nMaxRenderer < 0 || nRenderer < 0 || nRenderer > nMaxRenderer) return; -// schoen waers gewesen !!! const MultiSelection& rMulti = rOptions.aMulti; - MultiSelection aMulti( rOptions.aMulti ); - Range aPages( aMulti.FirstSelected(), aMulti.LastSelected() ); - if ( aPages.Max() > USHRT_MAX ) - aPages.Max() = USHRT_MAX; - - ASSERT( aPages.Min() > 0, - "Seite 0 Drucken?" ); - ASSERT( aPages.Min() <= aPages.Max(), - "MinSeite groesser MaxSeite." ); + // save settings of OutputDevice (should be done always since the + // output device is now provided by a call from outside the Writer) + pPrinter->Push(); + + std::pair< sal_Int32, sal_Int32 > rPagesToPrint = + rPrintData.GetRenderData().GetPagePairsForProspectPrinting()[ nRenderer ]; +// const USHORT nPageMax = static_cast< USHORT >(rPagesToPrint.first > rPagesToPrint.second ? +// rPagesToPrint.first : rPagesToPrint.second); +#if OSL_DEBUG_LEVEL > 1 + DBG_ASSERT( rPagesToPrint.first == -1 || rPrintData.GetRenderData().GetValidPagesSet().count( rPagesToPrint.first ) == 1, "first Page not valid" ); + DBG_ASSERT( rPagesToPrint.second == -1 || rPrintData.GetRenderData().GetValidPagesSet().count( rPagesToPrint.second ) == 1, "second Page not valid" ); +#endif // eine neue Shell fuer den Printer erzeugen - ViewShell aShell( *this, 0 ); - if ( &GetRefDev() == pPrt ) - aShell.mpTmpRef = new SfxPrinter( *pPrt ); + ViewShell aShell( *this, 0, pPrinter ); SET_CURR_SHELL( &aShell ); - aShell.PrepareForPrint( rOptions ); + aShell.PrepareForPrint( rPrintData ); - // gibt es versteckte Absatzfelder, unnoetig wenn die Absaetze bereits - // ausgeblendet sind. - int bHiddenFlds = FALSE; - SwFieldType* pFldType = 0; - if ( GetViewOptions()->IsShowHiddenPara() ) - { - pFldType = getIDocumentFieldsAccess()->GetSysFldType( RES_HIDDENPARAFLD ); - bHiddenFlds = 0 != pFldType->GetDepends(); - if( bHiddenFlds ) - { - SwMsgPoolItem aHnt( RES_HIDDENPARA_PRINT ); - pFldType->Modify( &aHnt, 0); - } - } - - // Seiten fuers Drucken formatieren - aShell.CalcPagesForPrint( (USHORT)aPages.Max(), &rProgress ); + //!! applying view options and formatting the dcoument should now only be done in getRendererCount! - USHORT nCopyCnt = rOptions.bCollate ? rOptions.nCopyCount : 1; - BOOL bStartJob = FALSE; + MapMode aMapMode( MAP_TWIP ); + Size aPrtSize( pPrinter->PixelToLogic( pPrinter->GetPaperSizePixel(), aMapMode ) ); - const bool bPrintEmptyPages = rOptions.IsPrintEmptyPages(); + SwTwips nMaxRowSz, nMaxColSz; - for ( USHORT nCnt = 0; nCnt < nCopyCnt; nCnt++ ) + const SwPageFrm *pStPage = 0; + const SwPageFrm *pNxtPage = 0; + const SwRenderData::ValidStartFramesMap_t &rFrms = rPrintData.GetRenderData().GetValidStartFrames(); + if (rPagesToPrint.first > 0) { - if( rOptions.IsPrintSingleJobs() && rOptions.GetJobName().Len() && - ( bStartJob || rOptions.bJobStartet ) ) - { - pPrt->EndJob(); - rOptions.bJobStartet = TRUE; - - // Reschedule statt Yield, da Yield keine Events abarbeitet - // und es sonst eine Endlosschleife gibt. - while( pPrt->IsPrinting() ) - rProgress.Reschedule(); - - rOptions.MakeNextJobName(); - bStartJob = pPrt->StartJob( rOptions.GetJobName() ); - } - - const SwPageFrm *pStPage = (SwPageFrm*)GetLayout()->Lower(); - const SwFrm *pEndPage = pStPage; - USHORT i; - - for( i = 1; pStPage && i < (USHORT)aPages.Min(); ++i ) - pStPage = (SwPageFrm*)pStPage->GetNext(); - - if( !pStPage ) // dann wars das - { - if( bHiddenFlds ) - { - SwMsgPoolItem aHnt( RES_HIDDENPARA_PRINT ); - pFldType->Modify( &aHnt, 0); - CalcPagesForPrint( (USHORT)aPages.Max() ); - } - return; - } - - // unsere SttPage haben wir, dann die EndPage suchen - USHORT nFirstPageNo = i; - USHORT nLastPageNo = i; - USHORT nPageNo = 1; - - pEndPage = pStPage; - - if( pStPage->GetNext() && (i != (USHORT)aPages.Max()) ) - { - pEndPage = pEndPage->GetNext(); - for( ++i,++nLastPageNo; - pEndPage->GetNext() && i < (USHORT)aPages.Max(); ++i ) - { - pEndPage = pEndPage->GetNext(); - ++nLastPageNo; - } - } + SwRenderData::ValidStartFramesMap_t::const_iterator aIt( rFrms.find( rPagesToPrint.first ) ); + DBG_ASSERT( aIt != rFrms.end(), "failed to find start frame" ); + pStPage = aIt->second; + } + if (rPagesToPrint.second > 0) + { + SwRenderData::ValidStartFramesMap_t::const_iterator aIt( rFrms.find( rPagesToPrint.second ) ); + DBG_ASSERT( aIt != rFrms.end(), "failed to find start frame" ); + pNxtPage = aIt->second; + } - if( rOptions.bPrintReverse ) + // OD 05.05.2003 #i14016# - consider empty pages on calculation + // of page size, used for calculation of scaling. + Size aSttPageSize; + if ( pStPage ) + { + if ( pStPage->IsEmptyPage() ) { - const SwFrm *pTmp = pStPage; - pStPage = (SwPageFrm*)pEndPage; - pEndPage = pTmp; - nPageNo = nLastPageNo; + if ( pStPage->GetPhyPageNum() % 2 == 0 ) + aSttPageSize = pStPage->GetPrev()->Frm().SSize(); + else + aSttPageSize = pStPage->GetNext()->Frm().SSize(); } else - nPageNo = nFirstPageNo; - - // ein Array fuer die Seiten anlegen, die auf eine Drucker-Seite - // gedruckt werden sollen. - BYTE nRow = BYTE(nRowCol >> 8), nCol = BYTE(nRowCol & 0xff); - USHORT nPages = nRow * nCol; - SwPageFrm** aPageArr = new SwPageFrm* [ nPages ]; - memset( aPageArr, 0, sizeof( SwPageFrm* ) * nPages ); - USHORT nCntPage = 0; - - SwTwips nCalcW = 0, nCalcH = 0, nMaxRowSz = 0, nMaxColSz = 0; - - MapMode aOld( pPrt->GetMapMode() ); - MapMode aMapMode( MAP_TWIP ); - Size aPrtSize( pPrt->PixelToLogic( pPrt->GetPaperSizePixel(), aMapMode )); - if( pPrtData ) { - aPrtSize.Width() -= pPrtData->GetLeftSpace() + - pPrtData->GetRightSpace() + - ( pPrtData->GetHorzSpace() * (nCol - 1)); - aPrtSize.Height() -= pPrtData->GetTopSpace() + - pPrtData->GetBottomSpace() + - ( pPrtData->GetVertSpace() * (nRow - 1)); + aSttPageSize = pStPage->Frm().SSize(); } - - aMulti.Select( Range( nLastPageNo+1, USHRT_MAX ), FALSE ); - USHORT nSelCount = USHORT((aMulti.GetSelectCount()+nPages-1) / nPages); - nSelCount = nSelCount * nCopyCnt; - USHORT nPrintCount = 1; - - const XubString aTmp( SW_RES( STR_STATSTR_PRINT ) ); - rProgress.SetText( aTmp ); - //HACK, damit die Anzeige nicht durcheinander kommt: - rProgress.SetState( 1, nSelCount ); - rProgress.SetText( aTmp ); - bStartJob = TRUE; - - while( pStPage ) + } + Size aNxtPageSize; + if ( pNxtPage ) + { + if ( pNxtPage->IsEmptyPage() ) { - // Mag der Anwender noch ? - rProgress.Reschedule(); - - if ( !pPrt->IsJobActive() ) - break; - - // --> FME 2005-12-12 #b6354161# Feature - Print empty pages - // --> OD 2007-10-22 #i79738# - correct condition: - // always consider, if page is selected for print. - if( aMulti.IsSelected( nPageNo ) && - ( bPrintEmptyPages || !pStPage->IsEmptyPage() ) ) - // <-- - { - if( rOptions.bPrintReverse ) - aPageArr[ nPages - ++nCntPage ] = (SwPageFrm*)pStPage; - else - aPageArr[ nCntPage++ ] = (SwPageFrm*)pStPage; - - // OD 05.05.2003 #i14016# - consider empty pages on calculation - // of page size, used for calculation of scaling. - Size aPageSize; - if ( pStPage->IsEmptyPage() ) - { - if ( pStPage->GetPhyPageNum() % 2 == 0 ) - aPageSize = pStPage->GetPrev()->Frm().SSize(); - else - aPageSize = pStPage->GetNext()->Frm().SSize(); - } - else - { - aPageSize = pStPage->Frm().SSize(); - } - nCalcW += aPageSize.Width(); - if( nCalcH < aPageSize.Height() ) - nCalcH = aPageSize.Height(); - - if( 0 == (nCntPage % nCol ) || // neue Zeile - nCntPage == nPages || pStPage == pEndPage ) - { - // sollte die Seite nicht gefuellt sein, so erweiter - // anhand der letzen Seite. Dadurch hat auch die - // letze Seite die richtigen Spalten/Reihen. - // BUG: 17695 - if( pStPage == pEndPage && nCntPage != nPages ) - { - // dann Werte mit der letzen Seite auffuellen - if( nCntPage < nCol ) - nCalcW += aPageSize.Width() * (nCol - nCntPage); - - BYTE nRows = (BYTE) ( nCntPage / nCol + 1 ); - if( nRows < nRow ) - nCalcH += ( nRow - nRows ) * nCalcH; - } - - if( nMaxColSz < nCalcW ) - nMaxColSz = nCalcW; - nCalcW = 0; - nMaxRowSz += nCalcH; - } - - if( nCntPage == nPages || pStPage == pEndPage ) - { - // den MapMode einstellen - aMapMode.SetOrigin( Point() ); - { - Fraction aScX( aPrtSize.Width(), nMaxColSz ); - Fraction aScY( aPrtSize.Height(), nMaxRowSz ); - - { - if( aScX < aScY ) - aScY = aScX; - - // fuer Drawing, damit diese ihre Objecte vernuenftig Painten - // koennen, auf "glatte" Prozentwerte setzen - aScY *= Fraction( 1000, 1 ); - long nTmp = (long)aScY; - if( 1 < nTmp ) - --nTmp; - else - nTmp = 1; - aScY = Fraction( nTmp, 1000 ); - aScX = aScY; - } - - aMapMode.SetScaleY( aScY ); - aMapMode.SetScaleX( aScX ); - } - - Point aPrtOff( pPrt->PixelToLogic( - pPrt->GetPageOffsetPixel(), aMapMode ) ); - long nPageHeight = (nMaxRowSz / nRow); - - // dann kann das drucken losgehen - rProgress.SetState( nPrintCount++, nSelCount ); - - pPrt->StartPage(); - Point aCalcPt; - SwPageFrm** ppTmpPg = aPageArr; - - // ist das Array nicht vollsteandig gefuellt ? - if( rOptions.bPrintReverse && nCntPage != nPages ) - { - // beim Rueckwaertsdruck alle Seiten nach vorne - // verschieben! - memmove( ppTmpPg, ppTmpPg + (nPages - nCntPage), - nCntPage * sizeof( SwPageFrm*) ); - aPageArr[ nCntPage ] = 0; // Endekennung - } - - long nHOffs = 0, nVOffs = 0, nXStt = 0; - if( pPrtData ) - { - const Fraction& rScaleX = aMapMode.GetScaleX(); - const Fraction& rScaleY = aMapMode.GetScaleY(); - Fraction aF( pPrtData->GetTopSpace(), 1 ); - aCalcPt.Y() = aF /= rScaleY; - aF = Fraction( pPrtData->GetLeftSpace(), 1 ); - nXStt = aF /= rScaleX; - aF = Fraction( pPrtData->GetVertSpace(), 1 ); - nVOffs = aF /= rScaleY; - aF = Fraction( pPrtData->GetHorzSpace(), 1 ); - nHOffs = aF /= rScaleX; - } - - for( BYTE nR = 0; *ppTmpPg && nR < nRow; ++nR ) - { - aCalcPt.X() = nXStt; - for( BYTE nC = 0; *ppTmpPg && nC < nCol; ++nC ) - { - aShell.Imp()->SetFirstVisPageInvalid(); - aShell.aVisArea = (*ppTmpPg)->Frm(); - - Point aPos( aCalcPt ); - aPos -= aShell.aVisArea.Pos(); - aPos -= aPrtOff; - aMapMode.SetOrigin( aPos ); - pPrt->SetMapMode( aMapMode ); - (*ppTmpPg)->GetUpper()->Paint( (*ppTmpPg)->Frm() ); - // OD 05.05.2003 #i14016# - consider empty pages - // on calculation of the paint offset for the next page. - aCalcPt.X() += nHOffs; - if ( (*ppTmpPg)->IsEmptyPage() ) - { - if ( (*ppTmpPg)->GetPhyPageNum() % 2 == 0 ) - aCalcPt.X() += (*ppTmpPg)->GetPrev()->Frm().SSize().Width(); - else - aCalcPt.X() += (*ppTmpPg)->GetNext()->Frm().SSize().Width(); - } - else - { - aCalcPt.X() += (*ppTmpPg)->Frm().Width(); - } - ++ppTmpPg; - } - aCalcPt.Y() += nVOffs + nPageHeight; - } - pPrt->EndPage(); - SwPaintQueue::Repaint(); - - memset( aPageArr, 0, sizeof( SwPageFrm* ) * nPages ); - nCntPage = 0; - nMaxRowSz = nMaxColSz = nCalcH = nCalcW = 0; - } - } - - if( pStPage == pEndPage ) - pStPage = 0; - else if( rOptions.bPrintReverse ) - { - --nPageNo; - pStPage = (SwPageFrm*)pStPage->GetPrev(); - } + if ( pNxtPage->GetPhyPageNum() % 2 == 0 ) + aNxtPageSize = pNxtPage->GetPrev()->Frm().SSize(); else - { - ++nPageNo; - pStPage = (SwPageFrm*)pStPage->GetNext(); - } + aNxtPageSize = pNxtPage->GetNext()->Frm().SSize(); } - pPrt->SetMapMode( aOld ); - - if( bHiddenFlds ) + else { - SwMsgPoolItem aHnt( RES_HIDDENPARA_PRINT ); - pFldType->Modify( &aHnt, 0); - CalcPagesForPrint( (USHORT)aPages.Max() ); + aNxtPageSize = pNxtPage->Frm().SSize(); } - delete[] aPageArr; - - if( bStartJob ) - rOptions.bJobStartet = TRUE; } - pFntCache->Flush(); -} -// print brochure -// OD 05.05.2003 #i14016# - consider empty pages on calculation of the scaling -// for a page to be printed. -void ViewShell::PrintProspect( SwPrtOptions& rOptions, - SfxProgress& rProgress , BOOL bRTL) -{ - if( !rOptions.aMulti.GetSelectCount() ) - return; - - // wenn kein Drucker vorhanden ist, wird nicht gedruckt - SfxPrinter* pPrt = getIDocumentDeviceAccess()->getPrinter(false); - if( !pPrt || !pPrt->GetName().Len() || - ( !rOptions.bPrintLeftPage && !rOptions.bPrintRightPage )) - return; - - MultiSelection aMulti( rOptions.aMulti ); - Range aPages( aMulti.FirstSelected(), aMulti.LastSelected() ); - if ( aPages.Max() > USHRT_MAX ) - aPages.Max() = USHRT_MAX; - - ASSERT( aPages.Min() > 0, - "Seite 0 Drucken?" ); - ASSERT( aPages.Min() <= aPages.Max(), - "MinSeite groesser MaxSeite." ); - - // eine neue Shell fuer den Printer erzeugen - ViewShell aShell( *this, 0 ); - if ( &GetRefDev() == pPrt ) - aShell.mpTmpRef = new SfxPrinter( *pPrt ); - - SET_CURR_SHELL( &aShell ); - - aShell.PrepareForPrint( rOptions ); - - // gibt es versteckte Absatzfelder, unnoetig wenn die Absaetze bereits - // ausgeblendet sind. - int bHiddenFlds = FALSE; - SwFieldType* pFldType = 0; - if ( GetViewOptions()->IsShowHiddenPara() ) + if( !pStPage ) { - pFldType = getIDocumentFieldsAccess()->GetSysFldType( RES_HIDDENPARAFLD ); - bHiddenFlds = 0 != pFldType->GetDepends(); - if( bHiddenFlds ) - { - SwMsgPoolItem aHnt( RES_HIDDENPARA_PRINT ); - pFldType->Modify( &aHnt, 0); - } + nMaxColSz = 2 * aNxtPageSize.Width(); + nMaxRowSz = aNxtPageSize.Height(); } - - // Seiten fuers Drucken formatieren - aShell.CalcPagesForPrint( (USHORT)aPages.Max(), &rProgress ); - - USHORT nCopyCnt = rOptions.bCollate ? rOptions.nCopyCount : 1; - - const SwPageFrm *pStPage = (SwPageFrm*)GetLayout()->Lower(); - USHORT i; - - for( i = 1; pStPage && i < (USHORT)aPages.Min(); ++i ) - pStPage = (SwPageFrm*)pStPage->GetNext(); - - if( !pStPage ) // dann wars das + else if( !pNxtPage ) { - if( bHiddenFlds ) - { - SwMsgPoolItem aHnt( RES_HIDDENPARA_PRINT ); - pFldType->Modify( &aHnt, 0); - CalcPagesForPrint( (USHORT)aPages.Max() ); - } - return; + nMaxColSz = 2 * aSttPageSize.Width(); + nMaxRowSz = aSttPageSize.Height(); } - - // unsere SttPage haben wir, dann die EndPage suchen - SvPtrarr aArr( 255, 255 ); - aArr.Insert( (void*)pStPage, aArr.Count() ); - - while( pStPage->GetNext() && i < (USHORT)aPages.Max() ) + else { - pStPage = (SwPageFrm*)pStPage->GetNext(); - if( aMulti.IsSelected( ++i ) ) - aArr.Insert( (void*)pStPage, aArr.Count() ); + nMaxColSz = aNxtPageSize.Width() + aSttPageSize.Width(); + nMaxRowSz = Max( aNxtPageSize.Height(), aSttPageSize.Height() ); } - // auf Doppelseiten auffuellen - if( 1 == aArr.Count() ) // eine Seite ist ein Sonderfall - aArr.Insert( (void*)0, 1 ); - else + // den MapMode einstellen + aMapMode.SetOrigin( Point() ); { - while( aArr.Count() & 3 ) - aArr.Insert( (void*)0, aArr.Count() ); + Fraction aScX( aPrtSize.Width(), nMaxColSz ); + Fraction aScY( aPrtSize.Height(), nMaxRowSz ); + if( aScX < aScY ) + aScY = aScX; - if( rOptions.bPrintReverse && 4 < aArr.Count() ) { - // das Array umsortieren - // Array: 1 2 3 4 5 6 7 8 - // soll: 3 4 1 2 7 8 5 6 - // Algorhytmus: - // vordere Haelfte: Austausch von 2 Pointer von Vorne vor die Haelfte - // hintere Haelfte: Austausch von 2 Pointer von der Haelfte nach hinten - - USHORT nHalf = aArr.Count() / 2; - USHORT nSwapCount = nHalf / 4; - - VoidPtr* ppArrStt = (VoidPtr*)aArr.GetData(); - VoidPtr* ppArrHalf = (VoidPtr*)aArr.GetData() + nHalf; - - for( int nLoop = 0; nLoop < 2; ++nLoop ) - { - for( USHORT n = 0; n < nSwapCount; ++n ) - { - void* pTmp = *ppArrStt; - *ppArrStt++ = *(ppArrHalf-2); - *(ppArrHalf-2) = pTmp; - - pTmp = *ppArrStt; - *ppArrStt++ = *--ppArrHalf; - *ppArrHalf-- = pTmp; - } - ppArrStt = (VoidPtr*)aArr.GetData() + nHalf; - ppArrHalf = (VoidPtr*)aArr.GetData() + aArr.Count(); - } + // fuer Drawing, damit diese ihre Objecte vernuenftig Painten + // koennen, auf "glatte" Prozentwerte setzen + aScY *= Fraction( 1000, 1 ); + long nTmp = (long)aScY; + if( 1 < nTmp ) + --nTmp; + else + nTmp = 1; + aScY = Fraction( nTmp, 1000 ); } + + aMapMode.SetScaleY( aScY ); + aMapMode.SetScaleX( aScY ); } - BOOL bStartJob = FALSE; + Size aTmpPrtSize( pPrinter->PixelToLogic( pPrinter->GetPaperSizePixel(), aMapMode ) ); - for( USHORT nCnt = 0; nCnt < nCopyCnt; nCnt++ ) + // calculate start point for equal border on all sides + Point aSttPt( (aTmpPrtSize.Width() - nMaxColSz) / 2, + (aTmpPrtSize.Height() - nMaxRowSz) / 2 ); + for( int nC = 0; nC < 2; ++nC ) { - if( rOptions.IsPrintSingleJobs() && rOptions.GetJobName().Len() && - ( bStartJob || rOptions.bJobStartet ) ) + if( pStPage ) { - pPrt->EndJob(); - rOptions.bJobStartet = TRUE; - - // Reschedule statt Yield, da Yield keine Events abarbeitet - // und es sonst eine Endlosschleife gibt. - while( pPrt->IsPrinting() ) - rProgress.Reschedule(); - - rOptions.MakeNextJobName(); - bStartJob = pPrt->StartJob( rOptions.GetJobName() ); + aShell.Imp()->SetFirstVisPageInvalid(); + aShell.aVisArea = pStPage->Frm(); + + Point aPos( aSttPt ); + aPos -= aShell.aVisArea.Pos(); +// aPos -= aPrtOff; + aMapMode.SetOrigin( aPos ); + pPrinter->SetMapMode( aMapMode ); + pStPage->GetUpper()->Paint( pStPage->Frm() ); } - // dann sorge mal dafuer, das alle Seiten in der richtigen - // Reihenfolge stehen: - USHORT nSPg = 0, nEPg = aArr.Count(), nStep = 1; - if( 0 == (nEPg & 1 )) // ungerade gibt es nicht! - --nEPg; - - if( !rOptions.bPrintLeftPage ) - ++nStep; - else if( !rOptions.bPrintRightPage ) - { - ++nStep; - ++nSPg, --nEPg; - } + pStPage = pNxtPage; + aSttPt.X() += aTmpPrtSize.Width() / 2; + } - USHORT nCntPage = (( nEPg - nSPg ) / ( 2 * nStep )) + 1; + SwPaintQueue::Repaint(); - MapMode aOld( pPrt->GetMapMode() ); - MapMode aMapMode( MAP_TWIP ); - Size aPrtSize( pPrt->PixelToLogic( pPrt->GetPaperSizePixel(), aMapMode ) ); + //!! applying/modifying view options and formatting the dcoument should now only be done in getRendererCount! - const XubString aTmp( SW_RES( STR_STATSTR_PRINT ) ); - rProgress.SetText( aTmp ); - //HACK, damit die Anzeige nicht durcheinander kommt: - rProgress.SetState( 1, nCntPage ); - rProgress.SetText( aTmp ); + pFntCache->Flush(); - for( USHORT nPrintCount = 0; nSPg < nEPg && - nPrintCount < nCntPage; ++nPrintCount ) - { - // Mag der Anwender noch ? - rProgress.Reschedule(); - - if ( !pPrt->IsJobActive() ) - break; - - SwTwips nMaxRowSz, nMaxColSz; - pStPage = (SwPageFrm*)aArr[ nSPg ]; - const SwPageFrm* pNxtPage = nEPg < aArr.Count() - ? (SwPageFrm*)aArr[ nEPg ] - : 0; - - // OD 05.05.2003 #i14016# - consider empty pages on calculation - // of page size, used for calculation of scaling. - Size aSttPageSize; - if ( pStPage ) - { - if ( pStPage->IsEmptyPage() ) - { - if ( pStPage->GetPhyPageNum() % 2 == 0 ) - aSttPageSize = pStPage->GetPrev()->Frm().SSize(); - else - aSttPageSize = pStPage->GetNext()->Frm().SSize(); - } - else - { - aSttPageSize = pStPage->Frm().SSize(); - } - } - Size aNxtPageSize; - if ( pNxtPage ) - { - if ( pNxtPage->IsEmptyPage() ) - { - if ( pNxtPage->GetPhyPageNum() % 2 == 0 ) - aNxtPageSize = pNxtPage->GetPrev()->Frm().SSize(); - else - aNxtPageSize = pNxtPage->GetNext()->Frm().SSize(); - } - else - { - aNxtPageSize = pNxtPage->Frm().SSize(); - } - } - - if( !pStPage ) - { - nMaxColSz = 2 * aNxtPageSize.Width(); - nMaxRowSz = aNxtPageSize.Height(); - } - else if( !pNxtPage ) - { - nMaxColSz = 2 * aSttPageSize.Width(); - nMaxRowSz = aSttPageSize.Height(); - } - else - { - nMaxColSz = aNxtPageSize.Width() + - aSttPageSize.Width(); - nMaxRowSz = Max( aNxtPageSize.Height(), - aSttPageSize.Height() ); - } - - short nRtlOfs = bRTL ? 1 : 0; - if( 0 == (( nSPg + nRtlOfs) & 1 ) ) // switch for odd number in LTR, even number in RTL - { - const SwPageFrm* pTmp = pStPage; - pStPage = pNxtPage; - pNxtPage = pTmp; - } - - // den MapMode einstellen - aMapMode.SetOrigin( Point() ); - { - Fraction aScX( aPrtSize.Width(), nMaxColSz ); - Fraction aScY( aPrtSize.Height(), nMaxRowSz ); - if( aScX < aScY ) - aScY = aScX; - - { - // fuer Drawing, damit diese ihre Objecte vernuenftig Painten - // koennen, auf "glatte" Prozentwerte setzen - aScY *= Fraction( 1000, 1 ); - long nTmp = (long)aScY; - if( 1 < nTmp ) - --nTmp; - else - nTmp = 1; - aScY = Fraction( nTmp, 1000 ); - } - - aMapMode.SetScaleY( aScY ); - aMapMode.SetScaleX( aScY ); - } - - Point aPrtOff( pPrt->PixelToLogic( - pPrt->GetPageOffsetPixel(), aMapMode ) ); - Size aTmpPrtSize( pPrt->PixelToLogic( - pPrt->GetPaperSizePixel(), aMapMode ) ); - - // dann kann das drucken losgehen - bStartJob = TRUE; - rProgress.SetState( nPrintCount, nCntPage ); - - pPrt->StartPage(); - - Point aSttPt; - for( int nC = 0; nC < 2; ++nC ) - { - if( pStPage ) - { - aShell.Imp()->SetFirstVisPageInvalid(); - aShell.aVisArea = pStPage->Frm(); - - Point aPos( aSttPt ); - aPos -= aShell.aVisArea.Pos(); - aPos -= aPrtOff; - aMapMode.SetOrigin( aPos ); - pPrt->SetMapMode( aMapMode ); - pStPage->GetUpper()->Paint( pStPage->Frm() ); - } - - pStPage = pNxtPage; - aSttPt.X() += aTmpPrtSize.Width() / 2; - } - - pPrt->EndPage(); - SwPaintQueue::Repaint(); - nSPg = nSPg + nStep; - nEPg = nEPg - nStep; - } - pPrt->SetMapMode( aOld ); + // restore settings of OutputDevice (should be done always now since the + // output device is now provided by a call from outside the Writer) + pPrinter->Pop(); +} - if( bHiddenFlds ) - { - SwMsgPoolItem aHnt( RES_HIDDENPARA_PRINT ); - pFldType->Modify( &aHnt, 0); - CalcPagesForPrint( (USHORT)aPages.Max() ); - } - if( bStartJob ) - rOptions.bJobStartet = TRUE; - } - pFntCache->Flush(); -} diff --git a/sw/source/core/view/vnew.cxx b/sw/source/core/view/vnew.cxx index a270c6f78492..99c16d68f2bd 100644 --- a/sw/source/core/view/vnew.cxx +++ b/sw/source/core/view/vnew.cxx @@ -116,11 +116,8 @@ void ViewShell::Init( const SwViewOption *pNewOpt ) // Only setup the printer if we need one: const IDocumentSettingAccess* pIDSA = getIDocumentSettingAccess(); const bool bBrowseMode = pIDSA->get(IDocumentSettingAccess::BROWSE_MODE); - const bool bCreatePrinter = !bBrowseMode && - !pIDSA->get(IDocumentSettingAccess::USE_VIRTUAL_DEVICE); - SfxPrinter* pPrinter = getIDocumentDeviceAccess()->getPrinter( bCreatePrinter ); - if( pPrinter ) - InitPrt( pPrinter, pPDFOut ); + if( pPDFOut ) + InitPrt( pPDFOut ); // <-- // --> FME 2005-03-16 #i44963# Good occasion to check if page sizes in diff --git a/sw/source/core/view/vprint.cxx b/sw/source/core/view/vprint.cxx index e64a3f58eba2..7a22698b87ca 100644..100755 --- a/sw/source/core/view/vprint.cxx +++ b/sw/source/core/view/vprint.cxx @@ -33,11 +33,19 @@ #include "precompiled_sw.hxx" +#include <com/sun/star/uno/Sequence.hxx> +#include <com/sun/star/uno/Any.hxx> + #include <hintids.hxx> +#include <vcl/oldprintadaptor.hxx> #include <sfx2/printer.hxx> #include <sfx2/objsh.hxx> +#include <tools/resary.hxx> +#include <tools/debug.hxx> +#include <rtl/ustring.hxx> +#include <toolkit/awt/vclxdevice.hxx> +#include <toolkit/awt/vclxdevice.hxx> -// #include <tools/intn.hxx> #include <sfx2/progress.hxx> #include <sfx2/app.hxx> #include <sfx2/prnmon.hxx> @@ -45,6 +53,16 @@ #include <svx/pbinitem.hxx> #include <svx/svdview.hxx> #include <unotools/localedatawrapper.hxx> + +#include <unotools/moduleoptions.hxx> +#include <svl/languageoptions.hxx> + +#include <com/sun/star/uno/Any.hxx> +#include <com/sun/star/view/XRenderable.hpp> + +#include <unotxdoc.hxx> + +#include <docsh.hxx> #include <unotools/syslocale.hxx> #include <txtfld.hxx> #include <fmtfld.hxx> @@ -54,14 +72,15 @@ #include <pagefrm.hxx> #include <cntfrm.hxx> #include <doc.hxx> +#include <wdocsh.hxx> #include <fesh.hxx> #include <pam.hxx> #include <viewimp.hxx> // Imp->SetFirstVisPageInvalid() #include <layact.hxx> #include <ndtxt.hxx> #include <fldbas.hxx> -#include <docufld.hxx> // PostItFld /-Type #include <docfld.hxx> // _SetGetExpFld +#include <docufld.hxx> // PostItFld /-Type #include <shellres.hxx> #include <viewopt.hxx> #include <swprtopt.hxx> // SwPrtOptions @@ -76,11 +95,18 @@ #include <txtfrm.hxx> // MinPrtLine #include <viscrs.hxx> // SwShellCrsr #include <fmtpdsc.hxx> // SwFmtPageDesc +#include <globals.hrc> #define JOBSET_ERR_DEFAULT 0 #define JOBSET_ERR_ERROR 1 #define JOBSET_ERR_ISSTARTET 2 + +extern bool lcl_GetPostIts( IDocumentFieldsAccess* pIDFA, _SetGetExpFlds * pSrtLst ); + + +using namespace ::com::sun::star; + //-------------------------------------------------------------------- //Klasse zum Puffern von Paints class SwQueuedPaint @@ -99,19 +125,6 @@ public: SwQueuedPaint *SwPaintQueue::pQueue = 0; -//Klasse zum Speichern einiger Druckereinstellungen -class SwPrtOptSave -{ - Printer *pPrt; - Size aSize; - Paper ePaper; - Orientation eOrientation; - USHORT nPaperBin; -public: - SwPrtOptSave( Printer *pPrinter ); - ~SwPrtOptSave(); -}; - // saves some settings from the draw view class SwDrawViewSave { @@ -201,6 +214,7 @@ void SwPaintQueue::Remove( ViewShell *pSh ) } } +/*****************************************************************************/ const XubString& SwPrtOptions::MakeNextJobName() { @@ -214,340 +228,538 @@ const XubString& SwPrtOptions::MakeNextJobName() return sJobName += XubString::CreateFromInt32( ++nJobNo ); } -/****************************************************************************** - * Methode : void SetSwVisArea( ViewShell *pSh, Point aPrtOffset, ... - * Beschreibung: - * Erstellt : OK 04.11.94 16:27 - * Aenderung : - ******************************************************************************/ +/*****************************************************************************/ -void SetSwVisArea( ViewShell *pSh, const SwRect &rRect, BOOL bPDFExport ) +SwRenderData::SwRenderData() { - ASSERT( !pSh->GetWin(), "Drucken mit Window?" ); - pSh->aVisArea = rRect; - pSh->Imp()->SetFirstVisPageInvalid(); - Point aPt( rRect.Pos() ); + m_pPostItFields = 0; + m_pPostItDoc = 0; + m_pPostItShell = 0; - if (!bPDFExport) - aPt += pSh->aPrtOffst; - aPt.X() = -aPt.X(); aPt.Y() = -aPt.Y(); + m_pViewOptionAdjust = 0; + m_pPrtOptions = 0; +} - OutputDevice *pOut = bPDFExport ? - pSh->GetOut() : - pSh->getIDocumentDeviceAccess()->getPrinter( false ); - MapMode aMapMode( pOut->GetMapMode() ); - aMapMode.SetOrigin( aPt ); - pOut->SetMapMode( aMapMode ); +SwRenderData::~SwRenderData() +{ + delete m_pViewOptionAdjust; m_pViewOptionAdjust = 0; + delete m_pPrtOptions; m_pPrtOptions = 0; + DBG_ASSERT( !m_pPostItShell, "m_pPostItShell should already have been deleted" ); + DBG_ASSERT( !m_pPostItDoc, "m_pPostItDoc should already have been deleted" ); + DBG_ASSERT( !m_pPostItFields, " should already have been deleted" ); } -/****************************************************************************** - * Methode : struct _PostItFld : public _SetGetExpFld - * Beschreibung: Update an das PostItFeld - * Erstellt : OK 07.11.94 10:18 - * Aenderung : - ******************************************************************************/ -struct _PostItFld : public _SetGetExpFld -{ - _PostItFld( const SwNodeIndex& rNdIdx, const SwTxtFld* pFld, - const SwIndex* pIdx = 0 ) - : _SetGetExpFld( rNdIdx, pFld, pIdx ) {} - - USHORT GetPageNo( MultiSelection &rMulti, BOOL bRgt, BOOL bLft, - USHORT& rVirtPgNo, USHORT& rLineNo ); - SwPostItField* GetPostIt() const - { return (SwPostItField*) GetFld()->GetFld().GetFld(); } -}; +void SwRenderData::CreatePostItData( SwDoc *pDoc, const SwViewOption *pViewOpt, OutputDevice *pOutDev ) +{ + DBG_ASSERT( !m_pPostItFields && !m_pPostItDoc && !m_pPostItShell, "some post-it data already exists" ); + m_pPostItFields = new _SetGetExpFlds; + lcl_GetPostIts( pDoc, m_pPostItFields ); + m_pPostItDoc = new SwDoc; + + //!! Disable spell and grammar checking in the temporary document. + //!! Otherwise the grammar checker might process it and crash if we later on + //!! simply delete this document while he is still at it. + SwViewOption aViewOpt( *pViewOpt ); + aViewOpt.SetOnlineSpell( FALSE ); + + m_pPostItShell = new ViewShell( *m_pPostItDoc, 0, &aViewOpt, pOutDev ); +} -USHORT _PostItFld::GetPageNo( MultiSelection &rMulti, BOOL bRgt, BOOL bLft, - USHORT& rVirtPgNo, USHORT& rLineNo ) +void SwRenderData::DeletePostItData() { - //Problem: Wenn ein PostItFld in einem Node steht, der von mehr als - //einer Layout-Instanz repraesentiert wird, steht die Frage im Raum, - //ob das PostIt nur ein- oder n-mal gedruck werden soll. - //Wahrscheinlich nur einmal, als Seitennummer soll hier keine Zufaellige - //sondern die des ersten Auftretens des PostIts innerhalb des selektierten - //Bereichs ermittelt werden. - rVirtPgNo = 0; - USHORT nPos = GetCntnt(); - SwClientIter aIter( (SwModify &)GetFld()->GetTxtNode() ); - for( SwTxtFrm* pFrm = (SwTxtFrm*)aIter.First( TYPE( SwFrm )); - pFrm; pFrm = (SwTxtFrm*)aIter.Next() ) + if (HasPostItData()) { - if( pFrm->GetOfst() > nPos || - (pFrm->HasFollow() && pFrm->GetFollow()->GetOfst() <= nPos) ) - continue; - USHORT nPgNo = pFrm->GetPhyPageNum(); - BOOL bRight = pFrm->OnRightPage(); - if( rMulti.IsSelected( nPgNo ) && - ( (bRight && bRgt) || (!bRight && bLft) ) ) - { - rLineNo = (USHORT)(pFrm->GetLineCount( nPos ) + - pFrm->GetAllLines() - pFrm->GetThisLines()); - rVirtPgNo = pFrm->GetVirtPageNum(); - return nPgNo; - } + m_pPostItDoc->setPrinter( 0, false, false ); //damit am echten DOC der Drucker bleibt + delete m_pPostItShell; //Nimmt das PostItDoc mit ins Grab. + delete m_pPostItFields; + m_pPostItDoc = 0; + m_pPostItShell = 0; + m_pPostItFields = 0; } - return 0; } -/****************************************************************************** - * Methode : void lcl_GetPostIts( IDocumentFieldsAccess* pIDFA, _SetGetExpFlds& ... - * Beschreibung: - * Erstellt : OK 07.11.94 10:20 - * Aenderung : - ******************************************************************************/ - -void lcl_GetPostIts( IDocumentFieldsAccess* pIDFA, _SetGetExpFlds& rSrtLst ) +void SwRenderData::ViewOptionAdjustStart( SwWrtShell &rSh, const SwViewOption &rViewOptions ) { - SwFieldType* pFldType = pIDFA->GetSysFldType( RES_POSTITFLD ); - ASSERT( pFldType, "kein PostItType ? "); - - if( pFldType->GetDepends() ) + if (m_pViewOptionAdjust) { - // Modify-Object gefunden, trage alle Felder ins Array ein - SwClientIter aIter( *pFldType ); - SwClient* pLast; - const SwTxtFld* pTxtFld; - - for( pLast = aIter.First( TYPE(SwFmtFld)); pLast; pLast = aIter.Next() ) - if( 0 != ( pTxtFld = ((SwFmtFld*)pLast)->GetTxtFld() ) && - pTxtFld->GetTxtNode().GetNodes().IsDocNodes() ) - { - SwNodeIndex aIdx( pTxtFld->GetTxtNode() ); - _PostItFld* pNew = new _PostItFld( aIdx, pTxtFld ); - rSrtLst.Insert( pNew ); - } + DBG_ASSERT( 0, "error: there should be no ViewOptionAdjust active when calling this function" ); } + m_pViewOptionAdjust = new SwViewOptionAdjust_Impl( rSh, rViewOptions ); } -/****************************************************************************** - * Methode : void lcl_FormatPostIt( IDocumentContentOperations* pIDCO, SwPaM& aPam, ... - * Beschreibung: - * Erstellt : OK 07.11.94 10:20 - * Aenderung : - ******************************************************************************/ - -void lcl_FormatPostIt( IDocumentContentOperations* pIDCO, SwPaM& aPam, SwPostItField* pField, - USHORT nPageNo, USHORT nLineNo ) +void SwRenderData::ViewOptionAdjust( const SwPrtOptions *pPrtOptions ) { - static char __READONLY_DATA sTmp[] = " : "; - - ASSERT( ViewShell::GetShellRes(), "missing ShellRes" ); + m_pViewOptionAdjust->AdjustViewOptions( pPrtOptions ); +} - String aStr( ViewShell::GetShellRes()->aPostItPage ); - aStr.AppendAscii(sTmp); - aStr += XubString::CreateFromInt32( nPageNo ); - aStr += ' '; - if( nLineNo ) +void SwRenderData::ViewOptionAdjustStop() +{ + if (m_pViewOptionAdjust) { - aStr += ViewShell::GetShellRes()->aPostItLine; - aStr.AppendAscii(sTmp); - aStr += XubString::CreateFromInt32( nLineNo ); - aStr += ' '; + delete m_pViewOptionAdjust; + m_pViewOptionAdjust = 0; } - aStr += ViewShell::GetShellRes()->aPostItAuthor; - aStr.AppendAscii(sTmp); - aStr += pField->GetPar1(); - aStr += ' '; - aStr += SvtSysLocale().GetLocaleData().getDate( pField->GetDate() ); - pIDCO->InsertString( aPam, aStr ); - - pIDCO->SplitNode( *aPam.GetPoint(), false ); - aStr = pField->GetPar2(); -#if defined( WIN ) || defined( WNT ) || defined( PM2 ) - // Bei Windows und Co alle CR rausschmeissen - aStr.EraseAllChars( '\r' ); -#endif - pIDCO->InsertString( aPam, aStr ); - pIDCO->SplitNode( *aPam.GetPoint(), false ); - pIDCO->SplitNode( *aPam.GetPoint(), false ); } -/****************************************************************************** - * Methode : void lcl_PrintPostIts( ViewShell* pPrtShell ) - * Beschreibung: - * Erstellt : OK 07.11.94 10:21 - * Aenderung : MA 10. May. 95 - ******************************************************************************/ +void SwRenderData::MakeSwPrtOptions( + SwPrtOptions &rOptions, + const SwDocShell *pDocShell, + const SwPrintUIOptions *pOpt, + const SwRenderData *pData, + bool bIsPDFExport ) +{ + if (!pDocShell || !pOpt || !pData) + return; -void lcl_PrintPostIts( ViewShell* pPrtShell, const XubString& rJobName, - BOOL& rStartJob, int& rJobStartError, BOOL bReverse) + // get default print options + const TypeId aSwWebDocShellTypeId = TYPE(SwWebDocShell); + BOOL bWeb = pDocShell->IsA( aSwWebDocShellTypeId ); + rOptions.MakeOptions( bWeb ); + + // get print options to use from provided properties + rOptions.bPrintGraphic = pOpt->IsPrintGraphics(); + rOptions.bPrintTable = pOpt->IsPrintTables(); + rOptions.bPrintDraw = pOpt->IsPrintDrawings(); + rOptions.bPrintControl = pOpt->IsPrintFormControls(); + rOptions.bPrintLeftPages = pOpt->IsPrintLeftPages(); + rOptions.bPrintRightPages = pOpt->IsPrintRightPages(); + rOptions.bPrintPageBackground = pOpt->IsPrintPageBackground(); + rOptions.bPrintEmptyPages = pOpt->IsPrintEmptyPages( bIsPDFExport ); + // bUpdateFieldsInPrinting <-- not set here; mail merge only + rOptions.bPaperFromSetup = pOpt->IsPaperFromSetup(); + rOptions.bPrintReverse = pOpt->IsPrintReverse(); + rOptions.bPrintProspect = pOpt->IsPrintProspect(); + rOptions.bPrintProspectRTL = pOpt->IsPrintProspectRTL(); + // bPrintSingleJobs <-- not set here; mail merge and or configuration + // bModified <-- not set here; mail merge only + rOptions.bPrintBlackFont = pOpt->IsPrintWithBlackTextColor(); + rOptions.bPrintHiddenText = pOpt->IsPrintHiddenText(); + rOptions.bPrintTextPlaceholder = pOpt->IsPrintTextPlaceholders(); + rOptions.nPrintPostIts = pOpt->GetPrintPostItsType(); + + //! needs to be set after MakeOptions since the assignment operation in that + //! function will destroy the pointers + rOptions.SetPrintUIOptions( pOpt ); + rOptions.SetRenderData( pData ); + + // rOptions.aMulti is not used anymore in the XRenderable API + // Thus we set it to a dummy value here. + rOptions.aMulti = MultiSelection( Range( 1, 1 ) ); + + //! Note: Since for PDF export of (multi-)selection a temporary + //! document is created that contains only the selects parts, + //! and thus that document is to printed in whole the, + //! rOptions.bPrintSelection parameter will be false. + if (bIsPDFExport) + rOptions.bPrintSelection = FALSE; +} + + +/*****************************************************************************/ + +SwPrintUIOptions::SwPrintUIOptions( + bool bWeb, + bool bSwSrcView, + bool bHasSelection, + bool bHasPostIts, + const SwPrintData &rDefaultPrintData ) : + m_pLast( NULL ), + m_rDefaultPrintData( rDefaultPrintData ) { - // Formatieren und Ausdrucken - pPrtShell->CalcLayout(); + ResStringArray aLocalizedStrings( SW_RES( STR_PRINTOPTUI ) ); - SfxPrinter* pPrn = pPrtShell->getIDocumentDeviceAccess()->getPrinter( false ); + DBG_ASSERT( aLocalizedStrings.Count() >= 44, "resource incomplete" ); + if( aLocalizedStrings.Count() < 44 ) // bad resource ? + return; - //Das Druckdokument ist ein default Dokument, mithin arbeitet es auf der - //StandardSeite. - SwFrm *pPage = pPrtShell->GetLayout()->Lower(); + // printing HTML sources does not have any valid UI options. + // Its just the source code that gets printed ... + if (bSwSrcView) + { + m_aUIProperties.realloc( 0 ); + return; + } - SwPrtOptSave aPrtSave( pPrn ); + // check if CTL is enabled + SvtLanguageOptions aLangOpt; + bool bCTL = aLangOpt.IsCTLFontEnabled(); + + // create sequence of print UI options + // (5 options are not available for Writer-Web) + const int nCTLOpts = bCTL ? 1 : 0; + const int nNumProps = nCTLOpts + (bWeb ? 14 : 20); + m_aUIProperties.realloc( nNumProps ); + int nIdx = 0; + + // create "writer" section (new tab page in dialog) + SvtModuleOptions aModOpt; + String aAppGroupname( aLocalizedStrings.GetString( 0 ) ); + aAppGroupname.SearchAndReplace( String( RTL_CONSTASCII_USTRINGPARAM( "%s" ) ), + aModOpt.GetModuleName( SvtModuleOptions::E_SWRITER ) ); + m_aUIProperties[ nIdx++ ].Value = getGroupControlOpt( aAppGroupname, rtl::OUString() ); + + // create sub section for Contents + m_aUIProperties[ nIdx++ ].Value = getSubgroupControlOpt( aLocalizedStrings.GetString( 1 ), rtl::OUString() ); + + // create a bool option for background + bool bDefaultVal = rDefaultPrintData.IsPrintPageBackground(); + m_aUIProperties[ nIdx++ ].Value = getBoolControlOpt( aLocalizedStrings.GetString( 2 ), + aLocalizedStrings.GetString( 3 ), + rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintPageBackground" ) ), + bDefaultVal ); + + // create a bool option for pictures/graphics AND OLE and drawing objects as well + bDefaultVal = rDefaultPrintData.IsPrintGraphic() || rDefaultPrintData.IsPrintDraw(); + m_aUIProperties[ nIdx++ ].Value = getBoolControlOpt( aLocalizedStrings.GetString( 4 ), + aLocalizedStrings.GetString( 5 ), + rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintPicturesAndObjects" ) ), + bDefaultVal ); + if (!bWeb) + { + // create a bool option for hidden text + bDefaultVal = rDefaultPrintData.IsPrintHiddenText(); + m_aUIProperties[ nIdx++ ].Value = getBoolControlOpt( aLocalizedStrings.GetString( 6 ), + aLocalizedStrings.GetString( 7 ), + rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintHiddenText" ) ), + bDefaultVal ); + + // create a bool option for place holder + bDefaultVal = rDefaultPrintData.IsPrintTextPlaceholder(); + m_aUIProperties[ nIdx++ ].Value = getBoolControlOpt( aLocalizedStrings.GetString( 8 ), + aLocalizedStrings.GetString( 9 ), + rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintTextPlaceholder" ) ), + bDefaultVal ); + } - pPrn->SetOrientation( ORIENTATION_PORTRAIT ); - pPrn->SetPaperBin( pPage->GetAttrSet()->GetPaperBin().GetValue() ); + // create a bool option for controls + bDefaultVal = rDefaultPrintData.IsPrintControl(); + m_aUIProperties[ nIdx++ ].Value = getBoolControlOpt( aLocalizedStrings.GetString( 10 ), + aLocalizedStrings.GetString( 11 ), + rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintControls" ) ), + bDefaultVal ); - if( !rStartJob && JOBSET_ERR_DEFAULT == rJobStartError && - rJobName.Len() ) + // create sub section for Color + m_aUIProperties[ nIdx++ ].Value = getSubgroupControlOpt( aLocalizedStrings.GetString( 12 ), rtl::OUString() ); + + // create a bool option for printing text with black font color + bDefaultVal = rDefaultPrintData.IsPrintBlackFont(); + m_aUIProperties[ nIdx++ ].Value = getBoolControlOpt( aLocalizedStrings.GetString( 13 ), + aLocalizedStrings.GetString( 14 ), + rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintBlackFonts" ) ), + bDefaultVal ); + + if (!bWeb) { - if( !pPrn->IsJobActive() ) - { - rStartJob = pPrn->StartJob( rJobName ); - if( !rStartJob ) - { - rJobStartError = JOBSET_ERR_ERROR; - return; - } - } - pPrtShell->InitPrt( pPrn ); - rJobStartError = JOBSET_ERR_ISSTARTET; + // create subgroup for misc options + m_aUIProperties[ nIdx++ ].Value = getSubgroupControlOpt( rtl::OUString( aLocalizedStrings.GetString( 15 ) ), rtl::OUString() ); + + // create a bool option for printing automatically inserted blank pages + bDefaultVal = rDefaultPrintData.IsPrintEmptyPages(); + m_aUIProperties[ nIdx++ ].Value = getBoolControlOpt( aLocalizedStrings.GetString( 16 ), + aLocalizedStrings.GetString( 17 ), + rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintEmptyPages" ) ), + bDefaultVal ); } - // Wir koennen auch rueckwaerts: - if ( bReverse ) - pPage = pPrtShell->GetLayout()->GetLastPage(); + // create a bool option for paper tray + bDefaultVal = rDefaultPrintData.IsPaperFromSetup(); + vcl::PrinterOptionsHelper::UIControlOptions aPaperTrayOpt; + aPaperTrayOpt.maGroupHint = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "OptionsPageOptGroup" ) ); + m_aUIProperties[ nIdx++ ].Value = getBoolControlOpt( aLocalizedStrings.GetString( 18 ), + aLocalizedStrings.GetString( 19 ), + rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintPaperFromSetup" ) ), + bDefaultVal, + aPaperTrayOpt + ); + + // print range selection + vcl::PrinterOptionsHelper::UIControlOptions aPrintRangeOpt; + aPrintRangeOpt.maGroupHint = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintRange" ) ); + aPrintRangeOpt.mbInternalOnly = sal_True; + m_aUIProperties[nIdx++].Value = getSubgroupControlOpt( rtl::OUString( aLocalizedStrings.GetString( 37 ) ), + rtl::OUString(), + aPrintRangeOpt + ); + + // create a choice for the content to create + rtl::OUString aPrintRangeName( RTL_CONSTASCII_USTRINGPARAM( "PrintContent" ) ); + uno::Sequence< rtl::OUString > aChoices( bHasSelection ? 3 : 2 ); + uno::Sequence< rtl::OUString > aHelpText( bHasSelection ? 3 : 2 ); + aChoices[0] = aLocalizedStrings.GetString( 38 ); + aHelpText[0] = aLocalizedStrings.GetString( 39 ); + aChoices[1] = aLocalizedStrings.GetString( 40 ); + aHelpText[1] = aLocalizedStrings.GetString( 41 ); + if (bHasSelection) + { + aChoices[2] = aLocalizedStrings.GetString( 42 ); + aHelpText[2] = aLocalizedStrings.GetString( 43 ); + } + m_aUIProperties[nIdx++].Value = getChoiceControlOpt( rtl::OUString(), + aHelpText, + aPrintRangeName, + aChoices, + bHasSelection ? 2 /*enable 'Selection' radio button*/ : 0 /* enable 'All pages' */); + // create a an Edit dependent on "Pages" selected + vcl::PrinterOptionsHelper::UIControlOptions aPageRangeOpt( aPrintRangeName, 1, sal_True ); + m_aUIProperties[nIdx++].Value = getEditControlOpt( rtl::OUString(), + rtl::OUString(), + rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PageRange" ) ), + rtl::OUString(), + aPageRangeOpt + ); + // print content selection + vcl::PrinterOptionsHelper::UIControlOptions aContentsOpt; + aContentsOpt.maGroupHint = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "JobPage" ) ); + m_aUIProperties[nIdx++].Value = getSubgroupControlOpt( rtl::OUString( aLocalizedStrings.GetString( 20 ) ), + rtl::OUString(), + aContentsOpt + ); + // create a list box for notes content + const sal_Int16 nPrintPostIts = rDefaultPrintData.GetPrintPostIts(); + aChoices.realloc( 4 ); + aChoices[0] = aLocalizedStrings.GetString( 21 ); + aChoices[1] = aLocalizedStrings.GetString( 22 ); + aChoices[2] = aLocalizedStrings.GetString( 23 ); + aChoices[3] = aLocalizedStrings.GetString( 24 ); + aHelpText.realloc( 2 ); + aHelpText[0] = aLocalizedStrings.GetString( 25 ); + aHelpText[1] = aLocalizedStrings.GetString( 25 ); + vcl::PrinterOptionsHelper::UIControlOptions aAnnotOpt( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintProspect" ) ), 0, sal_False ); + aAnnotOpt.mbEnabled = bHasPostIts; + m_aUIProperties[ nIdx++ ].Value = getChoiceControlOpt( aLocalizedStrings.GetString( 26 ), + aHelpText, + rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintAnnotationMode" ) ), + aChoices, + nPrintPostIts, + rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "List" ) ), + aAnnotOpt + ); + + // create subsection for Page settings + vcl::PrinterOptionsHelper::UIControlOptions aPageSetOpt; + aPageSetOpt.maGroupHint = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "LayoutPage" ) ); + + if (!bWeb) + { + m_aUIProperties[nIdx++].Value = getSubgroupControlOpt( rtl::OUString( aLocalizedStrings.GetString( 27 ) ), + rtl::OUString(), + aPageSetOpt + ); + uno::Sequence< rtl::OUString > aRLChoices( 3 ); + aRLChoices[0] = aLocalizedStrings.GetString( 28 ); + aRLChoices[1] = aLocalizedStrings.GetString( 29 ); + aRLChoices[2] = aLocalizedStrings.GetString( 30 ); + uno::Sequence< rtl::OUString > aRLHelp( 1 ); + aRLHelp[0] = aLocalizedStrings.GetString( 31 ); + // create a choice option for all/left/right pages + // 0 : all pages (left & right) + // 1 : left pages + // 2 : right pages + DBG_ASSERT( rDefaultPrintData.IsPrintLeftPage() || rDefaultPrintData.IsPrintRightPage(), + "unexpected value combination" ); + sal_Int16 nPagesChoice = 0; + if (rDefaultPrintData.IsPrintLeftPage() && !rDefaultPrintData.IsPrintRightPage()) + nPagesChoice = 1; + else if (!rDefaultPrintData.IsPrintLeftPage() && rDefaultPrintData.IsPrintRightPage()) + nPagesChoice = 2; + m_aUIProperties[ nIdx++ ].Value = getChoiceControlOpt( aLocalizedStrings.GetString( 32 ), + aRLHelp, + rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintLeftRightPages" ) ), + aRLChoices, + nPagesChoice, + rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "List" ) ) + ); + } - while( pPage ) + // create a bool option for brochure + bDefaultVal = rDefaultPrintData.IsPrintProspect(); + rtl::OUString aBrochurePropertyName( RTL_CONSTASCII_USTRINGPARAM( "PrintProspect" ) ); + m_aUIProperties[ nIdx++ ].Value = getBoolControlOpt( aLocalizedStrings.GetString( 33 ), + aLocalizedStrings.GetString( 34 ), + aBrochurePropertyName, + bDefaultVal, + aPageSetOpt + ); + + if (bCTL) { - //Mag der Anwender noch?, Abbruch erst in Prt() - GetpApp()->Reschedule(); - ::SetSwVisArea( pPrtShell, pPage->Frm() ); - pPrn->StartPage(); - pPage->GetUpper()->Paint( pPage->Frm() ); -// SFX_APP()->SpoilDemoOutput( *pPrtShell->GetOut(), pPage->Frm().SVRect()); - SwPaintQueue::Repaint(); - pPrn->EndPage(); - pPage = bReverse ? pPage->GetPrev() : pPage->GetNext(); + // create a bool option for brochure RTL dependent on brochure + uno::Sequence< rtl::OUString > aBRTLChoices( 2 ); + aBRTLChoices[0] = aLocalizedStrings.GetString( 35 ); + aBRTLChoices[1] = aLocalizedStrings.GetString( 36 ); + vcl::PrinterOptionsHelper::UIControlOptions aBrochureRTLOpt( aBrochurePropertyName, -1, sal_True ); + aBrochureRTLOpt.maGroupHint = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "LayoutPage" ) ); + // RTL brochure choices + // 0 : left-to-right + // 1 : right-to-left + const sal_Int16 nBRTLChoice = rDefaultPrintData.IsPrintProspectRTL() ? 1 : 0; + m_aUIProperties[ nIdx++ ].Value = getChoiceControlOpt( rtl::OUString(), + uno::Sequence< rtl::OUString >(), + rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintProspectRTL" ) ), + aBRTLChoices, + nBRTLChoice, + rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "List" ) ), + aBrochureRTLOpt + ); } + + + DBG_ASSERT( nIdx == nNumProps, "number of added properties is not as expected" ); } -/****************************************************************************** - * Methode : void lcl_PrintPostItsEndDoc( ViewShell* pPrtShell, ... - * Beschreibung: - * Erstellt : OK 07.11.94 10:21 - * Aenderung : MA 10. May. 95 - ******************************************************************************/ +SwPrintUIOptions::~SwPrintUIOptions() +{ +} -void lcl_PrintPostItsEndDoc( ViewShell* pPrtShell, - _SetGetExpFlds& rPostItFields, MultiSelection &rMulti, - const XubString& rJobName, BOOL& rStartJob, int& rJobStartError, - BOOL bRgt, BOOL bLft, BOOL bRev ) +bool SwPrintUIOptions::IsPrintLeftPages() const { - USHORT nPostIts = rPostItFields.Count(); - if( !nPostIts ) - // Keine Arbeit - return; + // take care of different property names for the option. + // for compatibility the old name should win (may still be used for PDF export or via Uno API) + + // 0: left and right pages + // 1: left pages only + // 2: right pages only + sal_Int64 nLRPages = getIntValue( "PrintLeftRightPages", 0 /* default: all */ ); + bool bRes = nLRPages == 0 || nLRPages == 1; + bRes = getBoolValue( "PrintLeftPages", bRes /* <- default value if property is not found */ ); + return bRes; +} - SET_CURR_SHELL( pPrtShell ); +bool SwPrintUIOptions::IsPrintRightPages() const +{ + // take care of different property names for the option. + // for compatibility the old name should win (may still be used for PDF export or via Uno API) - SwDoc* pPrtDoc = pPrtShell->GetDoc(); + sal_Int64 nLRPages = getIntValue( "PrintLeftRightPages", 0 /* default: all */ ); + bool bRes = nLRPages == 0 || nLRPages == 2; + bRes = getBoolValue( "PrintRightPages", bRes /* <- default value if property is not found */ ); + return bRes; +} - // Dokument leeren und ans Dokumentende gehen - SwPaM aPam( pPrtDoc->GetNodes().GetEndOfContent() ); - aPam.Move( fnMoveBackward, fnGoDoc ); - aPam.SetMark(); - aPam.Move( fnMoveForward, fnGoDoc ); - pPrtDoc->DeleteRange( aPam ); +bool SwPrintUIOptions::IsPrintEmptyPages( bool bIsPDFExport ) const +{ + // take care of different property names for the option. - for( USHORT i = 0, nVirtPg, nLineNo; i < nPostIts; ++i ) - { - _PostItFld& rPostIt = (_PostItFld&)*rPostItFields[ i ]; - if( rPostIt.GetPageNo( rMulti, bRgt, bLft, nVirtPg, nLineNo ) ) - lcl_FormatPostIt( pPrtShell->GetDoc(), aPam, - rPostIt.GetPostIt(), nVirtPg, nLineNo ); - } + bool bRes = bIsPDFExport ? + !getBoolValue( "IsSkipEmptyPages", sal_True ) : + getBoolValue( "PrintEmptyPages", sal_True ); + return bRes; +} - lcl_PrintPostIts( pPrtShell, rJobName, rStartJob, rJobStartError, bRev ); +bool SwPrintUIOptions::IsPrintTables() const +{ + // take care of different property names currently in use for this option. + // for compatibility the old name should win (may still be used for PDF export or via Uno API) + +// bool bRes = getBoolValue( "PrintTablesGraphicsAndDiagrams", sal_True ); +// bRes = getBoolValue( "PrintTables", bRes ); +// return bRes; + // for now it was decided that tables should always be printed + return true; } -/****************************************************************************** - * Methode : void lcl_PrintPostItsEndPage( ViewShell* pPrtShell, ... - * Beschreibung: - * Erstellt : OK 07.11.94 10:22 - * Aenderung : - ******************************************************************************/ +bool SwPrintUIOptions::IsPrintGraphics() const +{ + // take care of different property names for the option. + // for compatibility the old name should win (may still be used for PDF export or via Uno API) + bool bRes = getBoolValue( "PrintPicturesAndObjects", sal_True ); + bRes = getBoolValue( "PrintGraphics", bRes ); + return bRes; +} -void lcl_PrintPostItsEndPage( ViewShell* pPrtShell, - _SetGetExpFlds& rPostItFields, USHORT nPageNo, MultiSelection &rMulti, - const XubString& rJobName, BOOL& rStartJob, int& rJobStartError, - BOOL bRgt, BOOL bLft, BOOL bRev ) +bool SwPrintUIOptions::IsPrintDrawings() const { - USHORT nPostIts = rPostItFields.Count(); - if( !nPostIts ) - // Keine Arbeit - return; + // take care of different property names for the option. + // for compatibility the old name should win (may still be used for PDF export or via Uno API) - SET_CURR_SHELL( pPrtShell ); - - USHORT i = 0, nVirtPg, nLineNo; - while( ( i < nPostIts ) && - ( nPageNo != ((_PostItFld&)*rPostItFields[ i ]). - GetPageNo( rMulti,bRgt, bLft, nVirtPg, nLineNo ))) - ++i; - if(i == nPostIts) - // Nix zu drucken - return; + bool bRes = getBoolValue( "PrintPicturesAndObjects", sal_True ); + bRes = getBoolValue( "PrintDrawings", bRes ); + return bRes; +} - SwDoc* pPrtDoc = pPrtShell->GetDoc(); +bool SwPrintUIOptions::processPropertiesAndCheckFormat( const com::sun::star::uno::Sequence< com::sun::star::beans::PropertyValue >& i_rNewProp ) +{ + bool bChanged = processProperties( i_rNewProp ); - // Dokument leeren und ans Dokumentende gehen - SwPaM aPam( pPrtDoc->GetNodes().GetEndOfContent() ); - aPam.Move( fnMoveBackward, fnGoDoc ); - aPam.SetMark(); - aPam.Move( fnMoveForward, fnGoDoc ); - pPrtDoc->DeleteRange( aPam ); + uno::Reference< awt::XDevice > xRenderDevice; + uno::Any aVal( getValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "RenderDevice" ) ) ) ); + aVal >>= xRenderDevice; - while( i < nPostIts ) + OutputDevice* pOut = 0; + if (xRenderDevice.is()) { - _PostItFld& rPostIt = (_PostItFld&)*rPostItFields[ i ]; - if( nPageNo == rPostIt.GetPageNo( rMulti, bRgt, bLft, nVirtPg, nLineNo ) ) - lcl_FormatPostIt( pPrtShell->GetDoc(), aPam, - rPostIt.GetPostIt(), nVirtPg, nLineNo ); - ++i; + VCLXDevice* pDevice = VCLXDevice::GetImplementation( xRenderDevice ); + pOut = pDevice ? pDevice->GetOutputDevice() : 0; } - lcl_PrintPostIts( pPrtShell, rJobName, rStartJob, rJobStartError, bRev ); + bChanged = bChanged || (pOut != m_pLast); + if( pOut ) + m_pLast = pOut; + + return bChanged; } + /****************************************************************************** - * Methode : void ViewShell::InitPrt( SfxPrinter *pNew, OutputDevice *pPDFOut ) + * Methode : void SetSwVisArea( ViewShell *pSh, Point aPrtOffset, ... * Beschreibung: - * Erstellt : OK 07.11.94 10:22 + * Erstellt : OK 04.11.94 16:27 * Aenderung : ******************************************************************************/ -void ViewShell::InitPrt( SfxPrinter *pPrt, OutputDevice *pPDFOut ) +void SetSwVisArea( ViewShell *pSh, const SwRect &rRect, BOOL /*bPDFExport*/ ) +{ + ASSERT( !pSh->GetWin(), "Drucken mit Window?" ); + pSh->aVisArea = rRect; + pSh->Imp()->SetFirstVisPageInvalid(); + Point aPt( rRect.Pos() ); + + // calculate an offset for the rectangle of the n-th page to + // move the start point of the output operation to a position + // such that in the output device all pages will be painted + // at the same position + aPt.X() = -aPt.X(); aPt.Y() = -aPt.Y(); + + OutputDevice *pOut = pSh->GetOut(); + + MapMode aMapMode( pOut->GetMapMode() ); + aMapMode.SetOrigin( aPt ); + pOut->SetMapMode( aMapMode ); +} + +/******************************************************************************/ + +void ViewShell::InitPrt( OutputDevice *pOutDev ) { //Fuer den Printer merken wir uns einen negativen Offset, der //genau dem Offset de OutputSize entspricht. Das ist notwendig, //weil unser Ursprung der linken ober Ecke der physikalischen //Seite ist, die Ausgaben (SV) aber den Outputoffset als Urstprung //betrachten. - OutputDevice *pTmpDev = pPDFOut ? pPDFOut : (OutputDevice *) pPrt; - if ( pTmpDev ) + if ( pOutDev ) { - aPrtOffst = pPrt ? pPrt->GetPageOffset() : Point(); + aPrtOffst = Point(); - aPrtOffst += pTmpDev->GetMapMode().GetOrigin(); - MapMode aMapMode( pTmpDev->GetMapMode() ); + aPrtOffst += pOutDev->GetMapMode().GetOrigin(); + MapMode aMapMode( pOutDev->GetMapMode() ); aMapMode.SetMapUnit( MAP_TWIP ); - pTmpDev->SetMapMode( aMapMode ); - pTmpDev->SetLineColor(); - pTmpDev->SetFillColor(); + pOutDev->SetMapMode( aMapMode ); + pOutDev->SetLineColor(); + pOutDev->SetFillColor(); } else aPrtOffst.X() = aPrtOffst.Y() = 0; if ( !pWin ) - pOut = pTmpDev; //Oder was sonst? + pOut = pOutDev; //Oder was sonst? } /****************************************************************************** @@ -638,14 +850,6 @@ void ViewShell::ChgAllPageSize( Size &rSz ) } } -/****************************************************************************** - * Methode : void ViewShell::CalcPagesForPrint( short nMax, BOOL ... - * Beschreibung: - * Erstellt : OK 04.11.94 15:33 - * Aenderung : MA 07. Jun. 95 - ******************************************************************************/ - - void lcl_SetState( SfxProgress& rProgress, ULONG nPage, ULONG nMax, const XubString *pStr, ULONG nAct, ULONG nCnt, ULONG nOffs, ULONG nPageNo ) @@ -674,50 +878,19 @@ void lcl_SetState( SfxProgress& rProgress, ULONG nPage, ULONG nMax, -void ViewShell::CalcPagesForPrint( USHORT nMax, SfxProgress* pProgress, - const XubString* pStr, ULONG nMergeAct, ULONG nMergeCnt ) +void ViewShell::CalcPagesForPrint( USHORT nMax ) { SET_CURR_SHELL( this ); - //Seitenweise durchformatieren, by the way kann die Statusleiste - //angetriggert werden, damit der Anwender sieht worauf er wartet. - //Damit der Vorgang moeglichst transparent gestaltet werden kann - //Versuchen wir mal eine Schaetzung. - SfxPrinter* pPrt = getIDocumentDeviceAccess()->getPrinter( false ); - BOOL bPrtJob = pPrt ? pPrt->IsJobActive() : FALSE; SwRootFrm* pLayout = GetLayout(); - ULONG nStatMax = pLayout->GetPageNum(); + // ULONG nStatMax = pLayout->GetPageNum(); const SwFrm *pPage = pLayout->Lower(); SwLayAction aAction( pLayout, Imp() ); - if( pProgress ) - { - // HACK, damit die Anzeige sich nicht verschluckt. - const XubString aTmp( SW_RES( STR_STATSTR_FORMAT ) ); - pProgress->SetText( aTmp ); - lcl_SetState( *pProgress, 1, nStatMax, pStr, nMergeAct, nMergeCnt, 0, 1 ); - pProgress->Reschedule(); //Mag der Anwender noch oder hat er genug? - aAction.SetProgress(pProgress); - } - pLayout->StartAllAction(); for ( USHORT i = 1; pPage && i <= nMax; pPage = pPage->GetNext(), ++i ) { - if ( ( bPrtJob && !pPrt->IsJobActive() ) || Imp()->IsStopPrt() ) - break; - - if( pProgress ) - { - //HACK, damit die Anzeige sich nicht verschluckt. - if ( i > nStatMax ) nStatMax = i; - lcl_SetState( *pProgress, i, nStatMax, pStr, nMergeAct, nMergeCnt, 0, i ); - pProgress->Reschedule(); //Mag der Anwender noch oder hat er genug? - } - - if ( ( bPrtJob && !pPrt->IsJobActive() ) || Imp()->IsStopPrt() ) - break; - pPage->Calc(); SwRect aOldVis( VisArea() ); aVisArea = pPage->Frm(); @@ -731,34 +904,23 @@ void ViewShell::CalcPagesForPrint( USHORT nMax, SfxProgress* pProgress, aVisArea = aOldVis; //Zuruecksetzen wg. der Paints! Imp()->SetFirstVisPageInvalid(); - SwPaintQueue::Repaint(); - - if ( pProgress ) - pProgress->Reschedule(); //Mag der Anwender noch oder hat er genug? +// SwPaintQueue::Repaint(); } - - if (pProgress) - aAction.SetProgress( NULL ); - pLayout->EndAllAction(); } /******************************************************************************/ -SwDoc * ViewShell::CreatePrtDoc( SfxPrinter* pPrt, SfxObjectShellRef &rDocShellRef) +SwDoc * ViewShell::CreatePrtDoc( SfxObjectShellRef &rDocShellRef) { ASSERT( this->IsA( TYPE(SwFEShell) ),"ViewShell::Prt for FEShell only"); SwFEShell* pFESh = (SwFEShell*)this; // Wir bauen uns ein neues Dokument SwDoc *pPrtDoc = new SwDoc; pPrtDoc->acquire(); - pPrtDoc->SetRefForDocShell( boost::addressof(rDocShellRef) ); + pPrtDoc->SetRefForDocShell( (SfxObjectShellRef*)&(long&)rDocShellRef ); pPrtDoc->LockExpFlds(); - // Der Drucker wird uebernommen - if (pPrt) - pPrtDoc->setPrinter( pPrt, true, true ); - const SfxPoolItem* pCpyItem; const SfxItemPool& rPool = GetAttrPool(); for( USHORT nWh = POOLATTR_BEGIN; nWh < POOLATTR_END; ++nWh ) @@ -849,6 +1011,7 @@ SwDoc * ViewShell::CreatePrtDoc( SfxPrinter* pPrt, SfxObjectShellRef &rDocShellR } return pPrtDoc; } + SwDoc * ViewShell::FillPrtDoc( SwDoc *pPrtDoc, const SfxPrinter* pPrt) { ASSERT( this->IsA( TYPE(SwFEShell) ),"ViewShell::Prt for FEShell only"); @@ -856,7 +1019,7 @@ SwDoc * ViewShell::FillPrtDoc( SwDoc *pPrtDoc, const SfxPrinter* pPrt) // Wir bauen uns ein neues Dokument // SwDoc *pPrtDoc = new SwDoc; // pPrtDoc->acquire(); -// pPrtDoc->SetRefForDocShell( boost::addressof(rDocShellRef) ); +// pPrtDoc->SetRefForDocShell( (SvEmbeddedObjectRef*)&(long&)rDocShellRef ); pPrtDoc->LockExpFlds(); // Der Drucker wird uebernommen @@ -958,76 +1121,41 @@ SwDoc * ViewShell::FillPrtDoc( SwDoc *pPrtDoc, const SfxPrinter* pPrt) return pPrtDoc; } -/****************************************************************************** - * Methode : void ViewShell::Prt( const SwPrtOptions& rOptions, - * SfxProgress* pProgress, - * OutputDevice* pPDFOut ) - * Beschreibung: - * Erstellt : OK 04.11.94 15:33 - * Aenderung : MA 10. May. 95 - ******************************************************************************/ - -BOOL ViewShell::Prt( SwPrtOptions& rOptions, SfxProgress* pProgress, - OutputDevice* pPDFOut ) +sal_Bool ViewShell::PrintOrPDFExport( + OutputDevice *pOutDev, + const SwPrtOptions &rPrintData, + sal_Int32 nRenderer /* the index in the vector of pages to be printed */ ) { -//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -//Immer die Druckroutine in viewpg.cxx (fuer Seitenvorschau) mitpflegen!! -//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - ASSERT( pPDFOut || pProgress, "Printing without progress bar!" ) - - BOOL bStartJob = FALSE; - - //! Note: Since for PDF export of (multi-)selection a temporary - //! document is created that contains only the selects parts, - //! and thus that document is to printed in whole the, - //! rOptions.bPrintSelection parameter will be false. - BOOL bSelection = rOptions.bPrintSelection; - - MultiSelection aMulti( rOptions.aMulti ); - - if ( !aMulti.GetSelectCount() ) - return bStartJob; - - Range aPages( aMulti.FirstSelected(), aMulti.LastSelected() ); - if ( aPages.Max() > USHRT_MAX ) - aPages.Max() = USHRT_MAX; +//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +//Immer die Druckroutinen in viewpg.cxx (PrintProspect) mitpflegen!! +//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - ASSERT( aPages.Min() > 0, - "Seite 0 Drucken?" ); - ASSERT( aPages.Min() <= aPages.Max(), - "MinSeite groesser MaxSeite." ); - - SfxPrinter* pPrt = 0; //!! will be 0 for PDF export !! - if (pPDFOut) - pPDFOut->Push(); - else - { - // wenn kein Drucker vorhanden ist, wird nicht gedruckt - pPrt = getIDocumentDeviceAccess()->getPrinter( false ); - if( !pPrt || !pPrt->GetName().Len() ) - { - ASSERT( FALSE, "Drucken ohne Drucker?" ); - return bStartJob; - } - - if( !rOptions.GetJobName().Len() && !pPrt->IsJobActive() ) - return bStartJob; - } - - // Einstellungen am Drucker merken - SwPrtOptSave aPrtSave( pPrt ); + const sal_Int32 nMaxRenderer = rPrintData.GetRenderData().GetPagesToPrint().size() - 1; +#if OSL_DEBUG_LEVEL > 1 + DBG_ASSERT( 0 <= nRenderer && nRenderer <= nMaxRenderer, "nRenderer out of bounds"); +#endif + if (!pOutDev || nMaxRenderer < 0 || nRenderer < 0 || nRenderer > nMaxRenderer) + return sal_False; - OutputDevice *pPrtOrPDFOut = pPDFOut ? pPDFOut : (OutputDevice *) pPrt; + // save settings of OutputDevice (should be done always since the + // output device is now provided by a call from outside the Writer) + pOutDev->Push(); // eine neue Shell fuer den Printer erzeugen ViewShell *pShell; - SwDoc *pPrtDoc; + SwDoc *pOutDevDoc; //!! muss warum auch immer hier in diesem scope existieren !! //!! (h?ngt mit OLE Objekten im Dokument zusammen.) SfxObjectShellRef aDocShellRef; + //! Note: Since for PDF export of (multi-)selection a temporary + //! document is created that contains only the selects parts, + //! and thus that document is to printed in whole the, + //! rPrintData.bPrintSelection parameter will be false. + BOOL bSelection = rPrintData.bPrintSelection; + // PDF export for (multi-)selection has already generated a temporary document // with the selected text. (see XRenderable implementation in unotxdoc.cxx) // Thus we like to go in the 'else' part here in that case. @@ -1036,443 +1164,100 @@ BOOL ViewShell::Prt( SwPrtOptions& rOptions, SfxProgress* pProgress, // to be created that often here in the 'then' part. if ( bSelection ) { - pPrtDoc = CreatePrtDoc( pPrt, aDocShellRef ); + pOutDevDoc = CreatePrtDoc( aDocShellRef ); // eine ViewShell darauf - OutputDevice *pTmpDev = pPDFOut ? pPDFOut : 0; - pShell = new ViewShell( *pPrtDoc, 0, pOpt, pTmpDev ); - pPrtDoc->SetRefForDocShell( 0 ); + pShell = new ViewShell( *pOutDevDoc, 0, pOpt, pOutDev ); + pOutDevDoc->SetRefForDocShell( 0 ); } else { - pPrtDoc = GetDoc(); - OutputDevice *pTmpDev = pPDFOut ? pPDFOut : 0; - pShell = new ViewShell( *this, 0, pTmpDev ); + pOutDevDoc = GetDoc(); + pShell = new ViewShell( *this, 0, pOutDev ); + } + + SdrView *pDrawView = pShell->GetDrawView(); + if (pDrawView) + { + pDrawView->SetBufferedOutputAllowed( false ); + pDrawView->SetBufferedOverlayAllowed( false ); } { //Zusaetzlicher Scope, damit die CurrShell vor dem zerstoeren der //Shell zurueckgesetzt wird. - SET_CURR_SHELL( pShell ); - - if ( pProgress ) - { - Link aLnk = LINK(pShell->Imp(), SwViewImp, SetStopPrt); - ((SfxPrintProgress *)pProgress)->SetCancelHdl(aLnk); - } + SET_CURR_SHELL( pShell ); - //JP 01.02.99: das ReadOnly Flag wird NIE mitkopiert; Bug 61335 - if( pOpt->IsReadonly() ) - pShell->pOpt->SetReadonly( TRUE ); + //JP 01.02.99: das ReadOnly Flag wird NIE mitkopiert; Bug 61335 + if( pOpt->IsReadonly() ) + pShell->pOpt->SetReadonly( TRUE ); - // save options at draw view: - SwDrawViewSave aDrawViewSave( pShell->GetDrawView() ); + // save options at draw view: + SwDrawViewSave aDrawViewSave( pShell->GetDrawView() ); - pShell->PrepareForPrint( rOptions ); + pShell->PrepareForPrint( rPrintData ); - XubString* pStr = 0; - ULONG nMergeAct = rOptions.nMergeAct, nMergeCnt = rOptions.nMergeCnt; - if ( pProgress ) - { - if( nMergeAct ) + const sal_Int32 nPage = rPrintData.GetRenderData().GetPagesToPrint()[ nRenderer ]; +#if OSL_DEBUG_LEVEL > 1 + DBG_ASSERT( nPage == 0 || rPrintData.GetRenderData().GetValidPagesSet().count( nPage ) == 1, "nPage not valid" ); +#endif + const SwPageFrm *pStPage = 0; + if (nPage > 0) // a 'regular' page, not one from the post-it document { - pStr = new SW_RESSTR(STR_STATSTR_LETTER); - *pStr += ' '; - *pStr += XubString::CreateFromInt64( nMergeAct ); - if( nMergeCnt ) - { - *pStr += '/'; - *pStr += XubString::CreateFromInt64( nMergeCnt ); - } + const SwRenderData::ValidStartFramesMap_t &rFrms = rPrintData.GetRenderData().GetValidStartFrames(); + SwRenderData::ValidStartFramesMap_t::const_iterator aIt( rFrms.find( nPage ) ); + DBG_ASSERT( aIt != rFrms.end(), "failed to find start frame" ); + if (aIt == rFrms.end()) + return sal_False; + pStPage = aIt->second; } - else + else // a page from the post-its document ... { - ++nMergeAct; + DBG_ASSERT( nPage == 0, "unexpected page number. 0 for post-it pages expected" ); + pStPage = rPrintData.GetRenderData().GetPostItStartFrames()[ nRenderer ]; } - } + DBG_ASSERT( pStPage, "failed to get start page" ); - // Seiten fuers Drucken formatieren - pShell->CalcPagesForPrint( (USHORT)aPages.Max(), pProgress, pStr, - nMergeAct, nMergeCnt ); - - // Some field types, can require a valid layout - // (expression fields in tables). For these we do an UpdateFlds - // here after calculation of the pages. - // --> FME 2004-06-21 #i9684# For performance reasons, we do not update - // the fields during pdf export. - // #i56195# prevent update of fields (for mail merge) - if ( !pPDFOut && rOptions.bUpdateFieldsInPrinting ) - // <-- - pShell->UpdateFlds(TRUE); - - if( !pShell->Imp()->IsStopPrt() && - ( pPDFOut || rOptions.GetJobName().Len() || pPrt->IsJobActive()) ) - { - BOOL bStop = FALSE; - int nJobStartError = JOBSET_ERR_DEFAULT; + //!! applying view options and formatting the dcoument should now only be done in getRendererCount! - USHORT nCopyCnt = rOptions.bCollate ? rOptions.nCopyCount : 1; + ViewShell *pViewSh2 = nPage == 0 ? /* post-it page? */ + rPrintData.GetRenderData().m_pPostItShell : pShell; + ::SetSwVisArea( pViewSh2, pStPage->Frm() ); - USHORT nPrintCount = 1; - XubString sJobName( rOptions.GetJobName() ); - - for ( USHORT nCnt = 0; !bStop && nCnt < nCopyCnt; nCnt++ ) + // wenn wir einen Umschlag drucken wird ein Offset beachtet + if( pStPage->GetFmt()->GetPoolFmtId() == RES_POOLPAGE_JAKET ) { - const SwPageFrm *pStPage = (SwPageFrm*)pShell->GetLayout()->Lower(); - const SwFrm *pEndPage = pStPage; - - USHORT nFirstPageNo = 0; - USHORT nLastPageNo = 0; - USHORT nPageNo = 1; - - if (pPrt) - { - if( rOptions.IsPrintSingleJobs() && sJobName.Len() && - ( bStartJob || rOptions.bJobStartet ) ) - { - pPrt->EndJob(); - bStartJob = FALSE; - rOptions.bJobStartet = TRUE; - - // Reschedule statt Yield, da Yield keine Events abarbeitet - // und es sonst eine Endlosschleife gibt. - while( pPrt->IsPrinting() && pProgress ) - pProgress->Reschedule(); - - sJobName = rOptions.MakeNextJobName(); - nJobStartError = JOBSET_ERR_DEFAULT; - } - } - - for( USHORT i = 1; i <= (USHORT)aPages.Max(); ++i ) - { - if( i < (USHORT)aPages.Min() ) - { - if( !pStPage->GetNext() ) - break; - pStPage = (SwPageFrm*)pStPage->GetNext(); - pEndPage= pStPage; - } - else if( i == (USHORT)aPages.Min() ) - { - nFirstPageNo = i; - nLastPageNo = nFirstPageNo; - if( !pStPage->GetNext() || (i == (USHORT)aPages.Max()) ) - break; - pEndPage = pStPage->GetNext(); - } - else if( i > (USHORT)aPages.Min() ) - { - nLastPageNo = i; - if( !pEndPage->GetNext() || (i == (USHORT)aPages.Max()) ) - break; - pEndPage = pEndPage->GetNext(); - } - } - - if( !nFirstPageNo ) - { - bStop = TRUE; - break; - } - -// HACK: Hier muss von der MultiSelection noch eine akzeptable Moeglichkeit -// geschaffen werden, alle Seiten von Seite x an zu deselektieren. -// Z.B. durch SetTotalRange .... - -// aMulti.Select( Range( nLastPageNo+1, SELECTION_MAX ), FALSE ); - MultiSelection aTmpMulti( Range( 1, nLastPageNo ) ); - long nTmpIdx = aMulti.FirstSelected(); - static long nEndOfSelection = SFX_ENDOFSELECTION; - while ( nEndOfSelection != nTmpIdx && nTmpIdx <= long(nLastPageNo) ) - { - aTmpMulti.Select( nTmpIdx ); - nTmpIdx = aMulti.NextSelected(); - } - aMulti = aTmpMulti; -// Ende des HACKs - - const USHORT nSelCount = USHORT(aMulti.GetSelectCount() - /* * nCopyCnt*/); - - if ( pProgress ) - { - pProgress->SetText( SW_RESSTR(STR_STATSTR_PRINT) ); - lcl_SetState( *pProgress, 1, nSelCount, pStr, - nMergeAct, nMergeCnt, nSelCount, 1 ); - } - - if ( rOptions.bPrintReverse ) - { - const SwFrm *pTmp = pStPage; - pStPage = (SwPageFrm*)pEndPage; - pEndPage = pTmp; - nPageNo = nLastPageNo; - } - else - nPageNo = nFirstPageNo; - - // PostitListe holen - _SetGetExpFlds aPostItFields; - SwDoc* pPostItDoc = 0; - ViewShell* pPostItShell = 0; - if( rOptions.nPrintPostIts != POSTITS_NONE ) - { - lcl_GetPostIts( pDoc, aPostItFields ); - pPostItDoc = new SwDoc; - if (pPrt) - pPostItDoc->setPrinter( pPrt, true, true ); - pPostItShell = new ViewShell( *pPostItDoc, 0, - pShell->GetViewOptions() ); - // Wenn PostIts am Dokumentenende gedruckt werden sollen, - // die Druckreihenfolge allerdings umgekehrt ist, dann hier - if ( ( rOptions.nPrintPostIts == POSTITS_ENDDOC ) && - rOptions.bPrintReverse ) - lcl_PrintPostItsEndDoc( pPostItShell, aPostItFields, - aMulti, sJobName, bStartJob, nJobStartError, - rOptions.bPrintRightPage, rOptions.bPrintLeftPage, TRUE ); - - } - - // aOldMapMode wird fuer das Drucken von Umschlaegen gebraucht. - MapMode aOldMapMode; - - const SwPageDesc *pLastPageDesc = NULL; - BOOL bSetOrient = FALSE; - BOOL bSetPaperSz = FALSE; - BOOL bSetPaperBin = FALSE; - BOOL bSetPrt = FALSE; - if (pPrt) - { - bSetOrient = pPrt->HasSupport( SUPPORT_SET_ORIENTATION ); - bSetPaperSz = pPrt->HasSupport( SUPPORT_SET_PAPERSIZE ); - bSetPaperBin = !rOptions.bPaperFromSetup && - pPrt->HasSupport( SUPPORT_SET_PAPERBIN ); - bSetPrt = bSetOrient || bSetPaperSz || bSetPaperBin; - } - - if ( rOptions.nPrintPostIts != POSTITS_ONLY ) - { - // --> FME 2005-01-05 #110536# This valiable is used to track - // the number of pages which actually have been printed. - // If nPagesPrinted is odd, we have to send an additional - // empty page to the printer if we are currently in collation - // and duplex mode and there are still some more copies of the - // document to print. - USHORT nPagesPrinted = 0; - // <-- - - while( pStPage && !bStop ) - { - // Mag der Anwender noch ? - if ( pProgress ) - pProgress->Reschedule(); - - if (pPrt) - { - if ( JOBSET_ERR_ERROR == nJobStartError || - ( !pPrt->IsJobActive() && ( !sJobName.Len() || bStartJob ) ) || - pShell->Imp()->IsStopPrt() ) - { - bStop = TRUE; - break; - } - } - - ::SetSwVisArea( pShell, pStPage->Frm(), 0 != pPDFOut ); - - // wenn wir einen Umschlag drucken wird ein Offset beachtet - if( pStPage->GetFmt()->GetPoolFmtId() == RES_POOLPAGE_JAKET ) - { - aOldMapMode = pPrtOrPDFOut->GetMapMode(); - Point aNewOrigin = pPrtOrPDFOut->GetMapMode().GetOrigin(); - aNewOrigin += rOptions.aOffset; - MapMode aTmp( pPrtOrPDFOut->GetMapMode() ); - aTmp.SetOrigin( aNewOrigin ); - pPrtOrPDFOut->SetMapMode( aTmp ); - } - - const BOOL bRightPg = pStPage->OnRightPage(); - if( aMulti.IsSelected( nPageNo ) && - ( (bRightPg && rOptions.bPrintRightPage) || - (!bRightPg && rOptions.bPrintLeftPage) ) ) - { - if ( bSetPrt ) - { - // check for empty page - const SwPageFrm& rFormatPage = pStPage->GetFormatPage(); - - if ( pLastPageDesc != rFormatPage.GetPageDesc() ) - { - pLastPageDesc = rFormatPage.GetPageDesc(); - - const BOOL bLandScp = rFormatPage.GetPageDesc()->GetLandscape(); - - if( bSetPaperBin ) // Schacht einstellen. - pPrt->SetPaperBin( rFormatPage.GetFmt()-> - GetPaperBin().GetValue() ); - - if (bSetOrient ) - { - // Orientation einstellen: Breiter als Hoch - // -> Landscape, sonst -> Portrait. - if( bLandScp ) - pPrt->SetOrientation(ORIENTATION_LANDSCAPE); - else - pPrt->SetOrientation(ORIENTATION_PORTRAIT); - } - - if (bSetPaperSz ) - { - Size aSize = pStPage->Frm().SSize(); - if ( bLandScp && bSetOrient ) - { - // landscape is always interpreted as a rotation by 90 degrees ! - // this leads to non WYSIWIG but at least it prints! - // #i21775# - long nWidth = aSize.Width(); - aSize.Width() = aSize.Height(); - aSize.Height() = nWidth; - } - Paper ePaper = SvxPaperInfo::GetSvxPaper(aSize,MAP_TWIP,TRUE); - if ( PAPER_USER == ePaper ) - pPrt->SetPaperSizeUser( aSize ); - else - pPrt->SetPaper( ePaper ); - } - } - } - - // Wenn PostIts nach Seite gedruckt werden sollen, - // jedoch Reverse eingestellt ist ... - if( rOptions.bPrintReverse && - rOptions.nPrintPostIts == POSTITS_ENDPAGE ) - lcl_PrintPostItsEndPage( pPostItShell, aPostItFields, - nPageNo, aMulti, sJobName, bStartJob, nJobStartError, - rOptions.bPrintRightPage, rOptions.bPrintLeftPage, - rOptions.bPrintReverse ); - - if ( pProgress ) - lcl_SetState( *pProgress, nPrintCount++, nSelCount, - pStr, nMergeAct, nMergeCnt, - nSelCount, nPageNo ); - - if( !bStartJob && JOBSET_ERR_DEFAULT == nJobStartError - && sJobName.Len() ) - { - if( pPrt && !pPrt->IsJobActive() ) - { - bStartJob = pPrt->StartJob( sJobName ); - if( !bStartJob ) - { - nJobStartError = JOBSET_ERR_ERROR; - continue; - } - } - - pShell->InitPrt( pPrt, pPDFOut ); - - ::SetSwVisArea( pShell, pStPage->Frm(), 0 != pPDFOut ); - nJobStartError = JOBSET_ERR_ISSTARTET; - } - // --> FME 2005-12-12 #b6354161# Feature - Print empty pages - if ( rOptions.bPrintEmptyPages || pStPage->Frm().Height() ) - // <-- - { - if (pPrt) - pPrt->StartPage(); - - pStPage->GetUpper()->Paint( pStPage->Frm() ); - ++nPagesPrinted; - - if (pPrt) - pPrt->EndPage(); - } - SwPaintQueue::Repaint(); - - // Wenn PostIts nach Seite gedruckt werden sollen ... - if( (!rOptions.bPrintReverse) && - rOptions.nPrintPostIts == POSTITS_ENDPAGE ) - lcl_PrintPostItsEndPage( pPostItShell, aPostItFields, - nPageNo, aMulti, sJobName, bStartJob, nJobStartError, - rOptions.bPrintRightPage, rOptions.bPrintLeftPage, - rOptions.bPrintReverse ); - } - - // den eventl. fuer Umschlaege modifizierte OutDevOffset wieder - // zuruecksetzen. - if( pStPage->GetFmt()->GetPoolFmtId() == RES_POOLPAGE_JAKET ) - pPrtOrPDFOut->SetMapMode( aOldMapMode ); - - if ( pStPage == pEndPage ) - { - // --> FME 2005-01-05 #110536# Print emtpy page if - // we are have an odd page count in collation/duplex - // mode and there are still some copies to print: - if ( pPrt && ( 1 == ( nPagesPrinted % 2 ) ) && - DUPLEX_ON == pPrt->GetDuplexMode() && - nCnt + 1 < nCopyCnt ) - { - pPrt->StartPage(); - pPrt->EndPage(); - } - // <-- - - pStPage = 0; - } - else if ( rOptions.bPrintReverse ) - { - --nPageNo; - pStPage = (SwPageFrm*)pStPage->GetPrev(); - } - else - { ++nPageNo; - pStPage = (SwPageFrm*)pStPage->GetNext(); - } - } - if ( bStop ) - break; - } + Point aNewOrigin = pOutDev->GetMapMode().GetOrigin(); + aNewOrigin += rPrintData.aOffset; + MapMode aTmp( pOutDev->GetMapMode() ); + aTmp.SetOrigin( aNewOrigin ); + pOutDev->SetMapMode( aTmp ); + } - // Wenn PostIts am Dokumentenende gedruckt werden sollen, dann hier machen - if( ((rOptions.nPrintPostIts == POSTITS_ENDDOC) && !rOptions.bPrintReverse) - || (rOptions.nPrintPostIts == POSTITS_ONLY) ) - lcl_PrintPostItsEndDoc( pPostItShell, aPostItFields, aMulti, - sJobName, bStartJob, nJobStartError, - rOptions.bPrintRightPage, rOptions.bPrintLeftPage, - rOptions.bPrintReverse ); + pShell->InitPrt( pOutDev ); - if( pPostItShell ) - { - pPostItDoc->setPrinter( 0, false, false ); //damit am echten DOC der Drucker bleibt - delete pPostItShell; //Nimmt das PostItDoc mit ins Grab. - } + pViewSh2 = nPage == 0 ? /* post-it page? */ + rPrintData.GetRenderData().m_pPostItShell : pShell; + ::SetSwVisArea( pViewSh2, pStPage->Frm() ); - if( bStartJob ) - rOptions.bJobStartet = TRUE; - } - - } - delete pStr; + pStPage->GetUpper()->Paint( pStPage->Frm(), &rPrintData ); + SwPaintQueue::Repaint(); } //Zus. Scope wg. CurShell! delete pShell; if (bSelection ) { - // damit das Dokument nicht den Drucker mit ins Grab nimmt - pPrtDoc->setPrinter( 0, false, false ); - - if ( !pPrtDoc->release() ) - delete pPrtDoc; + if ( !pOutDevDoc->release() ) + delete pOutDevDoc; } - // restore settings of OutputDevicef - if (pPDFOut) - pPDFOut->Pop(); + // restore settings of OutputDevice (should be done always now since the + // output device is now provided by a call from outside the Writer) + pOutDev->Pop(); - return bStartJob; + return sal_True; } /****************************************************************************** @@ -1484,7 +1269,7 @@ BOOL ViewShell::Prt( SwPrtOptions& rOptions, SfxProgress* pProgress, -void ViewShell::PrtOle2( SwDoc *pDoc, const SwViewOption *pOpt, SwPrtOptions& rOptions, +void ViewShell::PrtOle2( SwDoc *pDoc, const SwViewOption *pOpt, const SwPrintData& rOptions, OutputDevice* pOleOut, const Rectangle& rRect ) { //Wir brauchen eine Shell fuer das Drucken. Entweder hat das Doc schon @@ -1562,52 +1347,6 @@ BOOL ViewShell::IsAnyFieldInDoc() const /****************************************************************************** - * Klasse : SwPrtOptSave - * Erstellt : AMA 12.07.95 - * Aenderung : AMA 12.07.95 - * Holt sich im Ctor folgende Einstellungen des Druckers, die im Dtor dann - * wieder im Drucker gesetzt werden (falls sie sich ueberhaupt geaendert haben) - * - PaperBin - Orientation - PaperSize - - ******************************************************************************/ - - - -SwPrtOptSave::SwPrtOptSave( Printer *pPrinter ) - : pPrt( pPrinter ) -{ - if ( pPrt ) - { - ePaper = pPrt->GetPaper(); - if ( PAPER_USER == ePaper ) - aSize = pPrt->GetPaperSize(); - eOrientation = pPrt->GetOrientation(); - nPaperBin = pPrt->GetPaperBin(); - - } -} - - - -SwPrtOptSave::~SwPrtOptSave() -{ - if ( pPrt ) - { - if ( PAPER_USER == ePaper ) - { - if( pPrt->GetPaperSize() != aSize ) - pPrt->SetPaperSizeUser( aSize ); - } - else if ( pPrt->GetPaper() != ePaper ) - pPrt->SetPaper( ePaper ); - if ( pPrt->GetOrientation() != eOrientation) - pPrt->SetOrientation( eOrientation ); - if ( pPrt->GetPaperBin() != nPaperBin ) - pPrt->SetPaperBin( nPaperBin ); - } -} - - -/****************************************************************************** * SwDrawViewSave * * Saves some settings at the draw view @@ -1633,7 +1372,7 @@ SwDrawViewSave::~SwDrawViewSave() // OD 09.01.2003 #i6467# - method also called for page preview -void ViewShell::PrepareForPrint( const SwPrtOptions &rOptions ) +void ViewShell::PrepareForPrint( const SwPrintData &rOptions ) { // Viewoptions fuer den Drucker setzen pOpt->SetGraphic ( TRUE == rOptions.bPrintGraphic ); diff --git a/sw/source/filter/html/htmlform.cxx b/sw/source/filter/html/htmlform.cxx index 68d3a1a85e2b..c9c850448f56 100644 --- a/sw/source/filter/html/htmlform.cxx +++ b/sw/source/filter/html/htmlform.cxx @@ -76,6 +76,9 @@ #include <com/sun/star/drawing/XControlShape.hpp> #include <com/sun/star/awt/XTextLayoutConstrains.hpp> #include <com/sun/star/awt/XLayoutConstrains.hpp> +#include <com/sun/star/awt/XImageConsumer.hpp> +#include <com/sun/star/form/XImageProducerSupplier.hpp> +#include <com/sun/star/form/XForm.hpp> #include <doc.hxx> #include <pam.hxx> #include <swtable.hxx> diff --git a/sw/source/filter/rtf/rtfatr.cxx b/sw/source/filter/rtf/rtfatr.cxx index 50cec6322339..0c85e78dc0e7 100644 --- a/sw/source/filter/rtf/rtfatr.cxx +++ b/sw/source/filter/rtf/rtfatr.cxx @@ -530,7 +530,7 @@ void OutRTF_SwFlyFrmFmt( SwRTFWriter& rRTFWrt ) rRTFWrt.SetStrm( *pSaveStrm ); // Stream-Pointer wieder zurueck - if( aTmpStrm.GetSize() ) // gibt es SWG spezifische Attribute ?? + if ( aTmpStrm.GetEndOfData() ) // gibt es SWG spezifische Attribute? { aTmpStrm.Seek( 0L ); rRTFWrt.Strm() << '{' << OOO_STRING_SVTOOLS_RTF_IGNORE << aTmpStrm << '}'; diff --git a/sw/source/filter/ww8/wrtw8sty.cxx b/sw/source/filter/ww8/wrtw8sty.cxx index 70756840603c..8e6b0c77b878 100644 --- a/sw/source/filter/ww8/wrtw8sty.cxx +++ b/sw/source/filter/ww8/wrtw8sty.cxx @@ -72,6 +72,7 @@ #include <fmtline.hxx> #include <swtable.hxx> #include <msfilter.hxx> +#include <swmodule.hxx> #include <writerfilter/doctok/sprmids.hxx> @@ -1856,13 +1857,48 @@ void WW8_WrPlcFtnEdn::Append( WW8_CP nCp, const SwFmtFtn& rFtn ) aCntnt.Insert( p, aCntnt.Count() ); } -void WW8_WrPlcPostIt::Append( WW8_CP nCp, const SwPostItField& rPostIt ) +WW8_Annotation::WW8_Annotation(const SwPostItField* pPostIt) +{ + mpRichText = pPostIt->GetTextObject(); + if (!mpRichText) + msSimpleText = pPostIt->GetTxt(); + msOwner = pPostIt->GetPar1(); + maDateTime = DateTime(pPostIt->GetDate(), pPostIt->GetTime()); +} + +WW8_Annotation::WW8_Annotation(const SwRedlineData* pRedline) : mpRichText(0) +{ + msSimpleText = pRedline->GetComment(); + msOwner = SW_MOD()->GetRedlineAuthor(pRedline->GetAuthor()); + maDateTime = pRedline->GetTimeStamp(); +} + +void WW8_WrPlcAnnotations::Append( WW8_CP nCp, const SwPostItField *pPostIt ) { aCps.Insert( nCp, aCps.Count() ); - void* p = (void*)&rPostIt; + WW8_Annotation* p = new WW8_Annotation(pPostIt); aCntnt.Insert( p, aCntnt.Count() ); } +void WW8_WrPlcAnnotations::Append( WW8_CP nCp, const SwRedlineData *pRedline ) +{ + maProcessedRedlines.insert(pRedline); + aCps.Insert( nCp, aCps.Count() ); + WW8_Annotation* p = new WW8_Annotation(pRedline); + aCntnt.Insert( p, aCntnt.Count() ); +} + +bool WW8_WrPlcAnnotations::IsNewRedlineComment( const SwRedlineData *pRedline ) +{ + return maProcessedRedlines.find(pRedline) == maProcessedRedlines.end(); +} + +WW8_WrPlcAnnotations::~WW8_WrPlcAnnotations() +{ + for( USHORT n=0; n < aCntnt.Count(); n++ ) + delete (WW8_Annotation*)aCntnt[n]; +} + bool WW8_WrPlcSubDoc::WriteGenericTxt( WW8Export& rWrt, BYTE nTTyp, WW8_CP& rCount ) { @@ -1882,13 +1918,13 @@ bool WW8_WrPlcSubDoc::WriteGenericTxt( WW8Export& rWrt, BYTE nTTyp, // Anfaenge fuer PlcfAtnTxt pTxtPos->Append( rWrt.Fc2Cp( rWrt.Strm().Tell() )); - const SwPostItField& rPFld = *(SwPostItField*)aCntnt[ i ]; rWrt.WritePostItBegin(); - if (const OutlinerParaObject* pOutliner = rPFld.GetTextObject()) - rWrt.WriteOutliner(*pOutliner, nTTyp); + const WW8_Annotation& rAtn = *(const WW8_Annotation*)aCntnt[i]; + if (rAtn.mpRichText) + rWrt.WriteOutliner(*rAtn.mpRichText, nTTyp); else { - String sTxt(rPFld.GetTxt()); + String sTxt(rAtn.msSimpleText); sTxt.SearchAndReplaceAll(0x0A, 0x0B); rWrt.WriteStringAsPara( sTxt ); } @@ -2015,8 +2051,8 @@ void WW8_WrPlcSubDoc::WriteGenericPlc( WW8Export& rWrt, BYTE nTTyp, // then write first the GrpXstAtnOwners for ( i = 0; i < nLen; ++i ) { - const SwPostItField& rPFld = *(SwPostItField*)aCntnt[ i ]; - aStrArr.push_back(rPFld.GetPar1()); + const WW8_Annotation& rAtn = *(const WW8_Annotation*)aCntnt[i]; + aStrArr.push_back(rAtn.msOwner); } //sort and remove duplicates @@ -2054,10 +2090,9 @@ void WW8_WrPlcSubDoc::WriteGenericPlc( WW8Export& rWrt, BYTE nTTyp, { for( i = 0; i < nLen; ++i ) { - const SwPostItField& rPFld = *(SwPostItField*)aCntnt[ i ]; + const WW8_Annotation& rAtn = *(const WW8_Annotation*)aCntnt[i]; - sal_uInt32 nDTTM = - sw::ms::DateTime2DTTM(DateTime(rPFld.GetDate(),rPFld.GetTime())); + sal_uInt32 nDTTM = sw::ms::DateTime2DTTM(rAtn.maDateTime); SwWW8Writer::WriteLong( *rWrt.pTableStrm, nDTTM ); SwWW8Writer::WriteShort( *rWrt.pTableStrm, 0 ); @@ -2137,12 +2172,12 @@ void WW8_WrPlcSubDoc::WriteGenericPlc( WW8Export& rWrt, BYTE nTTyp, { for ( i = 0; i < nLen; ++i ) { - const SwPostItField& rPFld = *(SwPostItField*)aCntnt[ i ]; + const WW8_Annotation& rAtn = *(const WW8_Annotation*)aCntnt[i]; //aStrArr is sorted myiter aIter = ::std::lower_bound(aStrArr.begin(), - aStrArr.end(), rPFld.GetPar1()); - ASSERT(aIter != aStrArr.end() && *aIter == rPFld.GetPar1(), + aStrArr.end(), rAtn.msOwner); + ASSERT(aIter != aStrArr.end() && *aIter == rAtn.msOwner, "Impossible"); sal_uInt16 nFndPos = static_cast< sal_uInt16 >(aIter - aStrArr.begin()); String sAuthor(*aIter); diff --git a/sw/source/filter/ww8/wrtww8.cxx b/sw/source/filter/ww8/wrtww8.cxx index fb121eb322f7..fb5ce68ec654 100644 --- a/sw/source/filter/ww8/wrtww8.cxx +++ b/sw/source/filter/ww8/wrtww8.cxx @@ -3039,7 +3039,7 @@ void WW8Export::ExportDocument_Impl() pFtn = new WW8_WrPlcFtnEdn( TXT_FTN ); // Footnotes pEdn = new WW8_WrPlcFtnEdn( TXT_EDN ); // Endnotes - pAtn = new WW8_WrPlcPostIt; // PostIts + pAtn = new WW8_WrPlcAnnotations; // PostIts pTxtBxs = new WW8_WrPlcTxtBoxes( TXT_TXTBOX ); pHFTxtBxs = new WW8_WrPlcTxtBoxes( TXT_HFTXTBOX ); @@ -3448,7 +3448,7 @@ void WW8_WrPlcFtnEdn::WritePlc( WW8Export& rWrt ) const } -bool WW8_WrPlcPostIt::WriteTxt( WW8Export& rWrt ) +bool WW8_WrPlcAnnotations::WriteTxt( WW8Export& rWrt ) { bool bRet = WriteGenericTxt( rWrt, TXT_ATN, rWrt.pFib->ccpAtn ); rWrt.pFldAtn->Finish( rWrt.Fc2Cp( rWrt.Strm().Tell() ), @@ -3457,7 +3457,7 @@ bool WW8_WrPlcPostIt::WriteTxt( WW8Export& rWrt ) return bRet; } -void WW8_WrPlcPostIt::WritePlc( WW8Export& rWrt ) const +void WW8_WrPlcAnnotations::WritePlc( WW8Export& rWrt ) const { WriteGenericPlc( rWrt, TXT_ATN, rWrt.pFib->fcPlcfandTxt, rWrt.pFib->lcbPlcfandTxt, rWrt.pFib->fcPlcfandRef, diff --git a/sw/source/filter/ww8/wrtww8.hxx b/sw/source/filter/ww8/wrtww8.hxx index 2e0b4ab7d778..83b3b7b265ed 100644 --- a/sw/source/filter/ww8/wrtww8.hxx +++ b/sw/source/filter/ww8/wrtww8.hxx @@ -109,7 +109,7 @@ class WW8_WrPlcFld; class WW8_WrMagicTable; class WW8_WrPlcFtnEdn; class WW8_WrPlcPn; -class WW8_WrPlcPostIt; +class WW8_WrPlcAnnotations; class MSWordSections; class WW8_WrPlcTxtBoxes; class WW8_WrPct; // Verwaltung @@ -488,7 +488,7 @@ public: WW8_WrPlcPn* pChpPlc; MSWordAttrIter* pChpIter; MSWordStyles* pStyles; - WW8_WrPlcPostIt* pAtn; + WW8_WrPlcAnnotations* pAtn; WW8_WrPlcTxtBoxes *pTxtBxs, *pHFTxtBxs; const sw::Frame *mpParentFrame; //If set we are exporting content inside @@ -1149,16 +1149,30 @@ public: void Append( WW8_CP nCp, const SwFmtFtn& rFtn ); }; -class WW8_WrPlcPostIt : public WW8_WrPlcSubDoc // Doppel-Plc fuer PostIts +struct WW8_Annotation +{ + const OutlinerParaObject* mpRichText; + String msSimpleText; + String msOwner; + DateTime maDateTime; + WW8_Annotation(const SwPostItField* pPostIt); + WW8_Annotation(const SwRedlineData* pRedline); +}; + +class WW8_WrPlcAnnotations : public WW8_WrPlcSubDoc // Doppel-Plc fuer PostIts { private: //No copying - WW8_WrPlcPostIt(const WW8_WrPlcPostIt&); - WW8_WrPlcPostIt& operator=(WW8_WrPlcPostIt&); + WW8_WrPlcAnnotations(const WW8_WrPlcAnnotations&); + WW8_WrPlcAnnotations& operator=(WW8_WrPlcAnnotations&); + std::set<const SwRedlineData*> maProcessedRedlines; public: - WW8_WrPlcPostIt() {} + WW8_WrPlcAnnotations() {} + ~WW8_WrPlcAnnotations(); - void Append( WW8_CP nCp, const SwPostItField& rPostIt ); + void Append( WW8_CP nCp, const SwPostItField* pPostIt ); + void Append( WW8_CP nCp, const SwRedlineData* pRedLine ); + bool IsNewRedlineComment( const SwRedlineData* pRedLine ); bool WriteTxt( WW8Export& rWrt ); void WritePlc( WW8Export& rWrt ) const; }; diff --git a/sw/source/filter/ww8/ww8atr.cxx b/sw/source/filter/ww8/ww8atr.cxx index 54ebd5c5a9ba..b20df77e79a1 100644 --- a/sw/source/filter/ww8/ww8atr.cxx +++ b/sw/source/filter/ww8/ww8atr.cxx @@ -982,6 +982,24 @@ void WW8AttributeOutput::StartRunProperties() m_nFieldResults = pCurrentFields ? pCurrentFields->ResultCount() : 0; } + +void WW8AttributeOutput::StartRun( const SwRedlineData* pRedlineData ) +{ + if (pRedlineData) + { + const String &rComment = pRedlineData->GetComment(); + //Only possible to export to main text + if (rComment.Len() && (m_rWW8Export.nTxtTyp == TXT_MAINTEXT)) + { + if (m_rWW8Export.pAtn->IsNewRedlineComment(pRedlineData)) + { + m_rWW8Export.pAtn->Append( m_rWW8Export.Fc2Cp( m_rWW8Export.Strm().Tell() ), pRedlineData ); + m_rWW8Export.WritePostItBegin( m_rWW8Export.pO ); + } + } + } +} + void WW8AttributeOutput::EndRunProperties( const SwRedlineData* pRedlineData ) { Redline( pRedlineData ); @@ -2555,8 +2573,8 @@ void WW8AttributeOutput::SetField( const SwField& rFld, ww::eField eType, const void WW8AttributeOutput::PostitField( const SwField* pFld ) { - const SwPostItField& rPFld = *(SwPostItField*)pFld; - m_rWW8Export.pAtn->Append( m_rWW8Export.Fc2Cp( m_rWW8Export.Strm().Tell() ), rPFld ); + const SwPostItField *pPFld = (const SwPostItField*)pFld; + m_rWW8Export.pAtn->Append( m_rWW8Export.Fc2Cp( m_rWW8Export.Strm().Tell() ), pPFld ); m_rWW8Export.WritePostItBegin( m_rWW8Export.pO ); } diff --git a/sw/source/filter/ww8/ww8attributeoutput.hxx b/sw/source/filter/ww8/ww8attributeoutput.hxx index 4968d88887dc..8d8516433432 100644 --- a/sw/source/filter/ww8/ww8attributeoutput.hxx +++ b/sw/source/filter/ww8/ww8attributeoutput.hxx @@ -57,8 +57,7 @@ public: /// Start of the text run. /// - /// No-op for binary filters. - virtual void StartRun( const SwRedlineData* /*pRedlineData*/ ) {} + virtual void StartRun( const SwRedlineData* pRedlineData ); /// End of the text run. /// diff --git a/sw/source/filter/ww8/ww8graf.cxx b/sw/source/filter/ww8/ww8graf.cxx index 0553267d12ed..e1c5b2509228 100644 --- a/sw/source/filter/ww8/ww8graf.cxx +++ b/sw/source/filter/ww8/ww8graf.cxx @@ -506,14 +506,15 @@ ESelection SwWW8ImplReader::GetESelection( long nCpStart, long nCpEnd ) // ItemSet gestopft. void SwWW8ImplReader::InsertTxbxStyAttrs( SfxItemSet& rS, USHORT nColl ) { - if( nColl < nColls && pCollA[nColl].pFmt && pCollA[nColl].bColl ) + SwWW8StyInf * pStyInf = GetStyle(nColl); + if( pStyInf != NULL && pStyInf->pFmt && pStyInf->bColl ) { const SfxPoolItem* pItem; for( USHORT i = POOLATTR_BEGIN; i < POOLATTR_END; i++ ) { //If we are set in the source and not set in the destination //then add it in. - if ( SFX_ITEM_SET == pCollA[nColl].pFmt->GetItemState( + if ( SFX_ITEM_SET == pStyInf->pFmt->GetItemState( i, true, &pItem ) ) { SfxItemPool *pEditPool = rS.GetPool(); diff --git a/sw/source/filter/ww8/ww8par.cxx b/sw/source/filter/ww8/ww8par.cxx index b92f80c85290..10aa3d36d6bb 100644 --- a/sw/source/filter/ww8/ww8par.cxx +++ b/sw/source/filter/ww8/ww8par.cxx @@ -57,9 +57,8 @@ #include <svx/lrspitem.hxx> // SvxLRSpaceItem #include <svx/ulspitem.hxx> #include <svx/langitem.hxx> -// --> OD 2005-02-28 #i43427# #include <svx/opaqitem.hxx> -// <-- +#include <svx/charhiddenitem.hxx> #include <filter/msfilter/svxmsbas.hxx> #include <svx/unoapi.hxx> #include <svx/svdoole2.hxx> @@ -989,7 +988,7 @@ const SfxPoolItem* SwWW8FltControlStack::GetFmtAttr(const SwPosition& rPos, SfxItemState eState = SFX_ITEM_DEFAULT; if (const SfxItemSet *pSet = pNd->GetpSwAttrSet()) eState = pSet->GetItemState(RES_LR_SPACE, false); - if (eState != SFX_ITEM_SET) + if (eState != SFX_ITEM_SET && rReader.pCollA != NULL) pItem = &(rReader.pCollA[rReader.nAktColl].maWordLR); } @@ -1630,7 +1629,9 @@ long SwWW8ImplReader::Read_And(WW8PLCFManResult* pRes) sTxt, aDate ); aPostIt.SetTextObject(pOutliner); + pCtrlStck->NewAttr(*pPaM->GetPoint(), SvxCharHiddenItem(false, RES_CHRATR_HIDDEN)); rDoc.InsertPoolItem(*pPaM, SwFmtFld(aPostIt), 0); + pCtrlStck->SetAttr(*pPaM->GetPoint(), RES_CHRATR_HIDDEN); return 0; } @@ -2163,7 +2164,7 @@ CharSet SwWW8ImplReader::GetCurrentCharSet() eSrcCharSet = maFontSrcCharSets.top(); if ((eSrcCharSet == RTL_TEXTENCODING_DONTKNOW) && (nCharFmt != -1)) eSrcCharSet = pCollA[nCharFmt].GetCharSet(); - if (eSrcCharSet == RTL_TEXTENCODING_DONTKNOW) + if ((eSrcCharSet == RTL_TEXTENCODING_DONTKNOW) && StyleExists(nAktColl)) eSrcCharSet = pCollA[nAktColl].GetCharSet(); if (eSrcCharSet == RTL_TEXTENCODING_DONTKNOW) { // patch from cmc for #i52786# @@ -2221,10 +2222,13 @@ CharSet SwWW8ImplReader::GetCurrentCJKCharSet() { if (!maFontSrcCJKCharSets.empty()) eSrcCharSet = maFontSrcCJKCharSets.top(); - if ((eSrcCharSet == RTL_TEXTENCODING_DONTKNOW) && (nCharFmt != -1)) - eSrcCharSet = pCollA[nCharFmt].GetCJKCharSet(); - if (eSrcCharSet == RTL_TEXTENCODING_DONTKNOW) - eSrcCharSet = pCollA[nAktColl].GetCJKCharSet(); + if (pCollA != NULL) + { + if ((eSrcCharSet == RTL_TEXTENCODING_DONTKNOW) && (nCharFmt != -1)) + eSrcCharSet = pCollA[nCharFmt].GetCJKCharSet(); + if (eSrcCharSet == RTL_TEXTENCODING_DONTKNOW) + eSrcCharSet = pCollA[nAktColl].GetCJKCharSet(); + } if (eSrcCharSet == RTL_TEXTENCODING_DONTKNOW) { // patch from cmc for #i52786# /* diff --git a/sw/source/filter/ww8/ww8par2.cxx b/sw/source/filter/ww8/ww8par2.cxx index 795cfb749531..afbf4b3593c1 100644 --- a/sw/source/filter/ww8/ww8par2.cxx +++ b/sw/source/filter/ww8/ww8par2.cxx @@ -827,7 +827,8 @@ void SwWW8ImplReader::Read_ANLevelNo( USHORT, const BYTE* pData, short nLen ) { // nur fuer SwTxtFmtColl, nicht CharFmt // WW: 0 = no Numbering - if (pCollA[nAktColl].bColl && *pData) + SwWW8StyInf * pColl = GetStyle(nAktColl); + if (pColl != NULL && pColl->bColl && *pData) { // Bereich WW:1..9 -> SW:0..8 keine Aufzaehlung / Nummerierung @@ -861,12 +862,16 @@ void SwWW8ImplReader::Read_ANLevelNo( USHORT, const BYTE* pData, short nLen ) void SwWW8ImplReader::Read_ANLevelDesc( USHORT, const BYTE* pData, short nLen ) // Sprm 12 { - if( !pAktColl || nLen <= 0 // nur bei Styledef - || !pCollA[nAktColl].bColl // CharFmt -> ignorieren - || ( nIniFlags & WW8FL_NO_OUTLINE ) ){ - nSwNumLevel = 0xff; - return; + { + SwWW8StyInf * pStyInf = GetStyle(nAktColl); + if( !pAktColl || nLen <= 0 // nur bei Styledef + || (pStyInf && !pStyInf->bColl) // CharFmt -> ignorieren + || ( nIniFlags & WW8FL_NO_OUTLINE ) ){ + nSwNumLevel = 0xff; + return; + } } + if( nSwNumLevel <= MAXLEVEL // Bereich WW:1..9 -> SW:0..8 && nSwNumLevel <= 9 ){ // keine Aufzaehlung / Nummerierung @@ -892,7 +897,10 @@ void SwWW8ImplReader::Read_ANLevelDesc( USHORT, const BYTE* pData, short nLen ) SwNumRule* pNR = GetStyRule(); SetAnld(pNR, (WW8_ANLD*)pData, 0, false); pAktColl->SetFmtAttr( SwNumRuleItem( pNR->GetName() ) ); - pCollA[nAktColl].bHasStyNumRule = true; + + SwWW8StyInf * pStyInf = GetStyle(nAktColl); + if (pStyInf != NULL) + pStyInf->bHasStyNumRule = true; } } @@ -1007,9 +1015,10 @@ void SwWW8ImplReader::StartAnl(const BYTE* pSprm13) } } - if (!sNumRule.Len() && pCollA[nAktColl].bHasStyNumRule) + SwWW8StyInf * pStyInf = GetStyle(nAktColl); + if (!sNumRule.Len() && pStyInf->bHasStyNumRule) { - sNumRule = pCollA[nAktColl].pFmt->GetNumRule().GetValue(); + sNumRule = pStyInf->pFmt->GetNumRule().GetValue(); pNumRule = rDoc.FindNumRulePtr(sNumRule); if (!pNumRule) sNumRule.Erase(); @@ -3918,8 +3927,8 @@ WW8RStyle::WW8RStyle(WW8Fib& _rFib, SwWW8ImplReader* pI) : WW8Style(*pI->pTableStream, _rFib), maSprmParser(_rFib.GetFIBVersion()), pIo(pI), pStStrm(pI->pTableStream), pStyRule(0), nWwNumLevel(0) { - pIo->pCollA = new SwWW8StyInf[ cstd ]; // Style-UEbersetzung WW->SW pIo->nColls = cstd; + pIo->pCollA = cstd ? new SwWW8StyInf[ cstd ] : NULL; // Style-UEbersetzung WW->SW } void WW8RStyle::Set1StyleDefaults() @@ -4691,7 +4700,7 @@ void WW8RStyle::Import() // // fuer z.B. Tabellen wird ein immer gueltiger Std-Style gebraucht - if( pIo->pCollA[0].pFmt && pIo->pCollA[0].bColl && pIo->pCollA[0].bValid ) + if( pIo->StyleExists(0) && pIo->pCollA[0].pFmt && pIo->pCollA[0].bColl && pIo->pCollA[0].bValid ) pIo->pDfltTxtFmtColl = (SwTxtFmtColl*)pIo->pCollA[0].pFmt; else pIo->pDfltTxtFmtColl = pIo->rDoc.GetDfltTxtFmtColl(); diff --git a/sw/source/filter/ww8/ww8scan.cxx b/sw/source/filter/ww8/ww8scan.cxx index f20c13889f27..55834f5c0816 100644 --- a/sw/source/filter/ww8/ww8scan.cxx +++ b/sw/source/filter/ww8/ww8scan.cxx @@ -2281,22 +2281,48 @@ WW8PLCF::WW8PLCF( SvStream* pSt, WW8_FC nFilePos, INT32 nPLCF, int nStruct, void WW8PLCF::ReadPLCF( SvStream* pSt, WW8_FC nFilePos, INT32 nPLCF ) { + bool failure = false; + // Pointer auf Pos-Array pPLCF_PosArray = new WW8_CP[ ( nPLCF + 3 ) / 4 ]; sal_Size nOldPos = pSt->Tell(); pSt->Seek( nFilePos ); - pSt->Read( pPLCF_PosArray, nPLCF ); + failure = pSt->GetError(); + + if (!failure) + { + pSt->Read( pPLCF_PosArray, nPLCF ); + failure = pSt->GetError(); + } + + if (!failure) + { #ifdef OSL_BIGENDIAN - for( nIdx = 0; nIdx <= nIMax; nIdx++ ) - pPLCF_PosArray[nIdx] = SWAPLONG( pPLCF_PosArray[nIdx] ); - nIdx = 0; + for( nIdx = 0; nIdx <= nIMax; nIdx++ ) + pPLCF_PosArray[nIdx] = SWAPLONG( pPLCF_PosArray[nIdx] ); + nIdx = 0; #endif // OSL_BIGENDIAN - // Pointer auf Inhalts-Array - pPLCF_Contents = (BYTE*)&pPLCF_PosArray[nIMax + 1]; + // Pointer auf Inhalts-Array + pPLCF_Contents = (BYTE*)&pPLCF_PosArray[nIMax + 1]; + } pSt->Seek( nOldPos ); + + ASSERT( !failure, "Document has corrupt PLCF, ignoring it" ); + + if (failure) + MakeFailedPLCF(); +} + +void WW8PLCF::MakeFailedPLCF() +{ + nIMax = 0; + delete[] pPLCF_PosArray; + pPLCF_PosArray = new INT32[2]; + pPLCF_PosArray[0] = pPLCF_PosArray[1] = WW8_CP_MAX; + pPLCF_Contents = (BYTE*)&pPLCF_PosArray[nIMax + 1]; } void WW8PLCF::GeneratePLCF( SvStream* pSt, INT32 nPN, INT32 ncpN ) @@ -2359,13 +2385,7 @@ void WW8PLCF::GeneratePLCF( SvStream* pSt, INT32 nPN, INT32 ncpN ) ASSERT( !failure, "Document has corrupt PLCF, ignoring it" ); if (failure) - { - nIMax = 0; - delete[] pPLCF_PosArray; - pPLCF_PosArray = new INT32[2]; - pPLCF_PosArray[0] = pPLCF_PosArray[1] = WW8_CP_MAX; - pPLCF_Contents = (BYTE*)&pPLCF_PosArray[nIMax + 1]; - } + MakeFailedPLCF(); } bool WW8PLCF::SeekPos(WW8_CP nPos) @@ -4390,15 +4410,16 @@ WW8PLCFMan::WW8PLCFMan(WW8ScannerBase* pBase, ManTypes nType, long nStartCp, pBkm = &aD[1]; pEdn = &aD[2]; pFtn = &aD[3]; + pAnd = &aD[4]; - - pPcd = ( pBase->pPLCFx_PCD ) ? &aD[4] : 0; + pPcd = ( pBase->pPLCFx_PCD ) ? &aD[5] : 0; //pPcdA index == pPcd index + 1 - pPcdA = ( pBase->pPLCFx_PCDAttrs ) ? &aD[5] : 0; - pChp = &aD[6]; - pAnd = &aD[7]; + pPcdA = ( pBase->pPLCFx_PCDAttrs ) ? &aD[6] : 0; + + pChp = &aD[7]; pPap = &aD[8]; pSep = &aD[9]; + pSep->pPLCFx = pBase->pSepPLCF; pFtn->pPLCFx = pBase->pFtnPLCF; pEdn->pPLCFx = pBase->pEdnPLCF; @@ -6240,8 +6261,11 @@ WW8Fonts::WW8Fonts( SvStream& rSt, WW8Fib& rFib ) rSt.Seek( rFib.fcSttbfffn ); + INT32 nFFn = rFib.lcbSttbfffn - 2; + // allocate Font Array - BYTE* pA = new BYTE[ rFib.lcbSttbfffn - 2 ]; + BYTE* pA = new BYTE[ nFFn ]; + memset(pA, 0, nFFn); WW8_FFN* p = (WW8_FFN*)pA; ww::WordVersion eVersion = rFib.GetFIBVersion(); @@ -6258,13 +6282,13 @@ WW8Fonts::WW8Fonts( SvStream& rSt, WW8Fib& rFib ) rSt.SeekRel( 2 ); // read all font information - rSt.Read( pA, rFib.lcbSttbfffn - 2 ); + nFFn = rSt.Read( pA, nFFn ); if( eVersion < ww::eWW8 ) { // try to figure out how many fonts are defined here nMax = 0; - long nLeft = rFib.lcbSttbfffn - 2; + long nLeft = nFFn; for(;;) { short nNextSiz; diff --git a/sw/source/filter/ww8/ww8scan.hxx b/sw/source/filter/ww8/ww8scan.hxx index 3547eaf99391..85c80ba51025 100644 --- a/sw/source/filter/ww8/ww8scan.hxx +++ b/sw/source/filter/ww8/ww8scan.hxx @@ -295,6 +295,8 @@ private: machen wir uns hiermit einen PLC: */ void GeneratePLCF( SvStream* pSt, INT32 nPN, INT32 ncpN ); + + void MakeFailedPLCF(); public: WW8PLCF( SvStream* pSt, WW8_FC nFilePos, INT32 nPLCF, int nStruct, WW8_CP nStartPos = -1 ); diff --git a/sw/source/ui/app/docsh2.cxx b/sw/source/ui/app/docsh2.cxx index 84c2ae9b9a95..16728ca544c9 100644 --- a/sw/source/ui/app/docsh2.cxx +++ b/sw/source/ui/app/docsh2.cxx @@ -1132,7 +1132,7 @@ void SwDocShell::Execute(SfxRequest& rReq) xRef( pClipCntnr ); pClipCntnr->CopyAnyData( FORMAT_RTF, (sal_Char*) - pStrm->GetData(), pStrm->GetSize() ); + pStrm->GetData(), pStrm->GetEndOfData() ); pClipCntnr->CopyToClipboard( GetView()? (Window*)&GetView()->GetEditWin() : 0 ); delete pStrm; diff --git a/sw/source/ui/app/docst.cxx b/sw/source/ui/app/docst.cxx index 953ab1b8b8f7..8d723f64f28e 100644 --- a/sw/source/ui/app/docst.cxx +++ b/sw/source/ui/app/docst.cxx @@ -42,6 +42,7 @@ #include <sfx2/request.hxx> #include <sfx2/dispatch.hxx> #include <sfx2/newstyle.hxx> +#include <sfx2/printer.hxx> #include <svl/macitem.hxx> #include <svx/brshitem.hxx> #include <svl/stritem.hxx> diff --git a/sw/source/ui/app/mn.src b/sw/source/ui/app/mn.src index c58eaa369fc0..f89046c40f74 100644 --- a/sw/source/ui/app/mn.src +++ b/sw/source/ui/app/mn.src @@ -1065,12 +1065,6 @@ Menu MN_PPREVIEW_POPUPMENU HelpID = FN_PRINT_PAGEPREVIEW ; Text [ en-US ] = "Print" ; }; - MenuItem - { - Identifier = FN_PREVIEW_PRINT_OPTIONS; - HelpID = FN_PREVIEW_PRINT_OPTIONS; - Text [ en-US ] = "Print Options"; - }; SEPARATOR ; MenuItem { diff --git a/sw/source/ui/config/optdlg.hrc b/sw/source/ui/config/optdlg.hrc index 2ada884e48c7..63ad384c7bd9 100644 --- a/sw/source/ui/config/optdlg.hrc +++ b/sw/source/ui/config/optdlg.hrc @@ -96,13 +96,13 @@ #define CB_CHAR_HIDDEN 61 // Print-Extra-Page #define CB_PGRF 61 -#define CB_PTAB 62 -#define CB_PDRAW 63 +//#define CB_PTAB 62 merged with CB_PGRF in printerpullpages +//#define CB_PDRAW 63 removed in printerpullpages #define CB_LEFTP 64 #define CB_RIGHTP 65 -#define CB_REVERSE 66 +//#define CB_REVERSE 66 removed in printerpullpages #define CB_PROSPECT 67 -#define CB_SINGLEJOBS 68 +//#define CB_SINGLEJOBS 68 removed in printerpullpages #define CB_CTRLFLD 69 #define CB_PAPERFROMSETUP 70 #define FL_1 71 diff --git a/sw/source/ui/config/optdlg.src b/sw/source/ui/config/optdlg.src index 41ba789789ff..f509b1cdcc5c 100644..100755 --- a/sw/source/ui/config/optdlg.src +++ b/sw/source/ui/config/optdlg.src @@ -215,60 +215,66 @@ TabPage TP_OPTPRINT_PAGE Text [ en-US ] = "Contents" ; Group = TRUE ; }; - CheckBox CB_PGRF + CheckBox CB_PGRF /*functionally merged with CB_PDRAW*/ { Pos = MAP_APPFONT ( 12 , 14 ) ; Size = MAP_APPFONT ( 70 , 10 ) ; - Text [ en-US ] = "~Graphics" ; + Text [ en-US ] = "~Pictures and objects" ; TabStop = TRUE ; Group = TRUE ; }; +/* + removed, tables now always get printed CheckBox CB_PTAB { Pos = MAP_APPFONT ( 12 , 27 ) ; Size = MAP_APPFONT ( 70 , 10 ) ; Text [ en-US ] = "~Tables" ; }; +*/ +/* + functionally merged with CB_PGRF (pictures and graphics) CheckBox CB_PDRAW { Pos = MAP_APPFONT ( 12 , 40 ) ; Size = MAP_APPFONT ( 70 , 10 ) ; Text [ en-US ] = "Dra~wings" ; }; +*/ CheckBox CB_CTRLFLD { - Pos = MAP_APPFONT ( 12 , 53 ) ; + Pos = MAP_APPFONT ( 12 , 27 ) ; Size = MAP_APPFONT ( 70 , 10 ) ; - Text [ en-US ] = "Control~s" ; + Text [ en-US ] = "Form control~s" ; }; CheckBox CB_BACKGROUND { - Pos = MAP_APPFONT ( 12 , 66 ) ; + Pos = MAP_APPFONT ( 12 , 40 ) ; Size = MAP_APPFONT ( 70 , 10 ) ; - Text [ en-US ] = "Ba~ckground" ; + Text [ en-US ] = "Page ba~ckground" ; }; CheckBox CB_BLACK_FONT { - Pos = MAP_APPFONT ( 12 , 79 ) ; + Pos = MAP_APPFONT ( 12 , 53 ) ; Size = MAP_APPFONT ( 70 , 10 ) ; - Text [ en-US ] = "Print blac~k" ; + Text [ en-US ] = "Print text in blac~k" ; }; CheckBox CB_HIDDEN_TEXT { - Pos = MAP_APPFONT ( 12 , 92 ) ; + Pos = MAP_APPFONT ( 12 , 66 ) ; Size = MAP_APPFONT ( 70 , 10 ) ; Text [ en-US ] = "Hidden te~xt" ; }; CheckBox CB_TEXT_PLACEHOLDER { - Pos = MAP_APPFONT ( 12 , 105 ) ; + Pos = MAP_APPFONT ( 12 , 79 ) ; Size = MAP_APPFONT ( 70 , 10 ) ; Text [ en-US ] = "Text ~placeholder" ; }; FixedLine FL_SEP_PRT_LEFT { Pos = MAP_APPFONT ( 85 , 14 ) ; - Size = MAP_APPFONT ( 4 , 104 ) ; + Size = MAP_APPFONT ( 4 , 78 ) ; Vert = TRUE; }; FixedLine FL_2 @@ -292,21 +298,24 @@ TabPage TP_OPTPRINT_PAGE Size = MAP_APPFONT ( 70 , 10 ) ; Text [ en-US ] = "~Right pages" ; }; +/* + removed, noe handled by the new print dialog (i.e. vcl) itself CheckBox CB_REVERSE { Pos = MAP_APPFONT ( 96 , 40 ) ; Size = MAP_APPFONT ( 70 , 10 ) ; Text [ en-US ] = "Re~versed" ; }; +*/ CheckBox CB_PROSPECT { - Pos = MAP_APPFONT ( 96 , 53 ) ; + Pos = MAP_APPFONT ( 96 , 40 ) ; Size = MAP_APPFONT ( 70 , 10 ) ; Text [ en-US ] = "Broch~ure" ; }; CheckBox CB_PROSPECT_RTL { - Pos = MAP_APPFONT ( 103 , 66 ) ; + Pos = MAP_APPFONT ( 103 , 53 ) ; Size = MAP_APPFONT ( 70 , 10 ) ; Text [ en-US ] = "Right to Left" ; Text [ x-comment ] = " "; @@ -340,7 +349,7 @@ TabPage TP_OPTPRINT_PAGE FixedLine FL_SEP_PRT_RIGHT { Pos = MAP_APPFONT ( 169 , 14 ) ; - Size = MAP_APPFONT ( 4 , 104 ) ; + Size = MAP_APPFONT ( 4 , 78 ) ; Vert = TRUE; }; FixedLine FL_3 @@ -352,35 +361,37 @@ TabPage TP_OPTPRINT_PAGE }; FixedLine FL_4 { - Pos = MAP_APPFONT ( 6 , 121 ) ; + Pos = MAP_APPFONT ( 6 , 95 ) ; Size = MAP_APPFONT ( 248 , 8 ) ; Group = TRUE ; Text [ en-US ] = "Other"; }; CheckBox CB_PRINTEMPTYPAGES { - Pos = MAP_APPFONT ( 12 , 132 ) ; + Pos = MAP_APPFONT ( 12 , 106 ) ; Size = MAP_APPFONT ( 200 , 10 ) ; TabStop = TRUE ; Text [ en-US ] = "Print ~automatically inserted blank pages"; }; +/* CheckBox CB_SINGLEJOBS { - Pos = MAP_APPFONT ( 12 , 145 ) ; + Pos = MAP_APPFONT ( 12 , 119 ) ; Size = MAP_APPFONT ( 200 , 10 ) ; TabStop = TRUE ; Text [ en-US ] = "Create s~ingle print jobs" ; }; +*/ CheckBox CB_PAPERFROMSETUP { - Pos = MAP_APPFONT ( 12 , 158 ) ; + Pos = MAP_APPFONT ( 12 , 119 ) ; Size = MAP_APPFONT ( 200 , 10 ) ; TabStop = TRUE ; Text [ en-US ] = "~Paper tray from printer settings"; }; FixedText FT_FAX { - Pos = MAP_APPFONT ( 12 , 173 ) ; + Pos = MAP_APPFONT ( 12 , 134 ) ; Size = MAP_APPFONT ( 50 , 8 ) ; Group = TRUE ; Text [ en-US ] = "~Fax"; @@ -388,7 +399,7 @@ TabPage TP_OPTPRINT_PAGE ListBox LB_FAX { Border = TRUE ; - Pos = MAP_APPFONT ( 70 , 171 ) ; + Pos = MAP_APPFONT ( 70 , 132 ) ; Size = MAP_APPFONT ( 184 , 70 ) ; TabStop = TRUE ; DropDown = TRUE ; @@ -935,3 +946,55 @@ TabPage TP_OPTSHDWCRSR }; }; + +StringArray STR_PRINTOPTUI +{ + ItemList [en-US] = + { + < "%PRODUCTNAME %s"; >; + < "Contents"; >; + < "Page ba~ckground"; >; + < "Specifies whether to include colors and objects that are inserted to the background of the page (Format - Page - Background) in the printed document."; >; + < "~Pictures and objects"; >; + < "Specifies whether the graphics and drawing or OLE objects of your text document are printed"; >; + < "Hidden te~xt"; >; + < "Enable this option to print text that is marked as hidden."; >; + < "~Text placeholder"; >; + < "Enable this option to print text placeholders. Disable this option to leave the text placeholders blank in the printout."; >; + < "Form control~s"; >; + < "Specifies whether the form control fields of the text document are printed"; >; + < "Color"; >; + < "Print text in blac~k"; >; + < "Specifies whether to always print text in black."; >; + < "Pages"; >; + < "Print ~automatically inserted blank pages"; >; + < "If this option is enabled automatically inserted blank pages are printed. This is best if you are printing double-sided. For example, in a book, a \"chapter\" paragraph style has been set to always start with an odd numbered page. If the previous chapter ends on an odd page, %PRODUCTNAME inserts an even numbered blank page. This option controls whether to print that even numbered page or not"; >; + < "~Use only paper tray from printer preferences"; >; + < "For printers with multiple trays this option specifies whether the paper tray used is specified by the system settings of the printer."; >; + < "Print"; >; + < "None (document only)"; >; + < "Comments only"; >; + < "Place at end of document"; >; + < "Place at end of page"; >; + < "Specify where to print comments (if any)."; >; + < "~Comments"; >; + < "Page sides";>; + < "All pages"; >; + < "Back sides / left pages"; >; + < "Front sides / right pages"; >; + < "Specify which pages to include in the output"; >; + < "Include"; >; + < "Broch~ure"; >; + < "Select the Brochure option to print the document in brochure format."; >; + < "Left-to-right script"; >; + < "Right-to-left script"; >; + < "Ranges and copies"; >; + < "~All pages"; >; + < "Print the whole document."; >; + < "Pa~ges"; >; + < "Print a range of pages of the document."; >; + < "~Selection"; >; + < "Print only the selected parts of the document"; >; + }; +}; + diff --git a/sw/source/ui/config/optpage.cxx b/sw/source/ui/config/optpage.cxx index b206bce741fd..84e8958fa977 100644..100755 --- a/sw/source/ui/config/optpage.cxx +++ b/sw/source/ui/config/optpage.cxx @@ -350,8 +350,8 @@ SwAddPrinterTabPage::SwAddPrinterTabPage( Window* pParent, SfxTabPage( pParent, SW_RES( TP_OPTPRINT_PAGE ), rCoreSet), aFL1 (this, SW_RES(FL_1)), aGrfCB (this, SW_RES(CB_PGRF)), - aTabCB (this, SW_RES(CB_PTAB)), - aDrawCB (this, SW_RES(CB_PDRAW)), +// aTabCB (this, SW_RES(CB_PTAB)), +// aDrawCB (this, SW_RES(CB_PDRAW)), aCtrlFldCB (this, SW_RES(CB_CTRLFLD)), aBackgroundCB (this, SW_RES(CB_BACKGROUND)), aBlackFontCB (this, SW_RES(CB_BLACK_FONT)), @@ -361,7 +361,7 @@ SwAddPrinterTabPage::SwAddPrinterTabPage( Window* pParent, aFL2 (this, SW_RES(FL_2)), aLeftPageCB (this, SW_RES(CB_LEFTP)), aRightPageCB (this, SW_RES(CB_RIGHTP)), - aReverseCB (this, SW_RES(CB_REVERSE)), +// aReverseCB (this, SW_RES(CB_REVERSE)), aProspectCB (this, SW_RES(CB_PROSPECT)), aProspectCB_RTL (this, SW_RES(CB_PROSPECT_RTL)), aSeparatorRFL (this, SW_RES(FL_SEP_PRT_RIGHT)), @@ -372,7 +372,7 @@ SwAddPrinterTabPage::SwAddPrinterTabPage( Window* pParent, aFL3 (this, SW_RES(FL_3)), aFL4 (this, SW_RES(FL_4)), aPrintEmptyPagesCB(this, SW_RES(CB_PRINTEMPTYPAGES)), - aSingleJobsCB (this, SW_RES(CB_SINGLEJOBS)), +// aSingleJobsCB (this, SW_RES(CB_SINGLEJOBS)), aPaperFromSetupCB(this, SW_RES(CB_PAPERFROMSETUP)), aFaxFT (this, SW_RES(FT_FAX)), aFaxLB (this, SW_RES(LB_FAX)), @@ -386,14 +386,14 @@ SwAddPrinterTabPage::SwAddPrinterTabPage( Window* pParent, aGrfCB.SetClickHdl( aLk ); aRightPageCB.SetClickHdl( aLk ); aLeftPageCB.SetClickHdl( aLk ); - aTabCB.SetClickHdl( aLk ); - aDrawCB.SetClickHdl( aLk ); +// aTabCB.SetClickHdl( aLk ); +// aDrawCB.SetClickHdl( aLk ); aCtrlFldCB.SetClickHdl( aLk ); aBackgroundCB.SetClickHdl( aLk ); aBlackFontCB.SetClickHdl( aLk ); aPrintHiddenTextCB.SetClickHdl( aLk ); aPrintTextPlaceholderCB.SetClickHdl( aLk ); - aReverseCB.SetClickHdl( aLk ); +// aReverseCB.SetClickHdl( aLk ); aProspectCB.SetClickHdl( aLk ); aProspectCB_RTL.SetClickHdl( aLk ); aPaperFromSetupCB.SetClickHdl( aLk ); @@ -402,27 +402,40 @@ SwAddPrinterTabPage::SwAddPrinterTabPage( Window* pParent, aEndRB.SetClickHdl( aLk ); aOnlyRB.SetClickHdl( aLk ); aNoRB.SetClickHdl( aLk ); - aSingleJobsCB.SetClickHdl( aLk ); +// aSingleJobsCB.SetClickHdl( aLk ); aFaxLB.SetSelectHdl( LINK( this, SwAddPrinterTabPage, SelectHdl ) ); const SfxPoolItem* pItem; if(SFX_ITEM_SET == rCoreSet.GetItemState(SID_HTML_MODE, FALSE, &pItem ) && ((SfxUInt16Item*)pItem)->GetValue() & HTMLMODE_ON) { - aDrawCB .Hide(); +// aDrawCB .Hide(); aLeftPageCB .Hide(); aRightPageCB .Hide(); aPrintHiddenTextCB.Hide(); aPrintTextPlaceholderCB.Hide(); - Point rPt(aReverseCB .GetPosPixel()); - rPt.setX(rPt.getX() + 15); // indent - aProspectCB_RTL.SetPosPixel(rPt); - aReverseCB.SetPosPixel(aLeftPageCB .GetPosPixel()); - aProspectCB.SetPosPixel(aRightPageCB .GetPosPixel()); - aPrintHiddenTextCB.SetPosPixel(aBlackFontCB.GetPosPixel()); - aBlackFontCB.SetPosPixel(aBackgroundCB.GetPosPixel()); - aBackgroundCB.SetPosPixel(aCtrlFldCB.GetPosPixel()); - aCtrlFldCB.SetPosPixel(aDrawCB.GetPosPixel()); +// aReverseCB.SetPosPixel(aLeftPageCB.GetPosPixel()); + aProspectCB.SetPosPixel(aLeftPageCB.GetPosPixel()); + Point aPt( aRightPageCB.GetPosPixel() ); + aPt.setX(aPt.getX() + 15); // indent + aProspectCB_RTL.SetPosPixel(aPt); +// aBlackFontCB.SetPosPixel(aBackgroundCB.GetPosPixel()); +// aPrintHiddenTextCB.SetPosPixel(aBlackFontCB.GetPosPixel()); +// aBackgroundCB.SetPosPixel(aCtrlFldCB.GetPosPixel()); +// aCtrlFldCB.SetPosPixel(aDrawCB.GetPosPixel()); + + // hide aPrintEmptyPagesCB and move everything below up accordingly + long nDeltaY = aPaperFromSetupCB.GetPosPixel().getY() - aPrintEmptyPagesCB.GetPosPixel().getY(); + aPrintEmptyPagesCB.Hide(); + aPt = aPaperFromSetupCB.GetPosPixel(); + aPt.setY( aPt.getY() - nDeltaY ); + aPaperFromSetupCB.SetPosPixel( aPt ); + aPt = aFaxFT.GetPosPixel(); + aPt.setY( aPt.getY() - nDeltaY ); + aFaxFT.SetPosPixel( aPt ); + aPt = aFaxLB.GetPosPixel(); + aPt.setY( aPt.getY() - nDeltaY ); + aFaxLB.SetPosPixel( aPt ); } aProspectCB_RTL.Disable(); SvtCTLOptions aCTLOptions; @@ -465,22 +478,22 @@ BOOL SwAddPrinterTabPage::FillItemSet( SfxItemSet& rCoreSet ) { SwAddPrinterItem aAddPrinterAttr (FN_PARAM_ADDPRINTER); aAddPrinterAttr.bPrintGraphic = aGrfCB.IsChecked(); - aAddPrinterAttr.bPrintTable = aTabCB.IsChecked(); - aAddPrinterAttr.bPrintDraw = aDrawCB.IsChecked(); + aAddPrinterAttr.bPrintTable = TRUE; // always enabled since CWS printerpullgpages /*aTabCB.IsChecked();*/ + aAddPrinterAttr.bPrintDraw = aGrfCB.IsChecked(); // UI merged with aGrfCB in CWS printerpullgpages /*aDrawCB.IsChecked()*/; aAddPrinterAttr.bPrintControl = aCtrlFldCB.IsChecked(); aAddPrinterAttr.bPrintPageBackground = aBackgroundCB.IsChecked(); aAddPrinterAttr.bPrintBlackFont = aBlackFontCB.IsChecked(); aAddPrinterAttr.bPrintHiddenText = aPrintHiddenTextCB.IsChecked(); aAddPrinterAttr.bPrintTextPlaceholder = aPrintTextPlaceholderCB.IsChecked(); - aAddPrinterAttr.bPrintLeftPage = aLeftPageCB.IsChecked(); - aAddPrinterAttr.bPrintRightPage = aRightPageCB.IsChecked(); - aAddPrinterAttr.bPrintReverse = aReverseCB.IsChecked(); - aAddPrinterAttr.bPrintProspect = aProspectCB.IsChecked(); - aAddPrinterAttr.bPrintProspect_RTL = aProspectCB_RTL.IsChecked(); - aAddPrinterAttr.bPaperFromSetup = aPaperFromSetupCB.IsChecked(); - aAddPrinterAttr.bPrintEmptyPages = aPrintEmptyPagesCB.IsChecked(); - aAddPrinterAttr.bPrintSingleJobs = aSingleJobsCB.IsChecked(); + aAddPrinterAttr.bPrintLeftPages = aLeftPageCB.IsChecked(); + aAddPrinterAttr.bPrintRightPages = aRightPageCB.IsChecked(); + aAddPrinterAttr.bPrintReverse = FALSE; // handled by vcl itself since CWS printerpullpages /*aReverseCB.IsChecked()*/; + aAddPrinterAttr.bPrintProspect = aProspectCB.IsChecked(); + aAddPrinterAttr.bPrintProspectRTL = aProspectCB_RTL.IsChecked(); + aAddPrinterAttr.bPaperFromSetup = aPaperFromSetupCB.IsChecked(); + aAddPrinterAttr.bPrintEmptyPages = aPrintEmptyPagesCB.IsChecked(); + aAddPrinterAttr.bPrintSingleJobs = TRUE; // handled by vcl in new print dialog since CWS printerpullpages /*aSingleJobsCB.IsChecked()*/; if (aNoRB.IsChecked()) aAddPrinterAttr.nPrintPostIts = POSTITS_NONE; @@ -508,22 +521,22 @@ void SwAddPrinterTabPage::Reset( const SfxItemSet& ) if( SFX_ITEM_SET == rSet.GetItemState( FN_PARAM_ADDPRINTER , FALSE, (const SfxPoolItem**)&pAddPrinterAttr )) { - aGrfCB.Check( pAddPrinterAttr->bPrintGraphic); - aTabCB.Check( pAddPrinterAttr->bPrintTable); - aDrawCB.Check( pAddPrinterAttr->bPrintDraw); + aGrfCB.Check( pAddPrinterAttr->bPrintGraphic || pAddPrinterAttr->bPrintDraw ); +// aTabCB.Check( pAddPrinterAttr->bPrintTable); +// aDrawCB.Check( pAddPrinterAttr->bPrintDraw); aCtrlFldCB.Check( pAddPrinterAttr->bPrintControl); aBackgroundCB.Check( pAddPrinterAttr->bPrintPageBackground); aBlackFontCB.Check( pAddPrinterAttr->bPrintBlackFont); aPrintHiddenTextCB.Check( pAddPrinterAttr->bPrintHiddenText); aPrintTextPlaceholderCB.Check(pAddPrinterAttr->bPrintTextPlaceholder); - aLeftPageCB.Check( pAddPrinterAttr->bPrintLeftPage); - aRightPageCB.Check( pAddPrinterAttr->bPrintRightPage); - aReverseCB.Check( pAddPrinterAttr->bPrintReverse); + aLeftPageCB.Check( pAddPrinterAttr->bPrintLeftPages); + aRightPageCB.Check( pAddPrinterAttr->bPrintRightPages); +// aReverseCB.Check( pAddPrinterAttr->bPrintReverse); aPaperFromSetupCB.Check(pAddPrinterAttr->bPaperFromSetup); aPrintEmptyPagesCB.Check(pAddPrinterAttr->bPrintEmptyPages); aProspectCB.Check( pAddPrinterAttr->bPrintProspect); - aProspectCB_RTL.Check( pAddPrinterAttr->bPrintProspect_RTL); - aSingleJobsCB.Check( pAddPrinterAttr->bPrintSingleJobs); + aProspectCB_RTL.Check( pAddPrinterAttr->bPrintProspectRTL); +// aSingleJobsCB.Check( pAddPrinterAttr->bPrintSingleJobs); aNoRB.Check (pAddPrinterAttr->nPrintPostIts== POSTITS_NONE ) ; aOnlyRB.Check (pAddPrinterAttr->nPrintPostIts== POSTITS_ONLY ) ; diff --git a/sw/source/ui/config/prtopt.cxx b/sw/source/ui/config/prtopt.cxx index 31f3dde739c7..68f86cae4639 100644 --- a/sw/source/ui/config/prtopt.cxx +++ b/sw/source/ui/config/prtopt.cxx @@ -69,8 +69,8 @@ Sequence<OUString> SwPrintOptions::GetPropertyNames() "Page/LeftPage", // 13 not in SW/Web "Page/RightPage", // 14 not in SW/Web "EmptyPages", // 15 not in SW/Web - "Content/PrintPlaceholders", // 16 not in Sw/Web - "Content/PrintHiddenText" // 17 + "Content/PrintPlaceholders", // 16 not in Sw/Web + "Content/PrintHiddenText" // 17 not in Sw/Web }; const int nCount = bIsWeb ? 12 : 18; Sequence<OUString> aNames(nCount); @@ -92,6 +92,8 @@ SwPrintOptions::SwPrintOptions(sal_Bool bWeb) : bPrintPageBackground = !bWeb; bPrintBlackFont = bWeb; bPrintTextPlaceholder = bPrintHiddenText = sal_False; + if (bWeb) + bPrintEmptyPages = sal_False; Sequence<OUString> aNames = GetPropertyNames(); Sequence<Any> aValues = GetProperties(aNames); @@ -119,13 +121,13 @@ SwPrintOptions::SwPrintOptions(sal_Bool bWeb) : break; case 6: bPrintReverse = *(sal_Bool*)pValues[nProp].getValue(); break; case 7: bPrintProspect = *(sal_Bool*)pValues[nProp].getValue(); break; - case 8: bPrintProspect_RTL = *(sal_Bool*)pValues[nProp].getValue(); break; + case 8: bPrintProspectRTL = *(sal_Bool*)pValues[nProp].getValue(); break; case 9: bPrintSingleJobs = *(sal_Bool*)pValues[nProp].getValue(); break; case 10: pValues[nProp] >>= sFaxName; break; case 11: bPaperFromSetup = *(sal_Bool*)pValues[nProp].getValue(); break; case 12: bPrintDraw = *(sal_Bool*)pValues[nProp].getValue() ; break; - case 13: bPrintLeftPage = *(sal_Bool*)pValues[nProp].getValue(); break; - case 14: bPrintRightPage = *(sal_Bool*)pValues[nProp].getValue(); break; + case 13: bPrintLeftPages = *(sal_Bool*)pValues[nProp].getValue(); break; + case 14: bPrintRightPages = *(sal_Bool*)pValues[nProp].getValue(); break; case 15: bPrintEmptyPages = *(sal_Bool*)pValues[nProp].getValue(); break; case 16: bPrintTextPlaceholder = *(sal_Bool*)pValues[nProp].getValue(); break; case 17: bPrintHiddenText = *(sal_Bool*)pValues[nProp].getValue(); break; @@ -133,6 +135,12 @@ SwPrintOptions::SwPrintOptions(sal_Bool bWeb) : } } } + + // currently there is just one checkbox for print drawings and print graphics + // In the UI. (File/Print dialog and Tools/Options/.../Print) + // And since print graphics is the only available in Writer and WrtierWeb ... + + bPrintDraw = bPrintGraphic; } /* -----------------------------06.09.00 16:50-------------------------------- @@ -167,18 +175,24 @@ void SwPrintOptions::Commit() case 5: pValues[nProp] <<= (sal_Int32)nPrintPostIts ; break; case 6: bVal = bPrintReverse ; pValues[nProp].setValue(&bVal, rType); break; case 7: bVal = bPrintProspect ; pValues[nProp].setValue(&bVal, rType); break; - case 8: bVal = bPrintProspect_RTL ; pValues[nProp].setValue(&bVal, rType); break; + case 8: bVal = bPrintProspectRTL ; pValues[nProp].setValue(&bVal, rType); break; case 9: bVal = bPrintSingleJobs ; pValues[nProp].setValue(&bVal, rType); break; case 10: pValues[nProp] <<= sFaxName; break; case 11: bVal = bPaperFromSetup ; pValues[nProp].setValue(&bVal, rType); break; case 12: bVal = bPrintDraw ; pValues[nProp].setValue(&bVal, rType); break; - case 13: bVal = bPrintLeftPage ; pValues[nProp].setValue(&bVal, rType); break; - case 14: bVal = bPrintRightPage ; pValues[nProp].setValue(&bVal, rType); break; + case 13: bVal = bPrintLeftPages ; pValues[nProp].setValue(&bVal, rType); break; + case 14: bVal = bPrintRightPages ; pValues[nProp].setValue(&bVal, rType); break; case 15: bVal = bPrintEmptyPages ; pValues[nProp].setValue(&bVal, rType); break; case 16: bVal = bPrintTextPlaceholder; pValues[nProp].setValue(&bVal, rType); break; case 17: bVal = bPrintHiddenText; pValues[nProp].setValue(&bVal, rType); break; } } + + // currently there is just one checkbox for print drawings and print graphics + // In the UI. (File/Print dialog and Tools/Options/.../Print) + // And since print graphics is the only available in Writer and WrtierWeb ... + bPrintDraw = bPrintGraphic; + PutProperties(aNames, aValues); } diff --git a/sw/source/ui/dbui/dbmgr.cxx b/sw/source/ui/dbui/dbmgr.cxx index 329316dcb21a..07ba1564c5ef 100644 --- a/sw/source/ui/dbui/dbmgr.cxx +++ b/sw/source/ui/dbui/dbmgr.cxx @@ -73,7 +73,7 @@ #include <svl/zformat.hxx> #include <svl/stritem.hxx> #include <svl/eitem.hxx> -#include <sfx2/printer.hxx> +#include <vcl/oldprintadaptor.hxx> #include <sfx2/docfile.hxx> #include <sfx2/progress.hxx> #include <sfx2/dispatch.hxx> @@ -454,80 +454,7 @@ BOOL SwNewDBMgr::MergeNew(const SwMergeDescriptor& rMergeDesc ) bRet = Merge(&rMergeDesc.rSh); // Mischen break; - case DBMGR_MERGE_MAILMERGE: // Serienbrief - { - SwView& rView = rMergeDesc.rSh.GetView(); - SfxDispatcher *pDis = rView.GetViewFrame()->GetDispatcher(); - SfxItemSet aPrintArgs( rView.GetPool(), - SID_SILENT, SID_SILENT, //5528 - SID_ASYNCHRON, SID_ASYNCHRON, //5811 - SID_PRINT_FIRST_PAGE, SID_PRINT_FIRST_PAGE, // 5001 - SID_PRINT_LAST_PAGE, SID_PRINT_LAST_PAGE, // 5002 - SID_PRINT_COPIES, SID_PRINT_COPIES, // 5003 - SID_PRINTER_NAME, SID_PRINTER_NAME, //5322 - SID_SELECTION, SID_SELECTION, //5346 - SID_FILE_NAME, SID_FILE_NAME, // 5507 - SID_PRINT_PAGES, SID_PRINT_PAGES, //6589 - SID_PRINT_COLLATE, SID_PRINT_COLLATE, //6590 - FN_QRY_MERGE, FN_QRY_MERGE, - 0 ); - aPrintArgs.Put(SfxBoolItem(FN_QRY_MERGE, TRUE) ); - - // !! Currently (Jan-2003) silent is defined by supplying *any* - // !! item!! (Thus according to OS it would be silent even when - // !! other items then SID_SILENT would be supplied!) - // !! Therefore it has to be the 0 pointer when not silent. - if(IsMergeSilent()) - { - aPrintArgs.Put( SfxBoolItem(SID_SILENT, TRUE) ); - // #i25686# printing should be done asynchronously to prevent dangling offices - // when mail merge is called as command line macro - // #i52629# aynchronous printing should only be done in silent mode - otherwise - // the printer dialog does not come up - aPrintArgs.Put( SfxBoolItem( SID_ASYNCHRON, rMergeDesc.bPrintAsync )); - } - // convert PropertyValues - const beans::PropertyValue* pPrintOptions = rMergeDesc.aPrintOptions.getConstArray(); - for( sal_Int32 nOption = 0; nOption < rMergeDesc.aPrintOptions.getLength(); ++nOption) - { - if( pPrintOptions[nOption].Name.equalsAscii( "CopyCount" )) - { - sal_Int16 nCopies = 0; - if((pPrintOptions[nOption].Value >>= nCopies) && nCopies > 0) - aPrintArgs.Put( SfxInt16Item( SID_PRINT_COPIES, nCopies )); - } - else if( pPrintOptions[nOption].Name.equalsAscii( "FileName" )) - { - ::rtl::OUString sFileName; - if( (pPrintOptions[nOption].Value >>= sFileName) && sFileName.getLength() > 0) - aPrintArgs.Put( SfxStringItem( SID_FILE_NAME, sFileName )); - } - else if( pPrintOptions[nOption].Name.equalsAscii( "Collate" )) - { - sal_Bool bCollate = sal_False; - if( pPrintOptions[nOption].Value >>= bCollate ) - aPrintArgs.Put( SfxBoolItem( SID_PRINT_COLLATE, bCollate )); - } - else if( pPrintOptions[nOption].Name.equalsAscii( "Pages" )) - { - ::rtl::OUString sPages; - if( (pPrintOptions[nOption].Value >>= sPages) && sPages.getLength() ) - aPrintArgs.Put( SfxStringItem( SID_PRINT_PAGES, sPages )); - } - else if( pPrintOptions[nOption].Name.equalsAscii( "Wait" )) - { - sal_Bool bWait = sal_False; - if( pPrintOptions[nOption].Value >>= bWait ) - aPrintArgs.Put( SfxBoolItem( SID_ASYNCHRON, !bWait )); - } - - } - pDis->Execute( SID_PRINTDOC, - SFX_CALLMODE_SYNCHRON|SFX_CALLMODE_RECORD, - aPrintArgs ); - } - break; - + case DBMGR_MERGE_MAILMERGE: // printing merge from 'old' merge dialog or from UNO-component case DBMGR_MERGE_MAILING: case DBMGR_MERGE_MAILFILES: case DBMGR_MERGE_SINGLE_FILE: @@ -853,323 +780,6 @@ SwNewDBMgr::~SwNewDBMgr() } delete pImpl; } -/*-------------------------------------------------------------------- - Beschreibung: Serienbrief drucken - --------------------------------------------------------------------*/ - - -BOOL SwNewDBMgr::MergePrint( SwView& rView, - SwPrtOptions& rOpt, SfxProgress& rProgress, BOOL bIsAPI ) -{ - SwWrtShell* pSh = &rView.GetWrtShell(); - //check if the doc is synchronized and contains at least one linked section - BOOL bSynchronizedDoc = pSh->IsLabelDoc() && pSh->GetSectionFmtCount() > 1; - //merge source is already open - rOpt.nMergeCnt = 0; - //#i56195# no field update while printing mail merge documents - rOpt.bUpdateFieldsInPrinting = sal_False; - if(pImpl->pMergeData) - { - if(pImpl->pMergeData->aSelection.getLength()) - rOpt.nMergeCnt = pImpl->pMergeData->aSelection.getLength(); - else if(pImpl->pMergeData->xResultSet.is()) - { - sal_Int32 nCount; - if( lcl_getCountFromResultSet( nCount, pImpl->pMergeData->xResultSet ) ) - rOpt.nMergeCnt = (ULONG)nCount; - } - } - - SwModuleOptions* pModOpt = SW_MOD()->GetModuleConfig(); - pModOpt->SetSinglePrintJob(rOpt.IsPrintSingleJobs()); - - SfxPrinter *pPrt = pSh->getIDocumentDeviceAccess()->getPrinter( false ); - Link aSfxSaveLnk = pPrt->GetEndPrintHdl(); - if( rOpt.IsPrintSingleJobs() ) - pPrt->SetEndPrintHdl( Link() ); - - BOOL bUserBreak = FALSE, - bRet = FALSE; - long nStartRow, nEndRow; - //calculate number of data sets to be printed - - Sequence<PropertyValue> aViewProperties(16); - PropertyValue* pViewProperties = aViewProperties.getArray(); - pViewProperties[0].Name = C2U("MailMergeCount"); - pViewProperties[0].Value <<= (sal_Int32)rOpt.nMergeCnt; - pViewProperties[1].Name = C2U("PrintGraphics"); - pViewProperties[1].Value <<= (sal_Bool)rOpt.IsPrintGraphic(); - pViewProperties[2].Name = C2U("PrintTables"); - pViewProperties[2].Value <<= (sal_Bool)rOpt.IsPrintTable(); - pViewProperties[3].Name = C2U("PrintDrawings"); - pViewProperties[3].Value <<= (sal_Bool)rOpt.IsPrintDraw(); - pViewProperties[4].Name = C2U("PrintLeftPages"); - pViewProperties[4].Value <<= (sal_Bool)rOpt.IsPrintLeftPage(); - pViewProperties[5].Name = C2U("PrintRightPages"); - pViewProperties[5].Value <<= (sal_Bool)rOpt.IsPrintRightPage(); - pViewProperties[6].Name = C2U("PrintControls"); - pViewProperties[6].Value <<= (sal_Bool)rOpt.IsPrintControl(); - pViewProperties[7].Name = C2U("PrintReversed"); - pViewProperties[7].Value <<= (sal_Bool)rOpt.IsPrintReverse(); - pViewProperties[8].Name = C2U("PrintPaperFromSetup"); - pViewProperties[8].Value <<= (sal_Bool)rOpt.IsPaperFromSetup(); - pViewProperties[9].Name = C2U("PrintFaxName"); - pViewProperties[9].Value <<= rOpt.GetFaxName(); - pViewProperties[10].Name = C2U("PrintAnnotationMode"); - pViewProperties[10].Value <<= (text::NotePrintMode) rOpt.GetPrintPostIts(); - pViewProperties[11].Name = C2U("PrintProspect"); - pViewProperties[11].Value <<= (sal_Bool)rOpt.IsPrintProspect(); - pViewProperties[12].Name = C2U("PrintPageBackground"); - pViewProperties[12].Value <<= (sal_Bool)rOpt.IsPrintPageBackground(); - pViewProperties[13].Name = C2U("PrintBlackFonts"); - pViewProperties[13].Value <<= (sal_Bool)rOpt.IsPrintBlackFont(); - pViewProperties[14].Name = C2U("IsSinglePrintJob"); - pViewProperties[14].Value <<= (sal_Bool)rOpt.IsPrintSingleJobs(); - pViewProperties[15].Name = C2U("PrintEmptyPages"); - pViewProperties[15].Value <<= (sal_Bool)rOpt.IsPrintEmptyPages(); - - rView.SetAdditionalPrintOptions(aViewProperties); - do { - nStartRow = pImpl->pMergeData ? pImpl->pMergeData->xResultSet->getRow() : 0; - { - SFX_APP()->NotifyEvent(SfxEventHint(SW_EVENT_FIELD_MERGE, SwDocShell::GetEventName(STR_SW_EVENT_FIELD_MERGE), pSh->GetView().GetViewFrame()->GetObjectShell())); - pSh->ViewShell::UpdateFlds(); - SFX_APP()->NotifyEvent(SfxEventHint(SW_EVENT_FIELD_MERGE_FINISHED, SwDocShell::GetEventName(STR_SW_EVENT_FIELD_MERGE_FINISHED), pSh->GetView().GetViewFrame()->GetObjectShell())); - ++rOpt.nMergeAct; - - // launch MailMergeEvent if required - const SwXMailMerge *pEvtSrc = GetMailMergeEvtSrc(); - if (pEvtSrc) - { - uno::Reference< XInterface > xRef( (XMailMergeBroadcaster *) pEvtSrc ); - text::MailMergeEvent aEvt( xRef, rView.GetDocShell()->GetModel() ); - pEvtSrc->LaunchMailMergeEvent( aEvt ); - } - - rView.SfxViewShell::Print( rProgress, bIsAPI ); // ggf Basic-Macro ausfuehren - if( rOpt.IsPrintSingleJobs() && bRet ) - { - //rOpt.bJobStartet = FALSE; - bRet = FALSE; - } - - bMergeLock = TRUE; - if(rOpt.IsPrintProspect()) - { - if( ! pPrt->IsJobActive() ) - { - pPrt->SetJobValue( String( RTL_CONSTASCII_USTRINGPARAM( "IsQuickJob" ) ), - String( RTL_CONSTASCII_USTRINGPARAM( "true" ) ) ); - pPrt->StartJob( rOpt.GetJobName() ); - } - if( pPrt->IsJobActive() ) - { - pSh->PrintProspect( rOpt, rProgress, rOpt.IsPrintProspect_RTL() ); - bRet = TRUE; - } - } - else if( pSh->Prt( rOpt, &rProgress ) ) - bRet = TRUE; - bMergeLock = FALSE; - - if( !pPrt->IsJobActive() ) - { - bUserBreak = TRUE; - bRet = FALSE; - break; - } - if( !rOpt.IsPrintSingleJobs() ) - { - String& rJNm = (String&)rOpt.GetJobName(); - rJNm.Erase(); - } - } - nEndRow = pImpl->pMergeData ? pImpl->pMergeData->xResultSet->getRow() : 0; - } while( bSynchronizedDoc && (nStartRow != nEndRow)? ExistsNextRecord() : ToNextMergeRecord()); - - if( rOpt.IsPrintSingleJobs() ) - { - SfxPrinter* pTmpPrinter = pSh->getIDocumentDeviceAccess()->getPrinter( true ); - pTmpPrinter->SetEndPrintHdl( aSfxSaveLnk ); - if ( !bUserBreak && !pTmpPrinter->IsJobActive() ) //Schon zu spaet? - aSfxSaveLnk.Call( pTmpPrinter ); - } - - rOpt.nMergeCnt = 0; - rOpt.nMergeAct = 0; - - nMergeType = DBMGR_INSERT; - - SwDocShell* pDocSh = rView.GetDocShell(); - SfxViewFrame *pTmpFrm = SfxViewFrame::GetFirst(pDocSh); - - while (pTmpFrm) // Alle Views Invalidieren - { - SwView *pVw = PTR_CAST(SwView, pTmpFrm->GetViewShell()); - if (pVw) - pVw->GetEditWin().Invalidate(); - pTmpFrm = pTmpFrm->GetNext(*pTmpFrm, pDocSh); - } - - return bRet; -} -/*-- 21.06.2004 09:08:16--------------------------------------------------- - - -----------------------------------------------------------------------*/ -BOOL SwNewDBMgr::MergePrintDocuments( SwView& rView, - SwPrtOptions& rOpt, SfxProgress& rProgress, BOOL bIsAPI ) -{ - SwWrtShell* pSh = &rView.GetWrtShell(); - //check if the doc is synchronized and contains at least one linked section - //merge source is already open - rOpt.nMergeCnt = 0; - rOpt.SetPrintSingleJobs( sal_True ); - - SfxPrinter *pPrt = pSh->getIDocumentDeviceAccess()->getPrinter( false ); - Link aSfxSaveLnk = pPrt->GetEndPrintHdl(); - if( rOpt.IsPrintSingleJobs() ) - pPrt->SetEndPrintHdl( Link() ); - - BOOL bUserBreak = FALSE, - bRet = FALSE; - //calculate number of data sets to be printed - - Sequence<PropertyValue> aViewProperties(16); - PropertyValue* pViewProperties = aViewProperties.getArray(); - pViewProperties[0].Name = C2U("MailMergeCount"); - pViewProperties[0].Value <<= (sal_Int32)rOpt.nMergeCnt; - pViewProperties[1].Name = C2U("PrintGraphics"); - pViewProperties[1].Value <<= (sal_Bool)rOpt.IsPrintGraphic(); - pViewProperties[2].Name = C2U("PrintTables"); - pViewProperties[2].Value <<= (sal_Bool)rOpt.IsPrintTable(); - pViewProperties[3].Name = C2U("PrintDrawings"); - pViewProperties[3].Value <<= (sal_Bool)rOpt.IsPrintDraw(); - pViewProperties[4].Name = C2U("PrintLeftPages"); - pViewProperties[4].Value <<= (sal_Bool)rOpt.IsPrintLeftPage(); - pViewProperties[5].Name = C2U("PrintRightPages"); - pViewProperties[5].Value <<= (sal_Bool)rOpt.IsPrintRightPage(); - pViewProperties[6].Name = C2U("PrintControls"); - pViewProperties[6].Value <<= (sal_Bool)rOpt.IsPrintControl(); - pViewProperties[7].Name = C2U("PrintReversed"); - pViewProperties[7].Value <<= (sal_Bool)rOpt.IsPrintReverse(); - pViewProperties[8].Name = C2U("PrintPaperFromSetup"); - pViewProperties[8].Value <<= (sal_Bool)rOpt.IsPaperFromSetup(); - pViewProperties[9].Name = C2U("PrintFaxName"); - pViewProperties[9].Value <<= rOpt.GetFaxName(); - pViewProperties[10].Name = C2U("PrintAnnotationMode"); - pViewProperties[10].Value <<= (text::NotePrintMode) rOpt.GetPrintPostIts(); - pViewProperties[11].Name = C2U("PrintProspect"); - pViewProperties[11].Value <<= (sal_Bool)rOpt.IsPrintProspect(); - pViewProperties[12].Name = C2U("PrintPageBackground"); - pViewProperties[12].Value <<= (sal_Bool)rOpt.IsPrintPageBackground(); - pViewProperties[13].Name = C2U("PrintBlackFonts"); - pViewProperties[13].Value <<= (sal_Bool)rOpt.IsPrintBlackFont(); - pViewProperties[14].Name = C2U("IsSinglePrintJob"); - pViewProperties[14].Value <<= (sal_Bool)rOpt.IsPrintSingleJobs(); - pViewProperties[15].Name = C2U("PrintEmptyPages"); - pViewProperties[15].Value <<= (sal_Bool)rOpt.IsPrintEmptyPages(); - - rView.SetAdditionalPrintOptions(aViewProperties); - - SwMailMergeConfigItem* pConfigItem = rView.GetMailMergeConfigItem(); - DBG_ASSERT(pConfigItem, "mail merge config item is missing"); - if(!pConfigItem) - return sal_False; - - USHORT nDocStart = pConfigItem->GetPrintRangeStart(); - USHORT nDocEnd = pConfigItem->GetPrintRangeEnd(); - DBG_ASSERT(nDocStart < nDocEnd && nDocEnd <= pConfigItem->GetMergedDocumentCount(), - "merge print settings are not correct"); - - for( sal_uInt32 nPrintDocument = nDocStart; nPrintDocument < nDocEnd; ++nPrintDocument) - { - SwDocMergeInfo& rDocInfo = pConfigItem->GetDocumentMergeInfo(nPrintDocument); - rOpt.aMulti.SelectAll(FALSE); - rOpt.aMulti.Select(Range( rDocInfo.nStartPageInTarget, rDocInfo.nEndPageInTarget ), TRUE ); - - ++rOpt.nMergeAct; - - // launch MailMergeEvent if required - const SwXMailMerge *pEvtSrc = GetMailMergeEvtSrc(); - if (pEvtSrc) - { - uno::Reference< XInterface > xRef( (XMailMergeBroadcaster *) pEvtSrc ); - text::MailMergeEvent aEvt( xRef, rView.GetDocShell()->GetModel() ); - pEvtSrc->LaunchMailMergeEvent( aEvt ); - } - - String aTmp; - aTmp += String::CreateFromInt32( rDocInfo.nStartPageInTarget ); - aTmp += '-'; - aTmp += String::CreateFromInt32( rDocInfo.nEndPageInTarget ); - - Sequence<PropertyValue> aAddViewProperties(1); - PropertyValue* pAddViewProperties = aAddViewProperties.getArray(); - pAddViewProperties[0].Name = C2U("Pages"); - pAddViewProperties[0].Value <<= ::rtl::OUString( aTmp ); - rView.SetAdditionalPrintOptions(aAddViewProperties); - - rView.SfxViewShell::Print( rProgress, bIsAPI ); // ggf Basic-Macro ausfuehren - if( rOpt.IsPrintSingleJobs() && bRet ) - { - //rOpt.bJobStartet = FALSE; - bRet = FALSE; - } - - bMergeLock = TRUE; - if(rOpt.IsPrintProspect()) - { - if( pPrt->IsJobActive() || pPrt->StartJob( rOpt.GetJobName() )) - { - pSh->PrintProspect( rOpt, rProgress, rOpt.IsPrintProspect_RTL() ); - bRet = TRUE; - } - } - else if( pSh->Prt( rOpt, &rProgress ) ) - bRet = TRUE; - bMergeLock = FALSE; - - if( !pPrt->IsJobActive() ) - { - bUserBreak = TRUE; - bRet = FALSE; - break; - } - if( !rOpt.IsPrintSingleJobs() ) - { - String& rJNm = (String&)rOpt.GetJobName(); - rJNm.Erase(); - } - } - - if( rOpt.IsPrintSingleJobs() ) - { - SfxPrinter* pTmpPrinter = pSh->getIDocumentDeviceAccess()->getPrinter( true ); - pTmpPrinter->SetEndPrintHdl( aSfxSaveLnk ); - if ( !bUserBreak && !pTmpPrinter->IsJobActive() ) //Schon zu spaet? - aSfxSaveLnk.Call( pTmpPrinter ); - } - - rOpt.nMergeCnt = 0; - rOpt.nMergeAct = 0; - - nMergeType = DBMGR_INSERT; - - SwDocShell* pDocSh = rView.GetDocShell(); - SfxViewFrame *pTmpFrm = SfxViewFrame::GetFirst(pDocSh); - - while (pTmpFrm) // Alle Views Invalidieren - { - SwView *pVw = PTR_CAST(SwView, pTmpFrm->GetViewShell()); - if (pVw) - pVw->GetEditWin().Invalidate(); - pTmpFrm = pTmpFrm->GetNext(*pTmpFrm, pDocSh); - } - - return bRet; -} - - /*-------------------------------------------------------------------- Beschreibung: Serienbriefe als einzelne Dokumente speichern @@ -1317,6 +927,7 @@ BOOL SwNewDBMgr::MergeMailFiles(SwWrtShell* pSourceShell, // in case of creating a single resulting file this has to be created here SwWrtShell* pTargetShell = 0; SfxObjectShellRef xTargetDocShell; + SwView* pTargetView = 0; std::auto_ptr< utl::TempFile > aTempFile; String sModifiedStartingPageDesc; String sStartingPageDesc; @@ -1329,7 +940,7 @@ BOOL SwNewDBMgr::MergeMailFiles(SwWrtShell* pSourceShell, xTargetDocShell->DoInitNew( 0 ); SfxViewFrame* pTargetFrame = SfxViewFrame::CreateViewFrame( *xTargetDocShell, 0, TRUE ); - SwView* pTargetView = static_cast<SwView*>( pTargetFrame->GetViewShell() ); + pTargetView = static_cast<SwView*>( pTargetFrame->GetViewShell() ); //initiate SelectShell() to create sub shells pTargetView->AttrChangedNotify( &pTargetView->GetWrtShell() ); @@ -1650,27 +1261,83 @@ BOOL SwNewDBMgr::MergeMailFiles(SwWrtShell* pSourceShell, // save the single output document if(rMergeDescriptor.bCreateSingleFile || bAsSingleFile) { - DBG_ASSERT( aTempFile.get(), "Temporary file not available" ); - INetURLObject aTempFileURL(bAsSingleFile ? sSubject : aTempFile->GetURL()); - SfxMedium* pDstMed = new SfxMedium( - aTempFileURL.GetMainURL( INetURLObject::NO_DECODE ), - STREAM_STD_READWRITE, TRUE ); - pDstMed->SetFilter( pStoreToFilter ); - if(pDstMed->GetItemSet()) + if( rMergeDescriptor.nMergeType != DBMGR_MERGE_MAILMERGE ) { - if(pStoreToFilterOptions ) - pDstMed->GetItemSet()->Put(SfxStringItem(SID_FILE_FILTEROPTIONS, *pStoreToFilterOptions)); - if(rMergeDescriptor.aSaveToFilterData.getLength()) - pDstMed->GetItemSet()->Put(SfxUsrAnyItem(SID_FILTER_DATA, makeAny(rMergeDescriptor.aSaveToFilterData))); - } + DBG_ASSERT( aTempFile.get(), "Temporary file not available" ); + INetURLObject aTempFileURL(bAsSingleFile ? sSubject : aTempFile->GetURL()); + SfxMedium* pDstMed = new SfxMedium( + aTempFileURL.GetMainURL( INetURLObject::NO_DECODE ), + STREAM_STD_READWRITE, TRUE ); + pDstMed->SetFilter( pStoreToFilter ); + if(pDstMed->GetItemSet()) + { + if(pStoreToFilterOptions ) + pDstMed->GetItemSet()->Put(SfxStringItem(SID_FILE_FILTEROPTIONS, *pStoreToFilterOptions)); + if(rMergeDescriptor.aSaveToFilterData.getLength()) + pDstMed->GetItemSet()->Put(SfxUsrAnyItem(SID_FILTER_DATA, makeAny(rMergeDescriptor.aSaveToFilterData))); + } - xTargetDocShell->DoSaveAs(*pDstMed); - xTargetDocShell->DoSaveCompleted(pDstMed); - if( xTargetDocShell->GetError() ) + xTargetDocShell->DoSaveAs(*pDstMed); + xTargetDocShell->DoSaveCompleted(pDstMed); + if( xTargetDocShell->GetError() ) + { + // error message ?? + ErrorHandler::HandleError( xTargetDocShell->GetError() ); + bLoop = FALSE; + } + } + else if( pTargetView ) // must be available! { - // error message ?? - ErrorHandler::HandleError( xTargetDocShell->GetError() ); - bLoop = FALSE; + //print the target document + #if OSL_DEBUG_LEVEL > 1 + sal_Bool _bVal; + sal_Int16 _nVal; + rtl::OUString _sVal; + const beans::PropertyValue* pDbgPrintOptions = rMergeDescriptor.aPrintOptions.getConstArray(); + for( sal_Int32 nOption = 0; nOption < rMergeDescriptor.aPrintOptions.getLength(); ++nOption) + { + rtl::OUString aName( pDbgPrintOptions[nOption].Name ); + uno::Any aVal( pDbgPrintOptions[nOption].Value ); + aVal >>= _bVal; + aVal >>= _nVal; + aVal >>= _sVal; + } + #endif + // printing should be done synchronously otherwise the document + // might already become invalid during the process + uno::Sequence< beans::PropertyValue > aOptions( rMergeDescriptor.aPrintOptions ); + const sal_Int32 nOpts = aOptions.getLength(); + aOptions.realloc( nOpts + 1 ); + aOptions[ nOpts ].Name = rtl::OUString::createFromAscii( "Wait" ); + aOptions[ nOpts ].Value <<= sal_True ; +// aPrintArgs.Put(SfxBoolItem(FN_QRY_MERGE, TRUE) ); +// // #i52629# aynchronous printing should only be done in silent mode - otherwise +// // the printer dialog does not come up +// aPrintArgs.Put( SfxBoolItem( SID_ASYNCHRON, rMergeDescriptor.bPrintAsync )); + // move print options + const beans::PropertyValue* pPrintOptions = rMergeDescriptor.aPrintOptions.getConstArray(); + for( sal_Int32 nOption = 0; nOption < rMergeDescriptor.aPrintOptions.getLength(); ++nOption) + { + if( pPrintOptions[nOption].Name.equalsAscii( "CopyCount" ) + ||( pPrintOptions[nOption].Name.equalsAscii( "FileName" )) + ||( pPrintOptions[nOption].Name.equalsAscii( "Collate" )) + ||( pPrintOptions[nOption].Name.equalsAscii( "Pages" )) + ||( pPrintOptions[nOption].Name.equalsAscii( "Wait" ))) + { + aOptions.realloc( nOpts + 1 ); + aOptions[ nOpts ].Name = pPrintOptions[nOption].Name; + aOptions[ nOpts ].Value = pPrintOptions[nOption].Value ; + } + } + +// const SwModuleOptions * pModOpt = SW_MOD()->GetModuleConfig(); +// if (pModOpt->IsSinglePrintJob()) +// { +// } +// else +// { + pTargetView->ExecPrint( aOptions, IsMergeSilent(), rMergeDescriptor.bPrintAsync ); +// } } xTargetDocShell->DoClose(); } @@ -2902,6 +2569,7 @@ void SwNewDBMgr::ExecuteFormLetter( SwWrtShell& rSh, SwMergeDescriptor aMergeDesc( pImpl->pMergeDialog->GetMergeType(), pView->GetWrtShell(), aDescriptor ); aMergeDesc.sSaveToFilter = pImpl->pMergeDialog->GetSaveFilter(); + aMergeDesc.bCreateSingleFile= true; MergeNew(aMergeDesc); pWorkDoc->SetNewDBMgr( pWorkDBMgr ); @@ -3255,8 +2923,8 @@ sal_Int32 SwNewDBMgr::MergeDocuments( SwMailMergeConfigItem& rMMConfig, pWorkDoc->EmbedAllLinks(); if(UNDO_UI_DELETE_INVISIBLECNTNT == rWorkShell.GetUndoIds()) rWorkShell.Undo(); - // #i69485# lock fields to prevent access to the result set while calculating layout
- rWorkShell.LockExpFlds();
+ // #i69485# lock fields to prevent access to the result set while calculating layout + rWorkShell.LockExpFlds(); // create a layout rWorkShell.CalcLayout(); rWorkShell.UnlockExpFlds(); diff --git a/sw/source/ui/dbui/mmoutputpage.cxx b/sw/source/ui/dbui/mmoutputpage.cxx index 1106a1ac62fe..331589570246 100644 --- a/sw/source/ui/dbui/mmoutputpage.cxx +++ b/sw/source/ui/dbui/mmoutputpage.cxx @@ -991,6 +991,13 @@ IMPL_LINK(SwMailMergeOutputPage, PrintHdl_Impl, PushButton*, EMPTYARG) nEnd = rConfigItem.GetMergedDocumentCount(); } rConfigItem.SetPrintRange( (USHORT)nBegin, (USHORT)nEnd ); + SwDocMergeInfo& rStartInfo = rConfigItem.GetDocumentMergeInfo(nBegin); + SwDocMergeInfo& rEndInfo = rConfigItem.GetDocumentMergeInfo(nEnd - 1); + + rtl::OUString sPages(rtl::OUString::valueOf( rStartInfo.nStartPageInTarget )); + sPages += rtl::OUString::createFromAscii( " - "); + sPages += rtl::OUString::valueOf( rEndInfo.nEndPageInTarget ); + SwWrtShell& rSh = pTargetView->GetWrtShell(); pTargetView->SetMailMergeConfigItem(&rConfigItem, 0, sal_False); if(m_pTempPrinter) @@ -1002,11 +1009,17 @@ IMPL_LINK(SwMailMergeOutputPage, PrintHdl_Impl, PushButton*, EMPTYARG) SfxObjectShell* pObjSh = pTargetView->GetViewFrame()->GetObjectShell(); SFX_APP()->NotifyEvent(SfxEventHint(SW_EVENT_MAIL_MERGE, SwDocShell::GetEventName(STR_SW_EVENT_MAIL_MERGE), pObjSh)); rSh.GetNewDBMgr()->SetMergeType( DBMGR_MERGE_DOCUMENTS ); - SfxDispatcher *pDis = pTargetView->GetViewFrame()->GetDispatcher(); + //SfxDispatcher *pDis = pTargetView->GetViewFrame()->GetDispatcher(); SfxBoolItem aMergeSilent(SID_SILENT, sal_False); m_pWizard->enableButtons(WZB_CANCEL, sal_False); - pDis->Execute(SID_PRINTDOCDIRECT, - SFX_CALLMODE_SYNCHRON|SFX_CALLMODE_RECORD, &aMergeSilent, 0L); + + uno::Sequence < beans::PropertyValue > aProps( 2 ); + aProps[0]. Name = rtl::OUString::createFromAscii("MonitorVisible"); + aProps[0].Value <<= sal_True; + aProps[1]. Name = rtl::OUString::createFromAscii("Pages"); + aProps[1]. Value <<= sPages; + + pTargetView->ExecPrint( aProps, false, true ); SFX_APP()->NotifyEvent(SfxEventHint(SW_EVENT_MAIL_MERGE_END, SwDocShell::GetEventName(STR_SW_EVENT_MAIL_MERGE_END), pObjSh)); pTargetView->SetMailMergeConfigItem(0, 0, sal_False); diff --git a/sw/source/ui/envelp/mailmrge.cxx b/sw/source/ui/envelp/mailmrge.cxx index 537a39dad8cf..4b9fb14d0500 100644 --- a/sw/source/ui/envelp/mailmrge.cxx +++ b/sw/source/ui/envelp/mailmrge.cxx @@ -227,6 +227,7 @@ SwMailMergeDlg::SwMailMergeDlg(Window* pParent, SwWrtShell& rShell, m_aDialogSize( GetSizePixel() ) { FreeResource(); + aSingleJobsCB.Show(sal_False); // not supported in since cws printerpullpages anymore //task #97066# mailing of form letters is currently not supported aMailingRB.Show(FALSE); aSubjectFT.Show(FALSE); @@ -347,7 +348,7 @@ SwMailMergeDlg::SwMailMergeDlg(Window* pParent, SwWrtShell& rShell, pModOpt = SW_MOD()->GetModuleConfig(); - aSingleJobsCB.Check(pModOpt->IsSinglePrintJob()); + //aSingleJobsCB.Check(pModOpt->IsSinglePrintJob());// not supported in since cws printerpullpages anymore sal_Int16 nMailingMode(pModOpt->GetMailingFormats()); aFormatSwCB.Check((nMailingMode & TXTFORMAT_OFFICE) != 0); @@ -941,4 +942,3 @@ SwMailMergeFieldConnectionsDlg::~SwMailMergeFieldConnectionsDlg() { } - diff --git a/sw/source/ui/inc/cfgitems.hxx b/sw/source/ui/inc/cfgitems.hxx index 3adfa962b9d7..913191ea7c3b 100644 --- a/sw/source/ui/inc/cfgitems.hxx +++ b/sw/source/ui/inc/cfgitems.hxx @@ -155,15 +155,15 @@ public: BOOL IsPrintProspect() const { return bPrintProspect; } - BOOL IsPrintProspect_RTL() const { return bPrintProspect_RTL; } + BOOL IsPrintProspectRTL() const { return bPrintProspectRTL; } void SetPrintProspect(BOOL bFlag ){ bPrintProspect = bFlag; } - void SetPrintProspect_RTL(BOOL bFlag ){ bPrintProspect_RTL = bFlag; } + void SetPrintProspectRTL(BOOL bFlag ){ bPrintProspectRTL = bFlag; } BOOL IsPrintGraphic () const { return bPrintGraphic; } BOOL IsPrintTable () const { return bPrintTable; } BOOL IsPrintDraw () const { return bPrintDraw; } BOOL IsPrintControl () const { return bPrintControl; } - BOOL IsPrintLeftPage () const { return bPrintLeftPage; } - BOOL IsPrintRightPage() const { return bPrintRightPage; } + BOOL IsPrintLeftPage () const { return bPrintLeftPages; } + BOOL IsPrintRightPage() const { return bPrintRightPages; } BOOL IsPrintReverse () const { return bPrintReverse; } BOOL IsPaperFromSetup() const { return bPaperFromSetup; } BOOL IsPrintEmptyPages() const { return bPrintEmptyPages; } diff --git a/sw/source/ui/inc/optpage.hxx b/sw/source/ui/inc/optpage.hxx index 959c4dc4fdd6..52611a703447 100644 --- a/sw/source/ui/inc/optpage.hxx +++ b/sw/source/ui/inc/optpage.hxx @@ -119,8 +119,8 @@ class SwAddPrinterTabPage : public SfxTabPage { FixedLine aFL1; CheckBox aGrfCB; - CheckBox aTabCB; - CheckBox aDrawCB; +// CheckBox aTabCB; +// CheckBox aDrawCB; CheckBox aCtrlFldCB; CheckBox aBackgroundCB; CheckBox aBlackFontCB; @@ -132,7 +132,7 @@ class SwAddPrinterTabPage : public SfxTabPage FixedLine aFL2; CheckBox aLeftPageCB; CheckBox aRightPageCB; - CheckBox aReverseCB; +// CheckBox aReverseCB; CheckBox aProspectCB; CheckBox aProspectCB_RTL; @@ -145,7 +145,7 @@ class SwAddPrinterTabPage : public SfxTabPage FixedLine aFL3; FixedLine aFL4; CheckBox aPrintEmptyPagesCB; - CheckBox aSingleJobsCB; +// CheckBox aSingleJobsCB; CheckBox aPaperFromSetupCB; FixedText aFaxFT; ListBox aFaxLB; diff --git a/sw/source/ui/inc/pview.hxx b/sw/source/ui/inc/pview.hxx index bcb96a26cb3d..9fe9e61e2d6f 100644 --- a/sw/source/ui/inc/pview.hxx +++ b/sw/source/ui/inc/pview.hxx @@ -222,8 +222,6 @@ class SW_DLLPUBLIC SwPagePreView: public SfxViewShell SW_DLLPRIVATE int ChgPage( int eMvMode, int bUpdateScrollbar = TRUE ); - SW_DLLPRIVATE virtual USHORT Print( SfxProgress &rProgress, BOOL bIsAPI, - PrintDialog *pPrintDialog = 0 ); SW_DLLPRIVATE virtual SfxPrinter* GetPrinter( BOOL bCreate = FALSE ); SW_DLLPRIVATE virtual USHORT SetPrinter( SfxPrinter *pNewPrinter, USHORT nDiffFlags = SFX_PRINTER_ALL, bool bIsAPI=false ); SW_DLLPRIVATE virtual SfxTabPage* CreatePrintOptionsPage( Window *pParent, diff --git a/sw/source/ui/inc/srcview.hxx b/sw/source/ui/inc/srcview.hxx index 996aab82b446..687015759243 100644..100755 --- a/sw/source/ui/inc/srcview.hxx +++ b/sw/source/ui/inc/srcview.hxx @@ -28,10 +28,12 @@ * ************************************************************************/ #ifndef _SRCVIEW_HXX -#define _SRCIEW_HXX +#define _SRCVIEW_HXX #include <sfx2/viewfac.hxx> #include <sfx2/viewsh.hxx> +#include <vcl/outdev.hxx> + #include "srcedtw.hxx" #include "shellid.hxx" @@ -92,11 +94,11 @@ public: void Load(SwDocShell* pDocShell); - virtual USHORT SetPrinter( SfxPrinter* pNew, - USHORT nDiff = SFX_PRINTER_ALL, bool bIsAPI=false ); - virtual ErrCode DoPrint( SfxPrinter *pPrinter, PrintDialog *pPrintDialog, BOOL bSilent, BOOL bIsAPI ); + virtual USHORT SetPrinter( SfxPrinter* pNew, USHORT nDiff = SFX_PRINTER_ALL, bool bIsAPI=false ); virtual SfxPrinter* GetPrinter( BOOL bCreate = FALSE ); + sal_Int32 PrintSource( OutputDevice *pOutDev, sal_Int32 nPage, bool bCalcNumPagesOnly ); + void SourceSaved() {bSourceSaved = TRUE;} BOOL HasSourceSaved() const {return bSourceSaved;} diff --git a/sw/source/ui/inc/unotxvw.hxx b/sw/source/ui/inc/unotxvw.hxx index 43dc420915ef..2793c625dfe3 100644 --- a/sw/source/ui/inc/unotxvw.hxx +++ b/sw/source/ui/inc/unotxvw.hxx @@ -109,7 +109,7 @@ public: virtual void SAL_CALL removeSelectionChangeListener(const ::com::sun::star::uno::Reference< ::com::sun::star::view::XSelectionChangeListener > & xListener) throw( ::com::sun::star::uno::RuntimeException ); // XFormLayerAccess - virtual ::com::sun::star::uno::Reference< ::com::sun::star::form::XFormController > SAL_CALL getFormController( const ::com::sun::star::uno::Reference< ::com::sun::star::form::XForm >& Form ) throw (::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::form::runtime::XFormController > SAL_CALL getFormController( const ::com::sun::star::uno::Reference< ::com::sun::star::form::XForm >& Form ) throw (::com::sun::star::uno::RuntimeException); virtual ::sal_Bool SAL_CALL isFormDesignMode( ) throw (::com::sun::star::uno::RuntimeException); virtual void SAL_CALL setFormDesignMode( ::sal_Bool DesignMode ) throw (::com::sun::star::uno::RuntimeException); diff --git a/sw/source/ui/inc/view.hxx b/sw/source/ui/inc/view.hxx index 7ddfc2775299..b181c85fa5ae 100644 --- a/sw/source/ui/inc/view.hxx +++ b/sw/source/ui/inc/view.hxx @@ -88,7 +88,7 @@ class SwPrtOptions; class SwTransferable; class SwMailMergeConfigItem; class SwTxtNode; // #i23726# -struct SwPrintData; +class SwPrintData; class SwFormatClipboard; struct SwConversionArgs; class Graphic; @@ -424,8 +424,6 @@ public: virtual USHORT SetPrinter( SfxPrinter* pNew, USHORT nDiff = SFX_PRINTER_ALL, bool bIsAPI=false); - virtual ErrCode DoPrint( SfxPrinter *pPrinter, PrintDialog *pPrintDialog, - BOOL bSilent, BOOL bIsAPI ); ShellModes GetShellMode(); com::sun::star::view::XSelectionSupplier* GetUNOObject(); @@ -632,10 +630,6 @@ public: //apply Accessiblity options void ApplyAccessiblityOptions(SvtAccessibilityOptions& rAccessibilityOptions); - // get print options (SwPrtOptions) - static void MakeOptions( PrintDialog* pDlg, SwPrtOptions& rOpts, - BOOL* pPrtProspect, BOOL* pPrtProspect_RTL, BOOL bWeb, SfxPrinter* pPrt, SwPrintData* pData ); - SwView(SfxViewFrame* pFrame, SfxViewShell*); ~SwView(); @@ -692,3 +686,4 @@ SfxTabPage* CreatePrintOptionsPage( Window *pParent, BOOL bPreview); #endif + diff --git a/sw/source/ui/misc/glshell.cxx b/sw/source/ui/misc/glshell.cxx index 12befeaeb194..03e3bf12f1f0 100644 --- a/sw/source/ui/misc/glshell.cxx +++ b/sw/source/ui/misc/glshell.cxx @@ -154,10 +154,10 @@ BOOL lcl_Save( SwWrtShell& rSh, const String& rGroupName, --------------------------------------------------------------------*/ -SwGlosDocShell::SwGlosDocShell( sal_Bool bNewShow) - : - SwDocShell( bShow ? SFX_CREATE_MODE_STANDARD : SFX_CREATE_MODE_INTERNAL ) - ,bShow ( bNewShow ) +SwGlosDocShell::SwGlosDocShell(sal_Bool bNewShow) + : SwDocShell( (bNewShow) + ? SFX_CREATE_MODE_STANDARD : SFX_CREATE_MODE_INTERNAL ) + , bShow ( bNewShow ) { SetHelpId(SW_GLOSDOCSHELL); } diff --git a/sw/source/ui/uiview/makefile.mk b/sw/source/ui/uiview/makefile.mk index 2aa5e12e2631..28ab2271a823 100644 --- a/sw/source/ui/uiview/makefile.mk +++ b/sw/source/ui/uiview/makefile.mk @@ -54,6 +54,7 @@ EXCEPTIONSFILES= \ $(SLO)$/uivwimp.obj \ $(SLO)$/view.obj \ $(SLO)$/view2.obj \ + $(SLO)$/viewprt.obj \ $(SLO)$/viewling.obj \ $(SLO)$/viewmdi.obj \ diff --git a/sw/source/ui/uiview/pview.cxx b/sw/source/ui/uiview/pview.cxx index d7cc7936958b..801a5fa68f6a 100644 --- a/sw/source/ui/uiview/pview.cxx +++ b/sw/source/ui/uiview/pview.cxx @@ -45,6 +45,7 @@ #include <svl/stritem.hxx> #include <svl/eitem.hxx> #include <sfx2/printer.hxx> +#include <sfx2/progress.hxx> #include <sfx2/app.hxx> #include <sfx2/topfrm.hxx> #include <sfx2/bindings.hxx> @@ -1520,12 +1521,6 @@ MOVEPAGE: rReq.SetSlot( FN_PRINT_PAGEPREVIEW ); return; } - case FN_PREVIEW_PRINT_OPTIONS : - { - SwPreviewPrintOptionsDialog aDlg(aViewWin, *this); - aDlg.Execute(); - } - break; case SID_PRINTDOCDIRECT: case SID_PRINTDOC: ::SetAppPrintOptions( aViewWin.GetViewShell(), FALSE ); @@ -1788,7 +1783,7 @@ void SwPagePreView::Init(const SwViewOption * pPrefs) // OD 09.01.2003 #i6467# - adjust view shell option to the same as for print SwPrtOptions aPrintOptions( GetViewFrame()->GetObjectShell()->GetTitle(0) ); - SwView::MakeOptions( 0, aPrintOptions, 0, 0, false, 0, 0 ); + aPrintOptions.MakeOptions( false ); GetViewShell()->AdjustOptionsForPagePreview( aPrintOptions ); IDocumentSettingAccess* pIDSA = pESh->getIDocumentSettingAccess(); @@ -2416,72 +2411,6 @@ void SwPagePreView::ScrollDocSzChg() // alles zum Thema Drucken -USHORT SwPagePreView::Print( SfxProgress &rProgress, BOOL bIsAPI, PrintDialog *pDlg ) -{ - ViewShell* pSh = aViewWin.GetViewShell(); - SfxPrinter* pPrinter = GetPrinter(); - if( !pPrinter || !pPrinter->InitJob( &aViewWin, - pSh->HasDrawView() && !bIsAPI && pSh->GetDrawView()->GetModel()->HasTransparentObjects() )) - return ERRCODE_IO_ABORT; - - SwWait aWait( *GetDocShell(), TRUE ); - - USHORT nRowCol = ( aViewWin.GetRow() << 8 ) + - aViewWin.GetCol(); // Zeilen / DoppelSeiten - - { - // die Felder aktualisieren - // ACHTUNG: hochcasten auf die EditShell, um die SS zu nutzen. - // In den Methoden wird auf die akt. Shell abgefragt! - SwEditShell* pESh = (SwEditShell*)pSh; - SwDocStat aDocStat; - BOOL bIsModified = pESh->IsModified(); - - pESh->StartAllAction(); - pESh->UpdateDocStat( aDocStat ); - pSh->UpdateFlds(); - pESh->EndAllAction(); - - if( !bIsModified ) - pESh->ResetModified(); - } - - // Druckauftrag starten - SfxObjectShell *pObjShell = GetViewFrame()->GetObjectShell(); - SwPrtOptions aOpts( pObjShell->GetTitle(0) ); - - BOOL bPrtPros; - BOOL bPrtPros_RTL; - SwView::MakeOptions( pDlg, aOpts, &bPrtPros, &bPrtPros_RTL, FALSE, GetPrinter(), GetDocShell()->GetDoc()->getPrintData() ); - - if( bNormalPrint ) - { - if( bPrtPros ) - pSh->PrintProspect( aOpts, rProgress, bPrtPros_RTL ); - else - pSh->Prt( aOpts, &rProgress ); - } - else - { - const SwPagePreViewPrtData* pPPVPD = pSh->GetDoc()->GetPreViewPrtData(); - if( pPPVPD && pPPVPD->GetCol() && pPPVPD->GetRow() ) - { - // Zeilen / Seiten - nRowCol = ( pPPVPD->GetRow() << 8 ) + pPPVPD->GetCol(); - } - else - pPPVPD = 0; - pSh->PrintPreViewPage( aOpts, nRowCol, rProgress, pPPVPD ); - } - - return 0; // OK -} - -/*-------------------------------------------------------------------- - Beschreibung: - --------------------------------------------------------------------*/ - - SfxPrinter* SwPagePreView::GetPrinter( BOOL bCreate ) { return aViewWin.GetViewShell()->getIDocumentDeviceAccess()->getPrinter( bCreate ); diff --git a/sw/source/ui/uiview/pview.src b/sw/source/ui/uiview/pview.src index a213c8df80e7..ff7f834db7a6 100644 --- a/sw/source/ui/uiview/pview.src +++ b/sw/source/ui/uiview/pview.src @@ -453,11 +453,6 @@ ToolBox RID_PVIEW_TOOLBOX Identifier = FN_PRINT_PAGEPREVIEW ; HelpID = FN_PRINT_PAGEPREVIEW ; }; - ToolBoxItem - { - Identifier = FN_PREVIEW_PRINT_OPTIONS ; - HelpID = FN_PREVIEW_PRINT_OPTIONS ; - }; ToolBoxItem { Type = TOOLBOXITEM_SEPARATOR ; }; ToolBoxItem { diff --git a/sw/source/ui/uiview/srcview.cxx b/sw/source/ui/uiview/srcview.cxx index 26a1253c5486..050f5c9d3057 100644 --- a/sw/source/ui/uiview/srcview.cxx +++ b/sw/source/ui/uiview/srcview.cxx @@ -152,23 +152,23 @@ TYPEINIT1(SwSrcView, SfxViewShell) --------------------------------------------------*/ -void lcl_PrintHeader( Printer* pPrinter, USHORT nPages, USHORT nCurPage, const String& rTitle ) +void lcl_PrintHeader( OutputDevice &rOutDev, USHORT nPages, USHORT nCurPage, const String& rTitle ) { short nLeftMargin = LMARGPRN; - Size aSz = pPrinter->GetOutputSize(); + Size aSz = rOutDev.GetOutputSize(); short nBorder = BORDERPRN; - Color aOldFillColor( pPrinter->GetFillColor() ); - Font aOldFont( pPrinter->GetFont() ); + Color aOldFillColor( rOutDev.GetFillColor() ); + Font aOldFont( rOutDev.GetFont() ); - pPrinter->SetFillColor( Color(COL_TRANSPARENT) ); + rOutDev.SetFillColor( Color(COL_TRANSPARENT) ); Font aFont( aOldFont ); aFont.SetWeight( WEIGHT_BOLD ); aFont.SetAlign( ALIGN_BOTTOM ); - pPrinter->SetFont( aFont ); + rOutDev.SetFont( aFont ); - long nFontHeight = pPrinter->GetTextHeight(); + long nFontHeight = rOutDev.GetTextHeight(); // 1.Border => Strich, 2+3 Border = Freiraum. long nYTop = TMARGPRN-3*nBorder-nFontHeight; @@ -176,34 +176,34 @@ void lcl_PrintHeader( Printer* pPrinter, USHORT nPages, USHORT nCurPage, const S long nXLeft = nLeftMargin-nBorder; long nXRight = aSz.Width()-RMARGPRN+nBorder; - pPrinter->DrawRect( Rectangle( + rOutDev.DrawRect( Rectangle( Point( nXLeft, nYTop ), Size( nXRight-nXLeft, aSz.Height() - nYTop - BMARGPRN + nBorder ) ) ); long nY = TMARGPRN-2*nBorder; Point aPos( nLeftMargin, nY ); - pPrinter->DrawText( aPos, rTitle ); + rOutDev.DrawText( aPos, rTitle ); if ( nPages != 1 ) { aFont.SetWeight( WEIGHT_NORMAL ); - pPrinter->SetFont( aFont ); + rOutDev.SetFont( aFont ); String aPageStr( C2S(" [") ); aPageStr += String( SW_RES( STR_PAGE ) ); aPageStr += ' '; aPageStr += String::CreateFromInt32( nCurPage ); aPageStr += ']'; - aPos.X() += pPrinter->GetTextWidth( rTitle ); - pPrinter->DrawText( aPos, aPageStr ); + aPos.X() += rOutDev.GetTextWidth( rTitle ); + rOutDev.DrawText( aPos, aPageStr ); } nY = TMARGPRN-nBorder; - pPrinter->DrawLine( Point( nXLeft, nY ), Point( nXRight, nY ) ); + rOutDev.DrawLine( Point( nXLeft, nY ), Point( nXRight, nY ) ); - pPrinter->SetFont( aOldFont ); - pPrinter->SetFillColor( aOldFillColor ); + rOutDev.SetFont( aOldFont ); + rOutDev.SetFillColor( aOldFillColor ); } /* -----------------13.11.2003 16:24----------------- @@ -734,16 +734,13 @@ USHORT SwSrcView::StartSearchAndReplace(const SvxSearchItem& rSearchItem, return nFound; } -/*-----------------02.07.97 09:29------------------- +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ ---------------------------------------------------*/ USHORT SwSrcView::SetPrinter(SfxPrinter* pNew, USHORT nDiffFlags, bool ) { SwDocShell* pDocSh = GetDocShell(); - SfxPrinter* pOld = pDocSh->GetDoc()->getPrinter( false ); - if ( pOld && pOld->IsPrinting() ) - return SFX_PRINTERROR_BUSY; - if ( (SFX_PRINTER_JOBSETUP | SFX_PRINTER_PRINTER) & nDiffFlags ) { pDocSh->GetDoc()->setPrinter( pNew, true, true ); @@ -766,109 +763,88 @@ USHORT SwSrcView::SetPrinter(SfxPrinter* pNew, USHORT nDiffFlags, bool ) Beschreibung: --------------------------------------------------------------------*/ -ErrCode SwSrcView::DoPrint( SfxPrinter *pPrinter, PrintDialog *pDlg, BOOL bSilent, BOOL bIsAPI ) +SfxPrinter* SwSrcView::GetPrinter( BOOL bCreate ) { - SfxPrintProgress *pProgress = new SfxPrintProgress( this, !bSilent ); - SfxPrinter *pDocPrinter = GetPrinter(TRUE); - if ( !pPrinter ) - pPrinter = pDocPrinter; - else if ( pDocPrinter != pPrinter ) - { - pProgress->RestoreOnEndPrint( pDocPrinter->Clone() ); - SetPrinter( pPrinter, SFX_PRINTER_PRINTER ); - } - pProgress->SetWaitMode(FALSE); + return GetDocShell()->GetDoc()->getPrinter( bCreate ); +} - // Drucker starten - PreparePrint( pDlg ); +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ +sal_Int32 SwSrcView::PrintSource( + OutputDevice *pOutDev, + sal_Int32 nPage, + bool bCalcNumPagesOnly ) +{ + if (!pOutDev || nPage <= 0) + return 0; - SfxViewShell::Print(*pProgress, bIsAPI, pDlg ); //??? + //! this a lgorithm for printing the n-th page is very poor since it + //! needs to go over the text of all previous pages to get to the correct one. + //! But since HTML source code is expected to be just a small number of pages + //! even this poor algorithm should be enough... - MapMode eOldMapMode( pPrinter->GetMapMode() ); - Font aOldFont( pPrinter->Printer::GetFont() ); + pOutDev->Push(); TextEngine* pTextEngine = aEditWin.GetTextEngine(); - pPrinter->SetMapMode(MAP_100TH_MM); - Font aFont(aEditWin.GetOutWin()->GetFont()); - Size aSize(aFont.GetSize()); - aSize = aEditWin.GetOutWin()->PixelToLogic(aSize, MAP_100TH_MM); - aFont.SetSize(aSize); - aFont.SetColor(COL_BLACK); - pPrinter->SetFont( aFont ); + pOutDev->SetMapMode( MAP_100TH_MM ); + Font aFont( aEditWin.GetOutWin()->GetFont() ); + Size aSize( aFont.GetSize() ); + aSize = aEditWin.GetOutWin()->PixelToLogic( aSize, MAP_100TH_MM ); + aFont.SetSize( aSize ); + aFont.SetColor( COL_BLACK ); + pOutDev->SetFont( aFont ); String aTitle( GetViewFrame()->GetWindow().GetText() ); - USHORT nLineHeight = (USHORT) pPrinter->GetTextHeight(); // etwas mehr. + USHORT nLineHeight = (USHORT) pOutDev->GetTextHeight(); // etwas mehr. USHORT nParaSpace = 10; - Size aPaperSz = pPrinter->GetOutputSize(); - aPaperSz.Width() -= (LMARGPRN+RMARGPRN); - aPaperSz.Height() -= (TMARGPRN+BMARGPRN); + Size aPaperSz = pOutDev->GetOutputSize(); + aPaperSz.Width() -= (LMARGPRN + RMARGPRN); + aPaperSz.Height() -= (TMARGPRN + BMARGPRN); // nLinepPage stimmt nicht, wenn Zeilen umgebrochen werden muessen... - USHORT nLinespPage = (USHORT) (aPaperSz.Height()/nLineHeight); - USHORT nCharspLine = (USHORT) (aPaperSz.Width() / pPrinter->GetTextWidth( 'X' )); + USHORT nLinespPage = (USHORT) (aPaperSz.Height() / nLineHeight); + USHORT nCharspLine = (USHORT) (aPaperSz.Width() / pOutDev->GetTextWidth( 'X' )); USHORT nParas = static_cast< USHORT >( pTextEngine->GetParagraphCount() ); - USHORT nPages = (USHORT) (nParas/nLinespPage+1 ); + USHORT nPages = (USHORT) (nParas / nLinespPage + 1 ); USHORT nCurPage = 1; - BOOL bStartJob = pPrinter->StartJob( aTitle ); - if( bStartJob ) + // Header drucken... + if (!bCalcNumPagesOnly && nPage == nCurPage) + lcl_PrintHeader( *pOutDev, nPages, nCurPage, aTitle ); + const Point aStartPos( LMARGPRN, TMARGPRN ); + Point aPos( aStartPos ); + for ( USHORT nPara = 0; nPara < nParas; ++nPara ) { - pPrinter->StartPage(); - // Header drucken... - lcl_PrintHeader( pPrinter, nPages, nCurPage, aTitle ); - Point aPos( LMARGPRN, TMARGPRN ); - for ( USHORT nPara = 0; nPara < nParas; nPara++ ) + String aLine( pTextEngine->GetText( nPara ) ); + lcl_ConvertTabsToSpaces( aLine ); + USHORT nLines = aLine.Len() / nCharspLine + 1; + for ( USHORT nLine = 0; nLine < nLines; ++nLine ) { - String aLine( pTextEngine->GetText( nPara ) ); - lcl_ConvertTabsToSpaces( aLine ); - USHORT nLines = aLine.Len()/nCharspLine+1; - for ( USHORT nLine = 0; nLine < nLines; nLine++ ) + String aTmpLine( aLine, nLine * nCharspLine, nCharspLine ); + aPos.Y() += nLineHeight; + if ( aPos.Y() > ( aPaperSz.Height() + TMARGPRN - nLineHeight/2 ) ) { - String aTmpLine( aLine, nLine*nCharspLine, nCharspLine ); - aPos.Y() += nLineHeight; - if ( aPos.Y() > ( aPaperSz.Height()+TMARGPRN ) ) - { - nCurPage++; - pPrinter->EndPage(); - pPrinter->StartPage(); - lcl_PrintHeader( pPrinter, nPages, nCurPage, aTitle ); - aPos = Point( LMARGPRN, TMARGPRN+nLineHeight ); - } - pPrinter->DrawText( aPos, aTmpLine ); + ++nCurPage; + if (!bCalcNumPagesOnly && nPage == nCurPage) + lcl_PrintHeader( *pOutDev, nPages, nCurPage, aTitle ); + aPos = aStartPos; } - aPos.Y() += nParaSpace; + if (!bCalcNumPagesOnly && nPage == nCurPage) + pOutDev->DrawText( aPos, aTmpLine ); } - pPrinter->EndPage(); + aPos.Y() += nParaSpace; } - pPrinter->SetFont( aOldFont ); - pPrinter->SetMapMode( eOldMapMode ); + pOutDev->Pop(); - if ( !bStartJob ) - { - // Printer konnte nicht gestartet werden - delete pProgress; - return ERRCODE_IO_ABORT; - } - - pProgress->Stop(); - pProgress->DeleteOnEndPrint(); - pPrinter->EndJob(); - return pPrinter->GetError(); + DBG_ASSERT( bCalcNumPagesOnly || nPage <= nCurPage, "page number out of range" ); + return nCurPage; } -/*-------------------------------------------------------------------- - Beschreibung: - --------------------------------------------------------------------*/ - - -SfxPrinter* SwSrcView::GetPrinter( BOOL bCreate ) -{ - return GetDocShell()->GetDoc()->getPrinter( bCreate ); -} /*-------------------------------------------------------------------- Beschreibung: diff --git a/sw/source/ui/uiview/view.cxx b/sw/source/ui/uiview/view.cxx index d823f2e6c63b..3d9062b14684 100644 --- a/sw/source/ui/uiview/view.cxx +++ b/sw/source/ui/uiview/view.cxx @@ -1920,53 +1920,6 @@ void SwView::NotifyDBChanged() Beschreibung: Drucken --------------------------------------------------------------------*/ -void SwView::MakeOptions( PrintDialog* pDlg, SwPrtOptions& rOpts, - BOOL* pPrtProspect, BOOL* pPrtProspect_RTL, BOOL bWeb, SfxPrinter* pPrt, SwPrintData* pData ) -{ - SwAddPrinterItem* pAddPrinterAttr; - if( pPrt && SFX_ITEM_SET == pPrt->GetOptions().GetItemState( - FN_PARAM_ADDPRINTER, FALSE, (const SfxPoolItem**)&pAddPrinterAttr )) - { - pData = pAddPrinterAttr; - } - else if(!pData) - { - pData = SW_MOD()->GetPrtOptions(bWeb); - } - rOpts = *pData; - if( pPrtProspect ) - *pPrtProspect = pData->bPrintProspect; - if( pPrtProspect_RTL ) - *pPrtProspect_RTL = pData->bPrintProspect_RTL; - rOpts.aMulti.SetTotalRange( Range( 0, RANGE_MAX ) ); - rOpts.aMulti.SelectAll( FALSE ); - rOpts.nCopyCount = 1; - rOpts.bCollate = FALSE; - rOpts.bPrintSelection = FALSE; - rOpts.bJobStartet = FALSE; - - if ( pDlg ) - { - rOpts.nCopyCount = pDlg->GetCopyCount(); - rOpts.bCollate = pDlg->IsCollateChecked(); - if ( pDlg->GetCheckedRange() == PRINTDIALOG_SELECTION ) - { - rOpts.aMulti.SelectAll(); - rOpts.bPrintSelection = TRUE; - } - else if ( PRINTDIALOG_ALL == pDlg->GetCheckedRange() ) - rOpts.aMulti.SelectAll(); - else - { - rOpts.aMulti = MultiSelection( pDlg->GetRangeText() ); - rOpts.aMulti.SetTotalRange( Range( 0, RANGE_MAX ) ); - } - } - else - rOpts.aMulti.SelectAll(); - rOpts.aMulti.Select( 0, FALSE ); -} - /* -----------------------------28.10.02 13:25-------------------------------- ---------------------------------------------------------------------------*/ @@ -1995,3 +1948,20 @@ void SwView::AddTransferable(SwTransferable& rTransferable) { GetViewImpl()->AddTransferable(rTransferable); } + +/* --------------------------------------------------*/ + +void SwPrtOptions::MakeOptions( BOOL bWeb ) +{ + *this = *SW_MOD()->GetPrtOptions(bWeb); + + nCopyCount = 1; + bCollate = FALSE; + bPrintSelection = FALSE; + bJobStartet = FALSE; + + aMulti.SetTotalRange( Range( 0, RANGE_MAX ) ); + aMulti.SelectAll(); + aMulti.Select( 0, FALSE ); +} + diff --git a/sw/source/ui/uiview/viewprt.cxx b/sw/source/ui/uiview/viewprt.cxx index c53f6efbc3fc..4d46407d3f15 100644 --- a/sw/source/ui/uiview/viewprt.cxx +++ b/sw/source/ui/uiview/viewprt.cxx @@ -47,9 +47,11 @@ #endif #include <sfx2/request.hxx> +#include <sfx2/progress.hxx> #include <sfx2/app.hxx> #include <svl/flagitem.hxx> #include <vcl/msgbox.hxx> +#include <vcl/oldprintadaptor.hxx> #include <svtools/printdlg.hxx> #include <sfx2/printer.hxx> #include <sfx2/prnmon.hxx> @@ -175,287 +177,6 @@ USHORT __EXPORT SwView::SetPrinter(SfxPrinter* pNew, USHORT nDiffFlags, bool ) } /*-------------------------------------------------------------------- - Beschreibung: - --------------------------------------------------------------------*/ - -ErrCode SwView::DoPrint( SfxPrinter *pPrinter, PrintDialog *pDlg, BOOL bSilent, BOOL bIsAPI ) -{ - // First test - SwWrtShell* pSh = &GetWrtShell(); - SwNewDBMgr* pMgr = pSh->GetNewDBMgr(); - - int bPrintSelection = -1; - USHORT nMergeType = pMgr->GetMergeType(); - if( DBMGR_MERGE_MAILMERGE != nMergeType && - DBMGR_MERGE_DOCUMENTS != nMergeType && - !pDlg && - !bIsAPI && ( pSh->IsSelection() || pSh->IsFrmSelected() || - pSh->IsObjSelected() ) ) - { - short nBtn = SvxPrtQryBox(&GetEditWin()).Execute(); - if( RET_CANCEL == nBtn ) - return ERRCODE_IO_ABORT; - - if( RET_OK == nBtn ) - bPrintSelection = 1; - else - bPrintSelection = 0; - } - -// Der PrintProgress stellt Handler am Printer der ViewShell ein. -// Das kann natuerlich erste nach dem evtl. Umschalten des Druckers korrekt -// funktionieren. #55210# -// SfxPrintProgress *pProgress = new SfxPrintProgress( this, !bSilent ); - SfxPrintProgress *pProgress = 0; - SfxPrinter *pDocPrinter = GetPrinter(TRUE); - if ( !pPrinter ) - pPrinter = pDocPrinter; - else if ( pDocPrinter != pPrinter ) - { - //Da der Doc-Drucker beim SetPrinter geloescht wird, - // muss man ihn vorher clonen - SfxPrinter* pClone = pDocPrinter->Clone(); - SetPrinter( pPrinter, SFX_PRINTER_PRINTER ); - pProgress = new SfxPrintProgress( this, !bSilent ); - pProgress->RestoreOnEndPrint( pClone ); - } - if(!pProgress) - pProgress = new SfxPrintProgress( this, !bSilent ); - pProgress->SetWaitMode(FALSE); - - BOOL bStartJob = pPrinter->InitJob( &GetEditWin(), - !bIsAPI && pSh->HasDrawView() && pSh->GetDrawView()->GetModel()->HasTransparentObjects()); - if( bStartJob ) - { - // Drucker starten - PreparePrint( pDlg ); - SfxObjectShell *pObjShell = GetViewFrame()->GetObjectShell(); - //#i82625# GetTitle( 0 ) doesn't work for 'embedded' documents like forms or reports - String sDocumentTitle( pObjShell->GetTitle(SFX_TITLE_APINAME)); - SwPrtOptions aOpts( sDocumentTitle ); - BOOL bWeb = 0 != PTR_CAST(SwWebView, this); - nMergeType = pMgr->GetMergeType(); - - BOOL bPrtPros; - BOOL bPrtPros_RTL; - SwView::MakeOptions( pDlg, aOpts, &bPrtPros, &bPrtPros_RTL, bWeb, GetPrinter(), - pSh->getIDocumentDeviceAccess()->getPrintData() ); - - //set the appropriate view options to print - //on silent mode the field commands have to be switched off always - //on default print the user is asked what to do - const SwViewOption* pCurrentViewOptions = pSh->GetViewOptions(); - bool bSwitchOff_IsFldName = pCurrentViewOptions->IsFldName() && pSh->IsAnyFieldInDoc(); - - if(!bSilent && bSwitchOff_IsFldName) - { - QueryBox aBox( &GetEditWin(), SW_RES( DLG_PRT_FIELDNAME ) ); - USHORT nRet = aBox.Execute(); - if( RET_CANCEL == nRet) - { - delete pProgress; - return ERRCODE_IO_ABORT; - } - // disable field commands - if( RET_NO != nRet ) - { - bSwitchOff_IsFldName = false; - } - } - bool bApplyViewOptions = bSwitchOff_IsFldName; - //switch off display of hidden characters if on and hidden characters are in use - const sal_Bool bOldShowHiddenChar = pCurrentViewOptions->IsShowHiddenChar(); - const sal_Bool bOldMetaChars = pCurrentViewOptions->IsViewMetaChars(); - if( bOldShowHiddenChar != aOpts.IsPrintHiddenText() - && pSh->GetDoc()->ContainsHiddenChars()) - bApplyViewOptions |= true; - //switch off display of hidden paragraphs if on and hidden paragraphs are in use - const sal_Bool bOldShowHiddenPara = pCurrentViewOptions->IsShowHiddenPara(); - if( aOpts.IsPrintHiddenText() != bOldShowHiddenPara ) - { - const SwFieldType* pFldType = pSh->GetDoc()->GetSysFldType(RES_HIDDENPARAFLD); - if( pFldType && pFldType->GetDepends()) - bApplyViewOptions |= true; - } - const sal_Bool bOldShowHiddenField = pCurrentViewOptions->IsShowHiddenField(); - if( aOpts.IsPrintHiddenText() != bOldShowHiddenField ) - { - const SwFieldType* pFldType = pSh->GetDoc()->GetSysFldType(RES_HIDDENTXTFLD); - if( pFldType || pFldType->GetDepends()) - bApplyViewOptions |= true; - } - - SwViewOption* pOrgViewOption = 0; - bApplyViewOptions |= !aOpts.IsPrintTextPlaceholder(); - if(bApplyViewOptions) - { - pOrgViewOption = new SwViewOption(*pSh->GetViewOptions()); - if(bSwitchOff_IsFldName) - pOrgViewOption->SetFldName(aOpts.IsPrintHiddenText()); - - pOrgViewOption->SetShowHiddenChar(aOpts.IsPrintHiddenText()); - pOrgViewOption->SetViewMetaChars(sal_True); - pOrgViewOption->SetShowHiddenPara(aOpts.IsPrintHiddenText()); - pOrgViewOption->SetShowHiddenField(aOpts.IsPrintHiddenText()); - pOrgViewOption->SetShowPlaceHolderFields( aOpts.bPrintTextPlaceholder ); - - SW_MOD()->ApplyUsrPref(*pOrgViewOption, this, VIEWOPT_DEST_VIEW_ONLY ); - } - - if( nMergeType == DBMGR_MERGE_MAILMERGE || - DBMGR_MERGE_DOCUMENTS == nMergeType ) - { - if(DBMGR_MERGE_DOCUMENTS == nMergeType) - bStartJob = pMgr->MergePrintDocuments( *this, aOpts, *pProgress, bIsAPI ); - else - bStartJob = pMgr->MergePrint( *this, aOpts, *pProgress, bIsAPI ); - } - else - { - const BOOL bLockedView = pSh->IsViewLocked(); - pSh->LockView( TRUE ); - - //BrowseView abschalten und die View gegen alle Paints locken. - BOOL bBrowse = pSh->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE); - SfxAllItemSet aSet( SFX_APP()->GetPool() ); - SfxBoolItem aBrowse( SID_BROWSER_MODE, FALSE ); - if ( bBrowse ) - { - if ( pSh->GetWin() ) - pSh->GetWin()->Update(); - pSh->LockPaint(); - aSet.Put( aBrowse, aBrowse.Which() ); - SfxRequest aReq( SID_BROWSER_MODE, 0, aSet ); - GetDocShell()->Execute( aReq ); - } - - // die Felder aktualisieren - BOOL bIsModified = pSh->IsModified(); - pSh->StartAllAction(); - SwDocStat aDocStat; - pSh->UpdateDocStat( aDocStat ); - pSh->EndAllTblBoxEdit(); - pSh->ViewShell::UpdateFlds(TRUE); - if( pSh->IsCrsrInTbl() ) - { - pSh->ClearTblBoxCntnt(); - pSh->SaveTblBoxCntnt(); - } - pSh->EndAllAction(); - - if( !bIsModified ) - pSh->ResetModified(); - - if( -1 != bPrintSelection ) - aOpts.bPrintSelection = 0 != bPrintSelection; - - uno::Sequence< beans::PropertyValue> aViewProperties(18); - beans::PropertyValue* pViewProperties = aViewProperties.getArray(); - pViewProperties[1].Name = C2U("PrintGraphics"); - pViewProperties[1].Value <<= (sal_Bool)aOpts.IsPrintGraphic(); - pViewProperties[2].Name = C2U("PrintTables"); - pViewProperties[2].Value <<= (sal_Bool)aOpts.IsPrintTable(); - pViewProperties[3].Name = C2U("PrintDrawings"); - pViewProperties[3].Value <<= (sal_Bool)aOpts.IsPrintDraw(); - pViewProperties[4].Name = C2U("PrintLeftPages"); - pViewProperties[4].Value <<= (sal_Bool)aOpts.IsPrintLeftPage(); - pViewProperties[5].Name = C2U("PrintRightPages"); - pViewProperties[5].Value <<= (sal_Bool)aOpts.IsPrintRightPage(); - pViewProperties[6].Name = C2U("PrintControls"); - pViewProperties[6].Value <<= (sal_Bool)aOpts.IsPrintControl(); - pViewProperties[7].Name = C2U("PrintReversed"); - pViewProperties[7].Value <<= (sal_Bool)aOpts.IsPrintReverse(); - pViewProperties[8].Name = C2U("PrintPaperFromSetup"); - pViewProperties[8].Value <<= (sal_Bool)aOpts.IsPaperFromSetup(); - pViewProperties[9].Name = C2U("PrintFaxName"); - pViewProperties[9].Value <<= aOpts.GetFaxName(); - pViewProperties[10].Name = C2U("PrintAnnotationMode"); - pViewProperties[10].Value <<= (text::NotePrintMode) aOpts.GetPrintPostIts(); - pViewProperties[11].Name = C2U("PrintProspect"); - pViewProperties[11].Value <<= (sal_Bool)aOpts.IsPrintProspect(); - pViewProperties[12].Name = C2U("PrintPageBackground"); - pViewProperties[12].Value <<= (sal_Bool)aOpts.IsPrintPageBackground(); - pViewProperties[13].Name = C2U("PrintBlackFonts"); - pViewProperties[13].Value <<= (sal_Bool)aOpts.IsPrintBlackFont(); - pViewProperties[0].Name = C2U("IsSinglePrintJob"); - pViewProperties[0].Value <<= (sal_Bool)aOpts.IsPrintSingleJobs(); - pViewProperties[14].Name = C2U("Selection"); - pViewProperties[14].Value <<= (sal_Bool)aOpts.bPrintSelection; - pViewProperties[15].Name = C2U("PrintEmptyPages"); - pViewProperties[15].Value <<= (sal_Bool)aOpts.bPrintEmptyPages; - pViewProperties[16].Name = C2U("PrintHiddenText"); - pViewProperties[16].Value <<= (sal_Bool)aOpts.bPrintHiddenText; - pViewProperties[17].Name = C2U("PrintTextPlaceholder"); - pViewProperties[17].Value <<= (sal_Bool)aOpts.bPrintTextPlaceholder; - SetAdditionalPrintOptions(aViewProperties); - - SfxViewShell::Print(*pProgress, bIsAPI ); - if ( !pProgress->IsAborted() ) - { - if( bPrtPros ) - { - bStartJob = pPrinter->StartJob( aOpts.GetJobName() ); - if( bStartJob ) - pSh->PrintProspect( aOpts, *pProgress, bPrtPros_RTL ); - } - else - bStartJob = pSh->Prt( aOpts, pProgress ); - - if ( bBrowse ) - { - aBrowse.SetValue( TRUE ); - aSet.Put( aBrowse, aBrowse.Which() ); - SfxRequest aReq( SID_BROWSER_MODE, 0, aSet ); - GetDocShell()->Execute( aReq ); - pSh->UnlockPaint(); - } - } - else - bStartJob = FALSE; - - pSh->LockView( bLockedView ); - } - if(pOrgViewOption) - { - if(bSwitchOff_IsFldName) - pOrgViewOption->SetFldName(TRUE); - pOrgViewOption->SetShowHiddenChar(bOldShowHiddenChar); - pOrgViewOption->SetViewMetaChars(bOldMetaChars); - pOrgViewOption->SetShowHiddenField(bOldShowHiddenField); - pOrgViewOption->SetShowHiddenPara(bOldShowHiddenPara); - //must to be set to sal_True anyway - pOrgViewOption->SetShowPlaceHolderFields( sal_True ); - SW_MOD()->ApplyUsrPref(*pOrgViewOption, this, VIEWOPT_DEST_VIEW_ONLY ); - delete pOrgViewOption; - } - } - - if( !bStartJob ) - { - // Printer konnte nicht gestartet werden - delete pProgress; - return pPrinter->GetError(); - } - - pProgress->Stop(); - if ( pPrinter->IsJobActive() ) - { - pProgress->DeleteOnEndPrint(); - pPrinter->EndJob(); - return pPrinter->GetError(); - } - else - { - // the next call might destroy pPrinter (in case it is not the usual document printer); so get the error before - ULONG nError = pPrinter->GetError(); - pProgress->DeleteOnEndPrint(); - return nError; - } -} - - - -/*-------------------------------------------------------------------- Beschreibung: TabPage fuer applikationsspezifische Druckoptionen --------------------------------------------------------------------*/ @@ -549,6 +270,7 @@ void __EXPORT SwView::ExecutePrint(SfxRequest& rReq) rReq.RemoveItem(FN_QRY_MERGE); BOOL bFromMerge = pPrintFromMergeItem ? pPrintFromMergeItem->GetValue() : FALSE; SwMiscConfig aMiscConfig; + bool bPrintSelection = false; if(!bSilent && !bFromMerge && SW_MOD()->GetModuleConfig()->IsAskForMailMerge() && pSh->IsAnyDatabaseFieldInDoc()) { @@ -563,12 +285,29 @@ void __EXPORT SwView::ExecutePrint(SfxRequest& rReq) return; } } + else if( rReq.GetSlot() == SID_PRINTDOCDIRECT && ! bSilent ) + { + if( /*!bIsAPI && */ + ( pSh->IsSelection() || pSh->IsFrmSelected() || pSh->IsObjSelected() ) ) + { + short nBtn = SvxPrtQryBox(&GetEditWin()).Execute(); + if( RET_CANCEL == nBtn ) + return;; + + if( RET_OK == nBtn ) + bPrintSelection = true; + } + } + //#i61455# if master documentes are printed silently without loaded links then update the links now if( bSilent && pSh->IsGlobalDoc() && !pSh->IsGlblDocSaveLinks() ) { pSh->GetLinkManager().UpdateAllLinks( sal_False, sal_False, sal_False, 0 ); } - SfxViewShell::ExecuteSlot( rReq, SfxViewShell::GetInterface() ); + SfxRequest aReq( rReq ); + SfxBoolItem aBool(SID_SELECTION, bPrintSelection); + aReq.AppendItem( aBool ); + SfxViewShell::ExecuteSlot( aReq, SfxViewShell::GetInterface() ); return; } default: @@ -637,4 +376,3 @@ void SetAppPrintOptions( ViewShell* pSh, BOOL bWeb ) } } - diff --git a/sw/source/ui/uno/unomailmerge.cxx b/sw/source/ui/uno/unomailmerge.cxx index b47f599a9120..5d0b03a4eaad 100644 --- a/sw/source/ui/uno/unomailmerge.cxx +++ b/sw/source/ui/uno/unomailmerge.cxx @@ -725,6 +725,7 @@ uno::Any SAL_CALL SwXMailMerge::execute( // when mail merge is called as command line macro aMergeDesc.bPrintAsync = sal_False; aMergeDesc.aPrintOptions = aPrintSettings; + aMergeDesc.bCreateSingleFile = true; } else /* FILE and MAIL*/ { diff --git a/sw/source/ui/uno/unomod.cxx b/sw/source/ui/uno/unomod.cxx index ed6d61898804..906402b8e365 100644 --- a/sw/source/ui/uno/unomod.cxx +++ b/sw/source/ui/uno/unomod.cxx @@ -519,81 +519,75 @@ void SwXPrintSettings::_preGetValues () void SwXPrintSettings::_getSingleValue( const comphelper::PropertyInfo & rInfo, uno::Any & rValue ) throw(UnknownPropertyException, WrappedTargetException ) { - sal_Bool bBool = TRUE; - sal_Bool bBoolVal; switch( rInfo.mnHandle ) { case HANDLE_PRINTSET_LEFT_PAGES: - bBoolVal = mpPrtOpt->IsPrintLeftPage(); + rValue <<= mpPrtOpt->IsPrintLeftPage(); break; case HANDLE_PRINTSET_RIGHT_PAGES: - bBoolVal = mpPrtOpt->IsPrintRightPage(); + rValue <<= mpPrtOpt->IsPrintRightPage(); break; case HANDLE_PRINTSET_REVERSED: - bBoolVal = mpPrtOpt->IsPrintReverse(); + rValue <<= mpPrtOpt->IsPrintReverse(); break; case HANDLE_PRINTSET_PROSPECT: - bBoolVal = mpPrtOpt->IsPrintProspect(); + rValue <<= mpPrtOpt->IsPrintProspect(); break; case HANDLE_PRINTSET_GRAPHICS: - bBoolVal = mpPrtOpt->IsPrintGraphic(); + rValue <<= mpPrtOpt->IsPrintGraphic(); break; case HANDLE_PRINTSET_TABLES: - bBoolVal = mpPrtOpt->IsPrintTable(); + rValue <<= mpPrtOpt->IsPrintTable(); break; case HANDLE_PRINTSET_DRAWINGS: - bBoolVal = mpPrtOpt->IsPrintDraw(); + rValue <<= mpPrtOpt->IsPrintDraw(); break; case HANDLE_PRINTSET_CONTROLS: - bBoolVal = mpPrtOpt->IsPrintControl(); + rValue <<= mpPrtOpt->IsPrintControl(); break; case HANDLE_PRINTSET_PAGE_BACKGROUND: - bBoolVal = mpPrtOpt->IsPrintPageBackground(); + rValue <<= mpPrtOpt->IsPrintPageBackground(); break; case HANDLE_PRINTSET_BLACK_FONTS: - bBoolVal = mpPrtOpt->IsPrintBlackFont(); + rValue <<= mpPrtOpt->IsPrintBlackFont(); break; case HANDLE_PRINTSET_SINGLE_JOBS: - bBoolVal = mpPrtOpt->IsPrintSingleJobs(); + rValue <<= mpPrtOpt->IsPrintSingleJobs(); break; case HANDLE_PRINTSET_EMPTY_PAGES: - bBoolVal = mpPrtOpt->IsPrintEmptyPages(); + rValue <<= mpPrtOpt->IsPrintEmptyPages(); break; case HANDLE_PRINTSET_PAPER_FROM_SETUP: - bBoolVal = mpPrtOpt->IsPaperFromSetup(); + rValue <<= mpPrtOpt->IsPaperFromSetup(); break; case HANDLE_PRINTSET_ANNOTATION_MODE: { - bBool = FALSE; rValue <<= static_cast < sal_Int16 > ( mpPrtOpt->GetPrintPostIts() ); } break; case HANDLE_PRINTSET_FAX_NAME : { - bBool = FALSE; rValue <<= mpPrtOpt->GetFaxName(); } break; case HANDLE_PRINTSET_PROSPECT_RTL: { - bBoolVal = mpPrtOpt->IsPrintProspect_RTL(); + rValue <<= mpPrtOpt->IsPrintProspectRTL(); } break; case HANDLE_PRINTSET_PLACEHOLDER: { - bBoolVal = mpPrtOpt->IsPrintTextPlaceholder(); + rValue <<= mpPrtOpt->IsPrintTextPlaceholder(); } break; case HANDLE_PRINTSET_HIDDEN_TEXT: { - bBoolVal = mpPrtOpt->IsPrintHiddenText(); + rValue <<= mpPrtOpt->IsPrintHiddenText(); } break; default: throw UnknownPropertyException(); } - if(bBool) - rValue.setValue(&bBoolVal, ::getBooleanCppuType()); } void SwXPrintSettings::_postGetValues () throw(UnknownPropertyException, PropertyVetoException, IllegalArgumentException, WrappedTargetException ) diff --git a/sw/source/ui/uno/unotxdoc.cxx b/sw/source/ui/uno/unotxdoc.cxx index aa2712225703..4b519bc747fd 100644 --- a/sw/source/ui/uno/unotxdoc.cxx +++ b/sw/source/ui/uno/unotxdoc.cxx @@ -31,13 +31,17 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_sw.hxx" -#include <cmdid.h> -#include <swtypes.hxx> +#include <vos/mutex.hxx> #include <vcl/image.hxx> #include <vcl/virdev.hxx> #include <vcl/svapp.hxx> +#include <vcl/print.hxx> #include <sfx2/viewfrm.hxx> +#include <sfx2/sfxbasecontroller.hxx> #include <toolkit/helper/vclunohelper.hxx> +#include <toolkit/awt/vclxdevice.hxx> +#include <cmdid.h> +#include <swtypes.hxx> #include <wdocsh.hxx> #include <wrtsh.hxx> #include <view.hxx> @@ -54,7 +58,6 @@ #include <unocoll.hxx> #include <unoredlines.hxx> #include <unosrch.hxx> -#include <toolkit/awt/vclxdevice.hxx> #include <sfx2/dispatch.hxx> #include <sfx2/request.hxx> #include <sfx2/objsh.hxx> // SfxObjectShellRef <-> SV_DECL_REF(SfxObjectShell) @@ -68,6 +71,7 @@ #include <unofield.hxx> #include <unoidx.hxx> #include <unoflatpara.hxx> +#include <unotxvw.hxx> #include <poolfmt.hxx> #include <globdoc.hxx> #include <viewopt.hxx> @@ -75,6 +79,8 @@ #include <doc.hxx> #include <charatr.hxx> #include <svx/xmleohlp.hxx> +#include <globals.hrc> +#include <unomid.h> #include <com/sun/star/util/SearchOptions.hpp> #include <com/sun/star/lang/ServiceNotRegisteredException.hpp> @@ -129,11 +135,14 @@ #include <svl/stylepool.hxx> #include <swatrset.hxx> +#include <view.hxx> +#include <srcview.hxx> //#include <com/sun/star/i18n/ScriptType.hpp> #include <svtools/langtab.hxx> #include <map> #include <set> +#include <vector> #include <svx/eeitem.hxx> #include <svx/editeng.hxx> @@ -170,6 +179,32 @@ using ::osl::FileBase; /****************************************************************************** * ******************************************************************************/ + +extern bool lcl_GetPostIts( IDocumentFieldsAccess* pIDFA, _SetGetExpFlds * pSrtLst ); + +SwPrintUIOptions * lcl_GetPrintUIOptions( + SwDocShell * pDocShell, + const SfxViewShell * pView ) +{ + if (!pDocShell) + return NULL; + + const BOOL bWebDoc = NULL != dynamic_cast< const SwWebDocShell * >(pDocShell); + const bool bSwSrcView = NULL != dynamic_cast< const SwSrcView * >(pView); + const SwView * pSwView = dynamic_cast< const SwView * >(pView); + const bool bHasSelection = pSwView ? pSwView->HasSelection( sal_False ) : false; // check for any selection, not just text selection + const bool bHasPostIts = lcl_GetPostIts( pDocShell->GetDoc(), 0 ); + + // get default values to use in dialog from documents SwPrintData + const SwPrintData *pPrintData = pDocShell->GetDoc()->getPrintData(); + DBG_ASSERT( pPrintData, "failed to get SwPrintData from document" ); + + return new SwPrintUIOptions( bWebDoc, bSwSrcView, bHasSelection, bHasPostIts, *pPrintData ); +} + +//////////////////////////////////////////////////////////// + + SwTxtFmtColl *lcl_GetParaStyle(const String& rCollName, SwDoc* pDoc) { SwTxtFmtColl* pColl = pDoc->FindTxtFmtCollByName( rCollName ); @@ -364,7 +399,9 @@ SwXTextDocument::SwXTextDocument(SwDocShell* pShell) : pxXLineNumberingProperties(0), pxLinkTargetSupplier(0), pxXRedlines(0), - m_pHiddenViewFrame(0) + m_pHiddenViewFrame(0), + m_pPrintUIOptions( NULL ), + m_pRenderData( NULL ) { } /*-- 18.12.98 11:53:00--------------------------------------------------- @@ -379,6 +416,8 @@ SwXTextDocument::~SwXTextDocument() xNumFmtAgg->setDelegator(x0); xNumFmtAgg = 0; } + delete m_pPrintUIOptions; + delete m_pRenderData; } @@ -2453,100 +2492,74 @@ Any SAL_CALL SwXTextDocument::getPropertyDefault( const OUString& rPropertyName } return aAny; } -/*-- 06.01.2004 15:08:34--------------------------------------------------- - The class SwViewOptionAdjust_Impl is used to adjust the SwViewOption of - the current ViewShell so that fields are not printed as commands and - hidden text and hidden characters are always invisible. - After printing the view options are restored - -----------------------------------------------------------------------*/ -class SwViewOptionAdjust_Impl -{ - bool m_bSwitchOff_IsFldName; - bool m_bSwitchOff_PlaceHolderView; - bool m_bSwitchOff_HiddenChar; - bool m_bSwitchOff_HiddenParagraphs; - bool m_bSwitchOff_IsShowHiddenField; - - SwViewOption* m_pViewOption; - SwWrtShell& m_rShell; -public: - SwViewOptionAdjust_Impl(SwWrtShell& rSh); - ~SwViewOptionAdjust_Impl(); -}; -/*-- 06.01.2004 15:08:34--------------------------------------------------- - - -----------------------------------------------------------------------*/ -SwViewOptionAdjust_Impl::SwViewOptionAdjust_Impl(SwWrtShell& rSh) : - m_pViewOption(0), - m_rShell(rSh) -{ - const SwViewOption* pCurrentViewOptions = m_rShell.GetViewOptions(); - m_bSwitchOff_IsFldName = pCurrentViewOptions->IsFldName() && m_rShell.IsAnyFieldInDoc(); - bool bApplyViewOptions = m_bSwitchOff_IsFldName; - //switch off painting of placeholder fields - m_bSwitchOff_PlaceHolderView = pCurrentViewOptions->IsShowPlaceHolderFields(); - //switch off display of hidden characters if on and hidden characters are in use - m_bSwitchOff_HiddenChar = pCurrentViewOptions->IsShowHiddenChar() && m_rShell.GetDoc()->ContainsHiddenChars(); - //switch off display of hidden paragraphs if on and hidden paragraphs are in use - m_bSwitchOff_HiddenParagraphs = pCurrentViewOptions->IsShowHiddenPara(); - if(m_bSwitchOff_HiddenParagraphs) - { - const SwFieldType* pFldType = m_rShell.GetDoc()->GetSysFldType(RES_HIDDENPARAFLD); - if(!pFldType || !pFldType->GetDepends()) - m_bSwitchOff_HiddenParagraphs = false; - } - m_bSwitchOff_IsShowHiddenField = pCurrentViewOptions->IsShowHiddenField(); - if(m_bSwitchOff_IsShowHiddenField) - { - const SwFieldType* pFldType = m_rShell.GetDoc()->GetSysFldType(RES_HIDDENTXTFLD); - if( !pFldType || !pFldType->GetDepends()) - m_bSwitchOff_IsShowHiddenField = false; - } - - bApplyViewOptions |= m_bSwitchOff_PlaceHolderView; - bApplyViewOptions |= m_bSwitchOff_HiddenChar; - bApplyViewOptions |= m_bSwitchOff_HiddenParagraphs; - bApplyViewOptions |= m_bSwitchOff_IsShowHiddenField; - if(bApplyViewOptions) - { - m_pViewOption = new SwViewOption(*m_rShell.GetViewOptions()); - if(m_bSwitchOff_IsFldName) - m_pViewOption->SetFldName(FALSE); - if(m_bSwitchOff_PlaceHolderView) - m_pViewOption->SetShowPlaceHolderFields(FALSE); - if(m_bSwitchOff_HiddenChar) - m_pViewOption->SetShowHiddenChar(FALSE); - if(m_bSwitchOff_HiddenParagraphs) - m_pViewOption->SetShowHiddenPara(FALSE); - if(m_bSwitchOff_IsShowHiddenField) - m_pViewOption->SetShowHiddenField(FALSE); - SW_MOD()->ApplyUsrPref(*m_pViewOption, &m_rShell.GetView(), VIEWOPT_DEST_VIEW_ONLY ); - } -} -/*-- 06.01.2004 15:08:34--------------------------------------------------- - -----------------------------------------------------------------------*/ -SwViewOptionAdjust_Impl::~SwViewOptionAdjust_Impl() +static OutputDevice * lcl_GetOutputDevice( const SwPrintUIOptions &rPrintUIOptions ) +{ + OutputDevice *pOut = 0; + + uno::Any aAny( rPrintUIOptions.getValue( C2U( "RenderDevice" ) )); + uno::Reference< awt::XDevice > xRenderDevice; + aAny >>= xRenderDevice; + if (xRenderDevice.is()) + { + VCLXDevice* pDevice = VCLXDevice::GetImplementation( xRenderDevice ); + pOut = pDevice ? pDevice->GetOutputDevice() : 0; + } + + return pOut; +} + + +static bool lcl_SeqHasProperty( + const uno::Sequence< beans::PropertyValue >& rOptions, + const sal_Char *pPropName ) { - if(m_pViewOption) + bool bRes = false; + const sal_Int32 nLen = rOptions.getLength(); + const beans::PropertyValue *pProps = rOptions.getConstArray(); + for (sal_Int32 i = 0; i < nLen && !bRes; ++i) { - if(m_bSwitchOff_IsFldName) - m_pViewOption->SetFldName(TRUE); - if(m_bSwitchOff_PlaceHolderView) - m_pViewOption->SetShowPlaceHolderFields(TRUE); - if(m_bSwitchOff_HiddenChar) - m_pViewOption->SetShowHiddenChar(TRUE); - if(m_bSwitchOff_HiddenParagraphs) - m_pViewOption->SetShowHiddenPara(TRUE); - if(m_bSwitchOff_IsShowHiddenField) - m_pViewOption->SetShowHiddenField(TRUE); - SW_MOD()->ApplyUsrPref(*m_pViewOption, &m_rShell.GetView(), VIEWOPT_DEST_VIEW_ONLY ); - delete m_pViewOption; + if (pProps[i].Name.equalsAscii( pPropName )) + bRes = true; } + return bRes; } -/* -----------------------------23.08.02 16:00-------------------------------- - ---------------------------------------------------------------------------*/ + +SfxViewShell * SwXTextDocument::GetRenderView( + bool &rbIsSwSrcView, + const uno::Sequence< beans::PropertyValue >& rOptions, + bool bIsPDFExport ) +{ + // get view shell to use + SfxViewShell *pView = 0; + if (bIsPDFExport) + pView = GuessViewShell( rbIsSwSrcView ); + else + { + uno::Any aTmp; + const sal_Int32 nLen = rOptions.getLength(); + const beans::PropertyValue *pProps = rOptions.getConstArray(); + for (sal_Int32 i = 0; i < nLen; ++i) + { + if (pProps[i].Name.equalsAscii( "View" )) + { + aTmp = pProps[i].Value; + break; + } + } + + uno::Reference< frame::XController > xController; + if (aTmp >>= xController) + { + DBG_ASSERT( xController.is(), "controller is empty!" ); + pView = GuessViewShell( rbIsSwSrcView, xController ); + } + } + return pView; +} + + /* * GetRenderDoc: * returns the document to be rendered, usually this will be the 'regular' @@ -2556,7 +2569,10 @@ SwViewOptionAdjust_Impl::~SwViewOptionAdjust_Impl() * SfxViewShell. */ -SwDoc * SwXTextDocument::GetRenderDoc( SfxViewShell *&rpView, const uno::Any& rSelection ) +SwDoc * SwXTextDocument::GetRenderDoc( + SfxViewShell *&rpView, + const uno::Any& rSelection, + bool bIsPDFExport ) { SwDoc *pDoc = 0; @@ -2566,11 +2582,22 @@ SwDoc * SwXTextDocument::GetRenderDoc( SfxViewShell *&rpView, const uno::Any& rS pDoc = pDocShell->GetDoc(); else { - // used for PDF export of (multi-)selection + DBG_ASSERT( !xModel.is(), "unexpected model found" ); + if (rSelection.hasValue()) // is anything selected ? { + // this part should only be called when a temporary document needs to be created, + // for example for PDF export or printing of (multi-)selection only. + + bool bIsSwSrcView = false; if (!rpView) - rpView = GuessViewShell(); + { + (void) bIsPDFExport; + // aside from maybe PDF export the view should always have been provided! + DBG_ASSERT( bIsPDFExport, "view is missing, guessing one..." ); + + rpView = GuessViewShell( bIsSwSrcView ); + } DBG_ASSERT( rpView, "ViewShell missing" ); // the view shell should be SwView for documents PDF export. // for the page preview no selection should be possible @@ -2585,55 +2612,187 @@ SwDoc * SwXTextDocument::GetRenderDoc( SfxViewShell *&rpView, const uno::Any& rS rpView = pDoc->GetDocShell()->GetView(); } } - else { + else + { DBG_ERROR( "unexpected ViewShell" ); } } } return pDoc; } + /* -----------------------------23.08.02 16:00-------------------------------- ---------------------------------------------------------------------------*/ + +static void lcl_SavePrintUIOptionsToDocumentPrintData( + SwDoc &rDoc, + const SwPrintUIOptions &rPrintUIOptions, + bool bIsPDFEXport ) +{ + if (!rDoc.getPrintData()) + { + SwPrintData *pTmpData = new SwPrintData; + rDoc.setPrintData ( *pTmpData ); + delete pTmpData; // setPrintData does make its own copy! + } + + SwPrintData *pDocPrintData = rDoc.getPrintData(); + + pDocPrintData->SetPrintGraphic( rPrintUIOptions.IsPrintGraphics() ); + pDocPrintData->SetPrintTable( rPrintUIOptions.IsPrintTables() ); + pDocPrintData->SetPrintDraw( rPrintUIOptions.IsPrintDrawings() ); + pDocPrintData->SetPrintControl( rPrintUIOptions.IsPrintFormControls() ); + pDocPrintData->SetPrintLeftPage( rPrintUIOptions.IsPrintLeftPages() ); + pDocPrintData->SetPrintRightPage( rPrintUIOptions.IsPrintRightPages() ); + pDocPrintData->SetPrintReverse( rPrintUIOptions.IsPrintReverse() ); + pDocPrintData->SetPaperFromSetup( rPrintUIOptions.IsPaperFromSetup() ); + pDocPrintData->SetPrintEmptyPages( rPrintUIOptions.IsPrintEmptyPages( bIsPDFEXport ) ); + pDocPrintData->SetPrintPostIts( rPrintUIOptions.GetPrintPostItsType() ); + pDocPrintData->SetPrintProspect( rPrintUIOptions.IsPrintProspect() ); + pDocPrintData->SetPrintProspect_RTL( rPrintUIOptions.IsPrintProspectRTL() ); + pDocPrintData->SetPrintPageBackground( rPrintUIOptions.IsPrintPageBackground() ); + pDocPrintData->SetPrintBlackFont( rPrintUIOptions.IsPrintWithBlackTextColor() ); + // pDocPrintData->SetPrintSingleJobs( b ); handled by File/Print dialog itself + // pDocPrintData->SetFaxName( s ); n/a in File/Print dialog + pDocPrintData->SetPrintHiddenText( rPrintUIOptions.IsPrintHiddenText() ); + pDocPrintData->SetPrintTextPlaceholder( rPrintUIOptions.IsPrintTextPlaceholders() ); +} + + sal_Int32 SAL_CALL SwXTextDocument::getRendererCount( const uno::Any& rSelection, - const uno::Sequence< beans::PropertyValue >& /*rxOptions*/ ) + const uno::Sequence< beans::PropertyValue >& rxOptions ) throw (IllegalArgumentException, RuntimeException) { ::vos::OGuard aGuard(Application::GetSolarMutex()); if(!IsValid()) throw RuntimeException(); - SfxViewShell *pView = 0; - SwDoc *pDoc = GetRenderDoc( pView, rSelection ); - if (!pDoc) - throw RuntimeException(); - SwDocShell *pRenderDocShell = pDoc->GetDocShell(); - // #i38289 - if(pDoc->get(IDocumentSettingAccess::BROWSE_MODE)) - { - pRenderDocShell->ToggleBrowserMode(false,NULL); - } + const bool bIsPDFExport = !lcl_SeqHasProperty( rxOptions, "IsPrinter" ); + bool bIsSwSrcView = false; + SfxViewShell *pView = GetRenderView( bIsSwSrcView, rxOptions, bIsPDFExport ); - SwWrtShell *pWrtShell = pRenderDocShell->GetWrtShell(); + if (!bIsSwSrcView && !m_pRenderData) + m_pRenderData = new SwRenderData; + if (!m_pPrintUIOptions) + m_pPrintUIOptions = lcl_GetPrintUIOptions( pDocShell, pView ); + bool bFormat = m_pPrintUIOptions->processPropertiesAndCheckFormat( rxOptions ); + // const bool bIsSkipEmptyPages = !m_pPrintUIOptions->IsPrintEmptyPages( bIsPDFExport ); + + SwDoc *pDoc = GetRenderDoc( pView, rSelection, bIsPDFExport ); + DBG_ASSERT( pDoc && pView, "doc or view shell missing!" ); + if (!pDoc || !pView) + return 0; + + // save current UI options from the print dialog for the next call to that dialog + lcl_SavePrintUIOptionsToDocumentPrintData( *pDoc, *m_pPrintUIOptions, bIsPDFExport ); sal_Int32 nRet = 0; - if( !pWrtShell ) + if (bIsSwSrcView) { - //create a hidden view to be able to export as PDF also in print preview - m_pHiddenViewFrame = SfxViewFrame::CreateViewFrame( *pRenderDocShell, 2, TRUE ); - SwView* pSwView = (SwView*) m_pHiddenViewFrame->GetViewShell(); - pWrtShell = pSwView->GetWrtShellPtr(); + SwSrcView *pSwSrcView = dynamic_cast< SwSrcView * >(pView); + OutputDevice *pOutDev = lcl_GetOutputDevice( *m_pPrintUIOptions ); + nRet = pSwSrcView->PrintSource( pOutDev, 1 /* dummy */, true /* get page count only */ ); } + else + { + SwDocShell *pRenderDocShell = pDoc->GetDocShell(); + SwWrtShell *pWrtShell = pRenderDocShell->GetWrtShell(); + if (bFormat) + { + // #i38289 + if(pDoc->get(IDocumentSettingAccess::BROWSE_MODE)) + { + pRenderDocShell->ToggleBrowserMode(false,NULL); + } + + if (!pWrtShell) + { + //create a hidden view to be able to export as PDF also in print preview + m_pHiddenViewFrame = SfxViewFrame::CreateViewFrame( *pRenderDocShell, 2, TRUE ); + SwView* pSwView = (SwView*) m_pHiddenViewFrame->GetViewShell(); + pWrtShell = pSwView->GetWrtShellPtr(); + } + + // reformating the document for printing will show the changes in the view + // which is likely to produce many unwanted and not nice to view actions. + // We don't want that! Thus we disable updating of the view. + pWrtShell->StartAction(); + + const TypeId aSwViewTypeId = TYPE(SwView); + if (pView->IsA(aSwViewTypeId)) + { + if (m_pRenderData && !m_pRenderData->IsViewOptionAdjust()) + m_pRenderData->ViewOptionAdjustStart( *pWrtShell, *pWrtShell->GetViewOptions() ); + } - SwViewOptionAdjust_Impl aAdjust(*pWrtShell); - pWrtShell->SetPDFExportOption( sal_True ); - // --> FME 2005-05-23 #122919# Force field update before PDF export: - pWrtShell->ViewShell::UpdateFlds(TRUE); - // <-- - pWrtShell->CalcLayout(); - pWrtShell->SetPDFExportOption( sal_False ); - nRet = pDoc->GetPageCount(); + m_pRenderData->SetSwPrtOptions( new SwPrtOptions( C2U( bIsPDFExport ? "PDF export" : "Printing" ) ) ); + m_pRenderData->MakeSwPrtOptions( m_pRenderData->GetSwPrtOptionsRef(), pRenderDocShell, + m_pPrintUIOptions, m_pRenderData, bIsPDFExport ); + + if (pView->IsA(aSwViewTypeId)) + { + // PDF export should not make use of the SwPrtOptions + const SwPrtOptions *pPrtOptions = bIsPDFExport? NULL : m_pRenderData->GetSwPrtOptions(); + m_pRenderData->ViewOptionAdjust( pPrtOptions ); + } + + // since printing now also use the API for PDF export this option + // should be set for printing as well ... + pWrtShell->SetPDFExportOption( sal_True ); + + // --> FME 2005-05-23 #122919# Force field update before PDF export: + pWrtShell->ViewShell::UpdateFlds(TRUE); + // <-- + + // there is some redundancy between those two function calls, but right now + // there is no time to sort this out. + //TODO: check what exatly needs to be done and make just one function for that + pWrtShell->CalcLayout(); + pWrtShell->CalcPagesForPrint( pDoc->GetPageCount() ); + + pWrtShell->SetPDFExportOption( sal_False ); + + + // enable view again + pWrtShell->EndAction(); + } + + const sal_Int32 nPageCount = pDoc->GetPageCount(); + + // + // get number of pages to be rendered + // + const bool bPrintProspect = m_pPrintUIOptions->getBoolValue( "PrintProspect", false ); + if (bPrintProspect) + { + pDoc->CalculatePagePairsForProspectPrinting( *m_pRenderData, *m_pPrintUIOptions, nPageCount ); + nRet = m_pRenderData->GetPagePairsForProspectPrinting().size(); + } + else + { + const sal_Int16 nPostItMode = (sal_Int16) m_pPrintUIOptions->getIntValue( "PrintAnnotationMode", 0 ); + if (nPostItMode != POSTITS_NONE) + { + OutputDevice *pOutDev = lcl_GetOutputDevice( *m_pPrintUIOptions ); + m_pRenderData->CreatePostItData( pDoc, pWrtShell->GetViewOptions(), pOutDev ); + } + + // get set of valid document pages (according to the current settings) + // and their start frames + pDoc->CalculatePagesForPrinting( *m_pRenderData, *m_pPrintUIOptions, bIsPDFExport, nPageCount ); + + if (nPostItMode != POSTITS_NONE) + { + pDoc->UpdatePagesForPrintingWithPostItData( *m_pRenderData, + *m_pPrintUIOptions, bIsPDFExport, nPageCount ); + } + + nRet = m_pRenderData->GetPagesToPrint().size(); + } + } + DBG_ASSERT( nRet >= 0, "negative number of pages???" ); return nRet; } @@ -2649,41 +2808,110 @@ uno::Sequence< beans::PropertyValue > SAL_CALL SwXTextDocument::getRenderer( ::vos::OGuard aGuard(Application::GetSolarMutex()); if(!IsValid()) throw RuntimeException(); - SfxViewShell *pView = 0; - SwDoc *pDoc = GetRenderDoc( pView, rSelection ); - if (!pDoc) - throw RuntimeException(); + + const bool bIsPDFExport = !lcl_SeqHasProperty( rxOptions, "IsPrinter" ); + bool bIsSwSrcView = false; + SfxViewShell *pView = GetRenderView( bIsSwSrcView, rxOptions, bIsPDFExport ); + + // m_pRenderData should NOT be created here! + // That should only be done in getRendererCount. If this function is called before + // getRendererCount was called then the caller will probably just retrieve the extra UI options + // and is not interested in getting valid information about the other data that would + // otherwise be provided here! +// if( ! m_pRenderData ) +// m_pRenderData = new SwRenderData; + if (!m_pPrintUIOptions) + m_pPrintUIOptions = lcl_GetPrintUIOptions( pDocShell, pView ); + m_pPrintUIOptions->processProperties( rxOptions ); + const bool bPrintProspect = m_pPrintUIOptions->getBoolValue( "PrintProspect", false ); + const bool bIsSkipEmptyPages = !m_pPrintUIOptions->IsPrintEmptyPages( bIsPDFExport ); + + SwDoc *pDoc = GetRenderDoc( pView, rSelection, bIsPDFExport ); + DBG_ASSERT( pDoc && pView, "doc or view shell missing!" ); + if (!pDoc || !pView) + return uno::Sequence< beans::PropertyValue >(); // due to #110067# (document page count changes sometimes during // PDF export/printing) we can not check for the upper bound properly. // Thus instead of throwing the exception we silently return. - if (!(0 <= nRenderer /* && nRenderer < pDoc->GetPageCount()*/)) + if (0 > nRenderer) throw IllegalArgumentException(); - if (nRenderer >= pDoc->GetPageCount()) + sal_Int32 nMaxRenderer = 0; + if (!bIsSwSrcView && m_pRenderData) + { + DBG_ASSERT( m_pRenderData, "m_pRenderData missing!!" ); + nMaxRenderer = bPrintProspect? + m_pRenderData->GetPagePairsForProspectPrinting().size() - 1 : + m_pRenderData->GetPagesToPrint().size() - 1; + } + // since SwSrcView::PrintSource is a poor implementation to get the number of pages to print + // we obmit checking of the upper bound in this case. + if (!bIsSwSrcView && m_pRenderData && nRenderer > nMaxRenderer) return uno::Sequence< beans::PropertyValue >(); - bool bSkipEmptyPages = false; - for( sal_Int32 nProperty = 0, nPropertyCount = rxOptions.getLength(); nProperty < nPropertyCount; ++nProperty ) + uno::Sequence< beans::PropertyValue > aRenderer; + if (m_pRenderData) { - if( rxOptions[ nProperty ].Name == OUString( RTL_CONSTASCII_USTRINGPARAM( "IsSkipEmptyPages" ) ) ) - rxOptions[ nProperty].Value >>= bSkipEmptyPages; - } + awt::Size aPageSize; + Size aTmpSize; + if (bIsSwSrcView || bPrintProspect) + { + // for printing of HTML source code and prospect printing we should use + // the printers paper size since + // a) HTML source view has no page size + // b) prospect printing has a different page size from the documents page + // since two document pages will get rendered on one printer page + + // since PageIncludesNonprintableArea will be set to true we can return the + // printers paper size here. + // Sometimes 'getRenderer' is only called to get "ExtraPrintUIOptions", in this + // case we won't get an OutputDevice here, but then the caller also has no need + // for the correct PageSisze right now... + Printer *pPrinter = dynamic_cast< Printer * >(lcl_GetOutputDevice( *m_pPrintUIOptions )); + if (pPrinter) + { + if (bPrintProspect) + { + aTmpSize = pDoc->GetPageSize( USHORT(nRenderer + 1), bIsSkipEmptyPages ); + // we just state what output size we would need + // the rest is nowadays up to vcl + aPageSize = awt::Size ( TWIP_TO_MM100( 2 * aTmpSize.Width() ), + TWIP_TO_MM100( aTmpSize.Height() )); + } + else + { + // printing HTML source view + aTmpSize = pPrinter->GetPaperSize(); + aTmpSize = pPrinter->LogicToLogic( aTmpSize, + pPrinter->GetMapMode(), MapMode( MAP_100TH_MM )); + aPageSize = awt::Size( aTmpSize.Width(), aTmpSize.Height() ); + } + } + } + else + { + aTmpSize = pDoc->GetPageSize( USHORT(nRenderer + 1), bIsSkipEmptyPages ); + aPageSize = awt::Size ( TWIP_TO_MM100( aTmpSize.Width() ), + TWIP_TO_MM100( aTmpSize.Height() )); + } - Size aPgSize( pDoc->GetPageSize( sal_uInt16(nRenderer + 1), bSkipEmptyPages ) ); + aRenderer.realloc(2); + aRenderer[0].Name = OUString( RTL_CONSTASCII_USTRINGPARAM( "PageSize" ) ); + aRenderer[0].Value <<= aPageSize; + aRenderer[1].Name = OUString( RTL_CONSTASCII_USTRINGPARAM( "PageIncludesNonprintableArea" ) ); + aRenderer[1].Value <<= sal_True; + } - awt::Size aPageSize( TWIP_TO_MM100( aPgSize.Width() ), - TWIP_TO_MM100( aPgSize.Height() )); - uno::Sequence< beans::PropertyValue > aRenderer(1); - PropertyValue &rValue = aRenderer.getArray()[0]; - rValue.Name = OUString( RTL_CONSTASCII_USTRINGPARAM( "PageSize" ) ); - rValue.Value <<= aPageSize; + m_pPrintUIOptions->appendPrintUIOptions( aRenderer ); return aRenderer; } /* -----------------------------28.10.02 16:00-------------------------------- ---------------------------------------------------------------------------*/ -SfxViewShell * SwXTextDocument::GuessViewShell() +SfxViewShell * SwXTextDocument::GuessViewShell( + /* out */ bool &rbIsSwSrcView, + const uno::Reference< css::frame::XController > xController ) { // #130810# SfxViewShell::Current() / SfxViewShell::GetObjectShell() // must not be used (see comment from MBA) @@ -2691,24 +2919,39 @@ SfxViewShell * SwXTextDocument::GuessViewShell() SfxViewShell *pView = 0; SwView *pSwView = 0; SwPagePreView *pSwPagePreView = 0; + SwSrcView *pSwSrcView = 0; SfxViewFrame *pFrame = SfxViewFrame::GetFirst( pDocShell, 0, sal_False ); + + // look for the view shell with the same controller in use, + // otherwise look for a suitable view, preferably a SwView, + // if that one is not found use a SwPagePreView if found. while (pFrame) { pView = pFrame->GetViewShell(); pSwView = dynamic_cast< SwView * >(pView); - if (pSwView) - break; + pSwSrcView = dynamic_cast< SwSrcView * >(pView); if (!pSwPagePreView) pSwPagePreView = dynamic_cast< SwPagePreView * >(pView); + if (xController.is()) + { + if (pView && pView->GetController() == xController) + break; + } + else if (pSwView || pSwSrcView) + break; pFrame = SfxViewFrame::GetNext( *pFrame, pDocShell, 0, sal_False ); } - return pSwView ? pSwView : dynamic_cast< SwView * >(pSwPagePreView); + DBG_ASSERT( pSwView || pSwPagePreView || pSwSrcView, "failed to get view shell" ); + if (pView) + rbIsSwSrcView = pSwSrcView != 0; + return pView; +// return pSwView ? dynamic_cast< SfxViewShell * >(pSwView) : +// (pSwSrcView ? dynamic_cast< SfxViewShell * >(pSwSrcView) : +// dynamic_cast< SfxViewShell * >(pSwPagePreView) ); } -/* -----------------------------23.08.02 16:00-------------------------------- - ---------------------------------------------------------------------------*/ void SAL_CALL SwXTextDocument::render( sal_Int32 nRenderer, const uno::Any& rSelection, @@ -2718,121 +2961,143 @@ void SAL_CALL SwXTextDocument::render( ::vos::OGuard aGuard(Application::GetSolarMutex()); if(!IsValid()) throw RuntimeException(); - SfxViewShell *pView = GuessViewShell(); - SwDoc *pDoc = GetRenderDoc( pView, rSelection ); - if (!pDoc || !pView) - throw RuntimeException(); // due to #110067# (document page count changes sometimes during // PDF export/printing) we can not check for the upper bound properly. // Thus instead of throwing the exception we silently return. - if (!(0 <= nRenderer /* && nRenderer < pDoc->GetPageCount()*/)) + if (0 > nRenderer) throw IllegalArgumentException(); - if (nRenderer >= pDoc->GetPageCount()) - return; - // the view shell should be SwView for documents PDF export - // or SwPagePreView for PDF export of the page preview - //!! (check for SwView first as in GuessViewShell) !! - const TypeId aSwViewTypeId = TYPE(SwView); - ViewShell* pVwSh = pView->IsA(aSwViewTypeId) ? - ((SwView*)pView)->GetWrtShellPtr() : - ((SwPagePreView*)pView)->GetViewShell(); - - uno::Reference< awt::XDevice > xRenderDevice; - bool bFirstPage = false; - bool bLastPage = false; - rtl::OUString aPages; - bool bSkipEmptyPages = false; - - for( sal_Int32 nProperty = 0, nPropertyCount = rxOptions.getLength(); nProperty < nPropertyCount; ++nProperty ) - { - if( rxOptions[ nProperty ].Name == OUString( RTL_CONSTASCII_USTRINGPARAM( "RenderDevice" ) ) ) - rxOptions[ nProperty].Value >>= xRenderDevice; - else if( rxOptions[ nProperty ].Name == OUString( RTL_CONSTASCII_USTRINGPARAM( "IsFirstPage" ) ) ) - rxOptions[ nProperty].Value >>= bFirstPage; - else if( rxOptions[ nProperty ].Name == OUString( RTL_CONSTASCII_USTRINGPARAM( "IsLastPage" ) ) ) - rxOptions[ nProperty].Value >>= bLastPage; - else if( rxOptions[ nProperty ].Name == OUString( RTL_CONSTASCII_USTRINGPARAM( "PageRange" ) ) ) - rxOptions[ nProperty].Value >>= aPages; - else if( rxOptions[ nProperty ].Name == OUString( RTL_CONSTASCII_USTRINGPARAM( "IsSkipEmptyPages" ) ) ) - rxOptions[ nProperty].Value >>= bSkipEmptyPages; - } - - OutputDevice* pOut = 0; - if (xRenderDevice.is()) + const bool bIsPDFExport = !lcl_SeqHasProperty( rxOptions, "IsPrinter" ); + bool bIsSwSrcView = false; + SfxViewShell *pView = GetRenderView( bIsSwSrcView, rxOptions, bIsPDFExport ); + + DBG_ASSERT( m_pRenderData, "data should have been created already in getRendererCount..." ); + DBG_ASSERT( m_pPrintUIOptions, "data should have been created already in getRendererCount..." ); + if (!bIsSwSrcView && !m_pRenderData) + m_pRenderData = new SwRenderData; + if (!m_pPrintUIOptions) + m_pPrintUIOptions = lcl_GetPrintUIOptions( pDocShell, pView ); + m_pPrintUIOptions->processProperties( rxOptions ); + const bool bPrintProspect = m_pPrintUIOptions->getBoolValue( "PrintProspect", false ); + const bool bLastPage = m_pPrintUIOptions->getBoolValue( "IsLastPage", sal_False ); + + SwDoc *pDoc = GetRenderDoc( pView, rSelection, bIsPDFExport ); + DBG_ASSERT( pDoc && pView, "doc or view shell missing!" ); + if (pDoc && pView) { - VCLXDevice* pDevice = VCLXDevice::GetImplementation( xRenderDevice ); - pOut = pDevice ? pDevice->GetOutputDevice() : 0; - } - - if(pVwSh && pOut) - { - SwPrtOptions aOptions( C2U("PDF export") ); - - const TypeId aSwWebDocShellTypeId = TYPE(SwWebDocShell); - BOOL bWeb = pDocShell->IsA( aSwWebDocShellTypeId ); - SwView::MakeOptions( NULL, aOptions, NULL, NULL, bWeb, NULL, NULL ); - - Range aPageRange( nRenderer+1, nRenderer+1 ); - MultiSelection aPage( aPageRange ); - aPage.SetTotalRange( Range( 0, RANGE_MAX ) ); - aPage.Select( aPageRange ); - aOptions.aMulti = aPage; - - //! Note: Since for PDF export of (multi-)selection a temporary - //! document is created that contains only the selects parts, - //! and thus that document is to printed in whole the, - //! aOptions.bPrintSelection parameter will be false. - aOptions.bPrintSelection = FALSE; - - SwViewOptionAdjust_Impl* pViewOptionAdjust = pView->IsA(aSwViewTypeId) ? - new SwViewOptionAdjust_Impl(*((SwView*)pView)->GetWrtShellPtr()) : 0; - - - pVwSh->SetPDFExportOption( sal_True ); - - // --> FME 2004-06-08 #i12836# enhanced pdf export - // - // First, we have to export hyperlinks, notes, and outline to pdf. - // During this process, additional information required for tagging - // the pdf file are collected, which are evaulated during painting. - // - SwWrtShell* pWrtShell = pView->IsA(aSwViewTypeId) ? - ((SwView*)pView)->GetWrtShellPtr() : - 0; - - if ( bFirstPage && pWrtShell ) + sal_Int32 nMaxRenderer = 0; + if (!bIsSwSrcView) { - SwEnhancedPDFExportHelper aHelper( *pWrtShell, *pOut, aPages, bSkipEmptyPages, sal_False ); + DBG_ASSERT( m_pRenderData, "m_pRenderData missing!!" ); + nMaxRenderer = bPrintProspect? + m_pRenderData->GetPagePairsForProspectPrinting().size() - 1 : + m_pRenderData->GetPagesToPrint().size() - 1; } - // <-- + // since SwSrcView::PrintSource is a poor implementation to get the number of pages to print + // we obmit checking of the upper bound in this case. + if (bIsSwSrcView || nRenderer <= nMaxRenderer) + { + if (bIsSwSrcView) + { + SwSrcView *pSwSrcView = dynamic_cast< SwSrcView * >(pView); + OutputDevice *pOutDev = lcl_GetOutputDevice( *m_pPrintUIOptions ); + pSwSrcView->PrintSource( pOutDev, nRenderer + 1, false ); + } + else + { + // the view shell should be SwView for documents PDF export + // or SwPagePreView for PDF export of the page preview + //!! (check for SwView first as in GuessViewShell) !! + DBG_ASSERT( pView, "!! view missing !!" ); + const TypeId aSwViewTypeId = TYPE(SwView); + ViewShell* pVwSh = 0; + if (pView) + { + pVwSh = pView->IsA(aSwViewTypeId) ? + ((SwView*)pView)->GetWrtShellPtr() : + ((SwPagePreView*)pView)->GetViewShell(); + } - pVwSh->Prt( aOptions, 0, pOut ); + // get output device to use + OutputDevice * pOut = lcl_GetOutputDevice( *m_pPrintUIOptions ); - // --> FME 2004-10-08 #i35176# - // - // After printing the last page, we take care for the links coming - // from the EditEngine. The links are generated during the painting - // process, but the destinations are still missing. - // - if ( bLastPage && pWrtShell ) - { - SwEnhancedPDFExportHelper aHelper( *pWrtShell, *pOut, aPages, bSkipEmptyPages, sal_True ); - } - // <-- + if(pVwSh && pOut && m_pRenderData->HasSwPrtOptions()) + { + const rtl::OUString aPageRange = m_pPrintUIOptions->getStringValue( "PageRange", OUString() ); + const bool bFirstPage = m_pPrintUIOptions->getBoolValue( "IsFirstPage", sal_False ); + bool bIsSkipEmptyPages = !m_pPrintUIOptions->IsPrintEmptyPages( bIsPDFExport ); + + DBG_ASSERT(( pView->IsA(aSwViewTypeId) && m_pRenderData->IsViewOptionAdjust()) + || (!pView->IsA(aSwViewTypeId) && !m_pRenderData->IsViewOptionAdjust()), + "SwView / SwViewOptionAdjust_Impl availability mismatch" ); + + // since printing now also use the API for PDF export this option + // should be set for printing as well ... + pVwSh->SetPDFExportOption( sal_True ); + + // --> FME 2004-06-08 #i12836# enhanced pdf export + // + // First, we have to export hyperlinks, notes, and outline to pdf. + // During this process, additional information required for tagging + // the pdf file are collected, which are evaulated during painting. + // + SwWrtShell* pWrtShell = pView->IsA(aSwViewTypeId) ? + ((SwView*)pView)->GetWrtShellPtr() : + 0; + + if (bIsPDFExport && bFirstPage && pWrtShell) + { + SwEnhancedPDFExportHelper aHelper( *pWrtShell, *pOut, aPageRange, bIsSkipEmptyPages, sal_False ); + } + // <-- + + const SwPrtOptions &rSwPrtOptions = *m_pRenderData->GetSwPrtOptions(); + if (bPrintProspect) + pVwSh->PrintProspect( pOut, rSwPrtOptions, nRenderer ); + else // normal printing and PDF export + pVwSh->PrintOrPDFExport( pOut, rSwPrtOptions, nRenderer ); + + // --> FME 2004-10-08 #i35176# + // + // After printing the last page, we take care for the links coming + // from the EditEngine. The links are generated during the painting + // process, but the destinations are still missing. + // + if (bIsPDFExport && bLastPage && pWrtShell) + { + SwEnhancedPDFExportHelper aHelper( *pWrtShell, *pOut, aPageRange, bIsSkipEmptyPages, sal_True ); + } + // <-- - pVwSh->SetPDFExportOption( sal_False ); - // #i96167# haggai: delete pViewOptionsAdjust here because it makes use - // of the shell, which might get destroyed in lcl_DisposeView! - delete pViewOptionAdjust; + pVwSh->SetPDFExportOption( sal_False ); - if( bLastPage && m_pHiddenViewFrame) - { - lcl_DisposeView( m_pHiddenViewFrame, pDocShell ); - m_pHiddenViewFrame = 0; + // last page to be rendered? (not necessarily the last page of the document) + // -> do clean-up of data + if (bLastPage) + { + // #i96167# haggai: delete ViewOptionsAdjust here because it makes use + // of the shell, which might get destroyed in lcl_DisposeView! + if (m_pRenderData && m_pRenderData->IsViewOptionAdjust()) + m_pRenderData->ViewOptionAdjustStop(); + + if (m_pRenderData && m_pRenderData->HasPostItData()) + m_pRenderData->DeletePostItData(); + if (m_pHiddenViewFrame) + { + lcl_DisposeView( m_pHiddenViewFrame, pDocShell ); + m_pHiddenViewFrame = 0; + } + } + } + } } } + if( bLastPage ) + { + delete m_pRenderData; m_pRenderData = NULL; + delete m_pPrintUIOptions; m_pPrintUIOptions = NULL; + } } /* -----------------------------03.10.04 ------------------------------------- @@ -3790,3 +4055,80 @@ void SwXDocumentPropertyHelper::onChange() if(m_pDoc) m_pDoc->SetModified(); } + + +/*****************************************************************************/ + +SwViewOptionAdjust_Impl::SwViewOptionAdjust_Impl( SwWrtShell& rSh, const SwViewOption &rViewOptions ) : + m_rShell( rSh ), + m_aOldViewOptions( rViewOptions ) +{ +} + + +SwViewOptionAdjust_Impl::~SwViewOptionAdjust_Impl() +{ + m_rShell.ApplyViewOptions( m_aOldViewOptions ); +} + + +void SwViewOptionAdjust_Impl::AdjustViewOptions( + const SwPrtOptions *pPrtOptions ) +{ + // to avoid unnecessary reformatting the view options related to the content + // below should only change if necessary, that is if respective content is present + const bool bContainsHiddenChars = m_rShell.GetDoc()->ContainsHiddenChars(); + const SwFieldType* pFldType = m_rShell.GetDoc()->GetSysFldType( RES_HIDDENTXTFLD ); + const bool bContainsHiddenFields = pFldType && pFldType->GetDepends(); + pFldType = m_rShell.GetDoc()->GetSysFldType( RES_HIDDENPARAFLD ); + const bool bContainsHiddenParagraphs = pFldType && pFldType->GetDepends(); + pFldType = m_rShell.GetDoc()->GetSysFldType( RES_JUMPEDITFLD ); + const bool bContainsPlaceHolders = pFldType && pFldType->GetDepends(); + const bool bContainsFields = m_rShell.IsAnyFieldInDoc(); + + SwViewOption aRenderViewOptions( m_aOldViewOptions ); + + // disable anything in the view that should not be printed (or exported to PDF) by default + // (see also dialog "Tools/Options - StarOffice Writer - Formatting Aids" + // in section "Display of ...") + aRenderViewOptions.SetParagraph( FALSE ); // paragraph end + aRenderViewOptions.SetSoftHyph( FALSE ); // aka custom hyphens + aRenderViewOptions.SetBlank( FALSE ); // spaces + aRenderViewOptions.SetHardBlank( FALSE ); // non-breaking spaces + aRenderViewOptions.SetTab( FALSE ); // tabs + aRenderViewOptions.SetLineBreak( FALSE ); // breaks (type 1) + aRenderViewOptions.SetPageBreak( FALSE ); // breaks (type 2) + aRenderViewOptions.SetColumnBreak( FALSE ); // breaks (type 3) + BOOL bVal = pPrtOptions? pPrtOptions->bPrintHiddenText : FALSE; + if (bContainsHiddenChars) + aRenderViewOptions.SetShowHiddenChar( bVal ); // hidden text + if (bContainsHiddenFields) + aRenderViewOptions.SetShowHiddenField( bVal ); + if (bContainsHiddenParagraphs) + aRenderViewOptions.SetShowHiddenPara( bVal ); + + if (bContainsPlaceHolders) + { + // should always be printed in PDF export! + bVal = pPrtOptions ? pPrtOptions->bPrintTextPlaceholder : TRUE; + aRenderViewOptions.SetShowPlaceHolderFields( bVal ); + } + + if (bContainsFields) + aRenderViewOptions.SetFldName( FALSE ); + + // we need to set this flag in order to get to see the visible effect of + // some of the above settings (needed for correct rendering) + aRenderViewOptions.SetViewMetaChars( TRUE ); + + if (m_aOldViewOptions != aRenderViewOptions) // check if reformatting is necessary + { + aRenderViewOptions.SetPrinting( pPrtOptions != NULL ); + m_rShell.ApplyViewOptions( aRenderViewOptions ); + } +} + + +/*****************************************************************************/ + + diff --git a/sw/source/ui/uno/unotxvw.cxx b/sw/source/ui/uno/unotxvw.cxx index 6197bb489d61..26feb0bf3117 100644 --- a/sw/source/ui/uno/unotxvw.cxx +++ b/sw/source/ui/uno/unotxvw.cxx @@ -721,7 +721,7 @@ uno::Reference< awt::XControl > SwXTextView::getControl(const uno::Reference< a /*-- 08.03.07 13:55------------------------------------------------------ -----------------------------------------------------------------------*/ -uno::Reference< form::XFormController > SAL_CALL SwXTextView::getFormController( const uno::Reference< form::XForm >& _Form ) throw (RuntimeException) +uno::Reference< form::runtime::XFormController > SAL_CALL SwXTextView::getFormController( const uno::Reference< form::XForm >& _Form ) throw (RuntimeException) { ::vos::OGuard aGuard( Application::GetSolarMutex() ); @@ -731,7 +731,7 @@ uno::Reference< form::XFormController > SAL_CALL SwXTextView::getFormController( Window* pWindow = pView2 ? pView2->GetWrtShell().GetWin() : NULL; DBG_ASSERT( pFormShell && pDrawView && pWindow, "SwXTextView::GetControl: how could I?" ); - uno::Reference< form::XFormController > xController; + uno::Reference< form::runtime::XFormController > xController; if ( pFormShell && pDrawView && pWindow ) xController = pFormShell->GetFormController( _Form, *pDrawView, *pWindow ); return xController; @@ -2214,5 +2214,6 @@ void SAL_CALL SwXTextView::insertTransferable( const uno::Reference< datatransfe } } } + // ----------------------------------------------------------------------------- |