-
Notifications
You must be signed in to change notification settings - Fork 11
/
metatoolsviewer.py
127 lines (103 loc) · 4.11 KB
/
metatoolsviewer.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# -*- coding: utf-8 -*-
# ******************************************************************************
#
# Metatools
# ---------------------------------------------------------
# Metadata browser/editor
#
# Copyright (C) 2011-2016 NextGIS ([email protected])
#
# This source is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free
# Software Foundation; either version 2 of the License, or (at your option)
# any later version.
#
# This code is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# A copy of the GNU General Public License is available on the World Wide Web
# at <http://www.gnu.org/copyleft/gpl.html>. You can also obtain it by writing
# to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
# MA 02111-1307, USA.
#
# ******************************************************************************
from PyQt4 import uic
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtXml import *
from PyQt4.QtXmlPatterns import *
from qgis.core import *
from qgis.gui import *
import os
FORM_CLASS, _ = uic.loadUiType(
os.path.join(os.path.dirname(__file__), "ui/viewer.ui")
)
from error_handler import ErrorHandler
class MetatoolsViewer(QDialog, FORM_CLASS):
def __init__(self, parent=None):
super(MetatoolsViewer, self).__init__(parent)
self.setupUi(self)
self.setWindowFlags(Qt.Window | Qt.WindowMaximizeButtonHint)
# set browser context menu
self.webView.setContextMenuPolicy(Qt.CustomContextMenu)
self.webView.customContextMenuRequested.connect(self.openMenu)
self.contextMenu = QMenu()
self.actionCopy.activated.connect(self.slotCopy)
self.actionPrint.activated.connect(self.slotPrint)
self.actionCopyAll.activated.connect(self.slotCopyAll)
def openMenu(self, position):
self.contextMenu.clear()
if self.webView.selectedText():
self.contextMenu.addAction(self.actionCopy)
self.contextMenu.addAction(self.actionCopyAll)
self.contextMenu.addSeparator()
self.contextMenu.addAction(self.actionPrint)
self.contextMenu.exec_(self.webView.mapToGlobal(position))
def slotPrint(self):
printer = QPrinter()
dialog = QPrintDialog(printer)
if dialog.exec_() == QDialog.Accepted:
self.webView.print_(printer)
def slotCopyAll(self):
mimeData = QMimeData()
mimeData.setHtml(self.webView.page().mainFrame().toHtml())
mimeData.setText(self.webView.page().mainFrame().toPlainText())
clipboard = QApplication.clipboard()
clipboard.setMimeData(mimeData)
def slotCopy(self):
if self.webView.selectedText():
clipboard = QApplication.clipboard()
clipboard.setText(self.webView.selectedText())
def setContent(self, metaProvider, xsltFilePath):
# load data
xsltFile = QFile(xsltFilePath)
xsltFile.open(QIODevice.ReadOnly)
xslt = unicode(xsltFile.readAll())
xsltFile.close()
src = metaProvider.getMetadata()
# translate
qry = QXmlQuery(QXmlQuery.XSLT20)
self.handler = ErrorHandler(self.tr("Translation error"))
qry.setMessageHandler(self.handler)
qry.setFocus(src)
qry.setQuery(xslt)
result = qry.evaluateToString()
# workaround, for PyQt < 4.8
# array = ""
# buf = QBuffer(array)
# buf.open(QIODevice.WriteOnly)
# qry.evaluateTo(buf)
# result = unicode(array)
if result:
# QXmlPattern not support CDATA section
result = result.replace("&", "&")
result = result.replace(">", ">")
result = result.replace("<", "<")
self.webView.setHtml(result) # QString.fromUtf8(result))
return True
else:
return False
def setHtml(self, html):
self.webView.setHtml(html)