diff options
Diffstat (limited to 'padmin/source/padialog.cxx')
-rw-r--r-- | padmin/source/padialog.cxx | 753 |
1 files changed, 753 insertions, 0 deletions
diff --git a/padmin/source/padialog.cxx b/padmin/source/padialog.cxx new file mode 100644 index 000000000000..5a6a1d0e319e --- /dev/null +++ b/padmin/source/padialog.cxx @@ -0,0 +1,753 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: padialog.cxx,v $ + * $Revision: 1.25 $ + * + * 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 <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <string.h> +#include <math.h> + +#include "padialog.hrc" +#include "fontentry.hxx" +#include "helper.hxx" +#include "padialog.hxx" +#include "adddlg.hxx" +#include "prtsetup.hxx" + +#include "vcl/msgbox.hxx" +#include "vcl/print.hxx" +#include "vcl/gradient.hxx" +#include "vcl/bitmap.hxx" +#include "vcl/lineinfo.hxx" +#include "vcl/svapp.hxx" +#include "vcl/event.hxx" +#include "vcl/printerinfomanager.hxx" + +#include "tools/stream.hxx" +#include "tools/color.hxx" + +#include "osl/file.hxx" + +#include "rtl/ustrbuf.hxx" + +#include "unotools/localedatawrapper.hxx" +#include "unotools/configitem.hxx" +#include "unotools/configmgr.hxx" + +#include "com/sun/star/awt/Size.hpp" + +using namespace psp; +using namespace rtl; +using namespace padmin; +using namespace osl; +using namespace com::sun::star; +using namespace com::sun::star::uno; +using namespace com::sun::star::beans; + +PADialog* PADialog::Create( Window* pParent, BOOL bAdmin ) +{ + return new PADialog( pParent, bAdmin ); +} + +PADialog::PADialog( Window* pParent, BOOL /*bAdmin*/ ) : + ModalDialog( pParent, PaResId( RID_PADIALOG ) ), + m_aDevicesLB( this, PaResId( RID_PA_LB_DEV ) ), + m_aConfPB( this, PaResId( RID_PA_BTN_CONF ) ), + m_aRenamePB( this, PaResId( RID_PA_BTN_RENAME ) ), + m_aStdPB( this, PaResId( RID_PA_BTN_STD ) ), + m_aRemPB( this, PaResId( RID_PA_BTN_DEL ) ), + m_aTestPagePB( this, PaResId( RID_PA_TESTPAGE ) ), + m_aPrintersFL( this, PaResId( RID_PA_FL_PRINTERS ) ), + m_aDriverTxt( this, PaResId( RID_PA_TXT_DRIVER ) ), + m_aDriver( this, PaResId( RID_PA_TXT_DRIVER_STRING ) ), + m_aLocationTxt( this, PaResId( RID_PA_TXT_LOCATION ) ), + m_aLocation( this, PaResId( RID_PA_TXT_LOCATION_STRING ) ), + m_aCommandTxt( this, PaResId( RID_PA_TXT_COMMAND ) ), + m_aCommand( this, PaResId( RID_PA_TXT_COMMAND_STRING ) ), + m_aCommentTxt( this, PaResId( RID_PA_TXT_COMMENT ) ), + m_aComment( this, PaResId( RID_PA_TXT_COMMENT_STRING ) ), + m_aCUPSFL( this, PaResId( RID_PA_FL_CUPSUSAGE ) ), + m_aCUPSCB( this, PaResId( RID_PA_CB_CUPSUSAGE ) ), + m_aSepButtonFL( this, PaResId( RID_PA_FL_SEPBUTTON ) ), + m_aAddPB( this, PaResId( RID_PA_BTN_ADD ) ), + m_aFontsPB( this, PaResId( RID_PA_BTN_FONTS ) ), + m_aCancelButton( this, PaResId( RID_PA_BTN_CANCEL ) ), + m_aDefPrt( PaResId( RID_PA_STR_DEFPRT ) ), + m_aRenameStr( PaResId( RID_PA_STR_RENAME ) ), + m_rPIManager( PrinterInfoManager::get() ) +{ + FreeResource(); + updateSettings(); + Init(); +} + +void PADialog::updateSettings() +{ + if( ! GetSettings().GetStyleSettings().GetHighContrastMode() ) + { + m_aPrinterImg = Image( BitmapEx( PaResId( RID_BMP_SMALL_PRINTER ) ) ); + m_aFaxImg = Image( BitmapEx( PaResId( RID_BMP_SMALL_FAX ) ) ); + m_aPdfImg = Image( BitmapEx( PaResId( RID_BMP_SMALL_PDF ) ) ); + } + else + { + m_aPrinterImg = Image( BitmapEx( PaResId( RID_BMP_SMALL_PRINTER_HC ) ) ); + m_aFaxImg = Image( BitmapEx( PaResId( RID_BMP_SMALL_FAX_HC ) ) ); + m_aPdfImg = Image( BitmapEx( PaResId( RID_BMP_SMALL_PDF_HC ) ) ); + } +} + +void PADialog::Init() +{ + // #i79787# initially ensure printer discovery has ended + m_rPIManager.checkPrintersChanged( true ); + m_aCUPSCB.Check( m_rPIManager.isCUPSDisabled() ); + + UpdateDevice(); + UpdateText(); + + m_aRemPB.Enable( FALSE ); + + m_aDevicesLB.SetDoubleClickHdl( LINK( this, PADialog, DoubleClickHdl ) ); + m_aDevicesLB.SetSelectHdl( LINK( this, PADialog, SelectHdl ) ); + m_aStdPB.SetClickHdl( LINK( this, PADialog, ClickBtnHdl ) ); + m_aRemPB.SetClickHdl( LINK( this, PADialog, ClickBtnHdl ) ); + m_aConfPB.SetClickHdl( LINK( this, PADialog, ClickBtnHdl ) ); + m_aRenamePB.SetClickHdl( LINK( this, PADialog, ClickBtnHdl ) ); + m_aTestPagePB.SetClickHdl( LINK( this, PADialog, ClickBtnHdl ) ); + m_aFontsPB.SetClickHdl( LINK( this, PADialog, ClickBtnHdl ) ); + m_aAddPB.SetClickHdl( LINK( this, PADialog, ClickBtnHdl ) ); + m_aDevicesLB.setDelPressedLink( LINK( this, PADialog, DelPressedHdl ) ); + m_aCUPSCB.SetClickHdl( LINK( this, PADialog, ClickBtnHdl ) ); + + ::psp::PrintFontManager& rFontManager( ::psp::PrintFontManager::get() ); + if( ! rFontManager.checkImportPossible() ) + m_aFontsPB.Enable( FALSE ); +} + +PADialog::~PADialog() +{ + m_rPIManager.writePrinterConfig(); + freePadminRC(); +} + +long PADialog::Notify( NotifyEvent& rEv ) +{ + if( IsVisible() && + (rEv.GetType() == EVENT_GETFOCUS || rEv.GetType() == EVENT_LOSEFOCUS ) + ) + { + if( m_rPIManager.checkPrintersChanged( true ) ) + { + String aSelectEntry = m_aDevicesLB.GetSelectEntry(); + UpdateDevice(); + UpdateText(); + m_aDevicesLB.SelectEntry( aSelectEntry ); + } + } + return ModalDialog::Notify( rEv ); +} + +void PADialog::DataChanged( const DataChangedEvent& rEv ) +{ + ModalDialog::DataChanged( rEv ); + if( (rEv.GetType() == DATACHANGED_SETTINGS) && + (rEv.GetFlags() & SETTINGS_STYLE) ) + { + updateSettings(); + // push the new images into the listbox + UpdateDevice(); + } +} + +String PADialog::getSelectedDevice() +{ + int nPos = m_aDevicesLB.GetSelectEntryPos(); + int nLen = (int)(sal_IntPtr)m_aDevicesLB.GetEntryData( nPos ); + return m_aDevicesLB.GetEntry( nPos ).Copy( 0, nLen ); +} + +IMPL_LINK( PADialog, DelPressedHdl, ListBox*, pBox ) +{ + if( pBox == &m_aDevicesLB && m_aRemPB.IsEnabled() ) + ClickBtnHdl( &m_aRemPB ); + return 0; +} + +IMPL_LINK( PADialog, ClickBtnHdl, PushButton*, pButton ) +{ + if( pButton == &m_aStdPB ) + UpdateDefPrt(); + else if( pButton == &m_aRemPB && AreYouSure( this, RID_QUERY_REMOVEPRINTER ) ) + RemDevice(); + else if( pButton == &m_aConfPB ) + ConfigureDevice(); + else if( pButton == &m_aRenamePB ) + RenameDevice(); + else if( pButton == &m_aTestPagePB ) + PrintTestPage(); + else if( pButton == &m_aAddPB ) + AddDevice(); + else if( pButton == &m_aFontsPB ) + { + FontNameDlg aDialog( this ); + aDialog.Execute(); + } + else if( static_cast<Button*>(pButton) == &m_aCUPSCB ) + { + m_rPIManager.setCUPSDisabled( m_aCUPSCB.IsChecked() ); + UpdateDevice(); + UpdateText(); + } + + return 0; +} + +IMPL_LINK( PADialog, DoubleClickHdl, ListBox*, pListBox ) +{ + if( pListBox == &m_aDevicesLB ) + UpdateDefPrt(); + return 0; +} + +IMPL_LINK( PADialog, SelectHdl, ListBox*, pListBox ) +{ + if( pListBox == &m_aDevicesLB ) + { + String sSelect = getSelectedDevice(); + String sDefPrt = m_rPIManager.getDefaultPrinter(); + if( sDefPrt == sSelect || ! m_rPIManager.removePrinter( sSelect, true ) ) + m_aRemPB.Enable( FALSE ); + else + m_aRemPB.Enable( TRUE ); + UpdateText(); + } + return 0; +} + +void PADialog::UpdateDefPrt() +{ + m_rPIManager.setDefaultPrinter( getSelectedDevice() ); + + UpdateDevice(); + UpdateText(); + + if( m_aRemPB.HasFocus() ) + m_aDevicesLB.GetFocus(); + m_aRemPB.Enable( FALSE ); +} + +void PADialog::UpdateText() +{ + OUString aDev( getSelectedDevice() ); + if( aDev.getLength() ) + { + const PrinterInfo& rInfo = m_rPIManager.getPrinterInfo( aDev ); + String aDriver( rInfo.m_aPrinterName ); + aDriver.AppendAscii( " (" ); + aDriver += String( rInfo.m_aDriverName ); + aDriver.Append( ')' ); + m_aDriver.SetText( aDriver ); + m_aCommand.SetText( rInfo.m_aCommand ); + m_aComment.SetText( rInfo.m_aComment ); + m_aLocation.SetText( rInfo.m_aLocation ); + } + else // nothing selected + { + String aEmpty; + m_aDriver.SetText( aEmpty ); + m_aCommand.SetText( aEmpty ); + m_aComment.SetText( aEmpty ); + m_aLocation.SetText( aEmpty ); + } +} + +static Point project( const Point& rPoint ) +{ + const double angle_x = M_PI / 6.0; + const double angle_z = M_PI / 6.0; + + // transform planar coordinates to 3d + double x = rPoint.X(); + double y = rPoint.Y(); + //double z = 0; + + // rotate around X axis + double x1 = x; + double y1 = y * cos( angle_x ); + double z1 = y * sin( angle_x ); + + // rotate around Z axis + double x2 = x1 * cos( angle_z ) + y1 * sin( angle_z ); + //double y2 = y1 * cos( angle_z ) - x1 * sin( angle_z ); + double z2 = z1; + + return Point( (sal_Int32)x2, (sal_Int32)z2 ); +} + +static Color approachColor( const Color& rFrom, const Color& rTo ) +{ + Color aColor; + UINT8 nDiff; + // approach red + if( rFrom.GetRed() < rTo.GetRed() ) + { + nDiff = rTo.GetRed() - rFrom.GetRed(); + aColor.SetRed( rFrom.GetRed() + ( nDiff < 10 ? nDiff : 10 ) ); + } + else if( rFrom.GetRed() > rTo.GetRed() ) + { + nDiff = rFrom.GetRed() - rTo.GetRed(); + aColor.SetRed( rFrom.GetRed() - ( nDiff < 10 ? nDiff : 10 ) ); + } + else + aColor.SetRed( rFrom.GetRed() ); + + // approach Green + if( rFrom.GetGreen() < rTo.GetGreen() ) + { + nDiff = rTo.GetGreen() - rFrom.GetGreen(); + aColor.SetGreen( rFrom.GetGreen() + ( nDiff < 10 ? nDiff : 10 ) ); + } + else if( rFrom.GetGreen() > rTo.GetGreen() ) + { + nDiff = rFrom.GetGreen() - rTo.GetGreen(); + aColor.SetGreen( rFrom.GetGreen() - ( nDiff < 10 ? nDiff : 10 ) ); + } + else + aColor.SetGreen( rFrom.GetGreen() ); + + // approach blue + if( rFrom.GetBlue() < rTo.GetBlue() ) + { + nDiff = rTo.GetBlue() - rFrom.GetBlue(); + aColor.SetBlue( rFrom.GetBlue() + ( nDiff < 10 ? nDiff : 10 ) ); + } + else if( rFrom.GetBlue() > rTo.GetBlue() ) + { + nDiff = rFrom.GetBlue() - rTo.GetBlue(); + aColor.SetBlue( rFrom.GetBlue() - ( nDiff < 10 ? nDiff : 10 ) ); + } + else + aColor.SetBlue( rFrom.GetBlue() ); + + return aColor; +} + +class SpaPrinterController : public vcl::PrinterController +{ +public: + SpaPrinterController( const boost::shared_ptr<Printer>& i_pPrinter ) + : vcl::PrinterController( i_pPrinter ) + {} + virtual ~SpaPrinterController() + {} + + virtual int getPageCount() const { return 1; } + virtual Sequence< PropertyValue > getPageParameters( int i_nPage ) const; + virtual void printPage( int i_nPage ) const; + virtual void jobFinished( com::sun::star::view::PrintableState ); +}; + +Sequence< PropertyValue > SpaPrinterController::getPageParameters( int ) const +{ + Sequence< PropertyValue > aRet( 1 ); + + Size aPageSize( getPrinter()->GetPaperSizePixel() ); + aPageSize = getPrinter()->PixelToLogic( aPageSize, MapMode( MAP_100TH_MM ) ); + + awt::Size aSize; + aSize.Width = aPageSize.Width(); + aSize.Height = aPageSize.Height(); + aRet[0].Value = makeAny(aSize); + + return aRet; +} + +void SpaPrinterController::printPage( int ) const +{ + const double DELTA = 5.0; + + boost::shared_ptr<Printer> pPrinter( getPrinter() ); + + PrinterInfo aInfo( psp::PrinterInfoManager::get().getPrinterInfo( pPrinter->GetName() ) ); + const PPDParser* pPrintParser = aInfo.m_pParser; + + MapMode aMapMode( MAP_100TH_MM ); + + Bitmap aButterfly( PaResId( RID_BUTTERFLY ) ); + + pPrinter->SetMapMode( aMapMode ); + + Any aRet = utl::ConfigManager::GetDirectConfigProperty( utl::ConfigManager::PRODUCTNAME ); + OUString aJobName; + aRet >>= aJobName; + + aJobName = aJobName + OUString( RTL_CONSTASCII_USTRINGPARAM( " Testpage" ) ); + + Size aPaperSize=pPrinter->GetOutputSize(); + Point aCenter( aPaperSize.Width()/2-300, + aPaperSize.Height() - aPaperSize.Width()/2 ); + Point aP1( aPaperSize.Width()/48, 0), aP2( aPaperSize.Width()/40, 0 ), aPoint; + + pPrinter->DrawRect( Rectangle( Point( 0,0 ), aPaperSize ) ); + pPrinter->DrawRect( Rectangle( Point( 100,100 ), + Size( aPaperSize.Width()-200, + aPaperSize.Height()-200 ) ) ); + pPrinter->DrawRect( Rectangle( Point( 200,200 ), + Size( aPaperSize.Width()-400, + aPaperSize.Height()-400 ) ) ); + pPrinter->DrawRect( Rectangle( Point( 300,300 ), + Size( aPaperSize.Width()-600, + aPaperSize.Height()-600 ) ) ); + + Font aFont( String( RTL_CONSTASCII_USTRINGPARAM( "Courier" ) ), Size( 0, 400 ) ); + aFont.SetWeight( WEIGHT_NORMAL ); + aFont.SetItalic( ITALIC_NONE ); + pPrinter->SetFont( aFont ); + + OUStringBuffer aPrintText(1024); + long nWidth = 0, nMaxWidth = 0; + String aToken; + + static const struct + { + const char* const pDirect; + USHORT nResId; + } aResIds[] = + { + { NULL, RID_TXT_TESTPAGE_NAME }, + { NULL, RID_TXT_TESTPAGE_MODEL }, + { "PPD", 0 }, + { NULL, RID_TXT_TESTPAGE_QUEUE }, + { NULL, RID_TXT_TESTPAGE_COMMENT }, + { NULL, RID_TXT_TESTPAGE_DATE }, + { NULL, RID_TXT_TESTPAGE_TIME } + }; + + for( unsigned int i = 0; i < sizeof(aResIds)/sizeof(aResIds[0]); i++ ) + { + if( aResIds[i].pDirect ) + aToken = String::CreateFromAscii( aResIds[i].pDirect ); + else + aToken = String( PaResId( aResIds[i].nResId ) ); + nMaxWidth = ( nWidth = pPrinter->GetTextWidth( aToken ) ) > nMaxWidth ? nWidth : nMaxWidth; + aPrintText.append( aToken ); + aPrintText.append( (sal_Unicode)'\n' ); + }; + + pPrinter->DrawText( Rectangle( Point( 1000, 1000 ), + Size( aPaperSize.Width() - 2000, + aPaperSize.Height() - 4000 ) ), + aPrintText.makeStringAndClear(), + TEXT_DRAW_MULTILINE ); + + AllSettings aSettings( Application::GetSettings() ); + const LocaleDataWrapper& rLocaleWrapper( aSettings.GetLocaleDataWrapper() ); + + aPrintText.appendAscii( ": " ); + aPrintText.append( pPrinter->GetName() ); + aPrintText.appendAscii( "\n: " ); + if( pPrintParser ) + aPrintText.append( pPrintParser->getPrinterName() ); + aPrintText.appendAscii( "\n: " ); + INetURLObject aDriverPath( pPrintParser ? pPrintParser->getFilename() : String( RTL_CONSTASCII_USTRINGPARAM( "<undef>" ) ), + INET_PROT_FILE, INetURLObject::ENCODE_ALL ); + aPrintText.append( aDriverPath.GetName() ); + aPrintText.appendAscii( "\n: " ); + aPrintText.append( aInfo.m_aCommand ); + aPrintText.appendAscii( "\n: " ); + aPrintText.append( aInfo.m_aComment ); + aPrintText.appendAscii( "\n: " ); + aPrintText.append( rLocaleWrapper.getDate( Date() ) ); + aPrintText.appendAscii( "\n: " ); + aPrintText.append( rLocaleWrapper.getTime( Time() ) ); + + pPrinter->DrawText( Rectangle( Point( 1100 + nMaxWidth, 1000 ), + Size( aPaperSize.Width() - 2100 - nMaxWidth, + aPaperSize.Height() - 4000 ) ), + aPrintText.makeStringAndClear(), + TEXT_DRAW_MULTILINE ); + + pPrinter->DrawBitmap( Point( aPaperSize.Width() - 4000, 1000 ), + Size( 3000,3000 ), + aButterfly ); + pPrinter->SetFillColor(); + pPrinter->DrawRect( Rectangle( Point( aPaperSize.Width() - 4000, 1000 ), + Size( 3000,3000 ) ) ); + + Color aWhite( 0xff, 0xff, 0xff ); + Color aBlack( 0, 0, 0 ); + Color aLightRed( 0xff, 0, 0 ); + Color aDarkRed( 0x40, 0, 0 ); + Color aLightBlue( 0, 0, 0xff ); + Color aDarkBlue( 0,0,0x40 ); + Color aLightGreen( 0, 0xff, 0 ); + Color aDarkGreen( 0, 0x40, 0 ); + + Gradient aGradient( GRADIENT_LINEAR, aBlack, aWhite ); + aGradient.SetAngle( 900 ); + pPrinter->DrawGradient( Rectangle( Point( 1000, 5500 ), + Size( aPaperSize.Width() - 2000, + 500 ) ), aGradient ); + aGradient.SetStartColor( aDarkRed ); + aGradient.SetEndColor( aLightBlue ); + pPrinter->DrawGradient( Rectangle( Point( 1000, 6300 ), + Size( aPaperSize.Width() - 2000, + 500 ) ), aGradient ); + aGradient.SetStartColor( aDarkBlue ); + aGradient.SetEndColor( aLightGreen ); + pPrinter->DrawGradient( Rectangle( Point( 1000, 7100 ), + Size( aPaperSize.Width() - 2000, + 500 ) ), aGradient ); + aGradient.SetStartColor( aDarkGreen ); + aGradient.SetEndColor( aLightRed ); + pPrinter->DrawGradient( Rectangle( Point( 1000, 7900 ), + Size( aPaperSize.Width() - 2000, + 500 ) ), aGradient ); + + + + LineInfo aLineInfo( LINE_SOLID, 200 ); + double sind = sin( DELTA*M_PI/180.0 ); + double cosd = cos( DELTA*M_PI/180.0 ); + double factor = 1 + (DELTA/1000.0); + int n=0; + Color aLineColor( 0, 0, 0 ); + Color aApproachColor( 0, 0, 200 ); + while ( aP2.X() < aCenter.X() && n++ < 680 ) + { + aLineInfo.SetWidth( n/3 ); + aLineColor = approachColor( aLineColor, aApproachColor ); + pPrinter->SetLineColor( aLineColor ); + + // switch aproach color + if( aApproachColor.IsRGBEqual( aLineColor ) ) + { + if( aApproachColor.GetRed() ) + aApproachColor = Color( 0, 0, 200 ); + else if( aApproachColor.GetGreen() ) + aApproachColor = Color( 200, 0, 0 ); + else + aApproachColor = Color( 0, 200, 0 ); + } + + pPrinter->DrawLine( project( aP1 ) + aCenter, + project( aP2 ) + aCenter, + aLineInfo ); + aPoint.X() = (int)((((double)aP1.X())*cosd - ((double)aP1.Y())*sind)*factor); + aPoint.Y() = (int)((((double)aP1.Y())*cosd + ((double)aP1.X())*sind)*factor); + aP1 = aPoint; + aPoint.X() = (int)((((double)aP2.X())*cosd - ((double)aP2.Y())*sind)*factor); + aPoint.Y() = (int)((((double)aP2.Y())*cosd + ((double)aP2.X())*sind)*factor); + aP2 = aPoint; + } +#if (OSL_DEBUG_LEVEL > 1) || defined DBG_UTIL + fprintf( stderr, "%d lines\n",n ); +#endif +} + +void SpaPrinterController::jobFinished( com::sun::star::view::PrintableState ) +{ + String aInfoString( PaResId( RID_PA_TXT_TESTPAGE_PRINTED ) ); + InfoBox aInfoBox( NULL, aInfoString ); + aInfoBox.SetText( String( PaResId( RID_BXT_TESTPAGE ) ) ); + aInfoBox.Execute(); +} + +void PADialog::PrintTestPage() +{ + String sPrinter( getSelectedDevice() ); + + boost::shared_ptr<Printer> pPrinter( new Printer( sPrinter ) ); + + if( pPrinter->GetName() != sPrinter ) + { + String aString( PaResId( RID_ERR_NOPRINTER ) ); + aString.SearchAndReplaceAscii( "%s", sPrinter ); + + ErrorBox aErrorBox( this, WB_OK | WB_DEF_OK, aString ); + aErrorBox.SetText( String( PaResId( RID_BXT_ENVIRONMENT ) ) ); + aErrorBox.Execute(); + return; + } + + boost::shared_ptr<vcl::PrinterController> pController( new SpaPrinterController( pPrinter ) ); + JobSetup aJobSetup( pPrinter->GetJobSetup() ); + aJobSetup.SetValue( String( RTL_CONSTASCII_USTRINGPARAM( "IsQuickJob" ) ), + String( RTL_CONSTASCII_USTRINGPARAM( "true" ) ) ); + Printer::PrintJob( pController, aJobSetup ); +} + +void PADialog::AddDevice() +{ + AddPrinterDialog aDlg( this ); + + if( aDlg.Execute() ) + UpdateDevice(); +} + +void PADialog::RemDevice() +{ + String aPrinter( getSelectedDevice() ); + String aDefPrinter( m_rPIManager.getDefaultPrinter() ); + // do not remove the default printer + if( aPrinter.Equals( aDefPrinter ) ) + return; + + if( ! m_rPIManager.removePrinter( aPrinter ) ) + { + String aText( PaResId( RID_ERR_PRINTERNOTREMOVEABLE ) ); + aText.SearchAndReplace( String( RTL_CONSTASCII_USTRINGPARAM( "%s" ) ), aPrinter ); + ErrorBox aBox( this, WB_OK | WB_DEF_OK, aText ); + aBox.Execute(); + return; + } + m_aPrinters.remove( aPrinter ); + + m_aDevicesLB.RemoveEntry( m_aDevicesLB.GetSelectEntryPos() ); + for( int i=0; i < m_aDevicesLB.GetEntryCount(); i++ ) + { + if( m_aDevicesLB.GetEntry( i ).CompareTo( aDefPrinter, aDefPrinter.Len() ) == COMPARE_EQUAL ) + { + m_aDevicesLB.SelectEntryPos( i, TRUE ); + UpdateText(); + break; + } + } + + m_aDevicesLB.GetFocus(); + + if( m_aDevicesLB.GetEntryCount() < 2 ) + m_aRemPB.Enable( FALSE ); +} + +void PADialog::ConfigureDevice() +{ + String aPrinter( getSelectedDevice() ); + + if( ! aPrinter.Len() ) + return; + + PrinterInfo aInfo( m_rPIManager.getPrinterInfo( aPrinter ) ); + RTSDialog aDialog( aInfo, aPrinter, true, this ); + + if( aDialog.Execute() ) + m_rPIManager.changePrinterInfo( aPrinter, aDialog.getSetup() ); + + UpdateText(); +} + +void PADialog::RenameDevice() +{ + String aPrinter( getSelectedDevice() ); + OUString aOldPrinter( aPrinter ); + + if( ! aPrinter.Len() ) + return; + + String aTmpString( PaResId( RID_QRY_PRTNAME ) ); + QueryString aQuery( this, + aTmpString, + aPrinter ); + aQuery.SetText( m_aRenameStr ); + aQuery.Execute(); + + if( aPrinter.Len() ) + { + PrinterInfo aInfo( m_rPIManager.getPrinterInfo( aOldPrinter ) ); + aInfo.m_aPrinterName = aPrinter; + if( m_rPIManager.addPrinter( aPrinter, aInfo.m_aDriverName ) ) + { + bool bWasDefault = m_rPIManager.getDefaultPrinter() == aOldPrinter; + m_aPrinters.push_back( aPrinter ); + if( m_rPIManager.removePrinter( aOldPrinter ) ) + m_aPrinters.remove( aOldPrinter ); + m_rPIManager.changePrinterInfo( aPrinter, aInfo ); + if( bWasDefault ) + { + m_rPIManager.setDefaultPrinter( aPrinter ); + UpdateDefPrt(); + } + UpdateDevice(); + } + } +} + +void PADialog::UpdateDevice() +{ + m_aDevicesLB.Clear(); + + m_rPIManager.listPrinters( m_aPrinters ); + ::std::list< OUString >::iterator it; + for( it = m_aPrinters.begin(); it != m_aPrinters.end(); ++it ) + { + const PrinterInfo& rInfo( m_rPIManager.getPrinterInfo( *it ) ); + sal_Int32 nIndex = 0; + bool bAutoQueue = false; + bool bFax = false; + bool bPdf = false; + while( nIndex != -1 && ! bAutoQueue ) + { + OUString aToken( rInfo.m_aFeatures.getToken( 0, ',', nIndex ) ); + if( aToken.getLength() ) + { + if( aToken.compareToAscii( "autoqueue" ) == 0 ) + bAutoQueue = true; + else if( aToken.compareToAscii( "pdf=", 4 ) == 0 ) + bPdf = true; + else if( aToken.compareToAscii( "fax", 3 ) == 0 ) + bFax = true; + } + } + if( bAutoQueue ) + continue; + + String aEntry( *it ); + if( *it == m_rPIManager.getDefaultPrinter() ) + { + aEntry.AppendAscii( " (" ); + aEntry += m_aDefPrt; + aEntry.AppendAscii( ")" ); + } + int nPos = + m_aDevicesLB.InsertEntry( aEntry, + bFax ? m_aFaxImg : + bPdf ? m_aPdfImg : m_aPrinterImg + ); + m_aDevicesLB.SetEntryData( nPos, (void*)it->getLength() ); + if( *it == m_rPIManager.getDefaultPrinter() ) + { + m_aDevicesLB.SelectEntryPos( nPos ); + UpdateText(); + } + } +} + |