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