diff options
Diffstat (limited to 'basctl/source/basicide/basicrenderable.cxx')
-rw-r--r-- | basctl/source/basicide/basicrenderable.cxx | 194 |
1 files changed, 194 insertions, 0 deletions
diff --git a/basctl/source/basicide/basicrenderable.cxx b/basctl/source/basicide/basicrenderable.cxx new file mode 100644 index 000000000000..e2042d49876c --- /dev/null +++ b/basctl/source/basicide/basicrenderable.cxx @@ -0,0 +1,194 @@ +/************************************************************************* + * + * 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_basctl.hxx" + +#include "basicrenderable.hxx" +#include "bastypes.hxx" +#include "basidesh.hrc" + +#include "com/sun/star/awt/XDevice.hpp" +#include "toolkit/awt/vclxdevice.hxx" +#include "vcl/print.hxx" +#include "tools/multisel.hxx" +#include "tools/resary.hxx" + +using namespace com::sun::star; +using namespace com::sun::star::uno; +using namespace basicide; + +BasicRenderable::BasicRenderable( IDEBaseWindow* pWin ) +: cppu::WeakComponentImplHelper1< com::sun::star::view::XRenderable >( maMutex ) +, mpWindow( pWin ) +{ + ResStringArray aStrings( IDEResId( RID_PRINTDLG_STRLIST ) ); + DBG_ASSERT( aStrings.Count() >= 5, "resource incomplete" ); + if( aStrings.Count() < 5 ) // bad resource ? + return; + + m_aUIProperties.realloc( 3 ); + + // create Subgroup for print range + vcl::PrinterOptionsHelper::UIControlOptions aPrintRangeOpt; + aPrintRangeOpt.maGroupHint = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintRange" ) ); + aPrintRangeOpt.mbInternalOnly = sal_True; + m_aUIProperties[0].Value = getSubgroupControlOpt( rtl::OUString( aStrings.GetString( 0 ) ), + rtl::OUString(), + aPrintRangeOpt + ); + + // create a choice for the range to print + rtl::OUString aPrintContentName( RTL_CONSTASCII_USTRINGPARAM( "PrintContent" ) ); + Sequence< rtl::OUString > aChoices( 2 ); + Sequence< rtl::OUString > aHelpTexts( 2 ); + aChoices[0] = aStrings.GetString( 1 ); + aHelpTexts[0] = aStrings.GetString( 2 ); + aChoices[1] = aStrings.GetString( 3 ); + aHelpTexts[1] = aStrings.GetString( 4 ); + m_aUIProperties[1].Value = getChoiceControlOpt( rtl::OUString(), + aHelpTexts, + aPrintContentName, + aChoices, + 0 ); + + // create a an Edit dependent on "Pages" selected + vcl::PrinterOptionsHelper::UIControlOptions aPageRangeOpt( aPrintContentName, 1, sal_True ); + m_aUIProperties[2].Value = getEditControlOpt( rtl::OUString(), + rtl::OUString(), + rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PageRange" ) ), + rtl::OUString(), + aPageRangeOpt + ); +} + +BasicRenderable::~BasicRenderable() +{ +} + +Printer* BasicRenderable::getPrinter() +{ + Printer* pPrinter = NULL; + Any aValue( getValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "RenderDevice" ) ) ) ); + Reference<awt::XDevice> xRenderDevice; + + if( aValue >>= xRenderDevice ) + { + VCLXDevice* pDevice = VCLXDevice::GetImplementation(xRenderDevice); + OutputDevice* pOut = pDevice ? pDevice->GetOutputDevice() : NULL; + pPrinter = dynamic_cast<Printer*>(pOut); + } + return pPrinter; +} + +sal_Int32 SAL_CALL BasicRenderable::getRendererCount ( + const Any&, const Sequence<beans::PropertyValue >& i_xOptions + ) throw (lang::IllegalArgumentException, RuntimeException) +{ + processProperties( i_xOptions ); + + sal_Int32 nCount = 0; + if( mpWindow ) + { + Printer* pPrinter = getPrinter(); + if( pPrinter ) + { + nCount = mpWindow->countPages( pPrinter ); + sal_Int64 nContent = getIntValue( "PrintContent", -1 ); + if( nContent == 1 ) + { + rtl::OUString aPageRange( getStringValue( "PageRange" ) ); + MultiSelection aSel( aPageRange ); + long nSelCount = aSel.GetSelectCount(); + if( nSelCount >= 0 && nSelCount < nCount ) + nCount = nSelCount; + } + } + else + throw lang::IllegalArgumentException(); + } + + return nCount; +} + +Sequence<beans::PropertyValue> SAL_CALL BasicRenderable::getRenderer ( + sal_Int32, const Any&, const Sequence<beans::PropertyValue>& i_xOptions + ) throw (lang::IllegalArgumentException, RuntimeException) +{ + processProperties( i_xOptions ); + + Sequence< beans::PropertyValue > aVals; + // insert page size here + Printer* pPrinter = getPrinter(); + // no renderdevice is legal; the first call is to get our print ui options + if( pPrinter ) + { + Size aPageSize( pPrinter->PixelToLogic( pPrinter->GetPaperSizePixel(), MapMode( MAP_100TH_MM ) ) ); + + aVals.realloc( 1 ); + aVals[0].Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PageSize" ) ); + awt::Size aSize; + aSize.Width = aPageSize.Width(); + aSize.Height = aPageSize.Height(); + aVals[0].Value <<= aSize; + } + + appendPrintUIOptions( aVals ); + + return aVals; +} + +void SAL_CALL BasicRenderable::render ( + sal_Int32 nRenderer, const Any&, + const Sequence<beans::PropertyValue>& i_xOptions + ) throw (lang::IllegalArgumentException, RuntimeException) +{ + processProperties( i_xOptions ); + + if( mpWindow ) + { + Printer* pPrinter = getPrinter(); + if( pPrinter ) + { + sal_Int64 nContent = getIntValue( "PrintContent", -1 ); + if( nContent == 1 ) + { + rtl::OUString aPageRange( getStringValue( "PageRange" ) ); + MultiSelection aSel( aPageRange ); + long nSelect = aSel.FirstSelected(); + while( nSelect != long(SFX_ENDOFSELECTION) && nRenderer-- ) + nSelect = aSel.NextSelected(); + if( nSelect != long(SFX_ENDOFSELECTION) ) + mpWindow->printPage( sal_Int32(nSelect-1), pPrinter ); + } + else + mpWindow->printPage( nRenderer, pPrinter ); + } + else + throw lang::IllegalArgumentException(); + } +} + + |