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<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, 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* pTempPrinterIn )
57 : {
58 0 : VclPtr<Printer> pTempPrinter( pTempPrinterIn );
59 0 : if ( pBox->GetSelectEntryPos() != LISTBOX_ENTRY_NOTFOUND )
60 : {
61 0 : const QueueInfo* pInfo = Printer::GetQueueInfo( pBox->GetSelectEntry(), true );
62 0 : if( pInfo)
63 : {
64 0 : if ( !pTempPrinter )
65 : {
66 0 : if ( (pPrinter->GetName() == pInfo->GetPrinterName()) &&
67 0 : (pPrinter->GetDriverName() == pInfo->GetDriver()) )
68 0 : pTempPrinter = VclPtr<Printer>::Create( pPrinter->GetJobSetup() );
69 : else
70 0 : pTempPrinter = VclPtr<Printer>::Create( *pInfo );
71 : }
72 : else
73 : {
74 0 : if ( (pTempPrinter->GetName() != pInfo->GetPrinterName()) ||
75 0 : (pTempPrinter->GetDriverName() != pInfo->GetDriver()) )
76 : {
77 0 : pTempPrinter.disposeAndClear();
78 0 : pTempPrinter = VclPtr<Printer>::Create( *pInfo );
79 : }
80 : }
81 :
82 0 : pPropBtn->Enable( pTempPrinter->HasSupport( SUPPORT_SETUPDIALOG ) );
83 : }
84 : else
85 0 : pPropBtn->Disable();
86 : }
87 : else
88 0 : pPropBtn->Disable();
89 :
90 0 : return pTempPrinter;
91 : }
92 :
93 :
94 :
95 0 : Printer* ImplPrnDlgUpdatePrinter( Printer* pPrinter, Printer* pTempPrinterIn )
96 : {
97 0 : VclPtr<Printer> pTempPrinter( pTempPrinterIn );
98 0 : OUString aPrnName;
99 0 : if ( pTempPrinter )
100 0 : aPrnName = pTempPrinter->GetName();
101 : else
102 0 : aPrnName = pPrinter->GetName();
103 :
104 0 : if ( ! Printer::GetQueueInfo( aPrnName, false ) )
105 : {
106 0 : pTempPrinter.disposeAndClear();
107 0 : pTempPrinter = VclPtr<Printer>::Create();
108 : }
109 :
110 0 : return pTempPrinter;
111 : }
112 :
113 :
114 :
115 0 : void ImplPrnDlgUpdateQueueInfo( ListBox* pBox, QueueInfo& rInfo )
116 : {
117 0 : if ( pBox->GetSelectEntryPos() != LISTBOX_ENTRY_NOTFOUND )
118 : {
119 0 : const QueueInfo* pInfo = Printer::GetQueueInfo( pBox->GetSelectEntry(), true );
120 0 : if( pInfo )
121 0 : rInfo = *pInfo;
122 : }
123 0 : }
124 :
125 :
126 :
127 0 : static OUString ImplPrnDlgAddString(const OUString& rStr, const OUString& rAddStr)
128 : {
129 0 : OUString aStr(rStr);
130 0 : if (!aStr.isEmpty())
131 0 : aStr += "; " ;
132 0 : return aStr + rAddStr;
133 : }
134 :
135 :
136 :
137 0 : static OUString ImplPrnDlgAddResString(const OUString& rStr, sal_uInt16 nResId)
138 : {
139 0 : return ImplPrnDlgAddString(rStr, SVT_RESSTR(nResId));
140 : }
141 :
142 :
143 :
144 0 : OUString ImplPrnDlgGetStatusText( const QueueInfo& rInfo )
145 : {
146 0 : OUString aStr;
147 0 : PrintQueueFlags nStatus = rInfo.GetStatus();
148 :
149 : // Default-Printer
150 0 : if ( !rInfo.GetPrinterName().isEmpty() &&
151 0 : (rInfo.GetPrinterName() == Printer::GetDefaultPrinterName()) )
152 0 : aStr = ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_DEFPRINTER );
153 :
154 : // Status
155 0 : if ( nStatus & PrintQueueFlags::Ready )
156 0 : aStr = ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_READY );
157 0 : if ( nStatus & PrintQueueFlags::Paused )
158 0 : aStr = ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_PAUSED );
159 0 : if ( nStatus & PrintQueueFlags::PendingDeletion )
160 0 : aStr = ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_PENDING );
161 0 : if ( nStatus & PrintQueueFlags::Busy )
162 0 : aStr = ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_BUSY );
163 0 : if ( nStatus & PrintQueueFlags::Initializing )
164 0 : aStr = ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_INITIALIZING );
165 0 : if ( nStatus & PrintQueueFlags::Waiting )
166 0 : aStr = ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_WAITING );
167 0 : if ( nStatus & PrintQueueFlags::WarmingUp )
168 0 : aStr = ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_WARMING_UP );
169 0 : if ( nStatus & PrintQueueFlags::Processing )
170 0 : aStr = ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_PROCESSING );
171 0 : if ( nStatus & PrintQueueFlags::Printing )
172 0 : aStr = ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_PRINTING );
173 0 : if ( nStatus & PrintQueueFlags::Offline )
174 0 : aStr = ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_OFFLINE );
175 0 : if ( nStatus & PrintQueueFlags::Error )
176 0 : aStr = ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_ERROR );
177 0 : if ( nStatus & PrintQueueFlags::StatusUnknown )
178 0 : aStr = ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_SERVER_UNKNOWN );
179 0 : if ( nStatus & PrintQueueFlags::PaperJam )
180 0 : aStr = ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_PAPER_JAM );
181 0 : if ( nStatus & PrintQueueFlags::PaperOut )
182 0 : aStr = ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_PAPER_OUT );
183 0 : if ( nStatus & PrintQueueFlags::ManualFeed )
184 0 : aStr = ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_MANUAL_FEED );
185 0 : if ( nStatus & PrintQueueFlags::PaperProblem )
186 0 : aStr = ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_PAPER_PROBLEM );
187 0 : if ( nStatus & PrintQueueFlags::IOActive )
188 0 : aStr = ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_IO_ACTIVE );
189 0 : if ( nStatus & PrintQueueFlags::OutputBinFull )
190 0 : aStr = ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_OUTPUT_BIN_FULL );
191 0 : if ( nStatus & PrintQueueFlags::TonerLow )
192 0 : aStr = ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_TONER_LOW );
193 0 : if ( nStatus & PrintQueueFlags::NoToner )
194 0 : aStr = ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_NO_TONER );
195 0 : if ( nStatus & PrintQueueFlags::PagePunt )
196 0 : aStr = ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_PAGE_PUNT );
197 0 : if ( nStatus & PrintQueueFlags::UserIntervention )
198 0 : aStr = ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_USER_INTERVENTION );
199 0 : if ( nStatus & PrintQueueFlags::OutOfMemory )
200 0 : aStr = ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_OUT_OF_MEMORY );
201 0 : if ( nStatus & PrintQueueFlags::DoorOpen )
202 0 : aStr = ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_DOOR_OPEN );
203 0 : if ( nStatus & PrintQueueFlags::PowerSave )
204 0 : aStr = ImplPrnDlgAddResString( aStr, STR_SVT_PRNDLG_POWER_SAVE );
205 :
206 : // Anzahl Jobs
207 0 : sal_uLong nJobs = rInfo.GetJobs();
208 0 : if ( nJobs && (nJobs != QUEUE_JOBS_DONTKNOW) )
209 : {
210 0 : OUString aJobStr( SVT_RESSTR( STR_SVT_PRNDLG_JOBCOUNT ) );
211 0 : OUString aJobs( OUString::number( nJobs ) );
212 0 : aStr = ImplPrnDlgAddString(aStr, aJobStr.replaceAll("%d", aJobs));
213 : }
214 :
215 0 : return aStr;
216 : }
217 :
218 :
219 :
220 0 : PrinterSetupDialog::PrinterSetupDialog(vcl::Window* pParent)
221 : : ModalDialog(pParent, "PrinterSetupDialog",
222 0 : "svt/ui/printersetupdialog.ui")
223 : {
224 0 : get(m_pLbName, "name");
225 0 : m_pLbName->SetStyle(m_pLbName->GetStyle() | WB_SORT);
226 0 : get(m_pBtnProperties, "properties");
227 0 : get(m_pBtnOptions, "options");
228 0 : get(m_pFiStatus, "status");
229 0 : get(m_pFiType, "type");
230 0 : get(m_pFiLocation, "location");
231 0 : get(m_pFiComment, "comment");
232 :
233 : // show options button only if link is set
234 0 : m_pBtnOptions->Hide();
235 :
236 0 : mpPrinter = NULL;
237 0 : mpTempPrinter = NULL;
238 :
239 0 : maStatusTimer.SetTimeout( IMPL_PRINTDLG_STATUS_UPDATE );
240 0 : maStatusTimer.SetTimeoutHdl( LINK( this, PrinterSetupDialog, ImplStatusHdl ) );
241 0 : m_pBtnProperties->SetClickHdl( LINK( this, PrinterSetupDialog, ImplPropertiesHdl ) );
242 0 : m_pLbName->SetSelectHdl( LINK( this, PrinterSetupDialog, ImplChangePrinterHdl ) );
243 0 : }
244 :
245 :
246 :
247 0 : PrinterSetupDialog::~PrinterSetupDialog()
248 : {
249 0 : disposeOnce();
250 0 : }
251 :
252 0 : void PrinterSetupDialog::dispose()
253 : {
254 0 : ImplFreePrnDlgListBox(m_pLbName, false);
255 0 : m_pLbName.clear();
256 0 : m_pBtnProperties.clear();
257 0 : m_pBtnOptions.clear();
258 0 : m_pFiStatus.clear();
259 0 : m_pFiType.clear();
260 0 : m_pFiLocation.clear();
261 0 : m_pFiComment.clear();
262 0 : mpTempPrinter.disposeAndClear();
263 0 : mpPrinter.clear();
264 0 : ModalDialog::dispose();
265 0 : }
266 :
267 0 : void PrinterSetupDialog::SetOptionsHdl( const Link<>& rLink )
268 : {
269 0 : m_pBtnOptions->SetClickHdl( rLink );
270 0 : m_pBtnOptions->Show( rLink.IsSet() );
271 0 : }
272 :
273 0 : void PrinterSetupDialog::ImplSetInfo()
274 : {
275 0 : const QueueInfo* pInfo = Printer::GetQueueInfo(m_pLbName->GetSelectEntry(), true);
276 0 : if ( pInfo )
277 : {
278 0 : m_pFiType->SetText( pInfo->GetDriver() );
279 0 : m_pFiLocation->SetText( pInfo->GetLocation() );
280 0 : m_pFiComment->SetText( pInfo->GetComment() );
281 0 : m_pFiStatus->SetText( ImplPrnDlgGetStatusText( *pInfo ) );
282 : }
283 : else
284 : {
285 0 : OUString aTempStr;
286 0 : m_pFiType->SetText( aTempStr );
287 0 : m_pFiLocation->SetText( aTempStr );
288 0 : m_pFiComment->SetText( aTempStr );
289 0 : m_pFiStatus->SetText( aTempStr );
290 : }
291 0 : }
292 :
293 :
294 :
295 0 : IMPL_LINK_NOARG_TYPED(PrinterSetupDialog, ImplStatusHdl, Timer *, void)
296 : {
297 0 : QueueInfo aInfo;
298 0 : ImplPrnDlgUpdateQueueInfo(m_pLbName, aInfo);
299 0 : m_pFiStatus->SetText( ImplPrnDlgGetStatusText( aInfo ) );
300 0 : }
301 :
302 :
303 :
304 0 : IMPL_LINK_NOARG(PrinterSetupDialog, ImplPropertiesHdl)
305 : {
306 0 : if ( !mpTempPrinter )
307 0 : mpTempPrinter = VclPtr<Printer>::Create( mpPrinter->GetJobSetup() );
308 0 : mpTempPrinter->Setup( this );
309 :
310 0 : return 0;
311 : }
312 :
313 :
314 :
315 0 : IMPL_LINK_NOARG(PrinterSetupDialog, ImplChangePrinterHdl)
316 : {
317 0 : mpTempPrinter = ImplPrnDlgListBoxSelect(m_pLbName, m_pBtnProperties,
318 0 : mpPrinter, mpTempPrinter );
319 0 : ImplSetInfo();
320 0 : return 0;
321 : }
322 :
323 :
324 :
325 0 : bool PrinterSetupDialog::Notify( NotifyEvent& rNEvt )
326 : {
327 0 : if ( (rNEvt.GetType() == MouseNotifyEvent::GETFOCUS) && IsReallyVisible() )
328 0 : ImplStatusHdl( &maStatusTimer );
329 :
330 0 : return ModalDialog::Notify( rNEvt );
331 : }
332 :
333 :
334 :
335 0 : void PrinterSetupDialog::DataChanged( const DataChangedEvent& rDCEvt )
336 : {
337 0 : if ( rDCEvt.GetType() == DataChangedEventType::PRINTER )
338 : {
339 0 : mpTempPrinter = ImplPrnDlgUpdatePrinter( mpPrinter, mpTempPrinter );
340 : Printer* pPrn;
341 0 : if ( mpTempPrinter )
342 0 : pPrn = mpTempPrinter;
343 : else
344 0 : pPrn = mpPrinter;
345 0 : ImplFillPrnDlgListBox(pPrn, m_pLbName, m_pBtnProperties);
346 0 : ImplSetInfo();
347 : }
348 :
349 0 : ModalDialog::DataChanged( rDCEvt );
350 0 : }
351 :
352 :
353 :
354 0 : short PrinterSetupDialog::Execute()
355 : {
356 0 : if ( !mpPrinter || mpPrinter->IsPrinting() || mpPrinter->IsJobActive() )
357 : {
358 : SAL_WARN( "svtools.dialogs", "PrinterSetupDialog::Execute() - No Printer or printer is printing" );
359 0 : return RET_CANCEL;
360 : }
361 :
362 0 : Printer::updatePrinters();
363 :
364 0 : ImplFillPrnDlgListBox(mpPrinter, m_pLbName, m_pBtnProperties);
365 0 : ImplSetInfo();
366 0 : maStatusTimer.Start();
367 :
368 : // start dialog
369 0 : short nRet = ModalDialog::Execute();
370 :
371 : // update data if the dialog was terminated with OK
372 0 : if ( nRet == RET_OK )
373 : {
374 0 : if ( mpTempPrinter )
375 0 : mpPrinter->SetPrinterProps( mpTempPrinter );
376 : }
377 :
378 0 : maStatusTimer.Stop();
379 :
380 0 : return nRet;
381 798 : }
382 :
383 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|