9 |
9 |
10 from __future__ import unicode_literals |
10 from __future__ import unicode_literals |
11 |
11 |
12 import os |
12 import os |
13 |
13 |
14 from PyQt5.QtCore import pyqtSignal, pyqtSlot, Qt, QUrl, QDir, QFile, \ |
14 from PyQt5.QtCore import pyqtSignal, pyqtSlot, Qt, QUrl, QFile, QFileDevice |
15 QFileDevice, QTemporaryFile |
|
16 from PyQt5.QtGui import QIcon, QPixmap, QPainter |
15 from PyQt5.QtGui import QIcon, QPixmap, QPainter |
17 from PyQt5.QtWidgets import QWidget, QHBoxLayout, QMenu, QToolButton, \ |
16 from PyQt5.QtWidgets import QWidget, QHBoxLayout, QMenu, QToolButton, \ |
18 QDialog, QApplication |
17 QDialog, QApplication |
19 from PyQt5.QtPrintSupport import QPrinter, QPrintDialog, QAbstractPrintDialog |
18 from PyQt5.QtPrintSupport import QPrinter, QPrintDialog, QAbstractPrintDialog |
20 |
19 |
23 from E5Gui.E5Application import e5App |
22 from E5Gui.E5Application import e5App |
24 |
23 |
25 from .WebBrowserView import WebBrowserView |
24 from .WebBrowserView import WebBrowserView |
26 from .WebBrowserPage import WebBrowserPage |
25 from .WebBrowserPage import WebBrowserPage |
27 from .Tools import WebBrowserTools |
26 from .Tools import WebBrowserTools |
28 from .Tools import FilePrinter |
|
29 from . import WebInspector |
27 from . import WebInspector |
30 |
28 |
31 import UI.PixmapCache |
29 import UI.PixmapCache |
32 |
30 |
33 import Utilities |
31 import Utilities |
34 import Preferences |
32 import Preferences |
35 import Globals |
33 import Globals |
36 from Globals import qVersionTuple |
|
37 |
34 |
38 from eric6config import getConfig |
35 from eric6config import getConfig |
|
36 |
|
37 |
|
38 def isCupsAvailable(): |
|
39 """ |
|
40 Static method to test the availability of CUPS. |
|
41 |
|
42 @return flag indicating the availability of CUPS |
|
43 @rtype bool |
|
44 """ |
|
45 if Globals.isMacPlatform(): |
|
46 # OS X/MacOS always have CUPS |
|
47 return True |
|
48 elif Globals.isLinuxPlatform(): |
|
49 testPrinter = QPrinter() |
|
50 return testPrinter.supportsMultipleCopies() |
|
51 else: |
|
52 return False |
39 |
53 |
40 |
54 |
41 class WebBrowserTabWidget(E5TabWidget): |
55 class WebBrowserTabWidget(E5TabWidget): |
42 """ |
56 """ |
43 Class implementing the central widget showing the web pages. |
57 Class implementing the central widget showing the web pages. |
171 UI.PixmapCache.getIcon("tabCloseOther.png"), |
183 UI.PixmapCache.getIcon("tabCloseOther.png"), |
172 self.tr("Close Others"), self.__tabContextMenuCloseOthers) |
184 self.tr("Close Others"), self.__tabContextMenuCloseOthers) |
173 self.__tabContextMenu.addAction( |
185 self.__tabContextMenu.addAction( |
174 self.tr('Close All'), self.closeAllBrowsers) |
186 self.tr('Close All'), self.closeAllBrowsers) |
175 self.__tabContextMenu.addSeparator() |
187 self.__tabContextMenu.addSeparator() |
176 if qVersionTuple() >= (5, 8, 0) or ( |
188 self.__tabContextMenu.addAction( |
177 not Globals.isWindowsPlatform() and qVersionTuple() < (5, 7, 0)): |
189 UI.PixmapCache.getIcon("printPreview.png"), |
178 self.__tabContextMenu.addAction( |
190 self.tr('Print Preview'), self.__tabContextMenuPrintPreview) |
179 UI.PixmapCache.getIcon("printPreview.png"), |
191 self.__tabContextMenu.addAction( |
180 self.tr('Print Preview'), self.__tabContextMenuPrintPreview) |
192 UI.PixmapCache.getIcon("print.png"), |
181 if qVersionTuple() >= (5, 8, 0) or ( |
193 self.tr('Print'), self.__tabContextMenuPrint) |
182 not Globals.isWindowsPlatform() or qVersionTuple() >= (5, 7, 0)): |
194 self.__tabContextMenu.addAction( |
183 self.__tabContextMenu.addAction( |
195 UI.PixmapCache.getIcon("printPdf.png"), |
184 UI.PixmapCache.getIcon("print.png"), |
196 self.tr('Print as PDF'), self.__tabContextMenuPrintPdf) |
185 self.tr('Print'), self.__tabContextMenuPrint) |
|
186 if Globals.isLinuxPlatform() or qVersionTuple() >= (5, 7, 0): |
|
187 self.__tabContextMenu.addAction( |
|
188 UI.PixmapCache.getIcon("printPdf.png"), |
|
189 self.tr('Print as PDF'), self.__tabContextMenuPrintPdf) |
|
190 self.__tabContextMenu.addSeparator() |
197 self.__tabContextMenu.addSeparator() |
191 if hasattr(WebBrowserPage, "isAudioMuted"): |
198 if hasattr(WebBrowserPage, "isAudioMuted"): |
192 self.__audioAct = self.__tabContextMenu.addAction( |
199 self.__audioAct = self.__tabContextMenu.addAction( |
193 "", self.__tabContextMenuAudioMute) |
200 "", self.__tabContextMenuAudioMute) |
194 self.__tabContextMenu.addSeparator() |
201 self.__tabContextMenu.addSeparator() |
658 |
665 |
659 printDialog = QPrintDialog(printer, self) |
666 printDialog = QPrintDialog(printer, self) |
660 printDialog.setOptions(QAbstractPrintDialog.PrintToFile | |
667 printDialog.setOptions(QAbstractPrintDialog.PrintToFile | |
661 QAbstractPrintDialog.PrintShowPageSize) |
668 QAbstractPrintDialog.PrintShowPageSize) |
662 if not Globals.isWindowsPlatform(): |
669 if not Globals.isWindowsPlatform(): |
663 if FilePrinter.isCupsAvailable(): |
670 if isCupsAvailable(): |
664 printDialog.setOption(QAbstractPrintDialog.PrintCollateCopies) |
671 printDialog.setOption(QAbstractPrintDialog.PrintCollateCopies) |
665 printDialog.setOption(QAbstractPrintDialog.PrintPageRange) |
672 printDialog.setOption(QAbstractPrintDialog.PrintPageRange) |
666 if printDialog.exec_() == QDialog.Accepted: |
673 if printDialog.exec_() == QDialog.Accepted: |
667 if hasattr(browser.page(), "print"): |
674 browser.page().execPrintPage(printer, 10 * 1000) |
668 # Qt >= 5.8.0 |
|
669 browser.page().execPrintPage(printer, 10 * 1000) |
|
670 elif hasattr(browser.page(), "printToPdf"): |
|
671 # Qt >= 5.7.0 |
|
672 if printer.outputFormat() == QPrinter.PdfFormat: |
|
673 # print to PDF file selected |
|
674 browser.page().printToPdf( |
|
675 lambda pdf: self.__pdfGeneratedForSave( |
|
676 printer.outputFileName(), pdf), |
|
677 printer.pageLayout()) |
|
678 else: |
|
679 # print to printer |
|
680 self.__pdfPrinter = printer |
|
681 browser.page().printToPdf( |
|
682 self.__pdfGeneratedForPrinting, |
|
683 printer.pageLayout()) |
|
684 else: |
|
685 browser.render(printer) |
|
686 |
675 |
687 @pyqtSlot() |
676 @pyqtSlot() |
688 def printBrowserPdf(self, browser=None): |
677 def printBrowserPdf(self, browser=None): |
689 """ |
678 """ |
690 Public slot called to print the displayed page to PDF. |
679 Public slot called to print the displayed page to PDF. |
764 """</b>.</p><p><b>Error:</b> {1}</p>""").format( |
753 """</b>.</p><p><b>Error:</b> {1}</p>""").format( |
765 filePath, pdfFile.errorString()), |
754 filePath, pdfFile.errorString()), |
766 E5MessageBox.StandardButtons( |
755 E5MessageBox.StandardButtons( |
767 E5MessageBox.Ok)) |
756 E5MessageBox.Ok)) |
768 |
757 |
769 def __pdfGeneratedForPrinting(self, pdfData): |
|
770 """ |
|
771 Private slot to print the generated PDF data. |
|
772 |
|
773 @param pdfData generated PDF document |
|
774 @type QByteArray |
|
775 """ |
|
776 if self.__pdfPrinter is None or pdfData.isEmpty(): |
|
777 return |
|
778 |
|
779 tempFile = QTemporaryFile(QDir.tempPath() + "/ericBrowserXXXXXX.pdf") |
|
780 tempFile.setAutoRemove(False) |
|
781 if tempFile.open(): |
|
782 bytesWritten = tempFile.write(pdfData) |
|
783 tempFile.close() |
|
784 if bytesWritten == pdfData.size(): |
|
785 if Globals.isWindowsPlatform(): |
|
786 printerName = self.__pdfPrinter.printerName() |
|
787 import ctypes |
|
788 ctypes.windll.shell32.ShellExecuteW( |
|
789 None, "printto", tempFile.fileName(), |
|
790 '"{0}"'.format(printerName), None, 0) |
|
791 else: |
|
792 FilePrinter.printFile( |
|
793 self.__pdfPrinter, tempFile.fileName(), |
|
794 FilePrinter.FilePrinter.SystemDeletesFiles, |
|
795 FilePrinter.FilePrinter.SystemSelectsPages) |
|
796 else: |
|
797 tempFile.remove() |
|
798 |
|
799 self.__pdfPrinter = None |
|
800 |
|
801 @pyqtSlot() |
758 @pyqtSlot() |
802 def printPreviewBrowser(self, browser=None): |
759 def printPreviewBrowser(self, browser=None): |
803 """ |
760 """ |
804 Public slot called to show a print preview of the displayed file. |
761 Public slot called to show a print preview of the displayed file. |
805 |
762 |
831 printer.setPrinterName(printerName) |
788 printer.setPrinterName(printerName) |
832 printer.setResolution(Preferences.getPrinter("Resolution")) |
789 printer.setResolution(Preferences.getPrinter("Resolution")) |
833 |
790 |
834 preview = QPrintPreviewDialog(printer, self) |
791 preview = QPrintPreviewDialog(printer, self) |
835 preview.resize(800, 750) |
792 preview.resize(800, 750) |
836 if qVersionTuple() >= (5, 8, 0): |
793 preview.paintRequested.connect( |
837 preview.paintRequested.connect( |
794 lambda p: self.__printPreviewRequested(p, browser)) |
838 lambda p: self.__printPreviewRequested(p, browser)) |
|
839 else: |
|
840 preview.paintRequested.connect(lambda p: browser.render(p)) |
|
841 preview.exec_() |
795 preview.exec_() |
842 |
796 |
843 def __printPreviewRequested(self, printer, browser): |
797 def __printPreviewRequested(self, printer, browser): |
844 """ |
798 """ |
845 Private slot to generate the print preview. |
799 Private slot to generate the print preview. |