home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2007 September / PCWSEP07.iso / Software / Linux / Linux Mint 3.0 Light / LinuxMint-3.0-Light.iso / casper / filesystem.squashfs / usr / lib / hplip / ui / scrollprint.py < prev    next >
Encoding:
Python Source  |  2007-04-04  |  22.4 KB  |  565 lines

  1. # -*- coding: utf-8 -*-
  2. #
  3. # (c) Copyright 2001-2007 Hewlett-Packard Development Company, L.P.
  4. #
  5. # This program is free software; you can redistribute it and/or modify
  6. # it under the terms of the GNU General Public License as published by
  7. # the Free Software Foundation; either version 2 of the License, or
  8. # (at your option) any later version.
  9. #
  10. # This program is distributed in the hope that it will be useful,
  11. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. # GNU General Public License for more details.
  14. #
  15. # You should have received a copy of the GNU General Public License
  16. # along with this program; if not, write to the Free Software
  17. # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  18. #
  19. # Author: Don Welch
  20. #
  21.  
  22. # Local
  23. from base.g import *
  24. from base import utils, magic
  25. from prnt import cups
  26.  
  27. # Qt
  28. from qt import *
  29. from scrollview import ScrollView, PixmapLabelButton
  30. from allowabletypesdlg import AllowableTypesDlg
  31.  
  32. # Std Lib
  33. import os.path, os
  34.  
  35.  
  36. class RangeValidator(QValidator):
  37.     def __init__(self, parent=None, name=None):
  38.         QValidator.__init__(self, parent, name)
  39.  
  40.     def validate(self, input, pos):
  41.         for x in str(input)[pos-1:]:
  42.             if x not in '0123456789,- ':
  43.                 return QValidator.Invalid, pos
  44.  
  45.         return QValidator.Acceptable, pos
  46.  
  47.  
  48. class ScrollPrintView(ScrollView):
  49.     def __init__(self, toolbox_hosted=True, parent = None, form=None, name = None,fl = 0):
  50.         ScrollView.__init__(self,parent,name,fl)
  51.         
  52.         self.toolbox_hosted = toolbox_hosted
  53.         self.form = form
  54.         self.file_list = []
  55.         self.pages_button_group = 0
  56.         
  57.         self.allowable_mime_types = cups.getAllowableMIMETypes()
  58.         self.allowable_mime_types.append("application/x-python")
  59.  
  60.         log.debug(self.allowable_mime_types)
  61.         
  62.         self.MIME_TYPES_DESC = \
  63.         {
  64.             "application/pdf" : (self.__tr("PDF Document"), '.pdf'),
  65.             "application/postscript" : (self.__tr("Postscript Document"), '.ps'),
  66.             "application/vnd.hp-HPGL" : (self.__tr("HP Graphics Language File"), '.hgl, .hpg, .plt, .prn'),
  67.             "application/x-cshell" : (self.__tr("C Shell Script"), '.csh, .sh'),
  68.             "application/x-csource" : (self.__tr("C Source Code"), '.c'),
  69.             "text/cpp": (self.__tr("C++ Source Code"), '.cpp, .cxx'),
  70.             "application/x-perl" : (self.__tr("Perl Script"), '.pl'),
  71.             "application/x-python" : (self.__tr("Python Program"), '.py'),
  72.             "application/x-shell" : (self.__tr("Shell Script"), '.sh'),
  73.             "text/plain" : (self.__tr("Plain Text"), '.txt, .log, etc'),
  74.             "text/html" : (self.__tr("HTML Dcoument"), '.htm, .html'),
  75.             "image/gif" : (self.__tr("GIF Image"), '.gif'),
  76.             "image/png" : (self.__tr("PNG Image"), '.png'),
  77.             "image/jpeg" : (self.__tr("JPEG Image"), '.jpg, .jpeg'),
  78.             "image/tiff" : (self.__tr("TIFF Image"), '.tif, .tiff'),
  79.             "image/x-bitmap" : (self.__tr("Bitmap (BMP) Image"), '.bmp'),
  80.             "image/x-bmp" : (self.__tr("Bitmap (BMP) Image"), '.bmp'),
  81.             "image/x-photocd" : (self.__tr("Photo CD Image"), '.pcd'),
  82.             "image/x-portable-anymap" : (self.__tr("Portable Image (PNM)"), '.pnm'),
  83.             "image/x-portable-bitmap" : (self.__tr("Portable B&W Image (PBM)"), '.pbm'),
  84.             "image/x-portable-graymap" : (self.__tr("Portable Grayscale Image (PGM)"), '.pgm'),
  85.             "image/x-portable-pixmap" : (self.__tr("Portable Color Image (PPM)"), '.ppm'),
  86.             "image/x-sgi-rgb" : (self.__tr("SGI RGB"), '.rgb'),
  87.             "image/x-xbitmap" : (self.__tr("X11 Bitmap (XBM)"), '.xbm'),
  88.             "image/x-xpixmap" : (self.__tr("X11 Pixmap (XPM)"), '.xpm'),
  89.             "image/x-sun-raster" : (self.__tr("Sun Raster Format"), '.ras'),
  90.         }
  91.         
  92.  
  93.     def fillControls(self):
  94.         ScrollView.fillControls(self)
  95.         
  96.         self.addPrinterFaxList()
  97.         self.addGroupHeading("files_to_print", "File(s) to Print")
  98.         self.addFileList()
  99.         self.addGroupHeading("options", "Print Options")
  100.         self.addCopies()
  101.         self.addPageRange()
  102.         self.addPageSet()
  103.         self.addGroupHeading("space1", "")
  104.         
  105.         if self.toolbox_hosted:
  106.             s = self.__tr("<< Functions")
  107.         else:
  108.             s = self.__tr("Close")
  109.             
  110.         self.printButton = self.addActionButton("bottom_nav", self.__tr("Print File(s)"), 
  111.                                 self.printButton_clicked, s, self.funcButton_clicked)
  112.                                 
  113.         self.printButton.setEnabled(False)
  114.         
  115.         self.maximizeControl()
  116.         
  117.         
  118.     def addFileList(self):
  119.         widget = self.getWidget()
  120.         
  121.         
  122. ##        layout20 = QGridLayout(LayoutWidget_8,1,1,11,6,"layout20")
  123. ##
  124. ##        self.moveUpPushButton = QPushButton(LayoutWidget_8,"moveUpPushButton")
  125. ##
  126. ##        layout20.addWidget(self.moveUpPushButton,1,2)
  127. ##
  128. ##        self.listView2 = QListView(LayoutWidget_8,"listView2")
  129. ##        self.listView2.addColumn(self.__tr("Name"))
  130. ##        self.listView2.addColumn(self.__tr("Type"))
  131. ##        self.listView2.addColumn(self.__tr("Path"))
  132. ##        self.listView2.setAllColumnsShowFocus(1)
  133. ##        self.listView2.setShowSortIndicator(1)
  134. ##
  135. ##        layout20.addMultiCellWidget(self.listView2,0,0,0,5)
  136. ##
  137. ##        self.removeFilePushButton = QPushButton(LayoutWidget_8,"removeFilePushButton")
  138. ##
  139. ##        layout20.addWidget(self.removeFilePushButton,1,1)
  140. ##
  141. ##        self.moveDownPushButton = QPushButton(LayoutWidget_8,"moveDownPushButton")
  142. ##
  143. ##        layout20.addWidget(self.moveDownPushButton,1,3)
  144. ##        spacer20_3 = QSpacerItem(20,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
  145. ##        layout20.addItem(spacer20_3,1,4)
  146. ##
  147. ##        self.showTypesPushButton = QPushButton(LayoutWidget_8,"showTypesPushButton")
  148. ##
  149. ##        layout20.addWidget(self.showTypesPushButton,1,5)
  150. ##
  151. ##        self.addFilePushButton = QPushButton(LayoutWidget_8,"addFilePushButton")
  152. ##
  153. ##        layout20.addWidget(self.addFilePushButton,1,0)
  154.  
  155.  
  156.         
  157.         
  158.         layout37 = QGridLayout(widget,1,1,5,10,"layout37")
  159.         
  160.         self.addFilePushButton = PixmapLabelButton(widget, 
  161.             "list-add.png", "list-add-disabled.png")
  162.  
  163.         layout37.addWidget(self.addFilePushButton,2,0)
  164.         
  165.         #self.showTypesPushButton = QPushButton(widget,"showTypesPushButton")
  166.         
  167.         self.showTypesPushButton = PixmapLabelButton(widget, "mimetypes.png", 
  168.             None, name='addFilePushButton')
  169.         
  170.         layout37.addWidget(self.showTypesPushButton,2,3)
  171.         
  172.         self.removeFilePushButton = PixmapLabelButton(widget, 
  173.             "list-remove.png", "list-remove-disabled.png")
  174.         
  175.         layout37.addWidget(self.removeFilePushButton,2,1)
  176.         
  177.         self.fileListView = QListView(widget,"fileListView")
  178.         self.fileListView.addColumn(self.__tr("Name"))
  179.         self.fileListView.addColumn(self.__tr("Type"))
  180.         self.fileListView.addColumn(self.__tr("Path"))
  181.         self.fileListView.setAllColumnsShowFocus(1)
  182.         self.fileListView.setShowSortIndicator(1)
  183.         self.fileListView.setColumnWidth(0, 150)
  184.         self.fileListView.setColumnWidth(1, 75)
  185.         self.fileListView.setColumnWidth(2, 300)
  186.         self.fileListView.setItemMargin(2)
  187.         self.fileListView.setSorting(-1)
  188.         
  189.         layout37.addMultiCellWidget(self.fileListView,1,1,0,3)
  190.         
  191.         spacer26 = QSpacerItem(20,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
  192.         layout37.addItem(spacer26,2,2)
  193.         
  194.         self.addFilePushButton.setText(self.__tr("Add File..."))
  195.         self.showTypesPushButton.setText(self.__tr("Show Types..."))
  196.         self.removeFilePushButton.setText(self.__tr("Remove File"))
  197.         
  198.         self.removeFilePushButton.setEnabled(False)
  199.         
  200.         self.connect(self.addFilePushButton, SIGNAL("clicked()"), self.addFile_clicked)
  201.         self.connect(self.removeFilePushButton, SIGNAL("clicked()"), self.removeFile_clicked)
  202.         self.connect(self.showTypesPushButton, SIGNAL("clicked()"), self.showFileTypes_clicked)
  203.         self.connect(self.fileListView,SIGNAL("rightButtonClicked(QListViewItem*,const QPoint&, int)"),self.fileListView_rightButtonClicked)
  204.  
  205.         self.addWidget(widget, "file_list", maximize=True)
  206.         
  207.         
  208.     def fileListView_rightButtonClicked(self, item, pos, col):
  209.         popup = QPopupMenu(self)
  210.         popup.insertItem(QIconSet(QPixmap(os.path.join(prop.image_dir, 'list-add.png'))),
  211.             self.__tr("Add File..."), self.addFile_clicked)
  212.     
  213.         if item is not None:
  214.             popup.insertItem(QIconSet(QPixmap(os.path.join(prop.image_dir,
  215.                 'list-remove.png'))), self.__tr("Remove File"), self.removeFile_clicked)
  216.             
  217.         popup.insertSeparator(-1)
  218.         popup.insertItem(QIconSet(QPixmap(os.path.join(prop.image_dir,
  219.                 'mimetypes.png'))), self.__tr("Show File Types..."), self.showFileTypes_clicked)
  220.         popup.popup(pos)
  221.         
  222.         
  223.     def addFile(self, path):
  224.         path = os.path.realpath(path)
  225.         if os.path.exists(path):
  226.             mime_type = magic.mime_type(path)
  227.             mime_type_desc = mime_type
  228.             log.debug(mime_type)
  229.             
  230.             try:
  231.                 mime_type_desc = self.MIME_TYPES_DESC[mime_type][0]
  232.             except KeyError:
  233.                 self.form.WarningUI(self.__tr("<b>You are trying to add a file that cannot be directly printed with this utility.</b><p>To print this file, use the print command in the application that created it."))
  234.             else:
  235.                 log.debug("Adding file %s (%s,%s)" % (path, mime_type, mime_type_desc))
  236.                 self.file_list.append((path, mime_type, mime_type_desc))
  237.         else:
  238.             self.form.FailureUI(self.__tr("<b>Unable to add file '%s' to file list.</b><p>Check the file name and try again." % path))
  239.  
  240.         self.UpdateFileList()
  241.         
  242.     def UpdateFileList(self):
  243.         self.fileListView.clear()
  244.         temp = self.file_list[:]
  245.         temp.reverse()
  246.         x = True
  247.  
  248.         for p, t, d in temp:
  249.             i = QListViewItem(self.fileListView, os.path.basename(p), d, p)
  250.             if x:
  251.                 self.fileListView.setSelected(i, True)
  252.                 x = False
  253.  
  254.         non_empty_file_list = self.fileListView.childCount() > 0
  255.         self.printButton.setEnabled(non_empty_file_list)
  256.         self.removeFilePushButton.setEnabled(non_empty_file_list)
  257.         
  258.         
  259.         
  260.     
  261.     def addFile_clicked(self):
  262.         workingDirectory = user_cfg.last_used.working_dir
  263.        
  264.         if not workingDirectory or not os.path.exists(workingDirectory):
  265.             workingDirectory = os.path.expanduser("~")
  266.  
  267.         log.debug("workingDirectory: %s" % workingDirectory)
  268.  
  269.         dlg = QFileDialog(workingDirectory, QString.null, None, None, True)
  270.  
  271.         dlg.setCaption("openfile")
  272.         dlg.setMode(QFileDialog.ExistingFile)
  273.         dlg.show()
  274.  
  275.         if dlg.exec_loop() == QDialog.Accepted:
  276.                 results = dlg.selectedFile()
  277.                 workingDirectory = str(dlg.dir().absPath())
  278.                 log.debug("results: %s" % results)
  279.                 log.debug("workingDirectory: %s" % workingDirectory)
  280.                 
  281.                 user_cfg.last_used.working_dir = workingDirectory
  282.  
  283.                 if results:
  284.                     self.addFile(str(results))
  285.                     
  286.         
  287.     def removeFile_clicked(self):
  288.         try:
  289.             path = self.fileListView.currentItem().text(2)
  290.         except AttributeError:
  291.             return
  292.         else:
  293.             temp = self.file_list[:]
  294.             index = 0
  295.             for p, t, d in temp:
  296.                 if p == path:
  297.                     del self.file_list[index]
  298.                     break
  299.                 index += 1
  300.  
  301.             self.UpdateFileList()
  302.             
  303.     def showFileTypes_clicked(self):
  304.         x = {}
  305.         for a in self.allowable_mime_types:
  306.             x[a] = self.MIME_TYPES_DESC.get(a, ('Unknown', 'n/a'))
  307.  
  308.         log.debug(x)
  309.         dlg = AllowableTypesDlg(x, self)
  310.         dlg.exec_loop()
  311.         
  312.         
  313.     def addCopies(self):
  314.         widget = self.getWidget()
  315.         
  316.         layout12 = QHBoxLayout(widget,5,10,"layout12")
  317.  
  318.         self.textLabel5 = QLabel(widget,"textLabel5")
  319.         layout12.addWidget(self.textLabel5)
  320.         spacer20 = QSpacerItem(20,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
  321.         layout12.addItem(spacer20)
  322.  
  323.         self.copiesSpinBox = QSpinBox(widget,"copiesSpinBox")
  324.         layout12.addWidget(self.copiesSpinBox)
  325.  
  326.         self.copiesDefaultPushButton = QPushButton(widget,"copiesDefaultPushButton")
  327.         layout12.addWidget(self.copiesDefaultPushButton)
  328.  
  329.         self.textLabel5.setText(self.__tr("Number of copies:"))
  330.         self.copiesDefaultPushButton.setText(self.__tr("Default"))
  331.         
  332.         self.copiesSpinBox.setMaxValue(99)
  333.         self.copiesSpinBox.setMinValue(1)
  334.         self.copiesSpinBox.setValue(1)
  335.         
  336.         self.copiesDefaultPushButton.setEnabled(False)
  337.         
  338.         self.connect(self.copiesDefaultPushButton, SIGNAL("clicked()"), self.copiesDefaultPushButton_clicked)
  339.         self.connect(self.copiesSpinBox, SIGNAL("valueChanged(int)"), self.copiesSpinBox_valueChanged)
  340.         
  341.         self.addWidget(widget, "copies")
  342.         
  343.     def copiesDefaultPushButton_clicked(self):
  344.         self.copiesSpinBox.setValue(1)
  345.         self.copiesDefaultPushButton.setEnabled(False)
  346.         
  347.     def copiesSpinBox_valueChanged(self, i):
  348.         self.copiesDefaultPushButton.setEnabled(i != 1)
  349.     
  350.     def addPageRange(self):
  351.         widget = self.getWidget()
  352.         
  353.         layout39 = QGridLayout(widget,1,1,5,10,"layout39")
  354.  
  355.         self.pageRangeEdit = QLineEdit(widget,"self.pageRangeEdit")
  356.         self.pageRangeEdit.setEnabled(0)
  357.         layout39.addWidget(self.pageRangeEdit,0,3)
  358.         
  359.         spacer20_2 = QSpacerItem(20,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
  360.         layout39.addItem(spacer20_2,0,1)
  361.  
  362.         textLabel5_2 = QLabel(widget,"textLabel5_2")
  363.         layout39.addWidget(textLabel5_2,0,0)
  364.  
  365.         self.pagerangeDefaultPushButton = QPushButton(widget,"pagerangeDefaultPushButton")
  366.         layout39.addWidget(self.pagerangeDefaultPushButton,0,4)
  367.  
  368.         self.rangeButtonGroup = QButtonGroup(widget,"self.rangeButtonGroup")
  369.         self.rangeButtonGroup.setLineWidth(0)
  370.         self.rangeButtonGroup.setColumnLayout(0,Qt.Vertical)
  371.         self.rangeButtonGroup.layout().setSpacing(0)
  372.         self.rangeButtonGroup.layout().setMargin(0)
  373.         self.rangeButtonGroupLayout = QGridLayout(self.rangeButtonGroup.layout())
  374.         self.rangeButtonGroupLayout.setAlignment(Qt.AlignTop)
  375.  
  376.         radioButton3_2 = QRadioButton(self.rangeButtonGroup,"radioButton3_2")
  377.         radioButton3_2.setChecked(1)
  378.         self.rangeButtonGroup.insert( radioButton3_2,0)
  379.         self.rangeButtonGroupLayout.addWidget(radioButton3_2,0,0)
  380.  
  381.         radioButton4_2 = QRadioButton(self.rangeButtonGroup,"radioButton4_2")
  382.         self.rangeButtonGroup.insert( radioButton4_2,1)
  383.         self.rangeButtonGroupLayout.addWidget(radioButton4_2,0,1)
  384.         
  385.         layout39.addWidget(self.rangeButtonGroup,0,2)
  386.         
  387.         self.bg = self.pageRangeEdit.paletteBackgroundColor()
  388.         self.invalid_page_range = False
  389.         
  390.         self.pageRangeEdit.setValidator(RangeValidator(self.pageRangeEdit))
  391.         
  392.         textLabel5_2.setText(self.__tr("Page Range:"))
  393.         radioButton3_2.setText(self.__tr("All pages"))
  394.         radioButton4_2.setText(self.__tr("Page range:"))
  395.         
  396.         self.pagerangeDefaultPushButton.setText(self.__tr("Default"))
  397.         
  398.         self.pagerangeDefaultPushButton.setEnabled(False)
  399.         
  400.         self.connect(self.rangeButtonGroup, SIGNAL("clicked(int)"), self.rangeButtonGroup_clicked)
  401.         self.connect(self.pageRangeEdit,SIGNAL("lostFocus()"),self.pageRangeEdit_lostFocus)
  402.         self.connect(self.pageRangeEdit,SIGNAL("textChanged(const QString&)"),self.pageRangeEdit_textChanged)
  403.         self.connect(self.pagerangeDefaultPushButton, SIGNAL("clicked()"), self.pagerangeDefaultPushButton_clicked)
  404.         
  405.         self.addWidget(widget, "range")
  406.         
  407.     def pagerangeDefaultPushButton_clicked(self):
  408.         self.rangeButtonGroup.setButton(0)
  409.         self.pagerangeDefaultPushButton.setEnabled(False)
  410.         self.pageRangeEdit.setEnabled(False)
  411.         
  412.     def rangeButtonGroup_clicked(self, a0):
  413.         self.pages_button_group = a0
  414.         self.pageRangeEdit.setEnabled(a0 == 1)
  415.         self.pagerangeDefaultPushButton.setEnabled(a0 == 1)
  416.         
  417.     def pageRangeEdit_lostFocus(self):
  418.         x = []
  419.         try:
  420.             x = utils.expand_range(str(self.pageRangeEdit.text()))
  421.         except ValueError:
  422.             log.error("Invalid page range entered.")
  423.             self.invalid_page_range = True
  424.             self.pageRangeEdit.setPaletteBackgroundColor(QColor(0xff, 0x99, 0x99))
  425.  
  426.         else:
  427.             self.pageRangeEdit.setText(QString(utils.collapse_range(x)))
  428.             self.pageRangeEdit.setPaletteBackgroundColor(self.bg)
  429.             self.invalid_page_range = False
  430.  
  431.     def pageRangeEdit_textChanged(self,a0):
  432.         x = []
  433.         try:
  434.             x = utils.expand_range(str(self.pageRangeEdit.text()))
  435.         except ValueError:
  436.             self.invalid_page_range = True
  437.             self.pageRangeEdit.setPaletteBackgroundColor(QColor(0xff, 0x99, 0x99))
  438.  
  439.         else:
  440.             self.pageRangeEdit.setPaletteBackgroundColor(self.bg)
  441.             self.invalid_page_range = False
  442.         
  443.     def addPageSet(self):
  444.         widget = self.getWidget()
  445.         
  446.         layout34 = QHBoxLayout(widget,5,10,"layout34")
  447.  
  448.         self.textLabel5_4 = QLabel(widget,"textLabel5_4")
  449.         layout34.addWidget(self.textLabel5_4)
  450.         spacer20_4 = QSpacerItem(20,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
  451.         layout34.addItem(spacer20_4)
  452.  
  453.         self.pageSetComboBox = QComboBox(0,widget,"pageSetComboBox")
  454.         layout34.addWidget(self.pageSetComboBox)
  455.  
  456.         self.pagesetDefaultPushButton = QPushButton(widget,"pagesetDefaultPushButton")
  457.         layout34.addWidget(self.pagesetDefaultPushButton)
  458.         
  459.         self.textLabel5_4.setText(self.__tr("Page set:"))
  460.         self.pageSetComboBox.clear()
  461.         self.pageSetComboBox.insertItem(self.__tr("All pages"))
  462.         self.pageSetComboBox.insertItem(self.__tr("Even pages"))
  463.         self.pageSetComboBox.insertItem(self.__tr("Odd pages"))
  464.         self.pagesetDefaultPushButton.setText(self.__tr("Default"))
  465.         
  466.         self.pagesetDefaultPushButton.setEnabled(False)
  467.         
  468.         self.connect(self.pageSetComboBox, SIGNAL("activated(int)"), self.pageSetComboBox_activated)
  469.         self.connect(self.pagesetDefaultPushButton, SIGNAL("clicked()"), self.pagesetDefaultPushButton_clicked)
  470.         
  471.         self.addWidget(widget, "set")
  472.         
  473.     def pagesetDefaultPushButton_clicked(self):
  474.         self.pagesetDefaultPushButton.setEnabled(False)
  475.         self.pageSetComboBox.setCurrentItem(0)
  476.         
  477.     def pageSetComboBox_activated(self, i):
  478.         self.pagesetDefaultPushButton.setEnabled(i != 0)
  479.  
  480.     def printButton_clicked(self):
  481.         if self.invalid_page_range:
  482.             self.form.FailureUI(self.__tr("<b>Cannot print: Invalid page range: %1</b><p>A valid page range is a list of pages or ranges of pages separated by commas (e.g., 1-2,4,6-7)").arg(self.pageRangeEdit.text()))
  483.             return
  484.             
  485.         try:
  486.             try:
  487.                 self.cur_device.open()
  488.             except Error:
  489.                 self.form.FailureUI(self.__tr("<b>Cannot print: Device is busy or not available.</b><p>Please check device and try again."))
  490.                 return
  491.             
  492.             if self.cur_device.isIdleAndNoError():
  493.                 copies = int(self.copiesSpinBox.value())
  494.                 all_pages = self.pages_button_group == 0
  495.                 page_range = str(self.pageRangeEdit.text())
  496.                 page_set = int(self.pageSetComboBox.currentItem())
  497.             
  498.                 cups.resetOptions()
  499.                 cups.openPPD(self.cur_printer)
  500.                 current_options = dict(cups.getOptions())
  501.                 cups.closePPD()
  502.                 
  503.                 nup = int(current_options.get("number-up", 1))
  504.                     
  505.                 for p, t, d in self.file_list:
  506.         
  507.                     alt_nup = (nup > 1 and t == 'application/postscript' and utils.which('psnup'))
  508.         
  509.                     if utils.which('lpr'):
  510.                         if alt_nup:
  511.                             cmd = ' '.join(['psnup', '-%d' % nup, ''.join(['"', p, '"']), '| lpr -P', self.cur_printer])
  512.                         else:
  513.                             cmd = ' '.join(['lpr -P', self.cur_printer])
  514.         
  515.                         if copies > 1:
  516.                             cmd = ' '.join([cmd, '-#%d' % copies])
  517.         
  518.                     else:
  519.                         if alt_nup:
  520.                             cmd = ' '.join(['psnup', '-%d' % nup, ''.join(['"', p, '"']), '| lp -c -d', self.cur_printer])
  521.                         else:
  522.                             cmd = ' '.join(['lp -c -d', self.cur_printer])
  523.         
  524.                         if copies > 1:
  525.                             cmd = ' '.join([cmd, '-n%d' % copies])
  526.         
  527.         
  528.                     if not all_pages and len(page_range) > 0:
  529.                         cmd = ' '.join([cmd, '-o page-ranges=%s' % page_range])
  530.         
  531.                     if page_set > 0:
  532.                         if page_set == 1:
  533.                             cmd = ' '.join([cmd, '-o page-set=even'])
  534.                         else:
  535.                             cmd = ' '.join([cmd, '-o page-set=odd'])
  536.         
  537.                     if not alt_nup:
  538.                         cmd = ''.join([cmd, ' "', p, '"'])
  539.         
  540.                     log.debug("Printing: %s" % cmd)
  541.         
  542.                     if os.system(cmd) != 0:
  543.                         log.error("Print command failed.")
  544.                         self.FailureUI(self.__tr("Print command failed."))
  545.             
  546.                 if self.toolbox_hosted:
  547.                     self.form.SwitchFunctionsTab("funcs")
  548.                 else:
  549.                     self.form.close()
  550.                     
  551.             else:
  552.                 self.form.FailureUI(self.__tr("<b>Cannot print: Device is busy or not available.</b><p>Please check device and try again."))
  553.         
  554.         finally:
  555.             self.cur_device.close()
  556.         
  557.     def funcButton_clicked(self):
  558.         if self.toolbox_hosted:
  559.             self.form.SwitchFunctionsTab("funcs")
  560.         else:
  561.             self.form.close()
  562.         
  563.     def __tr(self,s,c = None):
  564.         return qApp.translate("DevMgr4",s,c)
  565.