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 "prtsetup.hxx"
21 : #include "svdata.hxx"
22 : #include "svids.hrc"
23 :
24 : #include "osl/thread.h"
25 :
26 : #include <officecfg/Office/Common.hxx>
27 :
28 : using namespace psp;
29 :
30 0 : void RTSDialog::insertAllPPDValues( ListBox& rBox, const PPDParser* pParser, const PPDKey* pKey )
31 : {
32 0 : if( ! pKey || ! pParser )
33 0 : return;
34 :
35 0 : const PPDValue* pValue = NULL;
36 0 : sal_Int32 nPos = 0;
37 0 : OUString aOptionText;
38 :
39 0 : for( int i = 0; i < pKey->countValues(); i++ )
40 : {
41 0 : pValue = pKey->getValue( i );
42 0 : if (pValue->m_bCustomOption)
43 0 : continue;
44 0 : aOptionText = pParser->translateOption( pKey->getKey(), pValue->m_aOption) ;
45 :
46 0 : if( m_aJobData.m_aContext.checkConstraints( pKey, pValue ) )
47 : {
48 0 : if( rBox.GetEntryPos( static_cast<void const *>(pValue) ) == LISTBOX_ENTRY_NOTFOUND )
49 : {
50 0 : nPos = rBox.InsertEntry( aOptionText, LISTBOX_APPEND );
51 0 : rBox.SetEntryData( nPos, const_cast<PPDValue *>(pValue) );
52 : }
53 : }
54 : else
55 : {
56 0 : if( ( nPos = rBox.GetEntryPos( static_cast<void const *>(pValue) ) ) != LISTBOX_ENTRY_NOTFOUND )
57 0 : rBox.RemoveEntry( nPos );
58 : }
59 : }
60 0 : pValue = m_aJobData.m_aContext.getValue( pKey );
61 0 : if (pValue && !pValue->m_bCustomOption)
62 : {
63 0 : if( ( nPos = rBox.GetEntryPos( static_cast<void const *>(pValue) ) ) != LISTBOX_ENTRY_NOTFOUND )
64 0 : rBox.SelectEntryPos( nPos );
65 : }
66 : else
67 0 : rBox.SelectEntry( m_aInvalidString );
68 : }
69 :
70 : /*
71 : * RTSDialog
72 : */
73 :
74 0 : RTSDialog::RTSDialog(const PrinterInfo& rJobData, vcl::Window* pParent)
75 : : TabDialog(pParent, "PrinterPropertiesDialog", "vcl/ui/printerpropertiesdialog.ui")
76 : , m_aJobData(rJobData)
77 : , m_pPaperPage(NULL)
78 : , m_pDevicePage(NULL)
79 0 : , m_aInvalidString(VclResId(SV_PRINT_INVALID_TXT))
80 : {
81 0 : get(m_pOKButton, "ok");
82 0 : get(m_pCancelButton, "cancel");
83 0 : get(m_pTabControl, "notebook");
84 :
85 0 : OUString aTitle(GetText());
86 0 : SetText(aTitle.replaceAll("%s", m_aJobData.m_aPrinterName));
87 :
88 0 : m_pTabControl->SetActivatePageHdl( LINK( this, RTSDialog, ActivatePage ) );
89 0 : m_pOKButton->SetClickHdl( LINK( this, RTSDialog, ClickButton ) );
90 0 : m_pCancelButton->SetClickHdl( LINK( this, RTSDialog, ClickButton ) );
91 0 : ActivatePage(m_pTabControl);
92 0 : }
93 :
94 0 : RTSDialog::~RTSDialog()
95 : {
96 0 : disposeOnce();
97 0 : }
98 :
99 0 : void RTSDialog::dispose()
100 : {
101 0 : m_pTabControl.clear();
102 0 : m_pOKButton.clear();
103 0 : m_pCancelButton.clear();
104 0 : m_pPaperPage.disposeAndClear();
105 0 : m_pDevicePage.disposeAndClear();
106 0 : TabDialog::dispose();
107 0 : }
108 :
109 0 : IMPL_LINK( RTSDialog, ActivatePage, TabControl*, pTabCtrl )
110 : {
111 0 : if( pTabCtrl != m_pTabControl )
112 0 : return 0;
113 :
114 0 : sal_uInt16 nId = m_pTabControl->GetCurPageId();
115 0 : OString sPage = m_pTabControl->GetPageName(nId);
116 0 : if ( ! m_pTabControl->GetTabPage( nId ) )
117 : {
118 0 : TabPage *pPage = NULL;
119 0 : if (sPage == "paper")
120 0 : pPage = m_pPaperPage = VclPtr<RTSPaperPage>::Create( this );
121 0 : else if (sPage == "device")
122 0 : pPage = m_pDevicePage = VclPtr<RTSDevicePage>::Create( this );
123 0 : if( pPage )
124 0 : m_pTabControl->SetTabPage( nId, pPage );
125 : }
126 : else
127 : {
128 0 : if (sPage == "paper")
129 0 : m_pPaperPage->update();
130 : }
131 :
132 0 : return 0;
133 : }
134 :
135 0 : IMPL_LINK( RTSDialog, ClickButton, Button*, pButton )
136 : {
137 0 : if( pButton == m_pOKButton )
138 : {
139 : // refresh the changed values
140 0 : if( m_pPaperPage )
141 : {
142 : // orientation
143 0 : m_aJobData.m_eOrientation = m_pPaperPage->getOrientation() == 0 ?
144 0 : orientation::Portrait : orientation::Landscape;
145 : }
146 0 : if( m_pDevicePage )
147 : {
148 0 : m_aJobData.m_nColorDepth = m_pDevicePage->getDepth();
149 0 : m_aJobData.m_nColorDevice = m_pDevicePage->getColorDevice();
150 0 : m_aJobData.m_nPSLevel = m_pDevicePage->getLevel();
151 0 : m_aJobData.m_nPDFDevice = m_pDevicePage->getPDFDevice();
152 : }
153 0 : EndDialog( 1 );
154 : }
155 0 : else if( pButton == m_pCancelButton )
156 0 : EndDialog( 0 );
157 :
158 0 : return 0;
159 : }
160 :
161 : /*
162 : * RTSPaperPage
163 : */
164 :
165 0 : RTSPaperPage::RTSPaperPage(RTSDialog* pParent)
166 : : TabPage(pParent->m_pTabControl, "PrinterPaperPage", "vcl/ui/printerpaperpage.ui")
167 0 : , m_pParent( pParent )
168 : {
169 0 : get(m_pPaperText, "paperft");
170 0 : get(m_pPaperBox, "paperlb");
171 0 : get(m_pOrientBox, "orientlb");
172 0 : get(m_pDuplexText, "duplexft");
173 0 : get(m_pDuplexBox, "duplexlb");
174 0 : get(m_pSlotText, "slotft");
175 0 : get(m_pSlotBox, "slotlb");
176 :
177 0 : m_pPaperBox->SetSelectHdl( LINK( this, RTSPaperPage, SelectHdl ) );
178 0 : m_pOrientBox->SetSelectHdl( LINK( this, RTSPaperPage, SelectHdl ) );
179 0 : m_pDuplexBox->SetSelectHdl( LINK( this, RTSPaperPage, SelectHdl ) );
180 0 : m_pSlotBox->SetSelectHdl( LINK( this, RTSPaperPage, SelectHdl ) );
181 :
182 0 : sal_Int32 nPos = 0;
183 :
184 : // duplex
185 0 : nPos = m_pDuplexBox->InsertEntry( m_pParent->m_aInvalidString );
186 0 : m_pDuplexBox->SetEntryData( nPos, NULL );
187 :
188 : // paper does not have an invalid entry
189 :
190 : // input slots
191 0 : nPos = m_pSlotBox->InsertEntry( m_pParent->m_aInvalidString );
192 0 : m_pSlotBox->SetEntryData( nPos, NULL );
193 :
194 0 : update();
195 0 : }
196 :
197 0 : RTSPaperPage::~RTSPaperPage()
198 : {
199 0 : disposeOnce();
200 0 : }
201 :
202 0 : void RTSPaperPage::dispose()
203 : {
204 0 : m_pParent.clear();
205 0 : m_pPaperText.clear();
206 0 : m_pPaperBox.clear();
207 0 : m_pOrientBox.clear();
208 0 : m_pDuplexText.clear();
209 0 : m_pDuplexBox.clear();
210 0 : m_pSlotText.clear();
211 0 : m_pSlotBox.clear();
212 0 : TabPage::dispose();
213 0 : }
214 :
215 0 : void RTSPaperPage::update()
216 : {
217 0 : const PPDKey* pKey = NULL;
218 :
219 : // orientation
220 : m_pOrientBox->SelectEntryPos(
221 0 : m_pParent->m_aJobData.m_eOrientation == orientation::Portrait ? 0 : 1);
222 :
223 : // duplex
224 0 : if( m_pParent->m_aJobData.m_pParser &&
225 0 : (pKey = m_pParent->m_aJobData.m_pParser->getKey( OUString( "Duplex" ) )) )
226 : {
227 0 : m_pParent->insertAllPPDValues( *m_pDuplexBox, m_pParent->m_aJobData.m_pParser, pKey );
228 : }
229 : else
230 : {
231 0 : m_pDuplexText->Enable( false );
232 0 : m_pDuplexBox->Enable( false );
233 : }
234 :
235 : // paper
236 0 : if( m_pParent->m_aJobData.m_pParser &&
237 0 : (pKey = m_pParent->m_aJobData.m_pParser->getKey( OUString( "PageSize" ) )) )
238 : {
239 0 : m_pParent->insertAllPPDValues( *m_pPaperBox, m_pParent->m_aJobData.m_pParser, pKey );
240 : }
241 : else
242 : {
243 0 : m_pPaperText->Enable( false );
244 0 : m_pPaperBox->Enable( false );
245 : }
246 :
247 : // input slots
248 0 : if( m_pParent->m_aJobData.m_pParser &&
249 0 : (pKey = m_pParent->m_aJobData.m_pParser->getKey( OUString("InputSlot") )) )
250 : {
251 0 : m_pParent->insertAllPPDValues( *m_pSlotBox, m_pParent->m_aJobData.m_pParser, pKey );
252 : }
253 : else
254 : {
255 0 : m_pSlotText->Enable( false );
256 0 : m_pSlotBox->Enable( false );
257 : }
258 0 : }
259 :
260 0 : IMPL_LINK( RTSPaperPage, SelectHdl, ListBox*, pBox )
261 : {
262 0 : const PPDKey* pKey = NULL;
263 0 : if( pBox == m_pPaperBox )
264 : {
265 0 : if( m_pParent->m_aJobData.m_pParser )
266 0 : pKey = m_pParent->m_aJobData.m_pParser->getKey( OUString( "PageSize" ) );
267 : }
268 0 : else if( pBox == m_pDuplexBox )
269 : {
270 0 : if( m_pParent->m_aJobData.m_pParser )
271 0 : pKey = m_pParent->m_aJobData.m_pParser->getKey( OUString( "Duplex" ) );
272 : }
273 0 : else if( pBox == m_pSlotBox )
274 : {
275 0 : if( m_pParent->m_aJobData.m_pParser )
276 0 : pKey = m_pParent->m_aJobData.m_pParser->getKey( OUString( "InputSlot" ) );
277 : }
278 0 : else if( pBox == m_pOrientBox )
279 : {
280 0 : m_pParent->m_aJobData.m_eOrientation = m_pOrientBox->GetSelectEntryPos() == 0 ? orientation::Portrait : orientation::Landscape;
281 : }
282 0 : if( pKey )
283 : {
284 0 : PPDValue* pValue = static_cast<PPDValue*>(pBox->GetSelectEntryData());
285 0 : m_pParent->m_aJobData.m_aContext.setValue( pKey, pValue );
286 0 : update();
287 : }
288 0 : return 0;
289 : }
290 :
291 : /*
292 : * RTSDevicePage
293 : */
294 :
295 0 : RTSDevicePage::RTSDevicePage( RTSDialog* pParent )
296 : : TabPage(pParent->m_pTabControl, "PrinterDevicePage", "vcl/ui/printerdevicepage.ui")
297 : , m_pParent(pParent)
298 0 : , m_pCustomValue(NULL)
299 : {
300 0 : get(m_pPPDKeyBox, "options");
301 0 : get(m_pPPDValueBox, "values");
302 :
303 0 : m_pPPDKeyBox->SetDropDownLineCount(12);
304 0 : m_pPPDValueBox->SetDropDownLineCount(12);
305 :
306 0 : get(m_pCustomEdit, "custom");
307 0 : m_pCustomEdit->SetModifyHdl(LINK(this, RTSDevicePage, ModifyHdl));
308 :
309 0 : get(m_pLevelBox, "level");
310 0 : get(m_pSpaceBox, "colorspace");
311 0 : get(m_pDepthBox, "colordepth");
312 :
313 0 : m_pPPDKeyBox->SetSelectHdl( LINK( this, RTSDevicePage, SelectHdl ) );
314 0 : m_pPPDValueBox->SetSelectHdl( LINK( this, RTSDevicePage, SelectHdl ) );
315 :
316 0 : switch( m_pParent->m_aJobData.m_nColorDevice )
317 : {
318 0 : case 0: m_pSpaceBox->SelectEntryPos(0);break;
319 0 : case 1: m_pSpaceBox->SelectEntryPos(1);break;
320 0 : case -1: m_pSpaceBox->SelectEntryPos(2);break;
321 : }
322 :
323 0 : sal_uLong nLevelEntryData = 0; //automatic
324 0 : if( m_pParent->m_aJobData.m_nPDFDevice == 2 ) //explicit PDF
325 0 : nLevelEntryData = 10;
326 0 : else if (m_pParent->m_aJobData.m_nPSLevel > 0) //explicit PS Level
327 0 : nLevelEntryData = m_pParent->m_aJobData.m_nPSLevel+1;
328 0 : else if (m_pParent->m_aJobData.m_nPDFDevice == 1) //automatically PDF
329 0 : nLevelEntryData = 0;
330 0 : else if (m_pParent->m_aJobData.m_nPDFDevice == -1) //explicitly PS from driver
331 0 : nLevelEntryData = 1;
332 :
333 0 : bool bAutoIsPDF = officecfg::Office::Common::Print::Option::Printer::PDFAsStandardPrintJobFormat::get();
334 :
335 : assert(nLevelEntryData != 0
336 : || "Generic Printer" == m_pParent->m_aJobData.m_aPrinterName
337 : || int(bAutoIsPDF) == m_pParent->m_aJobData.m_nPDFDevice);
338 :
339 0 : OUString sStr = m_pLevelBox->GetEntry(0);
340 0 : m_pLevelBox->InsertEntry(sStr.replaceAll("%s", bAutoIsPDF ? m_pLevelBox->GetEntry(5) : m_pLevelBox->GetEntry(1)), 0);
341 0 : m_pLevelBox->SetEntryData(0, m_pLevelBox->GetEntryData(1));
342 0 : m_pLevelBox->RemoveEntry(1);
343 :
344 0 : for( sal_Int32 i = 0; i < m_pLevelBox->GetEntryCount(); i++ )
345 : {
346 0 : if( reinterpret_cast<sal_uLong>(m_pLevelBox->GetEntryData( i )) == nLevelEntryData )
347 : {
348 0 : m_pLevelBox->SelectEntryPos( i );
349 0 : break;
350 : }
351 : }
352 :
353 0 : if (m_pParent->m_aJobData.m_nColorDepth == 8)
354 0 : m_pDepthBox->SelectEntryPos(0);
355 0 : else if (m_pParent->m_aJobData.m_nColorDepth == 24)
356 0 : m_pDepthBox->SelectEntryPos(1);
357 :
358 : // fill ppd boxes
359 0 : if( m_pParent->m_aJobData.m_pParser )
360 : {
361 0 : for( int i = 0; i < m_pParent->m_aJobData.m_pParser->getKeys(); i++ )
362 : {
363 0 : const PPDKey* pKey = m_pParent->m_aJobData.m_pParser->getKey( i );
364 0 : if( pKey->isUIKey() &&
365 0 : pKey->getKey() != "PageSize" &&
366 0 : pKey->getKey() != "InputSlot" &&
367 0 : pKey->getKey() != "PageRegion" &&
368 0 : pKey->getKey() != "Duplex"
369 : )
370 : {
371 0 : OUString aEntry( m_pParent->m_aJobData.m_pParser->translateKey( pKey->getKey() ) );
372 0 : sal_uInt16 nPos = m_pPPDKeyBox->InsertEntry( aEntry );
373 0 : m_pPPDKeyBox->SetEntryData( nPos, const_cast<PPDKey *>(pKey) );
374 : }
375 : }
376 0 : }
377 0 : }
378 :
379 0 : RTSDevicePage::~RTSDevicePage()
380 : {
381 0 : disposeOnce();
382 0 : }
383 :
384 0 : void RTSDevicePage::dispose()
385 : {
386 0 : m_pParent.clear();
387 0 : m_pPPDKeyBox.clear();
388 0 : m_pPPDValueBox.clear();
389 0 : m_pCustomEdit.clear();
390 0 : m_pLevelBox.clear();
391 0 : m_pSpaceBox.clear();
392 0 : m_pDepthBox.clear();
393 0 : TabPage::dispose();
394 0 : }
395 :
396 0 : sal_uLong RTSDevicePage::getDepth()
397 : {
398 0 : sal_uInt16 nSelectPos = m_pDepthBox->GetSelectEntryPos();
399 0 : if (nSelectPos == 0)
400 0 : return 8;
401 : else
402 0 : return 24;
403 : }
404 :
405 0 : sal_uLong RTSDevicePage::getColorDevice()
406 : {
407 0 : sal_uInt16 nSelectPos = m_pSpaceBox->GetSelectEntryPos();
408 0 : switch (nSelectPos)
409 : {
410 : case 0:
411 0 : return 0;
412 : case 1:
413 0 : return 1;
414 : case 2:
415 0 : return -1;
416 : }
417 0 : return 0;
418 : }
419 :
420 0 : sal_uLong RTSDevicePage::getLevel()
421 : {
422 0 : sal_uLong nLevel = reinterpret_cast<sal_uLong>(m_pLevelBox->GetSelectEntryData());
423 0 : if (nLevel == 0)
424 0 : return 0; //automatic
425 0 : return nLevel < 10 ? nLevel-1 : 0;
426 : }
427 :
428 0 : sal_uLong RTSDevicePage::getPDFDevice()
429 : {
430 0 : sal_uLong nLevel = reinterpret_cast<sal_uLong>(m_pLevelBox->GetSelectEntryData());
431 0 : if (nLevel > 9)
432 0 : return 2; //explicitly PDF
433 0 : else if (nLevel == 0)
434 0 : return 0; //automatic
435 0 : return -1; //explicitly PS
436 : }
437 :
438 0 : IMPL_LINK(RTSDevicePage, ModifyHdl, Edit*, pEdit)
439 : {
440 0 : if (m_pCustomValue)
441 : {
442 0 : m_pCustomValue->m_aCustomOption = pEdit->GetText();
443 : }
444 0 : return 0;
445 : }
446 :
447 0 : IMPL_LINK( RTSDevicePage, SelectHdl, ListBox*, pBox )
448 : {
449 0 : if( pBox == m_pPPDKeyBox )
450 : {
451 0 : const PPDKey* pKey = static_cast<PPDKey*>(m_pPPDKeyBox->GetSelectEntryData());
452 0 : FillValueBox( pKey );
453 : }
454 0 : else if( pBox == m_pPPDValueBox )
455 : {
456 0 : const PPDKey* pKey = static_cast<PPDKey*>(m_pPPDKeyBox->GetSelectEntryData());
457 0 : const PPDValue* pValue = static_cast<PPDValue*>(m_pPPDValueBox->GetSelectEntryData());
458 0 : if (pKey && pValue)
459 : {
460 0 : m_pParent->m_aJobData.m_aContext.setValue( pKey, pValue );
461 0 : FillValueBox( pKey );
462 : }
463 : }
464 0 : return 0;
465 : }
466 :
467 0 : void RTSDevicePage::FillValueBox( const PPDKey* pKey )
468 : {
469 0 : m_pPPDValueBox->Clear();
470 0 : m_pCustomEdit->Hide();
471 :
472 0 : if( ! pKey )
473 0 : return;
474 :
475 0 : const PPDValue* pValue = NULL;
476 0 : for( int i = 0; i < pKey->countValues(); i++ )
477 : {
478 0 : pValue = pKey->getValue( i );
479 0 : if( m_pParent->m_aJobData.m_aContext.checkConstraints( pKey, pValue ) &&
480 0 : m_pParent->m_aJobData.m_pParser )
481 : {
482 0 : OUString aEntry;
483 0 : if (pValue->m_bCustomOption)
484 0 : aEntry = VclResId(SV_PRINT_CUSTOM_TXT);
485 : else
486 0 : aEntry = OUString(m_pParent->m_aJobData.m_pParser->translateOption( pKey->getKey(), pValue->m_aOption));
487 0 : sal_uInt16 nPos = m_pPPDValueBox->InsertEntry( aEntry );
488 0 : m_pPPDValueBox->SetEntryData( nPos, const_cast<PPDValue *>(pValue) );
489 : }
490 : }
491 0 : pValue = m_pParent->m_aJobData.m_aContext.getValue( pKey );
492 0 : m_pPPDValueBox->SelectEntryPos( m_pPPDValueBox->GetEntryPos( static_cast<void const *>(pValue) ) );
493 0 : if (pValue->m_bCustomOption)
494 : {
495 0 : m_pCustomValue = pValue;
496 0 : m_pParent->m_aJobData.m_aContext.setValue(pKey, pValue);
497 0 : m_pCustomEdit->SetText(m_pCustomValue->m_aCustomOption);
498 0 : m_pCustomEdit->Show();
499 : }
500 : }
501 :
502 0 : int SetupPrinterDriver(::psp::PrinterInfo& rJobData)
503 : {
504 0 : int nRet = 0;
505 0 : ScopedVclPtrInstance< RTSDialog > aDialog( rJobData, nullptr );
506 :
507 0 : if( aDialog->Execute() )
508 : {
509 0 : rJobData = aDialog->getSetup();
510 0 : nRet = 1;
511 : }
512 :
513 0 : return nRet;
514 801 : }
515 :
516 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|