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