1d119d52dSAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3d119d52dSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4d119d52dSAndrew Rist * or more contributor license agreements. See the NOTICE file 5d119d52dSAndrew Rist * distributed with this work for additional information 6d119d52dSAndrew Rist * regarding copyright ownership. The ASF licenses this file 7d119d52dSAndrew Rist * to you under the Apache License, Version 2.0 (the 8d119d52dSAndrew Rist * "License"); you may not use this file except in compliance 9d119d52dSAndrew Rist * with the License. You may obtain a copy of the License at 10d119d52dSAndrew Rist * 11d119d52dSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12d119d52dSAndrew Rist * 13d119d52dSAndrew Rist * Unless required by applicable law or agreed to in writing, 14d119d52dSAndrew Rist * software distributed under the License is distributed on an 15d119d52dSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16d119d52dSAndrew Rist * KIND, either express or implied. See the License for the 17d119d52dSAndrew Rist * specific language governing permissions and limitations 18d119d52dSAndrew Rist * under the License. 19d119d52dSAndrew Rist * 20d119d52dSAndrew Rist *************************************************************/ 21d119d52dSAndrew Rist 22d119d52dSAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_sfx2.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir #include <com/sun/star/document/XDocumentProperties.hpp> 28cdf0e10cSrcweir #include "com/sun/star/view/XRenderable.hpp" 29cdf0e10cSrcweir 30cdf0e10cSrcweir #include <svl/itempool.hxx> 31cdf0e10cSrcweir #include <vcl/msgbox.hxx> 32cdf0e10cSrcweir #include <svtools/prnsetup.hxx> 33cdf0e10cSrcweir #include <svl/flagitem.hxx> 34cdf0e10cSrcweir #include <svl/stritem.hxx> 35cdf0e10cSrcweir #include <svl/intitem.hxx> 36cdf0e10cSrcweir #include <svl/eitem.hxx> 37cdf0e10cSrcweir #include <sfx2/app.hxx> 38cdf0e10cSrcweir #include <unotools/useroptions.hxx> 39cdf0e10cSrcweir #include <unotools/printwarningoptions.hxx> 40cdf0e10cSrcweir #include <tools/datetime.hxx> 41cdf0e10cSrcweir #include <sfx2/bindings.hxx> 42cdf0e10cSrcweir #include <sfx2/objface.hxx> 43cdf0e10cSrcweir #include <sfx2/viewsh.hxx> 44cdf0e10cSrcweir #include "viewimp.hxx" 45cdf0e10cSrcweir #include <sfx2/viewfrm.hxx> 46cdf0e10cSrcweir #include <sfx2/prnmon.hxx> 47cdf0e10cSrcweir #include "sfx2/sfxresid.hxx" 48cdf0e10cSrcweir #include <sfx2/request.hxx> 49cdf0e10cSrcweir #include <sfx2/objsh.hxx> 50cdf0e10cSrcweir #include "sfxtypes.hxx" 51cdf0e10cSrcweir #include <sfx2/event.hxx> 52cdf0e10cSrcweir #include <sfx2/docfile.hxx> 53cdf0e10cSrcweir #include <sfx2/docfilt.hxx> 54cdf0e10cSrcweir 55cdf0e10cSrcweir #include "toolkit/awt/vclxdevice.hxx" 56cdf0e10cSrcweir 57cdf0e10cSrcweir #include "view.hrc" 58cdf0e10cSrcweir #include "helpid.hrc" 59cdf0e10cSrcweir 60cdf0e10cSrcweir using namespace com::sun::star; 61cdf0e10cSrcweir using namespace com::sun::star::uno; 62cdf0e10cSrcweir 63*3d720f72SAriel Constenla-Haile TYPEINIT1(SfxPrintingHint, SfxViewEventHint); 64cdf0e10cSrcweir 65cdf0e10cSrcweir // ----------------------------------------------------------------------- 66cdf0e10cSrcweir class SfxPrinterController : public vcl::PrinterController, public SfxListener 67cdf0e10cSrcweir { 68cdf0e10cSrcweir Any maCompleteSelection; 69cdf0e10cSrcweir Any maSelection; 70cdf0e10cSrcweir Reference< view::XRenderable > mxRenderable; 71cdf0e10cSrcweir mutable Printer* mpLastPrinter; 72cdf0e10cSrcweir mutable Reference<awt::XDevice> mxDevice; 73cdf0e10cSrcweir SfxViewShell* mpViewShell; 74cdf0e10cSrcweir SfxObjectShell* mpObjectShell; 75cdf0e10cSrcweir sal_Bool m_bOrigStatus; 76cdf0e10cSrcweir sal_Bool m_bNeedsChange; 77cdf0e10cSrcweir sal_Bool m_bApi; 78cdf0e10cSrcweir sal_Bool m_bTempPrinter; 79cdf0e10cSrcweir util::DateTime m_aLastPrinted; 80cdf0e10cSrcweir ::rtl::OUString m_aLastPrintedBy; 81cdf0e10cSrcweir 82cdf0e10cSrcweir Sequence< beans::PropertyValue > getMergedOptions() const; 83cdf0e10cSrcweir const Any& getSelectionObject() const; 84cdf0e10cSrcweir public: 85cdf0e10cSrcweir SfxPrinterController( const boost::shared_ptr<Printer>& i_rPrinter, 86cdf0e10cSrcweir const Any& i_rComplete, 87cdf0e10cSrcweir const Any& i_rSelection, 88cdf0e10cSrcweir const Any& i_rViewProp, 89cdf0e10cSrcweir const Reference< view::XRenderable >& i_xRender, 90cdf0e10cSrcweir sal_Bool i_bApi, sal_Bool i_bDirect, 91cdf0e10cSrcweir SfxViewShell* pView, 92cdf0e10cSrcweir const uno::Sequence< beans::PropertyValue >& rProps 93cdf0e10cSrcweir ); 94cdf0e10cSrcweir 95cdf0e10cSrcweir virtual ~SfxPrinterController(); 96cdf0e10cSrcweir virtual void Notify( SfxBroadcaster&, const SfxHint& ); 97cdf0e10cSrcweir 98cdf0e10cSrcweir virtual int getPageCount() const; 99cdf0e10cSrcweir virtual Sequence< beans::PropertyValue > getPageParameters( int i_nPage ) const; 100cdf0e10cSrcweir virtual void printPage( int i_nPage ) const; 101cdf0e10cSrcweir virtual void jobStarted(); 102cdf0e10cSrcweir virtual void jobFinished( com::sun::star::view::PrintableState ); 103cdf0e10cSrcweir }; 104cdf0e10cSrcweir 105cdf0e10cSrcweir SfxPrinterController::SfxPrinterController( const boost::shared_ptr<Printer>& i_rPrinter, 106cdf0e10cSrcweir const Any& i_rComplete, 107cdf0e10cSrcweir const Any& i_rSelection, 108cdf0e10cSrcweir const Any& i_rViewProp, 109cdf0e10cSrcweir const Reference< view::XRenderable >& i_xRender, 110cdf0e10cSrcweir sal_Bool i_bApi, sal_Bool i_bDirect, 111cdf0e10cSrcweir SfxViewShell* pView, 112cdf0e10cSrcweir const uno::Sequence< beans::PropertyValue >& rProps 113cdf0e10cSrcweir ) 114cdf0e10cSrcweir : PrinterController( i_rPrinter) 115cdf0e10cSrcweir , maCompleteSelection( i_rComplete ) 116cdf0e10cSrcweir , maSelection( i_rSelection ) 117cdf0e10cSrcweir , mxRenderable( i_xRender ) 118cdf0e10cSrcweir , mpLastPrinter( NULL ) 119cdf0e10cSrcweir , mpViewShell( pView ) 120cdf0e10cSrcweir , mpObjectShell(0) 121cdf0e10cSrcweir , m_bOrigStatus( sal_False ) 122cdf0e10cSrcweir , m_bNeedsChange( sal_False ) 123cdf0e10cSrcweir , m_bApi(i_bApi) 124cdf0e10cSrcweir , m_bTempPrinter( i_rPrinter.get() != NULL ) 125cdf0e10cSrcweir { 126cdf0e10cSrcweir if ( mpViewShell ) 127cdf0e10cSrcweir { 128cdf0e10cSrcweir StartListening( *mpViewShell ); 129cdf0e10cSrcweir mpObjectShell = mpViewShell->GetObjectShell(); 130cdf0e10cSrcweir StartListening( *mpObjectShell ); 131cdf0e10cSrcweir } 132cdf0e10cSrcweir 133cdf0e10cSrcweir // initialize extra ui options 134cdf0e10cSrcweir if( mxRenderable.is() ) 135cdf0e10cSrcweir { 136cdf0e10cSrcweir for (sal_Int32 nProp=0; nProp<rProps.getLength(); nProp++) 137cdf0e10cSrcweir setValue( rProps[nProp].Name, rProps[nProp].Value ); 138cdf0e10cSrcweir 139cdf0e10cSrcweir Sequence< beans::PropertyValue > aRenderOptions( 3 ); 140cdf0e10cSrcweir aRenderOptions[0].Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ExtraPrintUIOptions" ) ); 141cdf0e10cSrcweir aRenderOptions[1].Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "View" ) ); 142cdf0e10cSrcweir aRenderOptions[1].Value = i_rViewProp; 143cdf0e10cSrcweir aRenderOptions[2].Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "IsPrinter" ) ); 144cdf0e10cSrcweir aRenderOptions[2].Value <<= sal_True; 145cdf0e10cSrcweir try 146cdf0e10cSrcweir { 147cdf0e10cSrcweir Sequence< beans::PropertyValue > aRenderParms( mxRenderable->getRenderer( 0 , getSelectionObject(), aRenderOptions ) ); 148cdf0e10cSrcweir int nProps = aRenderParms.getLength(); 149cdf0e10cSrcweir for( int i = 0; i < nProps; i++ ) 150cdf0e10cSrcweir { 151cdf0e10cSrcweir if( aRenderParms[i].Name.equalsAscii( "ExtraPrintUIOptions" ) ) 152cdf0e10cSrcweir { 153cdf0e10cSrcweir Sequence< beans::PropertyValue > aUIProps; 154cdf0e10cSrcweir aRenderParms[i].Value >>= aUIProps; 155cdf0e10cSrcweir setUIOptions( aUIProps ); 1560dccdc5dSMichael Stahl } 1570dccdc5dSMichael Stahl else if( aRenderParms[i].Name.compareToAscii( "NUp", 3 ) == 0 ) 1580dccdc5dSMichael Stahl { 1590dccdc5dSMichael Stahl setValue( aRenderParms[i].Name, aRenderParms[i].Value ); 160cdf0e10cSrcweir } 161cdf0e10cSrcweir } 162cdf0e10cSrcweir } 163cdf0e10cSrcweir catch( lang::IllegalArgumentException& ) 164cdf0e10cSrcweir { 165cdf0e10cSrcweir // the first renderer should always be available for the UI options, 166cdf0e10cSrcweir // but catch the exception to be safe 167cdf0e10cSrcweir } 168cdf0e10cSrcweir } 169cdf0e10cSrcweir 170cdf0e10cSrcweir // set some job parameters 171cdf0e10cSrcweir setValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "IsApi" ) ), makeAny( i_bApi ) ); 172cdf0e10cSrcweir setValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "IsDirect" ) ), makeAny( i_bDirect ) ); 173cdf0e10cSrcweir setValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "IsPrinter" ) ), makeAny( sal_True ) ); 174cdf0e10cSrcweir setValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "View" ) ), i_rViewProp ); 175cdf0e10cSrcweir } 176cdf0e10cSrcweir 177cdf0e10cSrcweir void SfxPrinterController::Notify( SfxBroadcaster& , const SfxHint& rHint ) 178cdf0e10cSrcweir { 179cdf0e10cSrcweir if ( rHint.IsA(TYPE(SfxSimpleHint)) ) 180cdf0e10cSrcweir { 181cdf0e10cSrcweir if ( ((SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) 182cdf0e10cSrcweir { 183cdf0e10cSrcweir EndListening(*mpViewShell); 184cdf0e10cSrcweir EndListening(*mpObjectShell); 185cdf0e10cSrcweir mpViewShell = 0; 186cdf0e10cSrcweir mpObjectShell = 0; 187cdf0e10cSrcweir } 188cdf0e10cSrcweir } 189cdf0e10cSrcweir } 190cdf0e10cSrcweir 191cdf0e10cSrcweir SfxPrinterController::~SfxPrinterController() 192cdf0e10cSrcweir { 193cdf0e10cSrcweir } 194cdf0e10cSrcweir 195cdf0e10cSrcweir const Any& SfxPrinterController::getSelectionObject() const 196cdf0e10cSrcweir { 197cdf0e10cSrcweir const beans::PropertyValue* pVal = getValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintSelectionOnly" ) ) ); 198cdf0e10cSrcweir if( pVal ) 199cdf0e10cSrcweir { 200cdf0e10cSrcweir sal_Bool bSel = sal_False; 201cdf0e10cSrcweir pVal->Value >>= bSel; 202cdf0e10cSrcweir return bSel ? maSelection : maCompleteSelection; 203cdf0e10cSrcweir } 204cdf0e10cSrcweir 205cdf0e10cSrcweir sal_Int32 nChoice = 0; 206cdf0e10cSrcweir pVal = getValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintContent" ) ) ); 207cdf0e10cSrcweir if( pVal ) 208cdf0e10cSrcweir pVal->Value >>= nChoice; 209cdf0e10cSrcweir return (nChoice > 1) ? maSelection : maCompleteSelection; 210cdf0e10cSrcweir } 211cdf0e10cSrcweir 212cdf0e10cSrcweir Sequence< beans::PropertyValue > SfxPrinterController::getMergedOptions() const 213cdf0e10cSrcweir { 214cdf0e10cSrcweir boost::shared_ptr<Printer> pPrinter( getPrinter() ); 215cdf0e10cSrcweir if( pPrinter.get() != mpLastPrinter ) 216cdf0e10cSrcweir { 217cdf0e10cSrcweir mpLastPrinter = pPrinter.get(); 218cdf0e10cSrcweir VCLXDevice* pXDevice = new VCLXDevice(); 219cdf0e10cSrcweir pXDevice->SetOutputDevice( mpLastPrinter ); 220cdf0e10cSrcweir mxDevice = Reference< awt::XDevice >( pXDevice ); 221cdf0e10cSrcweir } 222cdf0e10cSrcweir 223cdf0e10cSrcweir Sequence< beans::PropertyValue > aRenderOptions( 1 ); 224cdf0e10cSrcweir aRenderOptions[ 0 ].Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "RenderDevice" ) ); 225cdf0e10cSrcweir aRenderOptions[ 0 ].Value <<= mxDevice; 226cdf0e10cSrcweir 227cdf0e10cSrcweir aRenderOptions = getJobProperties( aRenderOptions ); 228cdf0e10cSrcweir return aRenderOptions; 229cdf0e10cSrcweir } 230cdf0e10cSrcweir 231cdf0e10cSrcweir int SfxPrinterController::getPageCount() const 232cdf0e10cSrcweir { 233cdf0e10cSrcweir int nPages = 0; 234cdf0e10cSrcweir boost::shared_ptr<Printer> pPrinter( getPrinter() ); 235cdf0e10cSrcweir if( mxRenderable.is() && pPrinter ) 236cdf0e10cSrcweir { 237cdf0e10cSrcweir Sequence< beans::PropertyValue > aJobOptions( getMergedOptions() ); 238cdf0e10cSrcweir nPages = mxRenderable->getRendererCount( getSelectionObject(), aJobOptions ); 239cdf0e10cSrcweir } 240cdf0e10cSrcweir return nPages; 241cdf0e10cSrcweir } 242cdf0e10cSrcweir 243cdf0e10cSrcweir Sequence< beans::PropertyValue > SfxPrinterController::getPageParameters( int i_nPage ) const 244cdf0e10cSrcweir { 245cdf0e10cSrcweir boost::shared_ptr<Printer> pPrinter( getPrinter() ); 246cdf0e10cSrcweir Sequence< beans::PropertyValue > aResult; 247cdf0e10cSrcweir 248cdf0e10cSrcweir if( mxRenderable.is() && pPrinter ) 249cdf0e10cSrcweir { 250cdf0e10cSrcweir Sequence< beans::PropertyValue > aJobOptions( getMergedOptions() ); 251cdf0e10cSrcweir try 252cdf0e10cSrcweir { 253cdf0e10cSrcweir aResult = mxRenderable->getRenderer( i_nPage, getSelectionObject(), aJobOptions ); 254cdf0e10cSrcweir } 255cdf0e10cSrcweir catch( lang::IllegalArgumentException& ) 256cdf0e10cSrcweir { 257cdf0e10cSrcweir } 258cdf0e10cSrcweir } 259cdf0e10cSrcweir return aResult; 260cdf0e10cSrcweir } 261cdf0e10cSrcweir 262cdf0e10cSrcweir void SfxPrinterController::printPage( int i_nPage ) const 263cdf0e10cSrcweir { 264cdf0e10cSrcweir boost::shared_ptr<Printer> pPrinter( getPrinter() ); 265cdf0e10cSrcweir if( mxRenderable.is() && pPrinter ) 266cdf0e10cSrcweir { 267cdf0e10cSrcweir Sequence< beans::PropertyValue > aJobOptions( getMergedOptions() ); 268cdf0e10cSrcweir try 269cdf0e10cSrcweir { 270cdf0e10cSrcweir mxRenderable->render( i_nPage, getSelectionObject(), aJobOptions ); 271cdf0e10cSrcweir } 272cdf0e10cSrcweir catch( lang::IllegalArgumentException& ) 273cdf0e10cSrcweir { 274cdf0e10cSrcweir // don't care enough about nonexistant page here 275cdf0e10cSrcweir // to provoke a crash 276cdf0e10cSrcweir } 277cdf0e10cSrcweir } 278cdf0e10cSrcweir } 279cdf0e10cSrcweir 280cdf0e10cSrcweir void SfxPrinterController::jobStarted() 281cdf0e10cSrcweir { 282cdf0e10cSrcweir if ( mpObjectShell ) 283cdf0e10cSrcweir { 284cdf0e10cSrcweir m_bOrigStatus = mpObjectShell->IsEnableSetModified(); 285cdf0e10cSrcweir 286cdf0e10cSrcweir // check configuration: shall update of printing information in DocInfo set the document to "modified"? 287cdf0e10cSrcweir if ( m_bOrigStatus && !SvtPrintWarningOptions().IsModifyDocumentOnPrintingAllowed() ) 288cdf0e10cSrcweir { 289cdf0e10cSrcweir mpObjectShell->EnableSetModified( sal_False ); 290cdf0e10cSrcweir m_bNeedsChange = sal_True; 291cdf0e10cSrcweir } 292cdf0e10cSrcweir 293cdf0e10cSrcweir // refresh document info 294cdf0e10cSrcweir uno::Reference<document::XDocumentProperties> xDocProps(mpObjectShell->getDocProperties()); 295cdf0e10cSrcweir m_aLastPrintedBy = xDocProps->getPrintedBy(); 296cdf0e10cSrcweir m_aLastPrinted = xDocProps->getPrintDate(); 297cdf0e10cSrcweir 298cdf0e10cSrcweir xDocProps->setPrintedBy( mpObjectShell->IsUseUserData() 299cdf0e10cSrcweir ? ::rtl::OUString( SvtUserOptions().GetFullName() ) 300cdf0e10cSrcweir : ::rtl::OUString() ); 301cdf0e10cSrcweir ::DateTime now; 302cdf0e10cSrcweir 303cdf0e10cSrcweir xDocProps->setPrintDate( util::DateTime( 304cdf0e10cSrcweir now.Get100Sec(), now.GetSec(), now.GetMin(), now.GetHour(), 305cdf0e10cSrcweir now.GetDay(), now.GetMonth(), now.GetYear() ) ); 306cdf0e10cSrcweir 307cdf0e10cSrcweir uno::Sequence < beans::PropertyValue > aOpts; 308*3d720f72SAriel Constenla-Haile aOpts = getJobProperties( aOpts ); 309*3d720f72SAriel Constenla-Haile 310*3d720f72SAriel Constenla-Haile uno::Reference< frame::XController2 > xController; 311*3d720f72SAriel Constenla-Haile if ( mpViewShell ) 312*3d720f72SAriel Constenla-Haile xController.set( mpViewShell->GetController(), uno::UNO_QUERY ); 313*3d720f72SAriel Constenla-Haile 314*3d720f72SAriel Constenla-Haile mpObjectShell->Broadcast( SfxPrintingHint( 315*3d720f72SAriel Constenla-Haile view::PrintableState_JOB_STARTED, aOpts, mpObjectShell, xController ) ); 316cdf0e10cSrcweir } 317cdf0e10cSrcweir } 318cdf0e10cSrcweir 319cdf0e10cSrcweir void SfxPrinterController::jobFinished( com::sun::star::view::PrintableState nState ) 320cdf0e10cSrcweir { 321cdf0e10cSrcweir if ( mpObjectShell ) 322cdf0e10cSrcweir { 323cdf0e10cSrcweir bool bCopyJobSetup = false; 324cdf0e10cSrcweir mpObjectShell->Broadcast( SfxPrintingHint( nState ) ); 325cdf0e10cSrcweir switch ( nState ) 326cdf0e10cSrcweir { 327cdf0e10cSrcweir case view::PrintableState_JOB_FAILED : 328cdf0e10cSrcweir { 329cdf0e10cSrcweir // "real" problem (not simply printing cancelled by user) 330cdf0e10cSrcweir String aMsg( SfxResId( STR_NOSTARTPRINTER ) ); 331cdf0e10cSrcweir if ( !m_bApi ) 332cdf0e10cSrcweir ErrorBox( mpViewShell->GetWindow(), WB_OK | WB_DEF_OK, aMsg ).Execute(); 333cdf0e10cSrcweir // intentionally no break 334cdf0e10cSrcweir } 335cdf0e10cSrcweir case view::PrintableState_JOB_ABORTED : 336cdf0e10cSrcweir { 337cdf0e10cSrcweir // printing not succesful, reset DocInfo 338cdf0e10cSrcweir uno::Reference<document::XDocumentProperties> xDocProps(mpObjectShell->getDocProperties()); 339cdf0e10cSrcweir xDocProps->setPrintedBy(m_aLastPrintedBy); 340cdf0e10cSrcweir xDocProps->setPrintDate(m_aLastPrinted); 341cdf0e10cSrcweir break; 342cdf0e10cSrcweir } 343cdf0e10cSrcweir 344cdf0e10cSrcweir case view::PrintableState_JOB_SPOOLED : 345cdf0e10cSrcweir case view::PrintableState_JOB_COMPLETED : 346cdf0e10cSrcweir { 347cdf0e10cSrcweir SfxBindings& rBind = mpViewShell->GetViewFrame()->GetBindings(); 348cdf0e10cSrcweir rBind.Invalidate( SID_PRINTDOC ); 349cdf0e10cSrcweir rBind.Invalidate( SID_PRINTDOCDIRECT ); 350cdf0e10cSrcweir rBind.Invalidate( SID_SETUPPRINTER ); 351cdf0e10cSrcweir bCopyJobSetup = ! m_bTempPrinter; 352cdf0e10cSrcweir break; 353cdf0e10cSrcweir } 354cdf0e10cSrcweir 355cdf0e10cSrcweir default: 356cdf0e10cSrcweir break; 357cdf0e10cSrcweir } 358cdf0e10cSrcweir 359cdf0e10cSrcweir if( bCopyJobSetup && mpViewShell ) 360cdf0e10cSrcweir { 361cdf0e10cSrcweir // #i114306# 362cdf0e10cSrcweir // Note: this possibly creates a printer that gets immediately replaced 363cdf0e10cSrcweir // by a new one. The reason for this is that otherwise we would not get 364cdf0e10cSrcweir // the printer's SfxItemSet here to copy. Awkward, but at the moment there is no 365cdf0e10cSrcweir // other way here to get the item set. 366cdf0e10cSrcweir SfxPrinter* pDocPrt = mpViewShell->GetPrinter(sal_True); 367cdf0e10cSrcweir if( pDocPrt ) 368cdf0e10cSrcweir { 369cdf0e10cSrcweir if( pDocPrt->GetName() == getPrinter()->GetName() ) 370cdf0e10cSrcweir pDocPrt->SetJobSetup( getPrinter()->GetJobSetup() ); 371cdf0e10cSrcweir else 372cdf0e10cSrcweir { 373cdf0e10cSrcweir SfxPrinter* pNewPrt = new SfxPrinter( pDocPrt->GetOptions().Clone(), getPrinter()->GetName() ); 374cdf0e10cSrcweir pNewPrt->SetJobSetup( getPrinter()->GetJobSetup() ); 375cdf0e10cSrcweir mpViewShell->SetPrinter( pNewPrt, SFX_PRINTER_PRINTER | SFX_PRINTER_JOBSETUP ); 376cdf0e10cSrcweir } 377cdf0e10cSrcweir } 378cdf0e10cSrcweir } 379cdf0e10cSrcweir 380cdf0e10cSrcweir if ( m_bNeedsChange ) 381cdf0e10cSrcweir mpObjectShell->EnableSetModified( m_bOrigStatus ); 382cdf0e10cSrcweir 383cdf0e10cSrcweir if ( mpViewShell ) 384cdf0e10cSrcweir { 385cdf0e10cSrcweir mpViewShell->pImp->m_pPrinterController.reset(); 386cdf0e10cSrcweir } 387cdf0e10cSrcweir } 388cdf0e10cSrcweir } 389cdf0e10cSrcweir 390cdf0e10cSrcweir //==================================================================== 391cdf0e10cSrcweir 392cdf0e10cSrcweir class SfxDialogExecutor_Impl 393cdf0e10cSrcweir 394cdf0e10cSrcweir /* [Beschreibung] 395cdf0e10cSrcweir 396cdf0e10cSrcweir Eine Instanz dieser Klasse wird f"ur die Laufzeit des Printer-Dialogs 397cdf0e10cSrcweir erzeugt, um im dessen Click-Handler f"ur die Zus"atze den per 398cdf0e10cSrcweir virtueller Methode von der abgeleiteten SfxViewShell erzeugten 399cdf0e10cSrcweir Print-Options-Dialog zu erzeugen und die dort eingestellten Optionen 400cdf0e10cSrcweir als SfxItemSet zu zwischenzuspeichern. 401cdf0e10cSrcweir */ 402cdf0e10cSrcweir 403cdf0e10cSrcweir { 404cdf0e10cSrcweir private: 405cdf0e10cSrcweir SfxViewShell* _pViewSh; 406cdf0e10cSrcweir PrinterSetupDialog* _pSetupParent; 407cdf0e10cSrcweir SfxItemSet* _pOptions; 408cdf0e10cSrcweir sal_Bool _bModified; 409cdf0e10cSrcweir sal_Bool _bHelpDisabled; 410cdf0e10cSrcweir 411cdf0e10cSrcweir DECL_LINK( Execute, void * ); 412cdf0e10cSrcweir 413cdf0e10cSrcweir public: 414cdf0e10cSrcweir SfxDialogExecutor_Impl( SfxViewShell* pViewSh, PrinterSetupDialog* pParent ); 415cdf0e10cSrcweir ~SfxDialogExecutor_Impl() { delete _pOptions; } 416cdf0e10cSrcweir 417cdf0e10cSrcweir Link GetLink() const { return LINK( this, SfxDialogExecutor_Impl, Execute); } 418cdf0e10cSrcweir const SfxItemSet* GetOptions() const { return _pOptions; } 419cdf0e10cSrcweir void DisableHelp() { _bHelpDisabled = sal_True; } 420cdf0e10cSrcweir }; 421cdf0e10cSrcweir 422cdf0e10cSrcweir //-------------------------------------------------------------------- 423cdf0e10cSrcweir 424cdf0e10cSrcweir SfxDialogExecutor_Impl::SfxDialogExecutor_Impl( SfxViewShell* pViewSh, PrinterSetupDialog* pParent ) : 425cdf0e10cSrcweir 426cdf0e10cSrcweir _pViewSh ( pViewSh ), 427cdf0e10cSrcweir _pSetupParent ( pParent ), 428cdf0e10cSrcweir _pOptions ( NULL ), 429cdf0e10cSrcweir _bModified ( sal_False ), 430cdf0e10cSrcweir _bHelpDisabled ( sal_False ) 431cdf0e10cSrcweir 432cdf0e10cSrcweir { 433cdf0e10cSrcweir } 434cdf0e10cSrcweir 435cdf0e10cSrcweir //-------------------------------------------------------------------- 436cdf0e10cSrcweir 437cdf0e10cSrcweir IMPL_LINK( SfxDialogExecutor_Impl, Execute, void *, EMPTYARG ) 438cdf0e10cSrcweir { 439cdf0e10cSrcweir // Options lokal merken 440cdf0e10cSrcweir if ( !_pOptions ) 441cdf0e10cSrcweir { 442cdf0e10cSrcweir DBG_ASSERT( _pSetupParent, "no dialog parent" ); 443cdf0e10cSrcweir if( _pSetupParent ) 444cdf0e10cSrcweir _pOptions = ( (SfxPrinter*)_pSetupParent->GetPrinter() )->GetOptions().Clone(); 445cdf0e10cSrcweir } 446cdf0e10cSrcweir 447cdf0e10cSrcweir // Dialog ausf"uhren 448cdf0e10cSrcweir SfxPrintOptionsDialog* pDlg = new SfxPrintOptionsDialog( static_cast<Window*>(_pSetupParent), 449cdf0e10cSrcweir _pViewSh, _pOptions ); 450cdf0e10cSrcweir if ( _bHelpDisabled ) 451cdf0e10cSrcweir pDlg->DisableHelp(); 452cdf0e10cSrcweir if ( pDlg->Execute() == RET_OK ) 453cdf0e10cSrcweir { 454cdf0e10cSrcweir delete _pOptions; 455cdf0e10cSrcweir _pOptions = pDlg->GetOptions().Clone(); 456cdf0e10cSrcweir 457cdf0e10cSrcweir } 458cdf0e10cSrcweir delete pDlg; 459cdf0e10cSrcweir 460cdf0e10cSrcweir return 0; 461cdf0e10cSrcweir } 462cdf0e10cSrcweir 463cdf0e10cSrcweir //------------------------------------------------------------------------- 464cdf0e10cSrcweir 465cdf0e10cSrcweir sal_Bool UseStandardPrinter_Impl( Window* /*pParent*/, SfxPrinter* pDocPrinter ) 466cdf0e10cSrcweir { 467cdf0e10cSrcweir // Optionen abfragen, ob gewarnt werden soll (Doc uebersteuert App) 468cdf0e10cSrcweir sal_Bool bWarn = sal_False; 469cdf0e10cSrcweir const SfxItemSet *pDocOptions = &pDocPrinter->GetOptions(); 470cdf0e10cSrcweir if ( pDocOptions ) 471cdf0e10cSrcweir { 472cdf0e10cSrcweir sal_uInt16 nWhich = pDocOptions->GetPool()->GetWhich(SID_PRINTER_NOTFOUND_WARN); 473cdf0e10cSrcweir const SfxBoolItem* pBoolItem = NULL; 474cdf0e10cSrcweir pDocPrinter->GetOptions().GetItemState( nWhich, sal_False, (const SfxPoolItem**) &pBoolItem ); 475cdf0e10cSrcweir if ( pBoolItem ) 476cdf0e10cSrcweir bWarn = pBoolItem->GetValue(); 477cdf0e10cSrcweir } 478cdf0e10cSrcweir /* 479cdf0e10cSrcweir // ggf. den User fragen 480cdf0e10cSrcweir if ( bWarn ) 481cdf0e10cSrcweir { 482cdf0e10cSrcweir // Geht nicht mehr ohne OrigJobSetup! 483cdf0e10cSrcweir String aTmp( SfxResId( STR_PRINTER_NOTAVAIL ) ); 484cdf0e10cSrcweir QueryBox aBox( pParent, WB_OK_CANCEL | WB_DEF_OK, aTmp ); 485cdf0e10cSrcweir return RET_OK == aBox.Execute(); 486cdf0e10cSrcweir } 487cdf0e10cSrcweir */ 488cdf0e10cSrcweir // nicht gewarnt => einfach so den StandardDrucker nehmen 489cdf0e10cSrcweir return sal_True; 490cdf0e10cSrcweir } 491cdf0e10cSrcweir //------------------------------------------------------------------------- 492cdf0e10cSrcweir 493cdf0e10cSrcweir SfxPrinter* SfxViewShell::SetPrinter_Impl( SfxPrinter *pNewPrinter ) 494cdf0e10cSrcweir 495cdf0e10cSrcweir /* Interne Methode zum Setzen der Unterschiede von 'pNewPrinter' zum 496cdf0e10cSrcweir aktuellen Printer. pNewPrinter wird entweder "ubernommen oder gel"oscht. 497cdf0e10cSrcweir */ 498cdf0e10cSrcweir 499cdf0e10cSrcweir { 500cdf0e10cSrcweir // aktuellen Printer holen 501cdf0e10cSrcweir SfxPrinter *pDocPrinter = GetPrinter(); 502cdf0e10cSrcweir 503cdf0e10cSrcweir // Printer-Options auswerten 504cdf0e10cSrcweir bool bOriToDoc = false; 505cdf0e10cSrcweir bool bSizeToDoc = false; 506cdf0e10cSrcweir if ( &pDocPrinter->GetOptions() ) 507cdf0e10cSrcweir { 508cdf0e10cSrcweir sal_uInt16 nWhich = GetPool().GetWhich(SID_PRINTER_CHANGESTODOC); 509cdf0e10cSrcweir const SfxFlagItem *pFlagItem = 0; 510cdf0e10cSrcweir pDocPrinter->GetOptions().GetItemState( nWhich, sal_False, (const SfxPoolItem**) &pFlagItem ); 511cdf0e10cSrcweir bOriToDoc = pFlagItem ? (pFlagItem->GetValue() & SFX_PRINTER_CHG_ORIENTATION) : sal_False; 512cdf0e10cSrcweir bSizeToDoc = pFlagItem ? (pFlagItem->GetValue() & SFX_PRINTER_CHG_SIZE) : sal_False; 513cdf0e10cSrcweir } 514cdf0e10cSrcweir 515cdf0e10cSrcweir // vorheriges Format und Size feststellen 516cdf0e10cSrcweir Orientation eOldOri = pDocPrinter->GetOrientation(); 517cdf0e10cSrcweir Size aOldPgSz = pDocPrinter->GetPaperSizePixel(); 518cdf0e10cSrcweir 519cdf0e10cSrcweir // neues Format und Size feststellen 520cdf0e10cSrcweir Orientation eNewOri = pNewPrinter->GetOrientation(); 521cdf0e10cSrcweir Size aNewPgSz = pNewPrinter->GetPaperSizePixel(); 522cdf0e10cSrcweir 523cdf0e10cSrcweir // "Anderungen am Seitenformat feststellen 524cdf0e10cSrcweir sal_Bool bOriChg = (eOldOri != eNewOri) && bOriToDoc; 525cdf0e10cSrcweir sal_Bool bPgSzChg = ( aOldPgSz.Height() != 526cdf0e10cSrcweir ( bOriChg ? aNewPgSz.Width() : aNewPgSz.Height() ) || 527cdf0e10cSrcweir aOldPgSz.Width() != 528cdf0e10cSrcweir ( bOriChg ? aNewPgSz.Height() : aNewPgSz.Width() ) ) && 529cdf0e10cSrcweir bSizeToDoc; 530cdf0e10cSrcweir 531cdf0e10cSrcweir // Message und Flags f"ur Seitenformat-"Anderung zusammenstellen 532cdf0e10cSrcweir String aMsg; 533cdf0e10cSrcweir sal_uInt16 nNewOpt=0; 534cdf0e10cSrcweir if( bOriChg && bPgSzChg ) 535cdf0e10cSrcweir { 536cdf0e10cSrcweir aMsg = String(SfxResId(STR_PRINT_NEWORISIZE)); 537cdf0e10cSrcweir nNewOpt = SFX_PRINTER_CHG_ORIENTATION | SFX_PRINTER_CHG_SIZE; 538cdf0e10cSrcweir } 539cdf0e10cSrcweir else if (bOriChg ) 540cdf0e10cSrcweir { 541cdf0e10cSrcweir aMsg = String(SfxResId(STR_PRINT_NEWORI)); 542cdf0e10cSrcweir nNewOpt = SFX_PRINTER_CHG_ORIENTATION; 543cdf0e10cSrcweir } 544cdf0e10cSrcweir else if (bPgSzChg) 545cdf0e10cSrcweir { 546cdf0e10cSrcweir aMsg = String(SfxResId(STR_PRINT_NEWSIZE)); 547cdf0e10cSrcweir nNewOpt = SFX_PRINTER_CHG_SIZE; 548cdf0e10cSrcweir } 549cdf0e10cSrcweir 550cdf0e10cSrcweir // in dieser Variable sammeln, was sich so ge"aendert hat 551cdf0e10cSrcweir sal_uInt16 nChangedFlags = 0; 552cdf0e10cSrcweir 553cdf0e10cSrcweir // ggf. Nachfrage, ob Seitenformat vom Drucker "ubernommen werden soll 554cdf0e10cSrcweir if ( ( bOriChg || bPgSzChg ) && 555cdf0e10cSrcweir RET_YES == QueryBox(0, WB_YES_NO | WB_DEF_OK, aMsg).Execute() ) 556cdf0e10cSrcweir // Flags mit "Anderungen f"ur <SetPrinter(SfxPrinter*)> mitpflegen 557cdf0e10cSrcweir nChangedFlags |= nNewOpt; 558cdf0e10cSrcweir 559cdf0e10cSrcweir // fuer den MAC sein "temporary of class String" im naechsten if() 560cdf0e10cSrcweir String aTempPrtName = pNewPrinter->GetName(); 561cdf0e10cSrcweir String aDocPrtName = pDocPrinter->GetName(); 562cdf0e10cSrcweir 563cdf0e10cSrcweir // Wurde der Drucker gewechselt oder von Default auf Specific 564cdf0e10cSrcweir // oder umgekehrt geaendert? 565cdf0e10cSrcweir if ( (aTempPrtName != aDocPrtName) || (pDocPrinter->IsDefPrinter() != pNewPrinter->IsDefPrinter()) ) 566cdf0e10cSrcweir { 567cdf0e10cSrcweir // neuen Printer "ubernehmen 568cdf0e10cSrcweir // pNewPrinter->SetOrigJobSetup( pNewPrinter->GetJobSetup() ); 569cdf0e10cSrcweir nChangedFlags |= SFX_PRINTER_PRINTER|SFX_PRINTER_JOBSETUP; 570cdf0e10cSrcweir pDocPrinter = pNewPrinter; 571cdf0e10cSrcweir } 572cdf0e10cSrcweir else 573cdf0e10cSrcweir { 574cdf0e10cSrcweir // Extra-Optionen vergleichen 575cdf0e10cSrcweir if ( ! (pNewPrinter->GetOptions() == pDocPrinter->GetOptions()) ) 576cdf0e10cSrcweir { 577cdf0e10cSrcweir // Options haben sich geaendert 578cdf0e10cSrcweir pDocPrinter->SetOptions( pNewPrinter->GetOptions() ); 579cdf0e10cSrcweir nChangedFlags |= SFX_PRINTER_OPTIONS; 580cdf0e10cSrcweir } 581cdf0e10cSrcweir 582cdf0e10cSrcweir // JobSetups vergleichen 583cdf0e10cSrcweir JobSetup aNewJobSetup = pNewPrinter->GetJobSetup(); 584cdf0e10cSrcweir JobSetup aOldJobSetup = pDocPrinter->GetJobSetup(); 585cdf0e10cSrcweir if ( aNewJobSetup != aOldJobSetup ) 586cdf0e10cSrcweir { 587cdf0e10cSrcweir // JobSetup hat sich geaendert (=> App mu\s neu formatieren) 588cdf0e10cSrcweir // pDocPrinter->SetOrigJobSetup( aNewJobSetup ); 589cdf0e10cSrcweir nChangedFlags |= SFX_PRINTER_JOBSETUP; 590cdf0e10cSrcweir } 591cdf0e10cSrcweir 592cdf0e10cSrcweir // alten, ver"anderten Printer behalten 593cdf0e10cSrcweir pDocPrinter->SetPrinterProps( pNewPrinter ); 594cdf0e10cSrcweir delete pNewPrinter; 595cdf0e10cSrcweir } 596cdf0e10cSrcweir 597cdf0e10cSrcweir if ( 0 != nChangedFlags ) 598cdf0e10cSrcweir // SetPrinter will delete the old printer if it changes 599cdf0e10cSrcweir SetPrinter( pDocPrinter, nChangedFlags ); 600cdf0e10cSrcweir return pDocPrinter; 601cdf0e10cSrcweir } 602cdf0e10cSrcweir 603cdf0e10cSrcweir //------------------------------------------------------------------------- 604cdf0e10cSrcweir // Unter WIN32 tritt leider das Problem auf, dass nichts gedruckt 605cdf0e10cSrcweir // wird, wenn SID_PRINTDOCDIRECT auflaueft; bisher bekannte, 606cdf0e10cSrcweir // einzige Abhilfe ist in diesem Fall das Abschalten der Optimierungen 607cdf0e10cSrcweir // (KA 17.12.95) 608cdf0e10cSrcweir #ifdef _MSC_VER 609cdf0e10cSrcweir #pragma optimize ( "", off ) 610cdf0e10cSrcweir #endif 611cdf0e10cSrcweir 612cdf0e10cSrcweir void SfxViewShell::ExecPrint( const uno::Sequence < beans::PropertyValue >& rProps, sal_Bool bIsAPI, sal_Bool bIsDirect ) 613cdf0e10cSrcweir { 614cdf0e10cSrcweir // get the current selection; our controller should know it 615cdf0e10cSrcweir Reference< frame::XController > xController( GetController() ); 616cdf0e10cSrcweir Reference< view::XSelectionSupplier > xSupplier( xController, UNO_QUERY ); 617cdf0e10cSrcweir 618cdf0e10cSrcweir Any aSelection; 619cdf0e10cSrcweir if( xSupplier.is() ) 620cdf0e10cSrcweir aSelection = xSupplier->getSelection(); 621cdf0e10cSrcweir else 622cdf0e10cSrcweir aSelection <<= GetObjectShell()->GetModel(); 623cdf0e10cSrcweir Any aComplete( makeAny( GetObjectShell()->GetModel() ) ); 624cdf0e10cSrcweir Any aViewProp( makeAny( xController ) ); 625cdf0e10cSrcweir boost::shared_ptr<Printer> aPrt; 626cdf0e10cSrcweir 627cdf0e10cSrcweir const beans::PropertyValue* pVal = rProps.getConstArray(); 628cdf0e10cSrcweir for( sal_Int32 i = 0; i < rProps.getLength(); i++ ) 629cdf0e10cSrcweir { 630cdf0e10cSrcweir if( pVal[i].Name.equalsAscii( "PrinterName" ) ) 631cdf0e10cSrcweir { 632cdf0e10cSrcweir rtl::OUString aPrinterName; 633cdf0e10cSrcweir pVal[i].Value >>= aPrinterName; 634cdf0e10cSrcweir aPrt.reset( new Printer( aPrinterName ) ); 635cdf0e10cSrcweir break; 636cdf0e10cSrcweir } 637cdf0e10cSrcweir } 638cdf0e10cSrcweir 639cdf0e10cSrcweir boost::shared_ptr<vcl::PrinterController> pController( new SfxPrinterController( 640cdf0e10cSrcweir aPrt, 641cdf0e10cSrcweir aComplete, 642cdf0e10cSrcweir aSelection, 643cdf0e10cSrcweir aViewProp, 644cdf0e10cSrcweir GetRenderable(), 645cdf0e10cSrcweir bIsAPI, 646cdf0e10cSrcweir bIsDirect, 647cdf0e10cSrcweir this, 648cdf0e10cSrcweir rProps 649cdf0e10cSrcweir ) ); 650cdf0e10cSrcweir pImp->m_pPrinterController = pController; 651cdf0e10cSrcweir 652cdf0e10cSrcweir SfxObjectShell *pObjShell = GetObjectShell(); 653cdf0e10cSrcweir pController->setValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "JobName" ) ), 654cdf0e10cSrcweir makeAny( rtl::OUString( pObjShell->GetTitle(0) ) ) ); 655cdf0e10cSrcweir 656cdf0e10cSrcweir // FIXME: job setup 657cdf0e10cSrcweir SfxPrinter* pDocPrt = GetPrinter(sal_False); 658cdf0e10cSrcweir JobSetup aJobSetup = pDocPrt ? pDocPrt->GetJobSetup() : GetJobSetup(); 659cdf0e10cSrcweir if( bIsDirect ) 660cdf0e10cSrcweir aJobSetup.SetValue( String( RTL_CONSTASCII_USTRINGPARAM( "IsQuickJob" ) ), 661cdf0e10cSrcweir String( RTL_CONSTASCII_USTRINGPARAM( "true" ) ) ); 662cdf0e10cSrcweir 663cdf0e10cSrcweir Printer::PrintJob( pController, aJobSetup ); 664cdf0e10cSrcweir } 665cdf0e10cSrcweir 666cdf0e10cSrcweir Printer* SfxViewShell::GetActivePrinter() const 667cdf0e10cSrcweir { 668cdf0e10cSrcweir return (pImp->m_pPrinterController) 669cdf0e10cSrcweir ? pImp->m_pPrinterController->getPrinter().get() : 0; 670cdf0e10cSrcweir } 671cdf0e10cSrcweir 672cdf0e10cSrcweir void SfxViewShell::ExecPrint_Impl( SfxRequest &rReq ) 673cdf0e10cSrcweir { 674cdf0e10cSrcweir // sal_uInt16 nCopies=1; 675cdf0e10cSrcweir sal_uInt16 nDialogRet = RET_CANCEL; 676cdf0e10cSrcweir // sal_Bool bCollate=sal_False; 677cdf0e10cSrcweir SfxPrinter* pPrinter = 0; 678cdf0e10cSrcweir SfxDialogExecutor_Impl* pExecutor = 0; 679cdf0e10cSrcweir bool bSilent = false; 680cdf0e10cSrcweir sal_Bool bIsAPI = rReq.GetArgs() && rReq.GetArgs()->Count(); 681cdf0e10cSrcweir if ( bIsAPI ) 682cdf0e10cSrcweir { 683cdf0e10cSrcweir SFX_REQUEST_ARG(rReq, pSilentItem, SfxBoolItem, SID_SILENT, sal_False); 684cdf0e10cSrcweir bSilent = pSilentItem && pSilentItem->GetValue(); 685cdf0e10cSrcweir } 686cdf0e10cSrcweir 687cdf0e10cSrcweir //FIXME: how to transport "bPrintOnHelp"? 688cdf0e10cSrcweir 689cdf0e10cSrcweir // no help button in dialogs if called from the help window 690cdf0e10cSrcweir // (pressing help button would exchange the current page inside the help document that is going to be printed!) 691cdf0e10cSrcweir String aHelpFilterName( DEFINE_CONST_UNICODE("writer_web_HTML_help") ); 692cdf0e10cSrcweir SfxMedium* pMedium = GetViewFrame()->GetObjectShell()->GetMedium(); 693cdf0e10cSrcweir const SfxFilter* pFilter = pMedium ? pMedium->GetFilter() : NULL; 694cdf0e10cSrcweir sal_Bool bPrintOnHelp = ( pFilter && pFilter->GetFilterName() == aHelpFilterName ); 695cdf0e10cSrcweir 696cdf0e10cSrcweir const sal_uInt16 nId = rReq.GetSlot(); 697cdf0e10cSrcweir switch( nId ) 698cdf0e10cSrcweir { 699cdf0e10cSrcweir // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 700cdf0e10cSrcweir case SID_PRINTDOC: 701cdf0e10cSrcweir case SID_PRINTDOCDIRECT: 702cdf0e10cSrcweir { 703cdf0e10cSrcweir SfxObjectShell* pDoc = GetObjectShell(); 704cdf0e10cSrcweir 705cdf0e10cSrcweir // derived class may decide to abort this 706cdf0e10cSrcweir if( !pDoc->QuerySlotExecutable( nId ) ) 707cdf0e10cSrcweir { 708cdf0e10cSrcweir rReq.SetReturnValue( SfxBoolItem( 0, sal_False ) ); 709cdf0e10cSrcweir return; 710cdf0e10cSrcweir } 711cdf0e10cSrcweir 712cdf0e10cSrcweir bool bDetectHidden = ( !bSilent && pDoc ); 713cdf0e10cSrcweir if ( bDetectHidden && pDoc->QueryHiddenInformation( WhenPrinting, NULL ) != RET_YES ) 714cdf0e10cSrcweir break; 715cdf0e10cSrcweir 716cdf0e10cSrcweir SFX_REQUEST_ARG(rReq, pSelectItem, SfxBoolItem, SID_SELECTION, sal_False); 717cdf0e10cSrcweir sal_Bool bSelection = pSelectItem && pSelectItem->GetValue(); 718cdf0e10cSrcweir if( pSelectItem && rReq.GetArgs()->Count() == 1 ) 719cdf0e10cSrcweir bIsAPI = sal_False; 720cdf0e10cSrcweir 721cdf0e10cSrcweir uno::Sequence < beans::PropertyValue > aProps; 722cdf0e10cSrcweir if ( bIsAPI ) 723cdf0e10cSrcweir { 724cdf0e10cSrcweir // supported properties: 725cdf0e10cSrcweir // String PrinterName 726cdf0e10cSrcweir // String FileName 727cdf0e10cSrcweir // Int16 From 728cdf0e10cSrcweir // Int16 To 729cdf0e10cSrcweir // In16 Copies 730cdf0e10cSrcweir // String RangeText 731cdf0e10cSrcweir // bool Selection 732cdf0e10cSrcweir // bool Asynchron 733cdf0e10cSrcweir // bool Collate 734cdf0e10cSrcweir // bool Silent 735cdf0e10cSrcweir TransformItems( nId, *rReq.GetArgs(), aProps, GetInterface()->GetSlot(nId) ); 736cdf0e10cSrcweir for ( sal_Int32 nProp=0; nProp<aProps.getLength(); nProp++ ) 737cdf0e10cSrcweir { 738cdf0e10cSrcweir if ( aProps[nProp].Name.equalsAscii("Copies") ) 739cdf0e10cSrcweir aProps[nProp]. Name = rtl::OUString::createFromAscii("CopyCount"); 740cdf0e10cSrcweir else if ( aProps[nProp].Name.equalsAscii("RangeText") ) 741cdf0e10cSrcweir aProps[nProp]. Name = rtl::OUString::createFromAscii("Pages"); 742cdf0e10cSrcweir if ( aProps[nProp].Name.equalsAscii("Asynchron") ) 743cdf0e10cSrcweir { 744cdf0e10cSrcweir aProps[nProp]. Name = rtl::OUString::createFromAscii("Wait"); 745cdf0e10cSrcweir sal_Bool bAsynchron = sal_False; 746cdf0e10cSrcweir aProps[nProp].Value >>= bAsynchron; 747cdf0e10cSrcweir aProps[nProp].Value <<= (sal_Bool) (!bAsynchron); 748cdf0e10cSrcweir } 749cdf0e10cSrcweir if ( aProps[nProp].Name.equalsAscii("Silent") ) 750cdf0e10cSrcweir { 751cdf0e10cSrcweir aProps[nProp]. Name = rtl::OUString::createFromAscii("MonitorVisible"); 752cdf0e10cSrcweir sal_Bool bPrintSilent = sal_False; 753cdf0e10cSrcweir aProps[nProp].Value >>= bPrintSilent; 754cdf0e10cSrcweir aProps[nProp].Value <<= (sal_Bool) (!bPrintSilent); 755cdf0e10cSrcweir } 756cdf0e10cSrcweir } 757cdf0e10cSrcweir } 758cdf0e10cSrcweir // HACK: writer sets the SID_SELECTION item when printing directly and expects 759cdf0e10cSrcweir // to get only the selection document in that case (see getSelectionObject) 760cdf0e10cSrcweir // however it also reacts to the PrintContent property. We need this distinction here, too, 761cdf0e10cSrcweir // else one of the combinations print / print direct and selection / all will not work. 762cdf0e10cSrcweir // it would be better if writer handled this internally 763cdf0e10cSrcweir if( nId == SID_PRINTDOCDIRECT ) 764cdf0e10cSrcweir { 765cdf0e10cSrcweir sal_Int32 nLen = aProps.getLength(); 766cdf0e10cSrcweir aProps.realloc( nLen + 1 ); 767cdf0e10cSrcweir aProps[nLen].Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintSelectionOnly" ) ); 768cdf0e10cSrcweir aProps[nLen].Value = makeAny( bSelection ); 769cdf0e10cSrcweir } 770cdf0e10cSrcweir 771cdf0e10cSrcweir ExecPrint( aProps, bIsAPI, (nId == SID_PRINTDOCDIRECT) ); 772cdf0e10cSrcweir 773cdf0e10cSrcweir // FIXME: Recording 774cdf0e10cSrcweir rReq.Done(); 775cdf0e10cSrcweir break; 776cdf0e10cSrcweir } 777cdf0e10cSrcweir 778cdf0e10cSrcweir case SID_SETUPPRINTER : 779cdf0e10cSrcweir case SID_PRINTER_NAME : // only for recorded macros 780cdf0e10cSrcweir { 781cdf0e10cSrcweir // get printer and printer settings from the document 782cdf0e10cSrcweir SfxPrinter *pDocPrinter = GetPrinter(sal_True); 783cdf0e10cSrcweir 784cdf0e10cSrcweir // look for printer in parameters 785cdf0e10cSrcweir SFX_REQUEST_ARG( rReq, pPrinterItem, SfxStringItem, SID_PRINTER_NAME, sal_False ); 786cdf0e10cSrcweir if ( pPrinterItem ) 787cdf0e10cSrcweir { 788cdf0e10cSrcweir // use PrinterName parameter to create a printer 789cdf0e10cSrcweir pPrinter = new SfxPrinter( pDocPrinter->GetOptions().Clone(), ((const SfxStringItem*) pPrinterItem)->GetValue() ); 790cdf0e10cSrcweir 791cdf0e10cSrcweir // if printer is unknown, it can't be used - now printer from document will be used 792cdf0e10cSrcweir if ( !pPrinter->IsOriginal() ) 793cdf0e10cSrcweir DELETEZ(pPrinter); 794cdf0e10cSrcweir } 795cdf0e10cSrcweir 796cdf0e10cSrcweir if ( SID_PRINTER_NAME == nId ) 797cdf0e10cSrcweir { 798cdf0e10cSrcweir // just set a recorded printer name 799cdf0e10cSrcweir if ( pPrinter ) 800cdf0e10cSrcweir SetPrinter( pPrinter, SFX_PRINTER_PRINTER ); 801cdf0e10cSrcweir break; 802cdf0e10cSrcweir } 803cdf0e10cSrcweir 804cdf0e10cSrcweir // no PrinterName parameter in ItemSet or the PrinterName points to an unknown printer 805cdf0e10cSrcweir if ( !pPrinter ) 806cdf0e10cSrcweir // use default printer from document 807cdf0e10cSrcweir pPrinter = pDocPrinter; 808cdf0e10cSrcweir 809cdf0e10cSrcweir if( !pPrinter || !pPrinter->IsValid() ) 810cdf0e10cSrcweir { 811cdf0e10cSrcweir // no valid printer either in ItemSet or at the document 812cdf0e10cSrcweir if ( bSilent ) 813cdf0e10cSrcweir { 814cdf0e10cSrcweir rReq.SetReturnValue(SfxBoolItem(0,sal_False)); 815cdf0e10cSrcweir break; 816cdf0e10cSrcweir } 817cdf0e10cSrcweir else 818cdf0e10cSrcweir ErrorBox( NULL, WB_OK | WB_DEF_OK, String( SfxResId( STR_NODEFPRINTER ) ) ).Execute(); 819cdf0e10cSrcweir } 820cdf0e10cSrcweir 821cdf0e10cSrcweir if ( !pPrinter->IsOriginal() && rReq.GetArgs() && !UseStandardPrinter_Impl( NULL, pPrinter ) ) 822cdf0e10cSrcweir { 823cdf0e10cSrcweir // printer is not available, but standard printer should not be used 824cdf0e10cSrcweir rReq.SetReturnValue(SfxBoolItem(0,sal_False)); 825cdf0e10cSrcweir break; 826cdf0e10cSrcweir } 827cdf0e10cSrcweir 828cdf0e10cSrcweir // FIXME: printer isn't used for printing anymore! 829cdf0e10cSrcweir if( pPrinter->IsPrinting() ) 830cdf0e10cSrcweir { 831cdf0e10cSrcweir // if printer is busy, abort printing 832cdf0e10cSrcweir if ( !bSilent ) 833cdf0e10cSrcweir InfoBox( NULL, String( SfxResId( STR_ERROR_PRINTER_BUSY ) ) ).Execute(); 834cdf0e10cSrcweir rReq.SetReturnValue(SfxBoolItem(0,sal_False)); 835cdf0e10cSrcweir break; 836cdf0e10cSrcweir } 837cdf0e10cSrcweir 838cdf0e10cSrcweir // if no arguments are given, retrieve them from a dialog 839cdf0e10cSrcweir if ( !bIsAPI ) 840cdf0e10cSrcweir { 841cdf0e10cSrcweir // PrinterDialog needs a temporary printer 842cdf0e10cSrcweir SfxPrinter* pDlgPrinter = pPrinter->Clone(); 843cdf0e10cSrcweir nDialogRet = 0; 844cdf0e10cSrcweir 845cdf0e10cSrcweir // execute PrinterSetupDialog 846cdf0e10cSrcweir PrinterSetupDialog* pPrintSetupDlg = new PrinterSetupDialog( GetWindow() ); 847cdf0e10cSrcweir 848cdf0e10cSrcweir if (pImp->m_bHasPrintOptions) 849cdf0e10cSrcweir { 850cdf0e10cSrcweir // additional controls for dialog 851cdf0e10cSrcweir pExecutor = new SfxDialogExecutor_Impl( this, pPrintSetupDlg ); 852cdf0e10cSrcweir if ( bPrintOnHelp ) 853cdf0e10cSrcweir pExecutor->DisableHelp(); 854cdf0e10cSrcweir pPrintSetupDlg->SetOptionsHdl( pExecutor->GetLink() ); 855cdf0e10cSrcweir } 856cdf0e10cSrcweir 857cdf0e10cSrcweir pPrintSetupDlg->SetPrinter( pDlgPrinter ); 858cdf0e10cSrcweir nDialogRet = pPrintSetupDlg->Execute(); 859cdf0e10cSrcweir 860cdf0e10cSrcweir if ( pExecutor && pExecutor->GetOptions() ) 861cdf0e10cSrcweir { 862cdf0e10cSrcweir if ( nDialogRet == RET_OK ) 863cdf0e10cSrcweir // remark: have to be recorded if possible! 864cdf0e10cSrcweir pDlgPrinter->SetOptions( *pExecutor->GetOptions() ); 865cdf0e10cSrcweir else 866cdf0e10cSrcweir { 867cdf0e10cSrcweir pPrinter->SetOptions( *pExecutor->GetOptions() ); 868cdf0e10cSrcweir SetPrinter( pPrinter, SFX_PRINTER_OPTIONS ); 869cdf0e10cSrcweir } 870cdf0e10cSrcweir } 871cdf0e10cSrcweir 872cdf0e10cSrcweir DELETEZ( pPrintSetupDlg ); 873cdf0e10cSrcweir 874cdf0e10cSrcweir // no recording of PrinterSetup except printer name (is printer dependent) 875cdf0e10cSrcweir rReq.Ignore(); 876cdf0e10cSrcweir 877cdf0e10cSrcweir if ( nDialogRet == RET_OK ) 878cdf0e10cSrcweir { 879cdf0e10cSrcweir if ( pPrinter->GetName() != pDlgPrinter->GetName() ) 880cdf0e10cSrcweir { 881cdf0e10cSrcweir // user has changed the printer -> macro recording 882cdf0e10cSrcweir SfxRequest aReq( GetViewFrame(), SID_PRINTER_NAME ); 883cdf0e10cSrcweir aReq.AppendItem( SfxStringItem( SID_PRINTER_NAME, pDlgPrinter->GetName() ) ); 884cdf0e10cSrcweir aReq.Done(); 885cdf0e10cSrcweir } 886cdf0e10cSrcweir 887cdf0e10cSrcweir // take the changes made in the dialog 888cdf0e10cSrcweir pPrinter = SetPrinter_Impl( pDlgPrinter ); 889cdf0e10cSrcweir 890cdf0e10cSrcweir // forget new printer, it was taken over (as pPrinter) or deleted 891cdf0e10cSrcweir pDlgPrinter = NULL; 892cdf0e10cSrcweir 893cdf0e10cSrcweir } 894cdf0e10cSrcweir else 895cdf0e10cSrcweir { 896cdf0e10cSrcweir // PrinterDialog is used to transfer information on printing, 897cdf0e10cSrcweir // so it will only be deleted here if dialog was cancelled 898cdf0e10cSrcweir DELETEZ( pDlgPrinter ); 899cdf0e10cSrcweir rReq.Ignore(); 900cdf0e10cSrcweir if ( SID_PRINTDOC == nId ) 901cdf0e10cSrcweir rReq.SetReturnValue(SfxBoolItem(0,sal_False)); 902cdf0e10cSrcweir } 903cdf0e10cSrcweir } 904cdf0e10cSrcweir } 905cdf0e10cSrcweir 906cdf0e10cSrcweir break; 907cdf0e10cSrcweir } 908cdf0e10cSrcweir } 909cdf0e10cSrcweir 910cdf0e10cSrcweir // Optimierungen wieder einschalten 911cdf0e10cSrcweir #ifdef _MSC_VER 912cdf0e10cSrcweir #pragma optimize ( "", on ) 913cdf0e10cSrcweir #endif 914cdf0e10cSrcweir 915cdf0e10cSrcweir //-------------------------------------------------------------------- 916cdf0e10cSrcweir 917cdf0e10cSrcweir sal_Bool SfxViewShell::IsPrinterLocked() const 918cdf0e10cSrcweir { 919cdf0e10cSrcweir return pImp->m_nPrinterLocks > 0; 920cdf0e10cSrcweir } 921cdf0e10cSrcweir 922cdf0e10cSrcweir //-------------------------------------------------------------------- 923cdf0e10cSrcweir 924cdf0e10cSrcweir void SfxViewShell::LockPrinter( sal_Bool bLock) 925cdf0e10cSrcweir { 926cdf0e10cSrcweir sal_Bool bChanged = sal_False; 927cdf0e10cSrcweir if ( bLock ) 928cdf0e10cSrcweir { 929cdf0e10cSrcweir bChanged = 1 == ++pImp->m_nPrinterLocks; 930cdf0e10cSrcweir } 931cdf0e10cSrcweir else 932cdf0e10cSrcweir { 933cdf0e10cSrcweir bChanged = 0 == --pImp->m_nPrinterLocks; 934cdf0e10cSrcweir } 935cdf0e10cSrcweir 936cdf0e10cSrcweir if ( bChanged ) 937cdf0e10cSrcweir { 938cdf0e10cSrcweir Invalidate( SID_PRINTDOC ); 939cdf0e10cSrcweir Invalidate( SID_PRINTDOCDIRECT ); 940cdf0e10cSrcweir Invalidate( SID_SETUPPRINTER ); 941cdf0e10cSrcweir } 942cdf0e10cSrcweir } 943cdf0e10cSrcweir 944cdf0e10cSrcweir //-------------------------------------------------------------------- 945cdf0e10cSrcweir 946cdf0e10cSrcweir SfxPrinter* SfxViewShell::GetPrinter( sal_Bool /*bCreate*/ ) 947cdf0e10cSrcweir { 948cdf0e10cSrcweir return 0; 949cdf0e10cSrcweir } 950cdf0e10cSrcweir 951cdf0e10cSrcweir //-------------------------------------------------------------------- 952cdf0e10cSrcweir 953cdf0e10cSrcweir sal_uInt16 SfxViewShell::SetPrinter( SfxPrinter* /*pNewPrinter*/, sal_uInt16 /*nDiffFlags*/, bool ) 954cdf0e10cSrcweir { 955cdf0e10cSrcweir return 0; 956cdf0e10cSrcweir } 957cdf0e10cSrcweir 958cdf0e10cSrcweir //-------------------------------------------------------------------- 959cdf0e10cSrcweir 960cdf0e10cSrcweir SfxTabPage* SfxViewShell::CreatePrintOptionsPage 961cdf0e10cSrcweir ( 962cdf0e10cSrcweir Window* /*pParent*/, 963cdf0e10cSrcweir const SfxItemSet& /*rOptions*/ 964cdf0e10cSrcweir ) 965cdf0e10cSrcweir { 966cdf0e10cSrcweir return 0; 967cdf0e10cSrcweir } 968cdf0e10cSrcweir 969cdf0e10cSrcweir JobSetup SfxViewShell::GetJobSetup() const 970cdf0e10cSrcweir { 971cdf0e10cSrcweir return JobSetup(); 972cdf0e10cSrcweir } 973cdf0e10cSrcweir 974