1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 // MARKER(update_precomp.py): autogen include statement, do not remove 29 #include "precompiled_svtools.hxx" 30 #include <tools/debug.hxx> 31 #ifndef _VCL_PRINT_HXX 32 #include <vcl/print.hxx> 33 #endif 34 35 #ifndef GCC 36 #endif 37 38 #include <svtools/svtdata.hxx> 39 #include "prnsetup.hrc" 40 #include <svtools/prnsetup.hxx> 41 42 // ======================================================================= 43 44 void ImplFillPrnDlgListBox( const Printer* pPrinter, 45 ListBox* pBox, PushButton* pPropBtn ) 46 { 47 ImplFreePrnDlgListBox( pBox ); 48 49 const std::vector<rtl::OUString>& rPrinters = Printer::GetPrinterQueues(); 50 unsigned int nCount = rPrinters.size(); 51 if ( nCount ) 52 { 53 for( unsigned int i = 0; i < nCount; i++ ) 54 pBox->InsertEntry( rPrinters[i] ); 55 pBox->SelectEntry( pPrinter->GetName() ); 56 } 57 58 pBox->Enable( nCount != 0 ); 59 pPropBtn->Show( pPrinter->HasSupport( SUPPORT_SETUPDIALOG ) ); 60 } 61 62 // ----------------------------------------------------------------------- 63 64 void ImplFreePrnDlgListBox( ListBox* pBox, sal_Bool bClear ) 65 { 66 if ( bClear ) 67 pBox->Clear(); 68 } 69 70 // ----------------------------------------------------------------------- 71 72 Printer* ImplPrnDlgListBoxSelect( ListBox* pBox, PushButton* pPropBtn, 73 Printer* pPrinter, Printer* pTempPrinter ) 74 { 75 if ( pBox->GetSelectEntryPos() != LISTBOX_ENTRY_NOTFOUND ) 76 { 77 const QueueInfo* pInfo = Printer::GetQueueInfo( pBox->GetSelectEntry(), true ); 78 if( pInfo) 79 { 80 if ( !pTempPrinter ) 81 { 82 if ( (pPrinter->GetName() == pInfo->GetPrinterName()) && 83 (pPrinter->GetDriverName() == pInfo->GetDriver()) ) 84 pTempPrinter = new Printer( pPrinter->GetJobSetup() ); 85 else 86 pTempPrinter = new Printer( *pInfo ); 87 } 88 else 89 { 90 if ( (pTempPrinter->GetName() != pInfo->GetPrinterName()) || 91 (pTempPrinter->GetDriverName() != pInfo->GetDriver()) ) 92 { 93 delete pTempPrinter; 94 pTempPrinter = new Printer( *pInfo ); 95 } 96 } 97 98 pPropBtn->Enable( pTempPrinter->HasSupport( SUPPORT_SETUPDIALOG ) ); 99 } 100 else 101 pPropBtn->Disable(); 102 } 103 else 104 pPropBtn->Disable(); 105 106 return pTempPrinter; 107 } 108 109 // ----------------------------------------------------------------------- 110 111 Printer* ImplPrnDlgUpdatePrinter( Printer* pPrinter, Printer* pTempPrinter ) 112 { 113 XubString aPrnName; 114 if ( pTempPrinter ) 115 aPrnName = pTempPrinter->GetName(); 116 else 117 aPrnName = pPrinter->GetName(); 118 119 if ( ! Printer::GetQueueInfo( aPrnName, false ) ) 120 { 121 if ( pTempPrinter ) 122 delete pTempPrinter; 123 pTempPrinter = new Printer; 124 } 125 126 return pTempPrinter; 127 } 128 129 // ----------------------------------------------------------------------- 130 131 void ImplPrnDlgUpdateQueueInfo( ListBox* pBox, QueueInfo& rInfo ) 132 { 133 if ( pBox->GetSelectEntryPos() != LISTBOX_ENTRY_NOTFOUND ) 134 { 135 const QueueInfo* pInfo = Printer::GetQueueInfo( pBox->GetSelectEntry(), true ); 136 if( pInfo ) 137 rInfo = *pInfo; 138 } 139 } 140 141 // ----------------------------------------------------------------------- 142 143 static void ImplPrnDlgAddString( XubString& rStr, const XubString& rAddStr ) 144 { 145 if ( rStr.Len() ) 146 rStr.AppendAscii( "; " ); 147 rStr += rAddStr; 148 } 149 150 // ----------------------------------------------------------------------- 151 152 static void ImplPrnDlgAddResString( XubString& rStr, sal_uInt16 nResId ) 153 { 154 SvtResId aResId( nResId ); 155 XubString aAddStr( aResId ); 156 ImplPrnDlgAddString( rStr, aAddStr ); 157 } 158 159 // ----------------------------------------------------------------------- 160 161 XubString ImplPrnDlgGetStatusText( const QueueInfo& rInfo ) 162 { 163 XubString aStr; 164 sal_uLong nStatus = rInfo.GetStatus(); 165 166 // Default-Printer 167 if ( rInfo.GetPrinterName().Len() && 168 (rInfo.GetPrinterName() == Printer::GetDefaultPrinterName()) ) 169 ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_DEFPRINTER ); 170 171 // Status 172 if ( nStatus & QUEUE_STATUS_READY ) 173 ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_READY ); 174 if ( nStatus & QUEUE_STATUS_PAUSED ) 175 ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_PAUSED ); 176 if ( nStatus & QUEUE_STATUS_PENDING_DELETION ) 177 ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_PENDING ); 178 if ( nStatus & QUEUE_STATUS_BUSY ) 179 ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_BUSY ); 180 if ( nStatus & QUEUE_STATUS_INITIALIZING ) 181 ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_INITIALIZING ); 182 if ( nStatus & QUEUE_STATUS_WAITING ) 183 ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_WAITING ); 184 if ( nStatus & QUEUE_STATUS_WARMING_UP ) 185 ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_WARMING_UP ); 186 if ( nStatus & QUEUE_STATUS_PROCESSING ) 187 ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_PROCESSING ); 188 if ( nStatus & QUEUE_STATUS_PRINTING ) 189 ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_PRINTING ); 190 if ( nStatus & QUEUE_STATUS_OFFLINE ) 191 ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_OFFLINE ); 192 if ( nStatus & QUEUE_STATUS_ERROR ) 193 ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_ERROR ); 194 if ( nStatus & QUEUE_STATUS_SERVER_UNKNOWN ) 195 ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_SERVER_UNKNOWN ); 196 if ( nStatus & QUEUE_STATUS_PAPER_JAM ) 197 ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_PAPER_JAM ); 198 if ( nStatus & QUEUE_STATUS_PAPER_OUT ) 199 ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_PAPER_OUT ); 200 if ( nStatus & QUEUE_STATUS_MANUAL_FEED ) 201 ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_MANUAL_FEED ); 202 if ( nStatus & QUEUE_STATUS_PAPER_PROBLEM ) 203 ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_PAPER_PROBLEM ); 204 if ( nStatus & QUEUE_STATUS_IO_ACTIVE ) 205 ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_IO_ACTIVE ); 206 if ( nStatus & QUEUE_STATUS_OUTPUT_BIN_FULL ) 207 ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_OUTPUT_BIN_FULL ); 208 if ( nStatus & QUEUE_STATUS_TONER_LOW ) 209 ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_TONER_LOW ); 210 if ( nStatus & QUEUE_STATUS_NO_TONER ) 211 ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_NO_TONER ); 212 if ( nStatus & QUEUE_STATUS_PAGE_PUNT ) 213 ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_PAGE_PUNT ); 214 if ( nStatus & QUEUE_STATUS_USER_INTERVENTION ) 215 ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_USER_INTERVENTION ); 216 if ( nStatus & QUEUE_STATUS_OUT_OF_MEMORY ) 217 ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_OUT_OF_MEMORY ); 218 if ( nStatus & QUEUE_STATUS_DOOR_OPEN ) 219 ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_DOOR_OPEN ); 220 if ( nStatus & QUEUE_STATUS_POWER_SAVE ) 221 ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_POWER_SAVE ); 222 223 // Anzahl Jobs 224 sal_uLong nJobs = rInfo.GetJobs(); 225 if ( nJobs && (nJobs != QUEUE_JOBS_DONTKNOW) ) 226 { 227 XubString aJobStr( SvtResId( STR_SVT_PRNDLG_JOBCOUNT ) ); 228 XubString aJobs( XubString::CreateFromInt32( nJobs ) ); 229 aJobStr.SearchAndReplaceAscii( "%d", aJobs ); 230 ImplPrnDlgAddString( aStr, aJobStr ); 231 } 232 233 return aStr; 234 } 235 236 // ======================================================================= 237 238 PrinterSetupDialog::PrinterSetupDialog( Window* pWindow ) : 239 ModalDialog ( pWindow, SvtResId( DLG_SVT_PRNDLG_PRNSETUPDLG ) ), 240 maFlPrinter ( this, SvtResId( FL_PRINTER ) ), 241 maFtName ( this, SvtResId( FT_NAME ) ), 242 maLbName ( this, SvtResId( LB_NAMES ) ), 243 maBtnProperties ( this, SvtResId( BTN_PROPERTIES ) ), 244 maBtnOptions ( this, SvtResId( BTN_OPTIONS ) ), 245 maFtStatus ( this, SvtResId( FT_STATUS ) ), 246 maFiStatus ( this, SvtResId( FI_STATUS ) ), 247 maFtType ( this, SvtResId( FT_TYPE ) ), 248 maFiType ( this, SvtResId( FI_TYPE ) ), 249 maFtLocation ( this, SvtResId( FT_LOCATION ) ), 250 maFiLocation ( this, SvtResId( FI_LOCATION ) ), 251 maFtComment ( this, SvtResId( FT_COMMENT ) ), 252 maFiComment ( this, SvtResId( FI_COMMENT ) ), 253 maFlSepButton ( this, SvtResId( FL_SEPBUTTON ) ), 254 maBtnOK ( this, SvtResId( BTN_OK ) ), 255 maBtnCancel ( this, SvtResId( BTN_CANCEL ) ), 256 maBtnHelp ( this, SvtResId( BTN_HELP ) ) 257 { 258 FreeResource(); 259 260 // show options button only if link is set 261 maBtnOptions.Hide(); 262 263 mpPrinter = NULL; 264 mpTempPrinter = NULL; 265 266 maStatusTimer.SetTimeout( IMPL_PRINTDLG_STATUS_UPDATE ); 267 maStatusTimer.SetTimeoutHdl( LINK( this, PrinterSetupDialog, ImplStatusHdl ) ); 268 maBtnProperties.SetClickHdl( LINK( this, PrinterSetupDialog, ImplPropertiesHdl ) ); 269 maLbName.SetSelectHdl( LINK( this, PrinterSetupDialog, ImplChangePrinterHdl ) ); 270 } 271 272 // ----------------------------------------------------------------------- 273 274 PrinterSetupDialog::~PrinterSetupDialog() 275 { 276 ImplFreePrnDlgListBox( &maLbName, sal_False ); 277 delete mpTempPrinter; 278 } 279 280 // ----------------------------------------------------------------------- 281 282 void PrinterSetupDialog::SetOptionsHdl( const Link& rLink ) 283 { 284 maBtnOptions.SetClickHdl( rLink ); 285 maBtnOptions.Show( rLink.IsSet() ); 286 } 287 288 const Link& PrinterSetupDialog::GetOptionsHdl() const 289 { 290 return maBtnOptions.GetClickHdl(); 291 } 292 293 void PrinterSetupDialog::ImplSetInfo() 294 { 295 const QueueInfo* pInfo = Printer::GetQueueInfo(maLbName.GetSelectEntry(), true); 296 if ( pInfo ) 297 { 298 maFiType.SetText( pInfo->GetDriver() ); 299 maFiLocation.SetText( pInfo->GetLocation() ); 300 maFiComment.SetText( pInfo->GetComment() ); 301 maFiStatus.SetText( ImplPrnDlgGetStatusText( *pInfo ) ); 302 } 303 else 304 { 305 XubString aTempStr; 306 maFiType.SetText( aTempStr ); 307 maFiLocation.SetText( aTempStr ); 308 maFiComment.SetText( aTempStr ); 309 maFiStatus.SetText( aTempStr ); 310 } 311 } 312 313 // ----------------------------------------------------------------------- 314 315 IMPL_LINK( PrinterSetupDialog, ImplStatusHdl, Timer*, EMPTYARG ) 316 { 317 QueueInfo aInfo; 318 ImplPrnDlgUpdateQueueInfo( &maLbName, aInfo ); 319 maFiStatus.SetText( ImplPrnDlgGetStatusText( aInfo ) ); 320 321 return 0; 322 } 323 324 // ----------------------------------------------------------------------- 325 326 IMPL_LINK( PrinterSetupDialog, ImplPropertiesHdl, void*, EMPTYARG ) 327 { 328 if ( !mpTempPrinter ) 329 mpTempPrinter = new Printer( mpPrinter->GetJobSetup() ); 330 mpTempPrinter->Setup( this ); 331 332 return 0; 333 } 334 335 // ----------------------------------------------------------------------- 336 337 IMPL_LINK( PrinterSetupDialog, ImplChangePrinterHdl, void*, EMPTYARG ) 338 { 339 mpTempPrinter = ImplPrnDlgListBoxSelect( &maLbName, &maBtnProperties, 340 mpPrinter, mpTempPrinter ); 341 ImplSetInfo(); 342 return 0; 343 } 344 345 // ----------------------------------------------------------------------- 346 347 long PrinterSetupDialog::Notify( NotifyEvent& rNEvt ) 348 { 349 if ( (rNEvt.GetType() == EVENT_GETFOCUS) && IsReallyVisible() ) 350 ImplStatusHdl( &maStatusTimer ); 351 352 return ModalDialog::Notify( rNEvt ); 353 } 354 355 // ----------------------------------------------------------------------- 356 357 void PrinterSetupDialog::DataChanged( const DataChangedEvent& rDCEvt ) 358 { 359 if ( rDCEvt.GetType() == DATACHANGED_PRINTER ) 360 { 361 mpTempPrinter = ImplPrnDlgUpdatePrinter( mpPrinter, mpTempPrinter ); 362 Printer* pPrn; 363 if ( mpTempPrinter ) 364 pPrn = mpTempPrinter; 365 else 366 pPrn = mpPrinter; 367 ImplFillPrnDlgListBox( pPrn, &maLbName, &maBtnProperties ); 368 ImplSetInfo(); 369 } 370 371 ModalDialog::DataChanged( rDCEvt ); 372 } 373 374 // ----------------------------------------------------------------------- 375 376 short PrinterSetupDialog::Execute() 377 { 378 if ( !mpPrinter || mpPrinter->IsPrinting() || mpPrinter->IsJobActive() ) 379 { 380 DBG_ERRORFILE( "PrinterSetupDialog::Execute() - No Printer or printer is printing" ); 381 return sal_False; 382 } 383 384 Printer::updatePrinters(); 385 386 ImplFillPrnDlgListBox( mpPrinter, &maLbName, &maBtnProperties ); 387 ImplSetInfo(); 388 maStatusTimer.Start(); 389 390 // Dialog starten 391 short nRet = ModalDialog::Execute(); 392 393 // Wenn Dialog mit OK beendet wurde, dann die Daten updaten 394 if ( nRet == sal_True ) 395 { 396 if ( mpTempPrinter ) 397 mpPrinter->SetPrinterProps( mpTempPrinter ); 398 } 399 400 maStatusTimer.Stop(); 401 402 return nRet; 403 } 404