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
ImplFillPrnDlgListBox(const Printer * pPrinter,ListBox * pBox,PushButton * pPropBtn)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
ImplFreePrnDlgListBox(ListBox * pBox,sal_Bool bClear)60 void ImplFreePrnDlgListBox( ListBox* pBox, sal_Bool bClear )
61 {
62 if ( bClear )
63 pBox->Clear();
64 }
65
66 // -----------------------------------------------------------------------
67
ImplPrnDlgListBoxSelect(ListBox * pBox,PushButton * pPropBtn,Printer * pPrinter,Printer * pTempPrinter)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
ImplPrnDlgUpdatePrinter(Printer * pPrinter,Printer * pTempPrinter)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
ImplPrnDlgUpdateQueueInfo(ListBox * pBox,QueueInfo & rInfo)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
ImplPrnDlgAddString(XubString & rStr,const XubString & rAddStr)139 static void ImplPrnDlgAddString( XubString& rStr, const XubString& rAddStr )
140 {
141 if ( rStr.Len() )
142 rStr.AppendAscii( "; " );
143 rStr += rAddStr;
144 }
145
146 // -----------------------------------------------------------------------
147
ImplPrnDlgAddResString(XubString & rStr,sal_uInt16 nResId)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
ImplPrnDlgGetStatusText(const QueueInfo & rInfo)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
PrinterSetupDialog(Window * pWindow)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
~PrinterSetupDialog()270 PrinterSetupDialog::~PrinterSetupDialog()
271 {
272 ImplFreePrnDlgListBox( &maLbName, sal_False );
273 delete mpTempPrinter;
274 }
275
276 // -----------------------------------------------------------------------
277
SetOptionsHdl(const Link & rLink)278 void PrinterSetupDialog::SetOptionsHdl( const Link& rLink )
279 {
280 maBtnOptions.SetClickHdl( rLink );
281 maBtnOptions.Show( rLink.IsSet() );
282 }
283
GetOptionsHdl() const284 const Link& PrinterSetupDialog::GetOptionsHdl() const
285 {
286 return maBtnOptions.GetClickHdl();
287 }
288
ImplSetInfo()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
IMPL_LINK(PrinterSetupDialog,ImplStatusHdl,Timer *,EMPTYARG)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
IMPL_LINK(PrinterSetupDialog,ImplPropertiesHdl,void *,EMPTYARG)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
IMPL_LINK(PrinterSetupDialog,ImplChangePrinterHdl,void *,EMPTYARG)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
Notify(NotifyEvent & rNEvt)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
DataChanged(const DataChangedEvent & rDCEvt)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
Execute()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