diff options
Diffstat (limited to 'sd/source/ui/view/DocumentRenderer.cxx')
-rw-r--r-- | sd/source/ui/view/DocumentRenderer.cxx | 2413 |
1 files changed, 0 insertions, 2413 deletions
diff --git a/sd/source/ui/view/DocumentRenderer.cxx b/sd/source/ui/view/DocumentRenderer.cxx deleted file mode 100644 index 758e5ed85..000000000 --- a/sd/source/ui/view/DocumentRenderer.cxx +++ /dev/null @@ -1,2413 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#include "precompiled_sd.hxx" - -#include <com/sun/star/beans/XPropertySet.hpp> - -#include "DocumentRenderer.hxx" -#include "DocumentRenderer.hrc" - -#include "drawdoc.hxx" -#include "optsitem.hxx" -#include "sdresid.hxx" -#include "strings.hrc" -#include "sdattr.hxx" -#include "Window.hxx" -#include "drawview.hxx" -#include "DrawViewShell.hxx" -#include "FrameView.hxx" -#include "Outliner.hxx" -#include "OutlineViewShell.hxx" - -#include <basegfx/polygon/b2dpolygon.hxx> -#include <basegfx/polygon/b2dpolypolygon.hxx> -#include <basegfx/matrix/b2dhommatrix.hxx> -#include <sfx2/printer.hxx> -#include <editeng/editstat.hxx> -#include <editeng/outlobj.hxx> -#include <svx/svdetc.hxx> -#include <svx/svditer.hxx> -#include <svx/svdopage.hxx> -#include <svx/svdopath.hxx> -#include <svx/xlnclit.hxx> -#include <toolkit/awt/vclxdevice.hxx> -#include <tools/resary.hxx> -#include <unotools/localedatawrapper.hxx> -#include <vcl/msgbox.hxx> -#include <unotools/moduleoptions.hxx> - -#include <vector> - -using namespace ::com::sun::star; -using namespace ::com::sun::star::uno; -using ::rtl::OUString; - - -namespace sd { - -namespace { - OUString A2S (const char* pString) - { - return OUString::createFromAscii(pString); - } - - - - /** Convenience class to extract values from the sequence of properties - given to one of the XRenderable methods. - */ - class PrintOptions - { - public: - PrintOptions ( - const vcl::PrinterOptionsHelper& rHelper, - const ::std::vector<sal_Int32>& rSlidesPerPage) - : mrProperties(rHelper), - maSlidesPerPage(rSlidesPerPage) - { - } - - bool IsWarningOrientation (void) const - { - return GetBoolValue(NULL, true); - } - - bool IsPrintPageName (void) const - { - return GetBoolValue("IsPrintName"); - } - - bool IsDate (void) const - { - return GetBoolValue("IsPrintDateTime"); - } - - bool IsTime (void) const - { - return GetBoolValue("IsPrintDateTime"); - } - - bool IsHiddenPages (void) const - { - return GetBoolValue("IsPrintHidden"); - } - - bool IsHandoutHorizontal (void) const - { - return GetBoolValue("SlidesPerPageOrder", sal_Int32(0), true); - } - - sal_Int32 GetHandoutPageCount (void) const - { - sal_uInt32 nIndex = static_cast<sal_Int32>(mrProperties.getIntValue("SlidesPerPage", sal_Int32(0))); - if (nIndex<maSlidesPerPage.size()) - return maSlidesPerPage[nIndex]; - else if ( ! maSlidesPerPage.empty()) - return maSlidesPerPage[0]; - else - return 0; - } - - bool IsDraw (void) const - { - return GetBoolValue("PageContentType", sal_Int32(0)); - } - - bool IsHandout (void) const - { - return GetBoolValue("PageContentType", sal_Int32(1)); - } - - bool IsNotes (void) const - { - return GetBoolValue("PageContentType", sal_Int32(2)); - } - - bool IsOutline (void) const - { - return GetBoolValue("PageContentType", sal_Int32(3)); - } - - sal_uLong GetOutputQuality (void) const - { - sal_Int32 nQuality = static_cast<sal_Int32>(mrProperties.getIntValue( "Quality", sal_Int32(0) )); - return nQuality; - } - - bool IsPageSize (void) const - { - return GetBoolValue("PageOptions", sal_Int32(1)); - } - - bool IsTilePage (void) const - { - return GetBoolValue("PageOptions", sal_Int32(2)) || GetBoolValue("PageOptions", sal_Int32(3)); - } - - bool IsCutPage (void) const - { - return GetBoolValue("PageOptions", sal_Int32(0)); - } - - bool IsBooklet (void) const - { - return GetBoolValue("PrintProspect", false); - } - - bool IsPrintExcluded (void) const - { - return (IsNotes() || IsDraw() || IsHandout()) && IsHiddenPages(); - } - - bool IsPrintFrontPage (void) const - { - sal_Int32 nInclude = static_cast<sal_Int32>(mrProperties.getIntValue( "PrintProspectInclude", 0 )); - return nInclude == 0 || nInclude == 1; - } - - bool IsPrintBackPage (void) const - { - sal_Int32 nInclude = static_cast<sal_Int32>(mrProperties.getIntValue( "PrintProspectInclude", 0 )); - return nInclude == 0 || nInclude == 2; - } - - bool IsPaperBin (void) const - { - return GetBoolValue("PrintPaperFromSetup", false); - } - - OUString GetPrinterSelection (void) const - { - sal_Int32 nContent = static_cast<sal_Int32>(mrProperties.getIntValue( "PrintContent", 0 )); - OUString sValue( A2S("all") ); - if( nContent == 1 ) - sValue = mrProperties.getStringValue( "PageRange", A2S( "all" ) ); - else if( nContent == 2 ) - sValue = A2S( "selection" ); - return sValue; - } - - private: - const vcl::PrinterOptionsHelper& mrProperties; - const ::std::vector<sal_Int32> maSlidesPerPage; - - /** When the value of the property with name pName is a boolean then - return its value. When the property is unknown then - bDefaultValue is returned. Otherwise <FALSE/> is returned. - */ - bool GetBoolValue ( - const sal_Char* pName, - const bool bDefaultValue = false) const - { - sal_Bool bValue = mrProperties.getBoolValue( pName, bDefaultValue ); - return bValue; - } - - /** Return <TRUE/> when the value of the property with name pName is - a string and its value equals pValue. When the property is - unknown then bDefaultValue is returned. Otherwise <FALSE/> is - returned. - */ - bool GetBoolValue ( - const sal_Char* pName, - const sal_Char* pValue, - const bool bDefaultValue = false) const - { - OUString sValue( mrProperties.getStringValue( pName ) ); - if (sValue.getLength()) - return sValue.equalsAscii(pValue); - else - return bDefaultValue; - } - - /** Return <TRUE/> when the value of the property with name pName is - an integer and its value is nTriggerValue. Otherwise <FALSE/> is - returned. - */ - bool GetBoolValue ( - const sal_Char* pName, - const sal_Int32 nTriggerValue) const - { - sal_Int32 nValue = static_cast<sal_Int32>(mrProperties.getIntValue( pName )); - return nValue == nTriggerValue; - } - }; - - - - /** This class is like MultiSelection but understands two special values. - "all" indicates that all pages are selected. "selection" indicates that no - pages but a set of shapes is selected. - */ - class Selection - { - public: - Selection (const OUString& rsSelection, const SdPage* pCurrentPage) - : mbAreAllPagesSelected(rsSelection.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("all"))), - mbIsShapeSelection(rsSelection.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("selection"))), - mnCurrentPageIndex(pCurrentPage!=NULL ? (pCurrentPage->GetPageNum()-1)/2 : -1), - mpSelectedPages() - { - if ( ! (mbAreAllPagesSelected || mbIsShapeSelection)) - mpSelectedPages.reset(new MultiSelection(rsSelection)); - } - - bool IsMarkedOnly (void) const - { - return mbIsShapeSelection; - } - - /** Call with a 0 based page index. - */ - bool IsSelected (const sal_Int32 nIndex) const - { - if (mbAreAllPagesSelected) - return true; - else if (mpSelectedPages) - return mpSelectedPages->IsSelected(nIndex+1); - else if (mbIsShapeSelection && nIndex==mnCurrentPageIndex) - return true; - else - return false; - } - - private: - const bool mbAreAllPagesSelected; - const bool mbIsShapeSelection; - const sal_Int32 mnCurrentPageIndex; - ::boost::scoped_ptr<MultiSelection> mpSelectedPages; - }; - - /** A collection of values that helps to reduce the number of arguments - given to some functions. Note that not all values are set at the - same time. - */ - class PrintInfo - { - public: - PrintInfo ( - const Printer* pPrinter, - const OUString& rsPrinterSelection, - const ::boost::shared_ptr<ViewShell> pView) - : mpPrinter(pPrinter), - mnDrawMode(DRAWMODE_DEFAULT), - msTimeDate(), - msPageString(), - maPrintSize(0,0), - maPageSize(0,0), - meOrientation(ORIENTATION_PORTRAIT), - maMap(), - maSelection(rsPrinterSelection, pView ? pView->getCurrentPage() : NULL), - mbPrintMarkedOnly(maSelection.IsMarkedOnly()) - {} - - const Printer* mpPrinter; - sal_uLong mnDrawMode; - ::rtl::OUString msTimeDate; - ::rtl::OUString msPageString; - Size maPrintSize; - Size maPageSize; - Orientation meOrientation; - MapMode maMap; - const Selection maSelection; - bool mbPrintMarkedOnly; - }; - - - - /** Output one page of the document to the given printer. Note that - more than one document page may be output to one printer page. - */ - void PrintPage ( - Printer& rPrinter, - ::sd::View& rPrintView, - SdPage& rPage, - View* pView, - const bool bPrintMarkedOnly, - const SetOfByte& rVisibleLayers, - const SetOfByte& rPrintableLayers) - { - rPrintView.ShowSdrPage(&rPage); - - const MapMode aOriginalMapMode (rPrinter.GetMapMode()); - - // Set the visible layers - SdrPageView* pPageView = rPrintView.GetSdrPageView(); - OSL_ASSERT(pPageView!=NULL); - pPageView->SetVisibleLayers(rVisibleLayers); - pPageView->SetPrintableLayers(rPrintableLayers); - - if (pView!=NULL && bPrintMarkedOnly) - pView->DrawMarkedObj(rPrinter); - else - rPrintView.CompleteRedraw(&rPrinter, Rectangle(Point(0,0), rPage.GetSize())); - - rPrinter.SetMapMode(aOriginalMapMode); - - rPrintView.HideSdrPage(); - } - - - - - /** Output a string (that typically is not part of a document page) to - the given printer. - */ - void PrintMessage ( - Printer& rPrinter, - const ::rtl::OUString& rsPageString, - const Point& rPageStringOffset) - { - const Font aOriginalFont (rPrinter.OutputDevice::GetFont()); - rPrinter.SetFont(Font(FAMILY_SWISS, Size(0, 423))); - rPrinter.DrawText(rPageStringOffset, rsPageString); - rPrinter.SetFont(aOriginalFont); - } - - - - - /** Read the resource file and process it into a sequence of properties - that can be passed to the printing dialog. - */ - class DialogCreator : Resource - { - public: - DialogCreator (bool bImpress) - : Resource(SdResId(_STR_IMPRESS_PRINT_UI_OPTIONS)) - , mbImpress(bImpress) - { - ProcessResource(); - } - - Sequence< beans::PropertyValue > GetDialogControls(void) const - { - if (maProperties.empty()) - return Sequence< beans::PropertyValue >(); - else - { - return Sequence<beans::PropertyValue>( - &maProperties.front(), - maProperties.size()); - } - } - - ::std::vector<sal_Int32> GetSlidesPerPage (void) const - { - return maSlidesPerPage; - } - - private: - Any maDialog; - ::std::vector<beans::PropertyValue> maProperties; - ::std::vector<sal_Int32> maSlidesPerPage; - bool mbImpress; - - void ProcessResource (void) - { - SvtModuleOptions aOpt; - String aAppGroupname( String( SdResId( _STR_IMPRESS_PRINT_UI_GROUP_NAME ) ) ); - aAppGroupname.SearchAndReplace( String( RTL_CONSTASCII_USTRINGPARAM( "%s" ) ), - aOpt.GetModuleName( mbImpress ? SvtModuleOptions::E_SIMPRESS : SvtModuleOptions::E_SDRAW ) ); - AddDialogControl( vcl::PrinterOptionsHelper::getGroupControlOpt( - aAppGroupname, - rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".HelpID:vcl:PrintDialog:TabPage:AppPage" ) ) - ) ); - - uno::Sequence< rtl::OUString > aHelpIds; - if( mbImpress ) - { - vcl::PrinterOptionsHelper::UIControlOptions aPrintOpt; - aPrintOpt.maGroupHint = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "JobPage" ) ); - AddDialogControl( vcl::PrinterOptionsHelper::getSubgroupControlOpt( - String( SdResId(_STR_IMPRESS_PRINT_UI_PRINT_GROUP) ), - rtl::OUString(), - aPrintOpt ) - ); - - aHelpIds.realloc( 1 ); - aHelpIds[0] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".HelpID:vcl:PrintDialog:PageContentType:ListBox" ) ); - AddDialogControl( vcl::PrinterOptionsHelper::getChoiceControlOpt( - String( SdResId( _STR_IMPRESS_PRINT_UI_CONTENT ) ), - aHelpIds, - OUString( RTL_CONSTASCII_USTRINGPARAM( "PageContentType" ) ), - CreateChoice(_STR_IMPRESS_PRINT_UI_CONTENT_CHOICES), - 0, - OUString( RTL_CONSTASCII_USTRINGPARAM( "List" ) ) - ) - ); - - aHelpIds[0] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".HelpID:vcl:PrintDialog:SlidesPerPage:ListBox" ) ); - vcl::PrinterOptionsHelper::UIControlOptions - aContentOpt( OUString( RTL_CONSTASCII_USTRINGPARAM( "PageContentType" ) ), 1 ); - AddDialogControl( vcl::PrinterOptionsHelper::getChoiceControlOpt( - String( SdResId( _STR_IMPRESS_PRINT_UI_SLIDESPERPAGE ) ), - aHelpIds, - OUString( RTL_CONSTASCII_USTRINGPARAM( "SlidesPerPage" ) ), - GetSlidesPerPageSequence(), - 0, - OUString( RTL_CONSTASCII_USTRINGPARAM( "List" ) ), - Sequence< sal_Bool >(), - aContentOpt - ) - ); - - aHelpIds[0] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".HelpID:vcl:PrintDialog:SlidesPerPageOrder:ListBox" ) ); - vcl::PrinterOptionsHelper::UIControlOptions - aSlidesPerPageOpt( OUString( RTL_CONSTASCII_USTRINGPARAM( "SlidesPerPage" ) ), -1, sal_True ); - AddDialogControl( vcl::PrinterOptionsHelper::getChoiceControlOpt( - String( SdResId( _STR_IMPRESS_PRINT_UI_ORDER ) ), - aHelpIds, - OUString( RTL_CONSTASCII_USTRINGPARAM( "SlidesPerPageOrder" ) ), - CreateChoice(_STR_IMPRESS_PRINT_UI_ORDER_CHOICES), - 0, - OUString( RTL_CONSTASCII_USTRINGPARAM( "List" ) ), - Sequence< sal_Bool >(), - aSlidesPerPageOpt ) - ); - } - - AddDialogControl( vcl::PrinterOptionsHelper::getSubgroupControlOpt( - String( SdResId(_STR_IMPRESS_PRINT_UI_INCLUDE_CONTENT) ), rtl::OUString() ) ); - - - if( mbImpress ) - { - AddDialogControl( vcl::PrinterOptionsHelper::getBoolControlOpt( - String( SdResId(_STR_IMPRESS_PRINT_UI_IS_PRINT_NAME) ), - OUString( RTL_CONSTASCII_USTRINGPARAM( ".HelpID:vcl:PrintDialog:IsPrintName:CheckBox" ) ), - OUString( RTL_CONSTASCII_USTRINGPARAM( "IsPrintName" ) ), - sal_False - ) - ); - } - else - { - AddDialogControl( vcl::PrinterOptionsHelper::getBoolControlOpt( - String( SdResId(_STR_DRAW_PRINT_UI_IS_PRINT_NAME) ), - OUString( RTL_CONSTASCII_USTRINGPARAM( ".HelpID:vcl:PrintDialog:IsPrintName:CheckBox" ) ), - OUString( RTL_CONSTASCII_USTRINGPARAM( "IsPrintName" ) ), - sal_False - ) - ); - } - - AddDialogControl( vcl::PrinterOptionsHelper::getBoolControlOpt( - String( SdResId(_STR_IMPRESS_PRINT_UI_IS_PRINT_DATE) ), - OUString( RTL_CONSTASCII_USTRINGPARAM( ".HelpID:vcl:PrintDialog:IsPrintDateTime:CheckBox" ) ), - OUString( RTL_CONSTASCII_USTRINGPARAM( "IsPrintDateTime" ) ), - sal_False - ) - ); - - if( mbImpress ) - { - AddDialogControl( vcl::PrinterOptionsHelper::getBoolControlOpt( - String( SdResId(_STR_IMPRESS_PRINT_UI_IS_PRINT_HIDDEN) ), - OUString( RTL_CONSTASCII_USTRINGPARAM( ".HelpID:vcl:PrintDialog:IsPrintHidden:CheckBox" ) ), - OUString( RTL_CONSTASCII_USTRINGPARAM( "IsPrintHidden" ) ), - sal_False - ) - ); - } - - AddDialogControl( vcl::PrinterOptionsHelper::getSubgroupControlOpt( - String( SdResId(_STR_IMPRESS_PRINT_UI_QUALITY) ), rtl::OUString() ) ); - - aHelpIds.realloc( 3 ); - aHelpIds[0] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".HelpID:vcl:PrintDialog:Quality:RadioButton:0" ) ); - aHelpIds[1] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".HelpID:vcl:PrintDialog:Quality:RadioButton:1" ) ); - aHelpIds[2] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".HelpID:vcl:PrintDialog:Quality:RadioButton:2" ) ); - AddDialogControl( vcl::PrinterOptionsHelper::getChoiceControlOpt( - rtl::OUString(), - aHelpIds, - OUString( RTL_CONSTASCII_USTRINGPARAM( "Quality" ) ), - CreateChoice(_STR_IMPRESS_PRINT_UI_QUALITY_CHOICES), - 0 - ) - ); - - AddDialogControl( vcl::PrinterOptionsHelper::getSubgroupControlOpt( - String( SdResId(_STR_IMPRESS_PRINT_UI_PAGE_OPTIONS) ), rtl::OUString() ) ); - - aHelpIds.realloc( 4 ); - aHelpIds[0] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".HelpID:vcl:PrintDialog:PageOptions:RadioButton:0" ) ); - aHelpIds[1] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".HelpID:vcl:PrintDialog:PageOptions:RadioButton:1" ) ); - aHelpIds[2] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".HelpID:vcl:PrintDialog:PageOptions:RadioButton:2" ) ); - aHelpIds[3] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".HelpID:vcl:PrintDialog:PageOptions:RadioButton:3" ) ); - if( mbImpress ) - { - // FIXME: additional dependency on PrintProspect = false - vcl::PrinterOptionsHelper::UIControlOptions - aPageOptionsOpt( OUString( RTL_CONSTASCII_USTRINGPARAM( "PageContentType" ) ), 0 ); - AddDialogControl( vcl::PrinterOptionsHelper::getChoiceControlOpt( - rtl::OUString(), - aHelpIds, - OUString( RTL_CONSTASCII_USTRINGPARAM( "PageOptions" ) ), - CreateChoice(_STR_IMPRESS_PRINT_UI_PAGE_OPTIONS_CHOICES), - 0, - OUString( RTL_CONSTASCII_USTRINGPARAM( "Radio" ) ), - Sequence< sal_Bool >(), - aPageOptionsOpt - ) - ); - } - else - { - vcl::PrinterOptionsHelper::UIControlOptions - aPageOptionsOpt( OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintProspect" ) ), sal_False ); - AddDialogControl( vcl::PrinterOptionsHelper::getChoiceControlOpt( - rtl::OUString(), - aHelpIds, - OUString( RTL_CONSTASCII_USTRINGPARAM( "PageOptions" ) ), - CreateChoice(_STR_IMPRESS_PRINT_UI_PAGE_OPTIONS_CHOICES_DRAW), - 0, - OUString( RTL_CONSTASCII_USTRINGPARAM( "Radio" ) ), - Sequence< sal_Bool >(), - aPageOptionsOpt - ) - ); - } - - vcl::PrinterOptionsHelper::UIControlOptions aBrochureOpt; - aBrochureOpt.maGroupHint = OUString( RTL_CONSTASCII_USTRINGPARAM( "LayoutPage" ) ); - AddDialogControl( vcl::PrinterOptionsHelper::getSubgroupControlOpt( - String( SdResId(_STR_IMPRESS_PRINT_UI_PAGE_SIDES) ), rtl::OUString(), - aBrochureOpt ) ); - - // brochure printing - AddDialogControl( vcl::PrinterOptionsHelper::getBoolControlOpt( - String( SdResId(_STR_IMPRESS_PRINT_UI_BROCHURE) ), - rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".HelpID:vcl:PrintDialog:PrintProspect:CheckBox" ) ), - OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintProspect" ) ), - sal_False, - aBrochureOpt - ) - ); - - vcl::PrinterOptionsHelper::UIControlOptions - aIncludeOpt( OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintProspect" ) ), -1, sal_False ); - aIncludeOpt.maGroupHint = OUString( RTL_CONSTASCII_USTRINGPARAM( "LayoutPage" ) ); - aHelpIds.realloc( 1 ); - aHelpIds[0] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".HelpID:vcl:PrintDialog:PrintProspectInclude:ListBox" ) ); - AddDialogControl( vcl::PrinterOptionsHelper::getChoiceControlOpt( - String( SdResId(_STR_IMPRESS_PRINT_UI_BROCHURE_INCLUDE) ), - aHelpIds, - OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintProspectInclude" ) ), - CreateChoice(_STR_IMPRESS_PRINT_UI_BROCHURE_INCLUDE_LIST), - 0, - OUString( RTL_CONSTASCII_USTRINGPARAM( "List" ) ), - Sequence< sal_Bool >(), - aIncludeOpt - ) - ); - - // paper tray (on options page) - vcl::PrinterOptionsHelper::UIControlOptions aPaperTrayOpt; - aPaperTrayOpt.maGroupHint = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "OptionsPageOptGroup" ) ); - AddDialogControl( vcl::PrinterOptionsHelper::getBoolControlOpt( - String( SdResId(_STR_IMPRESS_PRINT_UI_PAPER_TRAY) ), - rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".HelpID:vcl:PrintDialog:PrintPaperFromSetup:CheckBox" ) ), - OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintPaperFromSetup" ) ), - sal_False, - aPaperTrayOpt - ) - ); - // print range selection - vcl::PrinterOptionsHelper::UIControlOptions aPrintRangeOpt; - aPrintRangeOpt.mbInternalOnly = sal_True; - aPrintRangeOpt.maGroupHint = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintRange" ) ); - AddDialogControl( vcl::PrinterOptionsHelper::getSubgroupControlOpt( - String( SdResId( _STR_IMPRESS_PRINT_UI_PAGE_RANGE ) ), - rtl::OUString(), - aPrintRangeOpt ) - ); - - // create a choice for the content to create - rtl::OUString aPrintRangeName( RTL_CONSTASCII_USTRINGPARAM( "PrintContent" ) ); - aHelpIds.realloc( 3 ); - aHelpIds[0] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".HelpID:vcl:PrintDialog:PrintContent:RadioButton:0" ) ); - aHelpIds[1] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".HelpID:vcl:PrintDialog:PrintContent:RadioButton:1" ) ); - aHelpIds[2] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".HelpID:vcl:PrintDialog:PrintContent:RadioButton:2" ) ); - AddDialogControl( vcl::PrinterOptionsHelper::getChoiceControlOpt( rtl::OUString(), - aHelpIds, - aPrintRangeName, - CreateChoice(mbImpress - ? _STR_IMPRESS_PRINT_UI_PAGE_RANGE_CHOICE - : _STR_DRAW_PRINT_UI_PAGE_RANGE_CHOICE), - 0 ) - ); - // create a an Edit dependent on "Pages" selected - vcl::PrinterOptionsHelper::UIControlOptions aPageRangeOpt( aPrintRangeName, 1, sal_True ); - AddDialogControl( vcl::PrinterOptionsHelper::getEditControlOpt( rtl::OUString(), - rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".HelpID:vcl:PrintDialog:PageRange:Edit" ) ), - rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PageRange" ) ), - rtl::OUString(), - aPageRangeOpt ) - ); - - FreeResource(); - } - - void AddDialogControl( const Any& i_rCtrl ) - { - beans::PropertyValue aVal; - aVal.Value = i_rCtrl; - maProperties.push_back( aVal ); - } - - Sequence<rtl::OUString> CreateChoice (const sal_uInt16 nResourceId) const - { - SdResId aResourceId (nResourceId); - ResStringArray aChoiceStrings (aResourceId); - - const sal_uInt32 nCount (aChoiceStrings.Count()); - Sequence<rtl::OUString> aChoices (nCount); - for (sal_uInt32 nIndex=0; nIndex<nCount; ++nIndex) - aChoices[nIndex] = aChoiceStrings.GetString(nIndex); - - return aChoices; - } - - Sequence<rtl::OUString> GetSlidesPerPageSequence (void) - { - const Sequence<rtl::OUString> aChoice ( - CreateChoice(_STR_IMPRESS_PRINT_UI_SLIDESPERPAGE_CHOICES)); - maSlidesPerPage.clear(); - maSlidesPerPage.push_back(0); // first is using the default - for (sal_Int32 nIndex=1,nCount=aChoice.getLength(); nIndex<nCount; ++nIndex) - maSlidesPerPage.push_back(aChoice[nIndex].toInt32()); - return aChoice; - } - }; - - - - - /** The Prepare... methods of the DocumentRenderer::Implementation class - create a set of PrinterPage objects that contain all necessary - information to do the actual printing. There is one PrinterPage - object per printed page. Derived classes implement the actual, mode - specific printing. - - This and all derived classes support the asynchronous printing - process by not storing pointers to any data with lifetime shorter - than the PrinterPage objects, i.e. slides, shapes, (one of) the - outliner (of the document). - */ - class PrinterPage - { - public: - PrinterPage ( - const PageKind ePageKind, - const MapMode& rMapMode, - const bool bPrintMarkedOnly, - const ::rtl::OUString& rsPageString, - const Point& rPageStringOffset, - const sal_uLong nDrawMode, - const Orientation eOrientation, - const sal_uInt16 nPaperTray) - : mePageKind(ePageKind), - maMap(rMapMode), - mbPrintMarkedOnly(bPrintMarkedOnly), - msPageString(rsPageString), - maPageStringOffset(rPageStringOffset), - mnDrawMode(nDrawMode), - meOrientation(eOrientation), - mnPaperTray(nPaperTray) - { - } - - virtual ~PrinterPage (void) {} - - virtual void Print ( - Printer& rPrinter, - SdDrawDocument& rDocument, - ViewShell& rViewShell, - View* pView, - DrawView& rPrintView, - const SetOfByte& rVisibleLayers, - const SetOfByte& rPrintableLayers) const = 0; - - sal_uLong GetDrawMode (void) const { return mnDrawMode; } - Orientation GetOrientation (void) const { return meOrientation; } - sal_uInt16 GetPaperTray (void) const { return mnPaperTray; } - - protected: - const PageKind mePageKind; - const MapMode maMap; - const bool mbPrintMarkedOnly; - const ::rtl::OUString msPageString; - const Point maPageStringOffset; - const sal_uLong mnDrawMode; - const Orientation meOrientation; - const sal_uInt16 mnPaperTray; - }; - - - - - /** The RegularPrinterPage is used for printing one regular slide (no - notes, handout, or outline) to one printer page. - */ - class RegularPrinterPage : public PrinterPage - { - public: - RegularPrinterPage ( - const sal_uInt16 nPageIndex, - const PageKind ePageKind, - const MapMode& rMapMode, - const bool bPrintMarkedOnly, - const ::rtl::OUString& rsPageString, - const Point& rPageStringOffset, - const sal_uLong nDrawMode, - const Orientation eOrientation, - const sal_uInt16 nPaperTray) - : PrinterPage(ePageKind, rMapMode, bPrintMarkedOnly, rsPageString, - rPageStringOffset, nDrawMode, eOrientation, nPaperTray), - mnPageIndex(nPageIndex) - { - } - - virtual ~RegularPrinterPage (void) {} - - virtual void Print ( - Printer& rPrinter, - SdDrawDocument& rDocument, - ViewShell& rViewShell, - View* pView, - DrawView& rPrintView, - const SetOfByte& rVisibleLayers, - const SetOfByte& rPrintableLayers) const - { - (void)rViewShell; - SdPage* pPageToPrint = rDocument.GetSdPage(mnPageIndex, mePageKind); - rPrinter.SetMapMode(maMap); - PrintPage( - rPrinter, - rPrintView, - *pPageToPrint, - pView, - mbPrintMarkedOnly, - rVisibleLayers, - rPrintableLayers); - PrintMessage( - rPrinter, - msPageString, - maPageStringOffset); - } - - private: - const sal_uInt16 mnPageIndex; - }; - - - - - /** Print one slide multiple times on a printer page so that the whole - printer page is covered. - */ - class TiledPrinterPage : public PrinterPage - { - public: - TiledPrinterPage ( - const sal_uInt16 nPageIndex, - const PageKind ePageKind, - const sal_Int32 nGap, - const bool bPrintMarkedOnly, - const ::rtl::OUString& rsPageString, - const Point& rPageStringOffset, - const sal_uLong nDrawMode, - const Orientation eOrientation, - const sal_uInt16 nPaperTray) - : PrinterPage(ePageKind, MapMode(), bPrintMarkedOnly, rsPageString, - rPageStringOffset, nDrawMode, eOrientation, nPaperTray), - mnPageIndex(nPageIndex), - mnGap(nGap) - { - } - - virtual ~TiledPrinterPage (void) {} - - virtual void Print ( - Printer& rPrinter, - SdDrawDocument& rDocument, - ViewShell& rViewShell, - View* pView, - DrawView& rPrintView, - const SetOfByte& rVisibleLayers, - const SetOfByte& rPrintableLayers) const - { - (void)rViewShell; - SdPage* pPageToPrint = rDocument.GetSdPage(mnPageIndex, mePageKind); - if (pPageToPrint==NULL) - return; - MapMode aMap (rPrinter.GetMapMode()); - - const Size aPageSize (pPageToPrint->GetSize()); - const Size aPrintSize (rPrinter.GetOutputSize()); - - const sal_Int32 nPageWidth (aPageSize.Width() + mnGap - - pPageToPrint->GetLftBorder() - pPageToPrint->GetRgtBorder()); - const sal_Int32 nPageHeight (aPageSize.Height() + mnGap - - pPageToPrint->GetUppBorder() - pPageToPrint->GetLwrBorder()); - if (nPageWidth<=0 || nPageHeight<=0) - return; - - // Print at least two rows and columns. More if the document - // page fits completely onto the printer page. - const sal_Int32 nColumnCount (::std::max(sal_Int32(2), - sal_Int32(aPrintSize.Width() / nPageWidth))); - const sal_Int32 nRowCount (::std::max(sal_Int32(2), - sal_Int32(aPrintSize.Height() / nPageHeight))); - Point aPrintOrigin; - for (sal_Int32 nRow=0; nRow<nRowCount; ++nRow) - for (sal_Int32 nColumn=0; nColumn<nColumnCount; ++nColumn) - { - aMap.SetOrigin(Point(nColumn*nPageWidth,nRow*nPageHeight)); - rPrinter.SetMapMode(aMap); - PrintPage( - rPrinter, - rPrintView, - *pPageToPrint, - pView, - mbPrintMarkedOnly, - rVisibleLayers, - rPrintableLayers); - } - - PrintMessage( - rPrinter, - msPageString, - maPageStringOffset); - } - - private: - const sal_uInt16 mnPageIndex; - const sal_Int32 mnGap; - }; - - /** Print two slides to one printer page so that the resulting pages - form a booklet. - */ - class BookletPrinterPage : public PrinterPage - { - public: - BookletPrinterPage ( - const sal_uInt16 nFirstPageIndex, - const sal_uInt16 nSecondPageIndex, - const Point& rFirstOffset, - const Point& rSecondOffset, - const PageKind ePageKind, - const MapMode& rMapMode, - const bool bPrintMarkedOnly, - const sal_uLong nDrawMode, - const Orientation eOrientation, - const sal_uInt16 nPaperTray) - : PrinterPage(ePageKind, rMapMode, bPrintMarkedOnly, ::rtl::OUString(), - Point(), nDrawMode, eOrientation, nPaperTray), - mnFirstPageIndex(nFirstPageIndex), - mnSecondPageIndex(nSecondPageIndex), - maFirstOffset(rFirstOffset), - maSecondOffset(rSecondOffset) - { - } - - virtual ~BookletPrinterPage (void) {} - - virtual void Print ( - Printer& rPrinter, - SdDrawDocument& rDocument, - ViewShell& rViewShell, - View* pView, - DrawView& rPrintView, - const SetOfByte& rVisibleLayers, - const SetOfByte& rPrintableLayers) const - { - (void)rViewShell; - MapMode aMap (maMap); - SdPage* pPageToPrint = rDocument.GetSdPage(mnFirstPageIndex, mePageKind); - if (pPageToPrint) - { - aMap.SetOrigin(maFirstOffset); - rPrinter.SetMapMode(aMap); - PrintPage( - rPrinter, - rPrintView, - *pPageToPrint, - pView, - mbPrintMarkedOnly, - rVisibleLayers, - rPrintableLayers); - } - - pPageToPrint = rDocument.GetSdPage(mnSecondPageIndex, mePageKind); - if( pPageToPrint ) - { - aMap.SetOrigin(maSecondOffset); - rPrinter.SetMapMode(aMap); - PrintPage( - rPrinter, - rPrintView, - *pPageToPrint, - pView, - mbPrintMarkedOnly, - rVisibleLayers, - rPrintableLayers); - } - } - - private: - const sal_uInt16 mnFirstPageIndex; - const sal_uInt16 mnSecondPageIndex; - const Point maFirstOffset; - const Point maSecondOffset; - }; - - - - - /** One handout page displays one to nine slides. - */ - class HandoutPrinterPage : public PrinterPage - { - public: - HandoutPrinterPage ( - const sal_uInt16 nHandoutPageIndex, - const ::std::vector<sal_uInt16>& rPageIndices, - const MapMode& rMapMode, - const ::rtl::OUString& rsPageString, - const Point& rPageStringOffset, - const sal_uLong nDrawMode, - const Orientation eOrientation, - const sal_uInt16 nPaperTray) - : PrinterPage(PK_HANDOUT, rMapMode, false, rsPageString, - rPageStringOffset, nDrawMode, eOrientation, nPaperTray), - mnHandoutPageIndex(nHandoutPageIndex), - maPageIndices(rPageIndices) - { - } - - virtual void Print ( - Printer& rPrinter, - SdDrawDocument& rDocument, - ViewShell& rViewShell, - View* pView, - DrawView& rPrintView, - const SetOfByte& rVisibleLayers, - const SetOfByte& rPrintableLayers) const - { - SdPage& rHandoutPage (*rDocument.GetSdPage(0, PK_HANDOUT)); - - Reference< com::sun::star::beans::XPropertySet > xHandoutPage( rHandoutPage.getUnoPage(), UNO_QUERY ); - const rtl::OUString sPageNumber( RTL_CONSTASCII_USTRINGPARAM( "Number" ) ); - - // Collect the page objects of the handout master. - std::vector<SdrPageObj*> aHandoutPageObjects; - SdrObjListIter aShapeIter (rHandoutPage); - while (aShapeIter.IsMore()) - { - SdrPageObj* pPageObj = dynamic_cast<SdrPageObj*>(aShapeIter.Next()); - if (pPageObj) - aHandoutPageObjects.push_back(pPageObj); - } - if (aHandoutPageObjects.empty()) - return; - - // Connect page objects with pages. - std::vector<SdrPageObj*>::iterator aPageObjIter (aHandoutPageObjects.begin()); - for (std::vector<sal_uInt16>::const_iterator - iPageIndex(maPageIndices.begin()), - iEnd(maPageIndices.end()); - iPageIndex!=iEnd && aPageObjIter!=aHandoutPageObjects.end(); - ++iPageIndex) - { - // Check if the page still exists. - if (*iPageIndex >= rDocument.GetSdPageCount(PK_STANDARD)) - continue; - - SdrPageObj* pPageObj = (*aPageObjIter++); - pPageObj->SetReferencedPage(rDocument.GetSdPage(*iPageIndex, PK_STANDARD)); - } - - // if there are more page objects than pages left, set the rest to invisible - int nHangoverCount = 0; - while (aPageObjIter != aHandoutPageObjects.end()) - { - (*aPageObjIter++)->SetReferencedPage(0L); - nHangoverCount++; - } - - // Hide outlines for objects that have pages attached. - if (nHangoverCount > 0) - { - int nSkip = aHandoutPageObjects.size() - nHangoverCount; - aShapeIter.Reset(); - while (aShapeIter.IsMore()) - { - SdrPathObj* pPathObj = dynamic_cast<SdrPathObj*>(aShapeIter.Next()); - if (pPathObj) - { - if (nSkip > 0) - --nSkip; - else - pPathObj->SetMergedItem(XLineStyleItem(XLINE_NONE)); - } - } - } - - if( xHandoutPage.is() ) try - { - xHandoutPage->setPropertyValue( sPageNumber, Any( static_cast<sal_Int16>(mnHandoutPageIndex) ) ); - } - catch( Exception& ) - { - } - rViewShell.SetPrintedHandoutPageNum( mnHandoutPageIndex + 1 ); - - MapMode aMap (rPrinter.GetMapMode()); - rPrinter.SetMapMode(maMap); - - PrintPage( - rPrinter, - rPrintView, - rHandoutPage, - pView, - false, - rVisibleLayers, - rPrintableLayers); - PrintMessage( - rPrinter, - msPageString, - maPageStringOffset); - - if( xHandoutPage.is() ) try - { - xHandoutPage->setPropertyValue( sPageNumber, Any( static_cast<sal_Int16>(0) ) ); - } - catch( Exception& ) - { - } - rViewShell.SetPrintedHandoutPageNum(1); - - // Restore outlines. - if (nHangoverCount > 0) - { - aShapeIter.Reset(); - while (aShapeIter.IsMore()) - { - SdrPathObj* pPathObj = dynamic_cast<SdrPathObj*>(aShapeIter.Next()); - if (pPathObj != NULL) - pPathObj->SetMergedItem(XLineStyleItem(XLINE_SOLID)); - } - } - - } - - private: - const sal_uInt16 mnHandoutPageIndex; - const ::std::vector<sal_uInt16> maPageIndices; - }; - - - - - /** The outline information (title, subtitle, outline objects) of the - document. There is no fixed mapping of slides to printer pages. - */ - class OutlinerPrinterPage : public PrinterPage - { - public: - OutlinerPrinterPage ( - OutlinerParaObject* pParaObject, - const MapMode& rMapMode, - const ::rtl::OUString& rsPageString, - const Point& rPageStringOffset, - const sal_uLong nDrawMode, - const Orientation eOrientation, - const sal_uInt16 nPaperTray) - : PrinterPage(PK_HANDOUT, rMapMode, false, rsPageString, - rPageStringOffset, nDrawMode, eOrientation, nPaperTray), - mpParaObject(pParaObject) - { - } - - ~OutlinerPrinterPage (void) - { - mpParaObject.reset(); - } - - virtual void Print ( - Printer& rPrinter, - SdDrawDocument& rDocument, - ViewShell& rViewShell, - View* pView, - DrawView& rPrintView, - const SetOfByte& rVisibleLayers, - const SetOfByte& rPrintableLayers) const - { - (void)rViewShell; - (void)pView; - (void)rPrintView; - (void)rVisibleLayers; - (void)rPrintableLayers; - - // Set up the printer. - rPrinter.SetMapMode(maMap); - - // Get and set up the outliner. - const Rectangle aOutRect (rPrinter.GetPageOffset(), rPrinter.GetOutputSize()); - Outliner* pOutliner = rDocument.GetInternalOutliner(); - const sal_uInt16 nSavedOutlMode (pOutliner->GetMode()); - const sal_Bool bSavedUpdateMode (pOutliner->GetUpdateMode()); - const Size aSavedPaperSize (pOutliner->GetPaperSize()); - - pOutliner->Init(OUTLINERMODE_OUTLINEVIEW); - pOutliner->SetPaperSize(aOutRect.GetSize()); - pOutliner->SetUpdateMode(sal_True); - pOutliner->Clear(); - pOutliner->SetText(*mpParaObject); - - pOutliner->Draw(&rPrinter, aOutRect); - - PrintMessage( - rPrinter, - msPageString, - maPageStringOffset); - - // Restore outliner and printer. - pOutliner->Clear(); - pOutliner->SetUpdateMode(bSavedUpdateMode); - pOutliner->SetPaperSize(aSavedPaperSize); - pOutliner->Init(nSavedOutlMode); - } - - private: - ::boost::scoped_ptr<OutlinerParaObject> mpParaObject; - }; -} - - -//===== DocumentRenderer::Implementation ====================================== - -class DocumentRenderer::Implementation - : public SfxListener, - public vcl::PrinterOptionsHelper -{ -public: - Implementation (ViewShellBase& rBase) - : mrBase(rBase), - mbIsDisposed(false), - mpPrinter(NULL), - mpOptions(), - maPrinterPages(), - mpPrintView(), - mbHasOrientationWarningBeenShown(false) - { - DialogCreator aCreator( mrBase.GetDocShell()->GetDocumentType() == DOCUMENT_TYPE_IMPRESS ); - m_aUIProperties = aCreator.GetDialogControls(); - maSlidesPerPage = aCreator.GetSlidesPerPage(); - - StartListening(mrBase); - } - - - - - virtual ~Implementation (void) - { - EndListening(mrBase); - } - - - - - virtual void Notify (SfxBroadcaster& rBroadcaster, const SfxHint& rHint) - { - const SfxSimpleHint* pSimpleHint = dynamic_cast<const SfxSimpleHint*>(&rHint); - if (pSimpleHint != NULL - && pSimpleHint->GetId() == SFX_HINT_DYING - && &rBroadcaster == &static_cast<SfxBroadcaster&>(mrBase)) - { - Dispose(); - } - } - - - - /** Process the sequence of properties given to one of the XRenderable - methods. - */ - void ProcessProperties (const css::uno::Sequence<css::beans::PropertyValue >& rOptions) - { - OSL_ASSERT(!mbIsDisposed); - if (mbIsDisposed) - return; - - bool bIsValueChanged = processProperties( rOptions ); - bool bIsPaperChanged = false; - - // The RenderDevice property is handled specially: its value is - // stored in mpPrinter instead of being retrieved on demand. - Any aDev( getValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "RenderDevice" ) ) ) ); - Reference<awt::XDevice> xRenderDevice; - - if (aDev >>= xRenderDevice) - { - VCLXDevice* pDevice = VCLXDevice::GetImplementation(xRenderDevice); - OutputDevice* pOut = pDevice ? pDevice->GetOutputDevice() : NULL; - mpPrinter = dynamic_cast<Printer*>(pOut); - Size aPageSizePixel = mpPrinter ? mpPrinter->GetPaperSizePixel() : Size(); - if( aPageSizePixel != maPrinterPageSizePixel ) - { - bIsPaperChanged = true; - maPrinterPageSizePixel = aPageSizePixel; - } - } - - if (bIsValueChanged) - { - if ( ! mpOptions ) - mpOptions.reset(new PrintOptions(*this, maSlidesPerPage)); - } - if( bIsValueChanged || bIsPaperChanged ) - PreparePages(); - } - - - - /** Return the number of pages that are to be printed. - */ - sal_Int32 GetPrintPageCount (void) - { - OSL_ASSERT(!mbIsDisposed); - if (mbIsDisposed) - return 0; - else - return maPrinterPages.size(); - } - - - - /** Return a sequence of properties that can be returned by the - XRenderable::getRenderer() method. - */ - css::uno::Sequence<css::beans::PropertyValue> GetProperties ( - const css::uno::Sequence<css::beans::PropertyValue>& rOptions) - { - (void)rOptions; - - css::uno::Sequence<css::beans::PropertyValue> aProperties (3); - - aProperties[0].Name = A2S("ExtraPrintUIOptions"); - aProperties[0].Value <<= m_aUIProperties; - - aProperties[1].Name = A2S("PageSize"); - aProperties[1].Value <<= maPrintSize; - - // FIXME: is this always true ? - aProperties[2].Name = A2S("PageIncludesNonprintableArea"); - aProperties[2].Value = makeAny( sal_True ); - - return aProperties; - } - - - - - /** Print one of the prepared pages. - */ - void PrintPage (const sal_Int32 nIndex) - { - OSL_ASSERT(!mbIsDisposed); - if (mbIsDisposed) - return; - - Printer& rPrinter (*mpPrinter); - - ::boost::shared_ptr<ViewShell> pViewShell (mrBase.GetMainViewShell()); - if ( ! pViewShell) - return; - - SdDrawDocument* pDocument = pViewShell->GetDoc(); - OSL_ASSERT(pDocument!=NULL); - - ::boost::shared_ptr<DrawViewShell> pDrawViewShell( - ::boost::dynamic_pointer_cast<DrawViewShell>(mrBase.GetMainViewShell())); - - if ( ! mpPrintView) - mpPrintView.reset(new DrawView(mrBase.GetDocShell(), &rPrinter, NULL)); - - if (nIndex<0 || sal::static_int_cast<sal_uInt32>(nIndex)>=maPrinterPages.size()) - return; - - const ::boost::shared_ptr<PrinterPage> pPage (maPrinterPages[nIndex]); - OSL_ASSERT(pPage); - if ( ! pPage) - return; - - const Orientation eSavedOrientation (rPrinter.GetOrientation()); - const sal_uLong nSavedDrawMode (rPrinter.GetDrawMode()); - const MapMode aSavedMapMode (rPrinter.GetMapMode()); - const sal_uInt16 nSavedPaperBin (rPrinter.GetPaperBin()); - - - // Set page orientation. - if ( ! rPrinter.SetOrientation(pPage->GetOrientation())) - { - if ( ! mbHasOrientationWarningBeenShown - && mpOptions->IsWarningOrientation()) - { - mbHasOrientationWarningBeenShown = true; - // Show warning that the orientation could not be set. - if (pViewShell) - { - WarningBox aWarnBox( - pViewShell->GetActiveWindow(), - (WinBits)(WB_OK_CANCEL | WB_DEF_CANCEL), - String(SdResId(STR_WARN_PRINTFORMAT_FAILURE))); - if (aWarnBox.Execute() != RET_OK) - return; - } - } - } - - // Set the draw mode. - rPrinter.SetDrawMode(pPage->GetDrawMode()); - - // Set paper tray. - rPrinter.SetPaperBin(pPage->GetPaperTray()); - - // Print the actual page. - pPage->Print( - rPrinter, - *pDocument, - *pViewShell, - pDrawViewShell ? pDrawViewShell->GetView() : NULL, - *mpPrintView, - pViewShell->GetFrameView()->GetVisibleLayers(), - pViewShell->GetFrameView()->GetPrintableLayers()); - - rPrinter.SetOrientation(eSavedOrientation); - rPrinter.SetDrawMode(nSavedDrawMode); - rPrinter.SetMapMode(aSavedMapMode); - rPrinter.SetPaperBin(nSavedPaperBin); - } - - - - -private: - ViewShellBase& mrBase; - bool mbIsDisposed; - Printer* mpPrinter; - Size maPrinterPageSizePixel; - ::boost::scoped_ptr<PrintOptions> mpOptions; - ::std::vector< ::boost::shared_ptr< ::sd::PrinterPage> > maPrinterPages; - ::boost::scoped_ptr<DrawView> mpPrintView; - bool mbHasOrientationWarningBeenShown; - ::std::vector<sal_Int32> maSlidesPerPage; - awt::Size maPrintSize; - - void Dispose (void) - { - mbIsDisposed = true; - } - - - - /** Determine and set the paper orientation. - */ - bool SetupPaperOrientation ( - const PageKind ePageKind, - PrintInfo& rInfo) - { - SdDrawDocument* pDocument = mrBase.GetMainViewShell()->GetDoc(); - rInfo.meOrientation = ORIENTATION_PORTRAIT; - - if( ! mpOptions->IsBooklet()) - { - rInfo.meOrientation = pDocument->GetSdPage(0, ePageKind)->GetOrientation(); - } - else if (rInfo.maPageSize.Width() < rInfo.maPageSize.Height()) - rInfo.meOrientation = ORIENTATION_LANDSCAPE; - - const Size aPaperSize (rInfo.mpPrinter->GetPaperSize()); - if( (rInfo.meOrientation == ORIENTATION_LANDSCAPE && - (aPaperSize.Width() < aPaperSize.Height())) - || - (rInfo.meOrientation == ORIENTATION_PORTRAIT && - (aPaperSize.Width() > aPaperSize.Height())) - ) - { - maPrintSize = awt::Size(aPaperSize.Height(), aPaperSize.Width()); - // rInfo.maPrintSize = Size(rInfo.maPrintSize.Height(), rInfo.maPrintSize.Width()); - } - else - { - maPrintSize = awt::Size(aPaperSize.Width(), aPaperSize.Height()); - } - - return true; - } - - - - /** Top most method for preparing printer pages. In this and the other - Prepare... methods the various special cases are detected and - handled. - For every page that is to be printed (that may contain several - slides) one PrinterPage object is created and inserted into - maPrinterPages. - */ - void PreparePages (void) - { - mpPrintView.reset(); - maPrinterPages.clear(); - mbHasOrientationWarningBeenShown = false; - - ViewShell* pShell = mrBase.GetMainViewShell().get(); - - PrintInfo aInfo (mpPrinter, mpOptions->GetPrinterSelection(), mrBase.GetMainViewShell()); - - if (aInfo.mpPrinter!=NULL && pShell!=NULL) - { - - MapMode aMap (aInfo.mpPrinter->GetMapMode()); - aMap.SetMapUnit(MAP_100TH_MM); - aInfo.maMap = aMap; - mpPrinter->SetMapMode(aMap); - - ::Outliner& rOutliner = mrBase.GetDocument()->GetDrawOutliner(); - const sal_uLong nSavedControlWord (rOutliner.GetControlWord()); - sal_uLong nCntrl = nSavedControlWord; - nCntrl &= ~EE_CNTRL_MARKFIELDS; - nCntrl &= ~EE_CNTRL_ONLINESPELLING; - rOutliner.SetControlWord( nCntrl ); - - // When in outline view then apply all pending changes to the model. - if (pShell->ISA(OutlineViewShell)) - static_cast<OutlineViewShell*>(pShell)->PrepareClose (sal_False, sal_False); - - // Collect some frequently used data. - if (mpOptions->IsDate()) - { - aInfo.msTimeDate += GetSdrGlobalData().GetLocaleData()->getDate( Date() ); - aInfo.msTimeDate += ::rtl::OUString((sal_Unicode)' '); - } - - if (mpOptions->IsTime()) - aInfo.msTimeDate += GetSdrGlobalData().GetLocaleData()->getTime( Time(), sal_False, sal_False ); - aInfo.maPrintSize = aInfo.mpPrinter->GetOutputSize(); - maPrintSize = awt::Size( - aInfo.mpPrinter->GetPaperSize().Width(), - aInfo.mpPrinter->GetPaperSize().Height()); - - switch (mpOptions->GetOutputQuality()) - { - case 1: - aInfo.mnDrawMode = DRAWMODE_GRAYLINE | DRAWMODE_GRAYFILL - | DRAWMODE_BLACKTEXT | DRAWMODE_GRAYBITMAP - | DRAWMODE_GRAYGRADIENT; - break; - - case 2: - aInfo.mnDrawMode = DRAWMODE_BLACKLINE | DRAWMODE_BLACKTEXT - | DRAWMODE_WHITEFILL | DRAWMODE_GRAYBITMAP - | DRAWMODE_WHITEGRADIENT; - break; - - default: - aInfo.mnDrawMode = DRAWMODE_DEFAULT; - } - - // check if selected range of pages contains transparent objects - /* - const bool bPrintPages (bPrintNotes || bPrintDraw || bPrintHandout); - const bool bContainsTransparency (bPrintPages && ContainsTransparency()); - if (pPrinter->InitJob (mrBase.GetWindow(), !bIsAPI && bContainsTransparency)) - */ - - if (mpOptions->IsDraw()) - PrepareStdOrNotes(PK_STANDARD, aInfo); - if (mpOptions->IsNotes()) - PrepareStdOrNotes(PK_NOTES, aInfo); - if (mpOptions->IsHandout()) - { - InitHandoutTemplate(); - PrepareHandout(aInfo); - } - if (mpOptions->IsOutline()) - PrepareOutline(aInfo); - - rOutliner.SetControlWord(nSavedControlWord); - } - } - - - - - /** Create the page objects of the handout template. When the actual - printing takes place then the page objects are assigned different - sets of slides for each printed page (see HandoutPrinterPage::Print). - */ - void InitHandoutTemplate (void) - { - const sal_Int32 nSlidesPerHandout (mpOptions->GetHandoutPageCount()); - const bool bHandoutHorizontal (mpOptions->IsHandoutHorizontal()); - - AutoLayout eLayout = AUTOLAYOUT_HANDOUT6; - switch (nSlidesPerHandout) - { - case 0: eLayout = AUTOLAYOUT_NONE; break; // AUTOLAYOUT_HANDOUT1; break; - case 1: eLayout = AUTOLAYOUT_HANDOUT1; break; - case 2: eLayout = AUTOLAYOUT_HANDOUT2; break; - case 3: eLayout = AUTOLAYOUT_HANDOUT3; break; - case 4: eLayout = AUTOLAYOUT_HANDOUT4; break; - default: - case 6: eLayout = AUTOLAYOUT_HANDOUT6; break; - case 9: eLayout = AUTOLAYOUT_HANDOUT9; break; - } - - if( !mrBase.GetDocument() ) - return; - - SdDrawDocument& rModel = *mrBase.GetDocument(); - - // first, prepare handout page (not handout master) - - SdPage* pHandout = rModel.GetSdPage(0, PK_HANDOUT); - if( !pHandout ) - return; - - // delete all previous shapes from handout page - while( pHandout->GetObjCount() ) - { - SdrObject* pObj = pHandout->NbcRemoveObject(0); - if( pObj ) - SdrObject::Free( pObj ); - } - - const bool bDrawLines (eLayout == AUTOLAYOUT_HANDOUT3); - - std::vector< Rectangle > aAreas; - SdPage::CalculateHandoutAreas( rModel, eLayout, bHandoutHorizontal, aAreas ); - - std::vector< Rectangle >::iterator iter( aAreas.begin() ); - while( iter != aAreas.end() ) - { - pHandout->NbcInsertObject( new SdrPageObj((*iter++)) ); - - if( bDrawLines && (iter != aAreas.end()) ) - { - Rectangle aRect( (*iter++) ); - - basegfx::B2DPolygon aPoly; - aPoly.insert(0, basegfx::B2DPoint( aRect.Left(), aRect.Top() ) ); - aPoly.insert(1, basegfx::B2DPoint( aRect.Right(), aRect.Top() ) ); - - basegfx::B2DHomMatrix aMatrix; - aMatrix.translate( 0.0, static_cast< double >( aRect.GetHeight() / 7 ) ); - - basegfx::B2DPolyPolygon aPathPoly; - for( sal_uInt16 nLine = 0; nLine < 7; nLine++ ) - { - aPoly.transform( aMatrix ); - aPathPoly.append( aPoly ); - } - - SdrPathObj* pPathObj = new SdrPathObj(OBJ_PATHLINE, aPathPoly ); - pPathObj->SetMergedItem(XLineStyleItem(XLINE_SOLID)); - pPathObj->SetMergedItem(XLineColorItem(String(), Color(COL_BLACK))); - - pHandout->NbcInsertObject( pPathObj ); - } - } - } - - - - - /** Detect whether any of the slides that are to be printed contains - partially transparent or translucent shapes. - */ - bool ContainsTransparency (const PrintInfo& rInfo) const - { - // const bool bPrintExcluded (mpOptions->IsPrintExcluded()); - bool bContainsTransparency = false; - - for (sal_uInt16 - nIndex=0, - nCount=mrBase.GetDocument()->GetSdPageCount(PK_STANDARD); - nIndex < nCount && !bContainsTransparency; - ++nIndex) - { - SdPage* pPage = GetFilteredPage(nIndex, PK_STANDARD, rInfo); - if (pPage == NULL) - continue; - - bContainsTransparency = pPage->HasTransparentObjects(); - if ( ! bContainsTransparency && pPage->TRG_HasMasterPage()) - bContainsTransparency = pPage->TRG_GetMasterPage().HasTransparentObjects(); - } - - return bContainsTransparency; - } - - - - - /** Detect whether the specified slide is to be printed. - @return - When the slide is not to be printed then <NULL/> is returned. - Otherwise a pointer to the slide is returned. - */ - SdPage* GetFilteredPage ( - const sal_Int32 nPageIndex, - const PageKind ePageKind, - const PrintInfo& rInfo) const - { - OSL_ASSERT(mrBase.GetDocument() != NULL); - OSL_ASSERT(nPageIndex>=0); - if ( ! rInfo.maSelection.IsSelected(nPageIndex)) - return NULL; - SdPage* pPage = mrBase.GetDocument()->GetSdPage( - sal::static_int_cast<sal_uInt16>(nPageIndex), - ePageKind); - if (pPage == NULL) - return NULL; - if ( ! pPage->IsExcluded() || mpOptions->IsPrintExcluded()) - return pPage; - else - return NULL; - } - - - - - /** Prepare the outline of the document for printing. There is no fixed - number of slides whose outline data is put onto one printer page. - If the current printer page has enough room for the outline of the - current slide then that is added. Otherwise a new printer page is - started. - */ - void PrepareOutline (PrintInfo& rInfo) - { - MapMode aMap (rInfo.maMap); - Point aPageOfs (rInfo.mpPrinter->GetPageOffset() ); - // aMap.SetOrigin(Point() - aPageOfs); - aMap.SetScaleX(Fraction(1,2)); - aMap.SetScaleY(Fraction(1,2)); - mpPrinter->SetMapMode(aMap); - - Rectangle aOutRect(aPageOfs, rInfo.mpPrinter->GetOutputSize()); - if( aOutRect.GetWidth() > aOutRect.GetHeight() ) - { - Size aPaperSize( rInfo.mpPrinter->PixelToLogic( rInfo.mpPrinter->GetPaperSizePixel(), MapMode( MAP_100TH_MM ) ) ); - maPrintSize.Width = aPaperSize.Height(); - maPrintSize.Height = aPaperSize.Width(); - aOutRect = Rectangle( Point( aPageOfs.Y(), aPageOfs.X() ), - Size( aOutRect.GetHeight(), aOutRect.GetWidth() ) ); - } - - Link aOldLink; - Outliner* pOutliner = mrBase.GetDocument()->GetInternalOutliner(); - pOutliner->Init(OUTLINERMODE_OUTLINEVIEW); - const sal_uInt16 nSavedOutlMode (pOutliner->GetMode()); - const sal_Bool bSavedUpdateMode (pOutliner->GetUpdateMode()); - const Size aSavedPaperSize (pOutliner->GetPaperSize()); - const MapMode aSavedMapMode (pOutliner->GetRefMapMode()); - pOutliner->SetPaperSize(aOutRect.GetSize()); - pOutliner->SetUpdateMode(sal_True); - - long nPageH = aOutRect.GetHeight(); - - for (sal_uInt16 - nIndex=0, - nCount=mrBase.GetDocument()->GetSdPageCount(PK_STANDARD); - nIndex < nCount; - ) - { - pOutliner->Clear(); - pOutliner->SetFirstPageNumber(nIndex+1); - - Paragraph* pPara = NULL; - sal_Int32 nH (0); - while (nH < nPageH && nIndex<nCount) - { - SdPage* pPage = GetFilteredPage(nIndex, PK_STANDARD, rInfo); - ++nIndex; - if (pPage == NULL) - continue; - - SdrTextObj* pTextObj = NULL; - sal_uInt32 nObj (0); - - while (pTextObj==NULL && nObj < pPage->GetObjCount()) - { - SdrObject* pObj = pPage->GetObj(nObj++); - if (pObj->GetObjInventor() == SdrInventor - && pObj->GetObjIdentifier() == OBJ_TITLETEXT) - { - pTextObj = dynamic_cast<SdrTextObj*>(pObj); - } - } - - pPara = pOutliner->GetParagraph(pOutliner->GetParagraphCount() - 1); - - if (pTextObj!=NULL - && !pTextObj->IsEmptyPresObj() - && pTextObj->GetOutlinerParaObject()) - { - pOutliner->AddText(*(pTextObj->GetOutlinerParaObject())); - } - else - pOutliner->Insert(String()); - - pTextObj = NULL; - nObj = 0; - - while (pTextObj==NULL && nObj<pPage->GetObjCount()) - { - SdrObject* pObj = pPage->GetObj(nObj++); - if (pObj->GetObjInventor() == SdrInventor - && pObj->GetObjIdentifier() == OBJ_OUTLINETEXT) - { - pTextObj = dynamic_cast<SdrTextObj*>(pObj); - } - } - - bool bSubTitle (false); - if (!pTextObj) - { - bSubTitle = true; - pTextObj = dynamic_cast<SdrTextObj*>(pPage->GetPresObj(PRESOBJ_TEXT)); // Untertitel vorhanden? - } - - sal_uLong nParaCount1 = pOutliner->GetParagraphCount(); - - if (pTextObj!=NULL - && !pTextObj->IsEmptyPresObj() - && pTextObj->GetOutlinerParaObject()) - { - pOutliner->AddText(*(pTextObj->GetOutlinerParaObject())); - } - - if (bSubTitle ) - { - const sal_Int32 nParaCount2 (pOutliner->GetParagraphCount()); - for (sal_Int32 nPara=nParaCount1; nPara<nParaCount2; ++nPara) - { - Paragraph* pP = pOutliner->GetParagraph(nPara); - if (pP!=NULL && pOutliner->GetDepth((sal_uInt16)nPara) > 0) - pOutliner->SetDepth(pP, 0); - } - } - - nH = pOutliner->GetTextHeight(); - } - - // Remove the last paragraph when that does not fit completely on - // the current page. - if (nH > nPageH && pPara!=NULL) - { - sal_uLong nCnt = pOutliner->GetAbsPos( - pOutliner->GetParagraph( pOutliner->GetParagraphCount() - 1 ) ); - sal_uLong nParaPos = pOutliner->GetAbsPos( pPara ); - nCnt -= nParaPos; - pPara = pOutliner->GetParagraph( ++nParaPos ); - if ( nCnt && pPara ) - { - pOutliner->Remove(pPara, nCnt); - --nIndex; - } - } - - maPrinterPages.push_back( - ::boost::shared_ptr<PrinterPage>( - new OutlinerPrinterPage( - pOutliner->CreateParaObject(), - aMap, - rInfo.msTimeDate, - aPageOfs, - rInfo.mnDrawMode, - rInfo.meOrientation, - rInfo.mpPrinter->GetPaperBin()))); - } - - pOutliner->SetRefMapMode(aSavedMapMode); - pOutliner->SetUpdateMode(bSavedUpdateMode); - pOutliner->SetPaperSize(aSavedPaperSize); - pOutliner->Init(nSavedOutlMode); - } - - - - - /** Prepare handout pages for slides that are to be printed. - */ - void PrepareHandout (PrintInfo& rInfo) - { - SdDrawDocument* pDocument = mrBase.GetDocument(); - OSL_ASSERT(pDocument != NULL); - SdPage& rHandoutPage (*pDocument->GetSdPage(0, PK_HANDOUT)); - - const bool bScalePage (mpOptions->IsPageSize()); - - sal_uInt16 nPaperBin; - if ( ! mpOptions->IsPaperBin()) - nPaperBin = rHandoutPage.GetPaperBin(); - else - nPaperBin = rInfo.mpPrinter->GetPaperBin(); - - // Change orientation? - SdPage& rMaster (dynamic_cast<SdPage&>(rHandoutPage.TRG_GetMasterPage())); - rInfo.meOrientation = rMaster.GetOrientation(); - - const Size aPaperSize (rInfo.mpPrinter->GetPaperSize()); - if( (rInfo.meOrientation == ORIENTATION_LANDSCAPE && - (aPaperSize.Width() < aPaperSize.Height())) - || - (rInfo.meOrientation == ORIENTATION_PORTRAIT && - (aPaperSize.Width() > aPaperSize.Height())) - ) - { - maPrintSize = awt::Size(aPaperSize.Height(), aPaperSize.Width()); - } - else - { - maPrintSize = awt::Size(aPaperSize.Width(), aPaperSize.Height()); - } - - MapMode aMap (rInfo.maMap); - const Point aPageOfs (rInfo.mpPrinter->GetPageOffset()); - //DrawView* pPrintView; - - // aMap.SetOrigin(Point() - aPageOfs); - - if ( bScalePage ) - { - const Size aPageSize (rHandoutPage.GetSize()); - const Size aPrintSize (rInfo.mpPrinter->GetOutputSize()); - - const double fHorz = (double) aPrintSize.Width() / aPageSize.Width(); - const double fVert = (double) aPrintSize.Height() / aPageSize.Height(); - - Fraction aFract; - if ( fHorz < fVert ) - aFract = Fraction(aPrintSize.Width(), aPageSize.Width()); - else - aFract = Fraction(aPrintSize.Height(), aPageSize.Height()); - - aMap.SetScaleX(aFract); - aMap.SetScaleY(aFract); - aMap.SetOrigin(Point()); - } - - ::boost::shared_ptr<ViewShell> pViewShell (mrBase.GetMainViewShell()); - pViewShell->WriteFrameViewData(); - - // Count page shapes. - sal_uInt32 nShapeCount (0); - SdrObjListIter aShapeIter (rHandoutPage); - while (aShapeIter.IsMore()) - { - SdrPageObj* pPageObj = dynamic_cast<SdrPageObj*>(aShapeIter.Next()); - if (pPageObj) - ++nShapeCount; - } - - const sal_uInt16 nPageCount = mrBase.GetDocument()->GetSdPageCount(PK_STANDARD); - const sal_uInt16 nHandoutPageCount = nShapeCount ? (nPageCount + nShapeCount - 1) / nShapeCount : 0; - pViewShell->SetPrintedHandoutPageCount( nHandoutPageCount ); - mrBase.GetDocument()->setHandoutPageCount( nHandoutPageCount ); - - // Distribute pages to handout pages. - ::std::vector<sal_uInt16> aPageIndices; - std::vector<SdPage*> aPagesVector; - for (sal_uInt16 - nIndex=0, - nCount= nPageCount, - nHandoutPageIndex=0; - nIndex <= nCount; - ++nIndex) - { - if (nIndex < nCount) - { - if (GetFilteredPage(nIndex, PK_STANDARD, rInfo) == NULL) - continue; - aPageIndices.push_back(nIndex); - } - - // Create a printer page when we have found one page for each - // placeholder or when this is the last (and special) loop. - if (aPageIndices.size() == nShapeCount - || nIndex==nCount) - { - maPrinterPages.push_back( - ::boost::shared_ptr<PrinterPage>( - new HandoutPrinterPage( - nHandoutPageIndex++, - aPageIndices, - aMap, - rInfo.msTimeDate, - aPageOfs, - rInfo.mnDrawMode, - rInfo.meOrientation, - nPaperBin))); - aPageIndices.clear(); - } - } - } - - - - - /** Prepare the notes pages or regular slides. - */ - void PrepareStdOrNotes ( - const PageKind ePageKind, - PrintInfo& rInfo) - { - OSL_ASSERT(rInfo.mpPrinter != NULL); - - // Fill in page kind specific data. - SdDrawDocument* pDocument = mrBase.GetMainViewShell()->GetDoc(); - if (pDocument->GetSdPageCount(ePageKind) == 0) - return; - SdPage* pRefPage = pDocument->GetSdPage(0, ePageKind); - rInfo.maPageSize = pRefPage->GetSize(); - - if ( ! SetupPaperOrientation(ePageKind, rInfo)) - return; - - MapMode aMap (rInfo.maMap); - // aMap.SetOrigin(Point() - rInfo.mpPrinter->GetPageOffset()); - rInfo.maMap = aMap; - - if (mpOptions->IsBooklet()) - PrepareBooklet(ePageKind, rInfo); - else - PrepareRegularPages(ePageKind, rInfo); - } - - - - - /** Prepare slides in a non-booklet way: one slide per one to many - printer pages. - */ - void PrepareRegularPages ( - const PageKind ePageKind, - PrintInfo& rInfo) - { - ::boost::shared_ptr<ViewShell> pViewShell (mrBase.GetMainViewShell()); - pViewShell->WriteFrameViewData(); - Point aPtZero; - - for (sal_uInt16 - nIndex=0, - nCount=mrBase.GetDocument()->GetSdPageCount(PK_STANDARD); - nIndex < nCount; - ++nIndex) - { - SdPage* pPage = GetFilteredPage(nIndex, ePageKind, rInfo); - if (pPage == NULL) - continue; - - MapMode aMap (rInfo.maMap); - // Kann sich die Seitengroesse geaendert haben? - const Size aPageSize = pPage->GetSize(); - - if (mpOptions->IsPageSize()) - { - const double fHorz ((double) rInfo.maPrintSize.Width() / aPageSize.Width()); - const double fVert ((double) rInfo.maPrintSize.Height() / aPageSize.Height()); - - Fraction aFract; - if (fHorz < fVert) - aFract = Fraction(rInfo.maPrintSize.Width(), aPageSize.Width()); - else - aFract = Fraction(rInfo.maPrintSize.Height(), aPageSize.Height()); - - aMap.SetScaleX(aFract); - aMap.SetScaleY(aFract); - aMap.SetOrigin(Point()); - } - - if (mpOptions->IsPrintPageName()) - { - rInfo.msPageString = pPage->GetName(); - rInfo.msPageString += ::rtl::OUString(sal_Unicode(' ')); - } - else - rInfo.msPageString = ::rtl::OUString(); - rInfo.msPageString += rInfo.msTimeDate; - - long aPageWidth = aPageSize.Width() - pPage->GetLftBorder() - pPage->GetRgtBorder(); - long aPageHeight = aPageSize.Height() - pPage->GetUppBorder() - pPage->GetLwrBorder(); - // Bugfix zu 44530: - // Falls implizit umgestellt wurde (Landscape/Portrait) - // wird dies beim Kacheln, bzw. aufteilen (Poster) beruecksichtigt - if( ( rInfo.maPrintSize.Width() > rInfo.maPrintSize.Height() - && aPageWidth < aPageHeight ) - || ( rInfo.maPrintSize.Width() < rInfo.maPrintSize.Height() - && aPageWidth > aPageHeight ) ) - { - const sal_Int32 nTmp (rInfo.maPrintSize.Width()); - rInfo.maPrintSize.Width() = rInfo.maPrintSize.Height(); - rInfo.maPrintSize.Height() = nTmp; - } - - if (mpOptions->IsTilePage() - && aPageWidth < rInfo.maPrintSize.Width() - && aPageHeight < rInfo.maPrintSize.Height()) - { - // Put multiple slides on one printer page. - PrepareTiledPage(nIndex, *pPage, ePageKind, rInfo); - } - else - { - rInfo.maMap = aMap; - PrepareScaledPage(nIndex, *pPage, ePageKind, rInfo); - } - } - } - - - - - /** Put two slides on one printer page. - */ - void PrepareBooklet ( - const PageKind ePageKind, - const PrintInfo& rInfo) - { - MapMode aStdMap (rInfo.maMap); - Point aOffset; - Size aPrintSize_2 (rInfo.maPrintSize); - Size aPageSize_2 (rInfo.maPageSize); - - if (rInfo.meOrientation == ORIENTATION_LANDSCAPE) - aPrintSize_2.Width() >>= 1; - else - aPrintSize_2.Height() >>= 1; - - const double fPageWH = (double) aPageSize_2.Width() / aPageSize_2.Height(); - const double fPrintWH = (double) aPrintSize_2.Width() / aPrintSize_2.Height(); - - if( fPageWH < fPrintWH ) - { - aPageSize_2.Width() = (long) ( aPrintSize_2.Height() * fPageWH ); - aPageSize_2.Height()= aPrintSize_2.Height(); - } - else - { - aPageSize_2.Width() = aPrintSize_2.Width(); - aPageSize_2.Height() = (long) ( aPrintSize_2.Width() / fPageWH ); - } - - MapMode aMap (rInfo.maMap); - aMap.SetScaleX( Fraction( aPageSize_2.Width(), rInfo.maPageSize.Width() ) ); - aMap.SetScaleY( Fraction( aPageSize_2.Height(), rInfo.maPageSize.Height() ) ); - - // calculate adjusted print size - const Size aAdjustedPrintSize (OutputDevice::LogicToLogic( - rInfo.maPrintSize, - aStdMap, - aMap)); - - if (rInfo.meOrientation == ORIENTATION_LANDSCAPE) - { - aOffset.X() = ( ( aAdjustedPrintSize.Width() >> 1 ) - rInfo.maPageSize.Width() ) >> 1; - aOffset.Y() = ( aAdjustedPrintSize.Height() - rInfo.maPageSize.Height() ) >> 1; - } - else - { - aOffset.X() = ( aAdjustedPrintSize.Width() - rInfo.maPageSize.Width() ) >> 1; - aOffset.Y() = ( ( aAdjustedPrintSize.Height() >> 1 ) - rInfo.maPageSize.Height() ) >> 1; - } - - // create vector of pages to print - ::std::vector< sal_uInt16 > aPageVector; - for (sal_uInt16 - nIndex=0, - nCount=mrBase.GetDocument()->GetSdPageCount(ePageKind); - nIndex < nCount; - ++nIndex) - { - SdPage* pPage = GetFilteredPage(nIndex, ePageKind, rInfo); - if (pPage != NULL) - aPageVector.push_back(nIndex); - } - - // create pairs of pages to print on each page - typedef ::std::vector< ::std::pair< sal_uInt16, sal_uInt16 > > PairVector; - PairVector aPairVector; - if ( ! aPageVector.empty()) - { - sal_uInt32 nFirstIndex = 0, nLastIndex = aPageVector.size() - 1; - - if( aPageVector.size() & 1 ) - aPairVector.push_back( ::std::make_pair( (sal_uInt16) 65535, aPageVector[ nFirstIndex++ ] ) ); - else - aPairVector.push_back( ::std::make_pair( aPageVector[ nLastIndex-- ], aPageVector[ nFirstIndex++ ] ) ); - - while( nFirstIndex < nLastIndex ) - { - if( nFirstIndex & 1 ) - aPairVector.push_back( ::std::make_pair( aPageVector[ nFirstIndex++ ], aPageVector[ nLastIndex-- ] ) ); - else - aPairVector.push_back( ::std::make_pair( aPageVector[ nLastIndex-- ], aPageVector[ nFirstIndex++ ] ) ); - } - } - - for (sal_uInt32 - nIndex=0, - nCount=aPairVector.size(); - nIndex < nCount; - ++nIndex) - { - const bool bIsIndexOdd (nIndex & 1); - if ((!bIsIndexOdd && mpOptions->IsPrintFrontPage()) - || (bIsIndexOdd && mpOptions->IsPrintBackPage())) - { - const ::std::pair<sal_uInt16, sal_uInt16> aPair (aPairVector[nIndex]); - Point aSecondOffset (aOffset); - if (rInfo.meOrientation == ORIENTATION_LANDSCAPE) - aSecondOffset.X() += aAdjustedPrintSize.Width() / 2; - else - aSecondOffset.Y() += aAdjustedPrintSize.Height() / 2; - maPrinterPages.push_back( - ::boost::shared_ptr<PrinterPage>( - new BookletPrinterPage( - aPair.first, - aPair.second, - aOffset, - aSecondOffset, - ePageKind, - aMap, - rInfo.mbPrintMarkedOnly, - rInfo.mnDrawMode, - rInfo.meOrientation, - rInfo.mpPrinter->GetPaperBin()))); - - } - } - } - - - - - /** Print one slide multiple times on one printer page so that the whole - printer page is covered. - */ - void PrepareTiledPage ( - const sal_Int32 nPageIndex, - const SdPage& rPage, - const PageKind ePageKind, - const PrintInfo& rInfo) - { - sal_uInt16 nPaperBin; - if ( ! mpOptions->IsPaperBin()) - nPaperBin = rPage.GetPaperBin(); - else - nPaperBin = rInfo.mpPrinter->GetPaperBin(); - - maPrinterPages.push_back( - ::boost::shared_ptr<PrinterPage>( - new TiledPrinterPage( - sal::static_int_cast<sal_uInt16>(nPageIndex), - ePageKind, - 500, - rInfo.mbPrintMarkedOnly, - rInfo.msPageString, - rInfo.mpPrinter->GetPageOffset(), - rInfo.mnDrawMode, - rInfo.meOrientation, - nPaperBin))); - } - - - - /** Print one standard slide or notes page on one to many printer - pages. More than on printer page is used when the slide is larger - than the printable area. - */ - void PrepareScaledPage ( - const sal_Int32 nPageIndex, - const SdPage& rPage, - const PageKind ePageKind, - const PrintInfo& rInfo) - { - const Point aPageOffset (rInfo.mpPrinter->GetPageOffset()); - - sal_uInt16 nPaperBin; - if ( ! mpOptions->IsPaperBin()) - nPaperBin = rPage.GetPaperBin(); - else - nPaperBin = rInfo.mpPrinter->GetPaperBin(); - - // For pages larger then the printable area there - // are three options: - // 1. Scale down to the page to the printable area. - // 2. Print only the upper left part of the page - // (without the unprintable borders). - // 3. Split the page into parts of the size of the - // printable area. - const bool bScalePage (mpOptions->IsPageSize()); - const bool bCutPage (mpOptions->IsCutPage()); - MapMode aMap (rInfo.maMap); - if (bScalePage || bCutPage) - { - // Handle 1 and 2. - - // if CutPage is set then do not move it, otherwise move the - // scaled page to printable area - maPrinterPages.push_back( - ::boost::shared_ptr<PrinterPage>( - new RegularPrinterPage( - sal::static_int_cast<sal_uInt16>(nPageIndex), - ePageKind, - aMap, - rInfo.mbPrintMarkedOnly, - rInfo.msPageString, - aPageOffset, - rInfo.mnDrawMode, - rInfo.meOrientation, - nPaperBin))); - } - else - { - // Handle 3. Print parts of the page in the size of the - // printable area until the whole page is covered. - - // keep the page content at its position if it fits, otherwise - // move it to the printable area - const long nPageWidth ( - rInfo.maPageSize.Width() - rPage.GetLftBorder() - rPage.GetRgtBorder()); - const long nPageHeight ( - rInfo.maPageSize.Height() - rPage.GetUppBorder() - rPage.GetLwrBorder()); - - Point aOrigin ( 0, 0 ); - - for (Point aPageOrigin = aOrigin; - -aPageOrigin.Y()<nPageHeight; - aPageOrigin.Y() -= rInfo.maPrintSize.Height()) - { - for (aPageOrigin.X()=aOrigin.X(); - -aPageOrigin.X()<nPageWidth; - aPageOrigin.X() -= rInfo.maPrintSize.Width()) - { - aMap.SetOrigin(aPageOrigin); - maPrinterPages.push_back( - ::boost::shared_ptr<PrinterPage>( - new RegularPrinterPage( - sal::static_int_cast<sal_uInt16>(nPageIndex), - ePageKind, - aMap, - rInfo.mbPrintMarkedOnly, - rInfo.msPageString, - aPageOffset, - rInfo.mnDrawMode, - rInfo.meOrientation, - nPaperBin))); - } - } - } - } -}; - - - - -//===== DocumentRenderer ====================================================== - -DocumentRenderer::DocumentRenderer (ViewShellBase& rBase) - : DocumentRendererInterfaceBase(m_aMutex), - mpImpl(new Implementation(rBase)) -{ -} - - - - -DocumentRenderer::~DocumentRenderer (void) -{ -} - - - - -//----- XRenderable ----------------------------------------------------------- - -sal_Int32 SAL_CALL DocumentRenderer::getRendererCount ( - const css::uno::Any& aSelection, - const css::uno::Sequence<css::beans::PropertyValue >& rOptions) - throw (css::lang::IllegalArgumentException, css::uno::RuntimeException) -{ - (void)aSelection; - mpImpl->ProcessProperties(rOptions); - return mpImpl->GetPrintPageCount(); -} - - - - -Sequence<beans::PropertyValue> SAL_CALL DocumentRenderer::getRenderer ( - sal_Int32 nRenderer, - const css::uno::Any& rSelection, - const css::uno::Sequence<css::beans::PropertyValue>& rOptions) - throw (css::lang::IllegalArgumentException, css::uno::RuntimeException) -{ - (void)nRenderer; - (void)rSelection; - mpImpl->ProcessProperties(rOptions); - return mpImpl->GetProperties(rOptions); -} - - - - -void SAL_CALL DocumentRenderer::render ( - sal_Int32 nRenderer, - const css::uno::Any& rSelection, - const css::uno::Sequence<css::beans::PropertyValue>& rOptions) - throw (css::lang::IllegalArgumentException, css::uno::RuntimeException) -{ - (void)rSelection; - mpImpl->ProcessProperties(rOptions); - mpImpl->PrintPage(nRenderer); -} - - - -} // end of namespace sd - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |