Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <svtools/prnsetup.hxx>
21 : #include <svtools/svtools.hrc>
22 : #include <svtools/svtresid.hxx>
23 : #include <vcl/print.hxx>
24 :
25 : // =======================================================================
26 :
27 0 : void ImplFillPrnDlgListBox( const Printer* pPrinter,
28 : ListBox* pBox, PushButton* pPropBtn )
29 : {
30 0 : ImplFreePrnDlgListBox( pBox );
31 :
32 0 : const std::vector<rtl::OUString>& rPrinters = Printer::GetPrinterQueues();
33 0 : unsigned int nCount = rPrinters.size();
34 0 : if ( nCount )
35 : {
36 0 : for( unsigned int i = 0; i < nCount; i++ )
37 0 : pBox->InsertEntry( rPrinters[i] );
38 0 : pBox->SelectEntry( pPrinter->GetName() );
39 : }
40 :
41 0 : pBox->Enable( nCount != 0 );
42 0 : pPropBtn->Show( pPrinter->HasSupport( SUPPORT_SETUPDIALOG ) );
43 0 : }
44 :
45 : // -----------------------------------------------------------------------
46 :
47 0 : void ImplFreePrnDlgListBox( ListBox* pBox, sal_Bool bClear )
48 : {
49 0 : if ( bClear )
50 0 : pBox->Clear();
51 0 : }
52 :
53 : // -----------------------------------------------------------------------
54 :
55 0 : Printer* ImplPrnDlgListBoxSelect( ListBox* pBox, PushButton* pPropBtn,
56 : Printer* pPrinter, Printer* pTempPrinter )
57 : {
58 0 : if ( pBox->GetSelectEntryPos() != LISTBOX_ENTRY_NOTFOUND )
59 : {
60 0 : const QueueInfo* pInfo = Printer::GetQueueInfo( pBox->GetSelectEntry(), true );
61 0 : if( pInfo)
62 : {
63 0 : if ( !pTempPrinter )
64 : {
65 0 : if ( (pPrinter->GetName() == pInfo->GetPrinterName()) &&
66 0 : (pPrinter->GetDriverName() == pInfo->GetDriver()) )
67 0 : pTempPrinter = new Printer( pPrinter->GetJobSetup() );
68 : else
69 0 : pTempPrinter = new Printer( *pInfo );
70 : }
71 : else
72 : {
73 0 : if ( (pTempPrinter->GetName() != pInfo->GetPrinterName()) ||
74 0 : (pTempPrinter->GetDriverName() != pInfo->GetDriver()) )
75 : {
76 0 : delete pTempPrinter;
77 0 : pTempPrinter = new Printer( *pInfo );
78 : }
79 : }
80 :
81 0 : pPropBtn->Enable( pTempPrinter->HasSupport( SUPPORT_SETUPDIALOG ) );
82 : }
83 : else
84 0 : pPropBtn->Disable();
85 : }
86 : else
87 0 : pPropBtn->Disable();
88 :
89 0 : return pTempPrinter;
90 : }
91 :
92 : // -----------------------------------------------------------------------
93 :
94 0 : Printer* ImplPrnDlgUpdatePrinter( Printer* pPrinter, Printer* pTempPrinter )
95 : {
96 0 : XubString aPrnName;
97 0 : if ( pTempPrinter )
98 0 : aPrnName = pTempPrinter->GetName();
99 : else
100 0 : aPrnName = pPrinter->GetName();
101 :
102 0 : if ( ! Printer::GetQueueInfo( aPrnName, false ) )
103 : {
104 0 : if ( pTempPrinter )
105 0 : delete pTempPrinter;
106 0 : pTempPrinter = new Printer;
107 : }
108 :
109 0 : return pTempPrinter;
110 : }
111 :
112 : // -----------------------------------------------------------------------
113 :
114 0 : void ImplPrnDlgUpdateQueueInfo( ListBox* pBox, QueueInfo& rInfo )
115 : {
116 0 : if ( pBox->GetSelectEntryPos() != LISTBOX_ENTRY_NOTFOUND )
117 : {
118 0 : const QueueInfo* pInfo = Printer::GetQueueInfo( pBox->GetSelectEntry(), true );
119 0 : if( pInfo )
120 0 : rInfo = *pInfo;
121 : }
122 0 : }
123 :
124 : // -----------------------------------------------------------------------
125 :
126 0 : static void ImplPrnDlgAddString( XubString& rStr, const XubString& rAddStr )
127 : {
128 0 : if ( rStr.Len() )
129 0 : rStr.AppendAscii( "; " );
130 0 : rStr += rAddStr;
131 0 : }
132 :
133 : // -----------------------------------------------------------------------
134 :
135 0 : static void ImplPrnDlgAddResString( XubString& rStr, sal_uInt16 nResId )
136 : {
137 0 : ImplPrnDlgAddString( rStr, SVT_RESSTR(nResId) );
138 0 : }
139 :
140 : // -----------------------------------------------------------------------
141 :
142 0 : XubString ImplPrnDlgGetStatusText( const QueueInfo& rInfo )
143 : {
144 0 : XubString aStr;
145 0 : sal_uLong nStatus = rInfo.GetStatus();
146 :
147 : // Default-Printer
148 0 : if ( !rInfo.GetPrinterName().isEmpty() &&
149 0 : (rInfo.GetPrinterName() == Printer::GetDefaultPrinterName()) )
150 0 : ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_DEFPRINTER );
151 :
152 : // Status
153 0 : if ( nStatus & QUEUE_STATUS_READY )
154 0 : ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_READY );
155 0 : if ( nStatus & QUEUE_STATUS_PAUSED )
156 0 : ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_PAUSED );
157 0 : if ( nStatus & QUEUE_STATUS_PENDING_DELETION )
158 0 : ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_PENDING );
159 0 : if ( nStatus & QUEUE_STATUS_BUSY )
160 0 : ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_BUSY );
161 0 : if ( nStatus & QUEUE_STATUS_INITIALIZING )
162 0 : ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_INITIALIZING );
163 0 : if ( nStatus & QUEUE_STATUS_WAITING )
164 0 : ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_WAITING );
165 0 : if ( nStatus & QUEUE_STATUS_WARMING_UP )
166 0 : ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_WARMING_UP );
167 0 : if ( nStatus & QUEUE_STATUS_PROCESSING )
168 0 : ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_PROCESSING );
169 0 : if ( nStatus & QUEUE_STATUS_PRINTING )
170 0 : ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_PRINTING );
171 0 : if ( nStatus & QUEUE_STATUS_OFFLINE )
172 0 : ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_OFFLINE );
173 0 : if ( nStatus & QUEUE_STATUS_ERROR )
174 0 : ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_ERROR );
175 0 : if ( nStatus & QUEUE_STATUS_SERVER_UNKNOWN )
176 0 : ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_SERVER_UNKNOWN );
177 0 : if ( nStatus & QUEUE_STATUS_PAPER_JAM )
178 0 : ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_PAPER_JAM );
179 0 : if ( nStatus & QUEUE_STATUS_PAPER_OUT )
180 0 : ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_PAPER_OUT );
181 0 : if ( nStatus & QUEUE_STATUS_MANUAL_FEED )
182 0 : ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_MANUAL_FEED );
183 0 : if ( nStatus & QUEUE_STATUS_PAPER_PROBLEM )
184 0 : ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_PAPER_PROBLEM );
185 0 : if ( nStatus & QUEUE_STATUS_IO_ACTIVE )
186 0 : ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_IO_ACTIVE );
187 0 : if ( nStatus & QUEUE_STATUS_OUTPUT_BIN_FULL )
188 0 : ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_OUTPUT_BIN_FULL );
189 0 : if ( nStatus & QUEUE_STATUS_TONER_LOW )
190 0 : ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_TONER_LOW );
191 0 : if ( nStatus & QUEUE_STATUS_NO_TONER )
192 0 : ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_NO_TONER );
193 0 : if ( nStatus & QUEUE_STATUS_PAGE_PUNT )
194 0 : ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_PAGE_PUNT );
195 0 : if ( nStatus & QUEUE_STATUS_USER_INTERVENTION )
196 0 : ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_USER_INTERVENTION );
197 0 : if ( nStatus & QUEUE_STATUS_OUT_OF_MEMORY )
198 0 : ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_OUT_OF_MEMORY );
199 0 : if ( nStatus & QUEUE_STATUS_DOOR_OPEN )
200 0 : ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_DOOR_OPEN );
201 0 : if ( nStatus & QUEUE_STATUS_POWER_SAVE )
202 0 : ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_POWER_SAVE );
203 :
204 : // Anzahl Jobs
205 0 : sal_uLong nJobs = rInfo.GetJobs();
206 0 : if ( nJobs && (nJobs != QUEUE_JOBS_DONTKNOW) )
207 : {
208 0 : XubString aJobStr( SVT_RESSTR( STR_SVT_PRNDLG_JOBCOUNT ) );
209 0 : XubString aJobs( XubString::CreateFromInt32( nJobs ) );
210 0 : aJobStr.SearchAndReplaceAscii( "%d", aJobs );
211 0 : ImplPrnDlgAddString( aStr, aJobStr );
212 : }
213 :
214 0 : return aStr;
215 : }
216 :
217 : // =======================================================================
218 :
219 0 : PrinterSetupDialog::PrinterSetupDialog(Window* pParent)
220 : : ModalDialog(pParent, "PrinterSetupDialog",
221 0 : "svt/ui/printersetupdialog.ui")
222 : {
223 0 : get(m_pLbName, "name");
224 0 : m_pLbName->SetStyle(m_pLbName->GetStyle() | WB_SORT);
225 0 : get(m_pBtnProperties, "properties");
226 0 : get(m_pBtnOptions, "options");
227 0 : get(m_pFiStatus, "status");
228 0 : get(m_pFiType, "type");
229 0 : get(m_pFiLocation, "location");
230 0 : get(m_pFiComment, "comment");
231 :
232 : // show options button only if link is set
233 0 : m_pBtnOptions->Hide();
234 :
235 0 : mpPrinter = NULL;
236 0 : mpTempPrinter = NULL;
237 :
238 0 : maStatusTimer.SetTimeout( IMPL_PRINTDLG_STATUS_UPDATE );
239 0 : maStatusTimer.SetTimeoutHdl( LINK( this, PrinterSetupDialog, ImplStatusHdl ) );
240 0 : m_pBtnProperties->SetClickHdl( LINK( this, PrinterSetupDialog, ImplPropertiesHdl ) );
241 0 : m_pLbName->SetSelectHdl( LINK( this, PrinterSetupDialog, ImplChangePrinterHdl ) );
242 0 : }
243 :
244 : // -----------------------------------------------------------------------
245 :
246 0 : PrinterSetupDialog::~PrinterSetupDialog()
247 : {
248 0 : ImplFreePrnDlgListBox(m_pLbName, sal_False);
249 0 : delete mpTempPrinter;
250 0 : }
251 :
252 : // -----------------------------------------------------------------------
253 :
254 0 : void PrinterSetupDialog::SetOptionsHdl( const Link& rLink )
255 : {
256 0 : m_pBtnOptions->SetClickHdl( rLink );
257 0 : m_pBtnOptions->Show( rLink.IsSet() );
258 0 : }
259 :
260 0 : void PrinterSetupDialog::ImplSetInfo()
261 : {
262 0 : const QueueInfo* pInfo = Printer::GetQueueInfo(m_pLbName->GetSelectEntry(), true);
263 0 : if ( pInfo )
264 : {
265 0 : m_pFiType->SetText( pInfo->GetDriver() );
266 0 : m_pFiLocation->SetText( pInfo->GetLocation() );
267 0 : m_pFiComment->SetText( pInfo->GetComment() );
268 0 : m_pFiStatus->SetText( ImplPrnDlgGetStatusText( *pInfo ) );
269 : }
270 : else
271 : {
272 0 : XubString aTempStr;
273 0 : m_pFiType->SetText( aTempStr );
274 0 : m_pFiLocation->SetText( aTempStr );
275 0 : m_pFiComment->SetText( aTempStr );
276 0 : m_pFiStatus->SetText( aTempStr );
277 : }
278 0 : }
279 :
280 : // -----------------------------------------------------------------------
281 :
282 0 : IMPL_LINK_NOARG(PrinterSetupDialog, ImplStatusHdl)
283 : {
284 0 : QueueInfo aInfo;
285 0 : ImplPrnDlgUpdateQueueInfo(m_pLbName, aInfo);
286 0 : m_pFiStatus->SetText( ImplPrnDlgGetStatusText( aInfo ) );
287 :
288 0 : return 0;
289 : }
290 :
291 : // -----------------------------------------------------------------------
292 :
293 0 : IMPL_LINK_NOARG(PrinterSetupDialog, ImplPropertiesHdl)
294 : {
295 0 : if ( !mpTempPrinter )
296 0 : mpTempPrinter = new Printer( mpPrinter->GetJobSetup() );
297 0 : mpTempPrinter->Setup( this );
298 :
299 0 : return 0;
300 : }
301 :
302 : // -----------------------------------------------------------------------
303 :
304 0 : IMPL_LINK_NOARG(PrinterSetupDialog, ImplChangePrinterHdl)
305 : {
306 : mpTempPrinter = ImplPrnDlgListBoxSelect(m_pLbName, m_pBtnProperties,
307 0 : mpPrinter, mpTempPrinter );
308 0 : ImplSetInfo();
309 0 : return 0;
310 : }
311 :
312 : // -----------------------------------------------------------------------
313 :
314 0 : long PrinterSetupDialog::Notify( NotifyEvent& rNEvt )
315 : {
316 0 : if ( (rNEvt.GetType() == EVENT_GETFOCUS) && IsReallyVisible() )
317 0 : ImplStatusHdl( &maStatusTimer );
318 :
319 0 : return ModalDialog::Notify( rNEvt );
320 : }
321 :
322 : // -----------------------------------------------------------------------
323 :
324 0 : void PrinterSetupDialog::DataChanged( const DataChangedEvent& rDCEvt )
325 : {
326 0 : if ( rDCEvt.GetType() == DATACHANGED_PRINTER )
327 : {
328 0 : mpTempPrinter = ImplPrnDlgUpdatePrinter( mpPrinter, mpTempPrinter );
329 : Printer* pPrn;
330 0 : if ( mpTempPrinter )
331 0 : pPrn = mpTempPrinter;
332 : else
333 0 : pPrn = mpPrinter;
334 0 : ImplFillPrnDlgListBox(pPrn, m_pLbName, m_pBtnProperties);
335 0 : ImplSetInfo();
336 : }
337 :
338 0 : ModalDialog::DataChanged( rDCEvt );
339 0 : }
340 :
341 : // -----------------------------------------------------------------------
342 :
343 0 : short PrinterSetupDialog::Execute()
344 : {
345 0 : if ( !mpPrinter || mpPrinter->IsPrinting() || mpPrinter->IsJobActive() )
346 : {
347 : SAL_WARN( "svtools.dialogs", "PrinterSetupDialog::Execute() - No Printer or printer is printing" );
348 0 : return sal_False;
349 : }
350 :
351 0 : Printer::updatePrinters();
352 :
353 0 : ImplFillPrnDlgListBox(mpPrinter, m_pLbName, m_pBtnProperties);
354 0 : ImplSetInfo();
355 0 : maStatusTimer.Start();
356 :
357 : // Dialog starten
358 0 : short nRet = ModalDialog::Execute();
359 :
360 : // Wenn Dialog mit OK beendet wurde, dann die Daten updaten
361 0 : if ( nRet == sal_True )
362 : {
363 0 : if ( mpTempPrinter )
364 0 : mpPrinter->SetPrinterProps( mpTempPrinter );
365 : }
366 :
367 0 : maStatusTimer.Stop();
368 :
369 0 : return nRet;
370 : }
371 :
372 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|