/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_sw.hxx" #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern bool lcl_GetPostIts( IDocumentFieldsAccess* pIDFA, _SetGetExpFlds * pSrtLst ); using namespace ::com::sun::star; using ::rtl::OUString; ////////////////////////////////////////////////////////////////////// SwRenderData::SwRenderData() { m_pPostItFields = 0; m_pPostItDoc = 0; m_pPostItShell = 0; m_pViewOptionAdjust = 0; m_pPrtOptions = 0; } 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" ); } 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; m_pPostItDoc->acquire(); //!! 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( sal_False ); m_pPostItShell = new ViewShell( *m_pPostItDoc, 0, &aViewOpt, pOutDev ); } void SwRenderData::DeletePostItData() { if (HasPostItData()) { m_pPostItDoc->setPrinter( 0, false, false ); // damit am echten DOC der Drucker bleibt delete m_pPostItShell; m_pPostItShell = 0; delete m_pPostItFields; m_pPostItFields = 0; if ( !m_pPostItDoc->release() ) { delete m_pPostItDoc; } m_pPostItDoc = 0; } } bool SwRenderData::NeedNewViewOptionAdjust( const ViewShell& rCompare ) const { return m_pViewOptionAdjust ? ! m_pViewOptionAdjust->checkShell( rCompare ) : true; } void SwRenderData::ViewOptionAdjustStart( ViewShell &rSh, const SwViewOption &rViewOptions ) { if (m_pViewOptionAdjust) { DBG_ASSERT( 0, "error: there should be no ViewOptionAdjust active when calling this function" ); } m_pViewOptionAdjust = new SwViewOptionAdjust_Impl( rSh, rViewOptions ); } void SwRenderData::ViewOptionAdjust(SwPrintData const*const pPrtOptions) { m_pViewOptionAdjust->AdjustViewOptions( pPrtOptions ); } void SwRenderData::ViewOptionAdjustStop() { if (m_pViewOptionAdjust) { delete m_pViewOptionAdjust; m_pViewOptionAdjust = 0; } } void SwRenderData::MakeSwPrtOptions( SwPrintData & rOptions, const SwDocShell *pDocShell, const SwPrintUIOptions *pOpt, const SwRenderData *pData, bool bIsPDFExport ) { if (!pDocShell || !pOpt || !pData) return; // get default print options const TypeId aSwWebDocShellTypeId = TYPE(SwWebDocShell); sal_Bool bWeb = pDocShell->IsA( aSwWebDocShellTypeId ); ::sw::InitPrintOptionsFromApplication(rOptions, 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 ); } ////////////////////////////////////////////////////////////////////// SwPrintUIOptions::SwPrintUIOptions( bool bWeb, bool bSwSrcView, bool bHasSelection, bool bHasPostIts, const SwPrintData &rDefaultPrintData ) : m_pLast( NULL ), m_rDefaultPrintData( rDefaultPrintData ) { ResStringArray aLocalizedStrings( SW_RES( STR_PRINTOPTUI ) ); DBG_ASSERT( aLocalizedStrings.Count() >= 30, "resource incomplete" ); if( aLocalizedStrings.Count() < 30 ) // bad resource ? return; // printing HTML sources does not have any valid UI options. // It's just the source code that gets printed... if (bSwSrcView) { m_aUIProperties.realloc( 0 ); return; } // 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( RTL_CONSTASCII_USTRINGPARAM( ".HelpID:vcl:PrintDialog:TabPage:AppPage" ) ) ); // 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 ), rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".HelpID:vcl:PrintDialog:PrintPageBackground:CheckBox" ) ), 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( 3 ), rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".HelpID:vcl:PrintDialog:PrintPicturesAndObjects:CheckBox" ) ), 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( 4 ), rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".HelpID:vcl:PrintDialog:PrintHiddenText:CheckBox" ) ), rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintHiddenText" ) ), bDefaultVal ); // create a bool option for place holder bDefaultVal = rDefaultPrintData.IsPrintTextPlaceholder(); m_aUIProperties[ nIdx++ ].Value = getBoolControlOpt( aLocalizedStrings.GetString( 5 ), rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".HelpID:vcl:PrintDialog:PrintTextPlaceholder:CheckBox" ) ), rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintTextPlaceholder" ) ), bDefaultVal ); } // create a bool option for controls bDefaultVal = rDefaultPrintData.IsPrintControl(); m_aUIProperties[ nIdx++ ].Value = getBoolControlOpt( aLocalizedStrings.GetString( 6 ), rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".HelpID:vcl:PrintDialog:PrintControls:CheckBox" ) ), rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintControls" ) ), bDefaultVal ); // create sub section for Color m_aUIProperties[ nIdx++ ].Value = getSubgroupControlOpt( aLocalizedStrings.GetString( 7 ), rtl::OUString() ); // create a bool option for printing text with black font color bDefaultVal = rDefaultPrintData.IsPrintBlackFont(); m_aUIProperties[ nIdx++ ].Value = getBoolControlOpt( aLocalizedStrings.GetString( 8 ), rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".HelpID:vcl:PrintDialog:PrintBlackFonts:CheckBox" ) ), rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintBlackFonts" ) ), bDefaultVal ); if (!bWeb) { // create subgroup for misc options m_aUIProperties[ nIdx++ ].Value = getSubgroupControlOpt( rtl::OUString( aLocalizedStrings.GetString( 9 ) ), rtl::OUString() ); // create a bool option for printing automatically inserted blank pages bDefaultVal = rDefaultPrintData.IsPrintEmptyPages(); m_aUIProperties[ nIdx++ ].Value = getBoolControlOpt( aLocalizedStrings.GetString( 10 ), rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".HelpID:vcl:PrintDialog:PrintEmptyPages:CheckBox" ) ), rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintEmptyPages" ) ), bDefaultVal ); } // 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( 11 ), rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".HelpID:vcl:PrintDialog:PrintPaperFromSetup:CheckBox" ) ), 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( 26 ) ), rtl::OUString(), aPrintRangeOpt ); // create a choice for the content to create rtl::OUString aPrintRangeName( RTL_CONSTASCII_USTRINGPARAM( "PrintContent" ) ); uno::Sequence< rtl::OUString > aChoices( 3 ); uno::Sequence< sal_Bool > aChoicesDisabled( 3 ); uno::Sequence< rtl::OUString > aHelpIds( 3 ); aChoices[0] = aLocalizedStrings.GetString( 27 ); aChoicesDisabled[0] = sal_False; aHelpIds[0] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".HelpID:vcl:PrintDialog:PrintContent:RadioButton:0" ) ); aChoices[1] = aLocalizedStrings.GetString( 28 ); aChoicesDisabled[1] = sal_False; aHelpIds[1] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".HelpID:vcl:PrintDialog:PrintContent:RadioButton:1" ) ); aChoices[2] = aLocalizedStrings.GetString( 29 ); aChoicesDisabled[2] = sal_Bool(! bHasSelection); aHelpIds[2] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".HelpID:vcl:PrintDialog:PrintContent:RadioButton:2" ) ); m_aUIProperties[nIdx++].Value = getChoiceControlOpt( rtl::OUString(), aHelpIds, aPrintRangeName, aChoices, bHasSelection ? 2 /*enable 'Selection' radio button*/ : 0 /* enable 'All pages' */, rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Radio" ) ), aChoicesDisabled ); // 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_CONSTASCII_USTRINGPARAM( ".HelpID:vcl:PrintDialog:PageRange:Edit" ) ), 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( 12 ) ), rtl::OUString(), aContentsOpt ); // create a list box for notes content const sal_Int16 nPrintPostIts = rDefaultPrintData.GetPrintPostIts(); aChoices.realloc( 4 ); aChoices[0] = aLocalizedStrings.GetString( 13 ); aChoices[1] = aLocalizedStrings.GetString( 14 ); aChoices[2] = aLocalizedStrings.GetString( 15 ); aChoices[3] = aLocalizedStrings.GetString( 16 ); aHelpIds.realloc( 2 ); aHelpIds[0] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".HelpID:vcl:PrintDialog:PrintAnnotationMode:FixedText" ) ); aHelpIds[1] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".HelpID:vcl:PrintDialog:PrintAnnotationMode:ListBox" ) ); vcl::PrinterOptionsHelper::UIControlOptions aAnnotOpt( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintProspect" ) ), 0, sal_False ); aAnnotOpt.mbEnabled = bHasPostIts; m_aUIProperties[ nIdx++ ].Value = getChoiceControlOpt( aLocalizedStrings.GetString( 17 ), aHelpIds, rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintAnnotationMode" ) ), aChoices, nPrintPostIts, rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "List" ) ), uno::Sequence< sal_Bool >(), 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( 18 ) ), rtl::OUString(), aPageSetOpt ); uno::Sequence< rtl::OUString > aRLChoices( 3 ); aRLChoices[0] = aLocalizedStrings.GetString( 19 ); aRLChoices[1] = aLocalizedStrings.GetString( 20 ); aRLChoices[2] = aLocalizedStrings.GetString( 21 ); uno::Sequence< rtl::OUString > aRLHelp( 1 ); aRLHelp[0] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".HelpID:vcl:PrintDialog:PrintLeftRightPages:ListBox" ) ); // 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( 22 ), aRLHelp, rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintLeftRightPages" ) ), aRLChoices, nPagesChoice, rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "List" ) ) ); } // create a bool option for brochure bDefaultVal = rDefaultPrintData.IsPrintProspect(); rtl::OUString aBrochurePropertyName( RTL_CONSTASCII_USTRINGPARAM( "PrintProspect" ) ); m_aUIProperties[ nIdx++ ].Value = getBoolControlOpt( aLocalizedStrings.GetString( 23 ), rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".HelpID:vcl:PrintDialog:PrintProspect:CheckBox" ) ), aBrochurePropertyName, bDefaultVal, aPageSetOpt ); if (bCTL) { // create a bool option for brochure RTL dependent on brochure uno::Sequence< rtl::OUString > aBRTLChoices( 2 ); aBRTLChoices[0] = aLocalizedStrings.GetString( 24 ); aBRTLChoices[1] = aLocalizedStrings.GetString( 25 ); vcl::PrinterOptionsHelper::UIControlOptions aBrochureRTLOpt( aBrochurePropertyName, -1, sal_True ); uno::Sequence< rtl::OUString > aBRTLHelpIds( 1 ); aBRTLHelpIds[0] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".HelpID:vcl:PrintDialog:PrintProspectRTL:ListBox" ) ); 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(), aBRTLHelpIds, rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintProspectRTL" ) ), aBRTLChoices, nBRTLChoice, rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "List" ) ), uno::Sequence< sal_Bool >(), aBrochureRTLOpt ); } DBG_ASSERT( nIdx == nNumProps, "number of added properties is not as expected" ); } SwPrintUIOptions::~SwPrintUIOptions() { } bool SwPrintUIOptions::IsPrintLeftPages() 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) // 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; } 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) 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; } bool SwPrintUIOptions::IsPrintEmptyPages( bool bIsPDFExport ) const { // take care of different property names for the option. bool bRes = bIsPDFExport ? !getBoolValue( "IsSkipEmptyPages", sal_True ) : getBoolValue( "PrintEmptyPages", sal_True ); return bRes; } 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; } 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; } bool SwPrintUIOptions::IsPrintDrawings() 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( "PrintDrawings", bRes ); return bRes; } bool SwPrintUIOptions::processPropertiesAndCheckFormat( const uno::Sequence< beans::PropertyValue >& i_rNewProp ) { bool bChanged = processProperties( i_rNewProp ); uno::Reference< awt::XDevice > xRenderDevice; uno::Any aVal( getValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "RenderDevice" ) ) ) ); aVal >>= xRenderDevice; OutputDevice* pOut = 0; if (xRenderDevice.is()) { VCLXDevice* pDevice = VCLXDevice::GetImplementation( xRenderDevice ); pOut = pDevice ? pDevice->GetOutputDevice() : 0; } bChanged = bChanged || (pOut != m_pLast); if( pOut ) m_pLast = pOut; return bChanged; } //////////////////////////////////////////////////////////////////////