diff --git a/nw/gui/__init__.py b/nw/gui/__init__.py index 4073dcc6..8800834d 100644 --- a/nw/gui/__init__.py +++ b/nw/gui/__init__.py @@ -2,11 +2,11 @@ from nw.gui.about import GuiAbout from nw.gui.build import GuiBuildNovel -from nw.gui.docbars import GuiDocTitleBar, GuiSearchBar, GuiDocViewDetails +from nw.gui.docbars import GuiDocTitleBar, GuiSearchBar from nw.gui.doceditor import GuiDocEditor from nw.gui.docmerge import GuiDocMerge from nw.gui.docsplit import GuiDocSplit -from nw.gui.docviewer import GuiDocViewer +from nw.gui.docviewer import GuiDocViewer, GuiDocViewDetails from nw.gui.itemdetails import GuiItemDetails from nw.gui.itemeditor import GuiItemEditor from nw.gui.mainmenu import GuiMainMenu @@ -25,11 +25,11 @@ __all__ = [ "GuiBuildNovel", "GuiDocTitleBar", "GuiSearchBar", - "GuiDocViewDetails", "GuiDocEditor", "GuiDocMerge", "GuiDocSplit", "GuiDocViewer", + "GuiDocViewDetails", "GuiItemDetails", "GuiItemEditor", "GuiMainMenu", diff --git a/nw/gui/custom.py b/nw/gui/custom.py index 264a2c98..5c3dfbd6 100644 --- a/nw/gui/custom.py +++ b/nw/gui/custom.py @@ -45,7 +45,7 @@ from nw.constants import nwUnicode logger = logging.getLogger(__name__) # =============================================================================================== # -# Config FOrm Layout +# Config Form Layout # =============================================================================================== # class QConfigLayout(QGridLayout): diff --git a/nw/gui/docbars.py b/nw/gui/docbars.py index f7406c17..fcbc1869 100644 --- a/nw/gui/docbars.py +++ b/nw/gui/docbars.py @@ -7,9 +7,7 @@ File History: Created: 2019-09-29 [0.2.1] GuiSearchBar - Created: 2019-10-31 [0.3.2] GuiDocViewDetails Created: 2020-04-25 [0.4.5] GuiDocTitleBar - Created: 2020-06-09 [0.8.0] GuiDocViewFooter This file is a part of novelWriter Copyright 2020, Veronica Berglyd Olsen @@ -353,198 +351,3 @@ class GuiDocTitleBar(QWidget): return # END Class GuiDocTitleBar - -class GuiDocViewFooter(QWidget): - - def __init__(self, theParent): - QWidget.__init__(self, theParent) - - logger.debug("Initialising GuiDocViewFooter ...") - - self.mainConf = nw.CONFIG - self.theParent = theParent - self.theTheme = theParent.theTheme - self.optState = theParent.theProject.optState - self.viewMeta = theParent.theParent.viewMeta - self.theHandle = None - - # Make a QPalette that matches the Syntax Theme - self.thePalette = QPalette() - self.thePalette.setColor(QPalette.Window, QColor(*self.theTheme.colBack)) - self.thePalette.setColor(QPalette.Text, QColor(*self.theTheme.colText)) - - fPx = int(0.9*self.theTheme.fontPixelSize) - hSp = self.mainConf.pxInt(6) - - # Main Widget Settings - self.setContentsMargins(0, 0, 0, 0) - self.setAutoFillBackground(True) - self.setPalette(self.thePalette) - - buttonStyle = ( - "QToolButton {{border: none; background: transparent;}} " - "QToolButton:hover {{border: none; background: rgba({0},{1},{2},0.2);}}" - ).format(*self.theTheme.colText) - - # Show/Hide Details - self.showHide = QToolButton(self) - self.showHide.setToolButtonStyle(Qt.ToolButtonIconOnly) - self.showHide.setStyleSheet(buttonStyle) - self.showHide.setIcon(self.theTheme.getIcon("reference")) - self.showHide.setIconSize(QSize(fPx, fPx)) - self.showHide.setFixedSize(QSize(fPx, fPx)) - self.showHide.clicked.connect(self._doShowHide) - - # Sticky Button - stickyOn = self.theTheme.getPixmap("sticky-on", (fPx, fPx)) - stickyOff = self.theTheme.getPixmap("sticky-off", (fPx, fPx)) - stickyIcon = QIcon() - stickyIcon.addPixmap(stickyOn, QIcon.Normal, QIcon.On) - stickyIcon.addPixmap(stickyOff, QIcon.Normal, QIcon.Off) - self.stickyRefs = QToolButton(self) - self.stickyRefs.setCheckable(True) - self.stickyRefs.setToolButtonStyle(Qt.ToolButtonIconOnly) - self.stickyRefs.setStyleSheet(buttonStyle) - self.stickyRefs.setIcon(stickyIcon) - self.stickyRefs.setIconSize(QSize(fPx, fPx)) - self.stickyRefs.setFixedSize(QSize(fPx, fPx)) - self.stickyRefs.toggled.connect(self._doToggleSticky) - - # Labels - self.lblRefs = QLabel("References") - self.lblRefs.setBuddy(self.showHide) - self.lblRefs.setIndent(0) - self.lblRefs.setMargin(0) - self.lblRefs.setContentsMargins(0, 0, 0, 0) - self.lblRefs.setAutoFillBackground(True) - self.lblRefs.setFixedHeight(fPx) - self.lblRefs.setAlignment(Qt.AlignLeft | Qt.AlignTop) - self.lblRefs.setPalette(self.thePalette) - - self.lblSticky = QLabel("Sticky") - self.lblSticky.setBuddy(self.stickyRefs) - self.lblSticky.setIndent(0) - self.lblSticky.setMargin(0) - self.lblSticky.setContentsMargins(0, 0, 0, 0) - self.lblSticky.setAutoFillBackground(True) - self.lblSticky.setFixedHeight(fPx) - self.lblSticky.setAlignment(Qt.AlignLeft | Qt.AlignTop) - self.lblSticky.setPalette(self.thePalette) - - lblFont = self.font() - lblFont.setPointSizeF(0.9*self.theTheme.fontPointSize) - self.lblRefs.setFont(lblFont) - self.lblSticky.setFont(lblFont) - - # Assemble Layout - self.outerBox = QHBoxLayout() - self.outerBox.setSpacing(hSp) - self.outerBox.addWidget(self.showHide, 0) - self.outerBox.addWidget(self.lblRefs, 0) - self.outerBox.addWidget(self.stickyRefs, 0) - self.outerBox.addWidget(self.lblSticky, 0) - self.outerBox.addStretch(1) - self.setLayout(self.outerBox) - - logger.debug("GuiDocViewFooter initialisation complete") - - return - - ## - # Slots - ## - - def _doShowHide(self): - """Toggle the expand/collapse of the panel. - """ - isVisible = self.viewMeta.isVisible() - self.viewMeta.setVisible(not isVisible) - return - - def _doToggleSticky(self, theState): - """Toggle the sticky flag for the reference panel. - """ - logger.verbose("Reference sticky is %s" % str(theState)) - self.theParent.stickyRef = theState - if not theState and self.theParent.theHandle is not None: - self.viewMeta.refreshReferences(self.theParent.theHandle) - return - -# END Class GuiDocViewFooter - -class GuiDocViewDetails(QScrollArea): - - def __init__(self, theParent): - QScrollArea.__init__(self, theParent) - - logger.debug("Initialising GuiDocViewDetails ...") - self.mainConf = nw.CONFIG - self.theParent = theParent - self.theProject = theParent.theProject - self.theTheme = theParent.theTheme - self.currHandle = None - - self.refList = QLabel("None") - self.refList.setWordWrap(True) - self.refList.setAlignment(Qt.AlignTop) - self.refList.setScaledContents(True) - self.refList.linkActivated.connect(self._linkClicked) - - hCol = self.palette().highlight().color() - self.linkStyle = "style='color: rgb({0},{1},{2})'".format( - *self.theTheme.colLink - ) - - # Assemble - self.outerWidget = QWidget() - self.outerBox = QHBoxLayout() - self.outerBox.addWidget(self.refList, 1) - - self.outerWidget.setLayout(self.outerBox) - self.setWidget(self.outerWidget) - - self.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) - self.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) - self.setWidgetResizable(True) - self.setMinimumHeight(self.mainConf.pxInt(50)) - - logger.debug("GuiDocViewDetails initialisation complete") - - return - - def refreshReferences(self, tHandle): - """Update the current list of document references from the - project index. - """ - self.currHandle = tHandle - if self.theParent.docViewer.stickyRef: - return - - theRefs = self.theParent.theIndex.getBackReferenceList(tHandle) - theList = [] - for tHandle in theRefs: - tItem = self.theProject.projTree[tHandle] - if tItem is not None: - theList.append("%s" % ( - tHandle, theRefs[tHandle], self.linkStyle, tItem.itemName - )) - - self.refList.setText(", ".join(theList)) - - return - - ## - # Internal Functions - ## - - def _linkClicked(self, theLink): - """Capture the link-click and forward it to the document viewer - class for handling. - """ - logger.verbose("Clicked link: '%s'" % theLink) - if len(theLink) == 27: - tHandle = theLink[6:19] - self.theParent.viewDocument(tHandle, theLink) - return - -# END Class GuiDocViewDetails diff --git a/nw/gui/docviewer.py b/nw/gui/docviewer.py index 42332fb5..74b20fc7 100644 --- a/nw/gui/docviewer.py +++ b/nw/gui/docviewer.py @@ -6,7 +6,10 @@ Class holding the document html viewer File History: - Created: 2019-05-10 [0.0.1] + Created: 2019-05-10 [0.0.1] GuiDocViewer + Created: 2019-10-31 [0.3.2] GuiDocViewDetails + Created: 2020-04-25 [0.4.5] GuiDocViewHeader + Created: 2020-06-09 [0.8.0] GuiDocViewFooter This file is a part of novelWriter Copyright 2020, Veronica Berglyd Olsen @@ -28,13 +31,17 @@ import logging import nw -from PyQt5.QtCore import Qt, QUrl -from PyQt5.QtWidgets import QTextBrowser -from PyQt5.QtGui import QTextOption, QFont, QPalette, QColor, QTextCursor +from PyQt5.QtCore import Qt, QUrl, QSize +from PyQt5.QtGui import ( + QTextOption, QFont, QPalette, QColor, QTextCursor, QIcon +) +from PyQt5.QtWidgets import ( + QTextBrowser, QWidget, QScrollArea, QLabel, QHBoxLayout, QFrame, + QToolButton +) from nw.core import ToHtml -from nw.constants import nwAlert, nwItemType, nwDocAction -from nw.gui.docbars import GuiDocTitleBar, GuiDocViewFooter +from nw.constants import nwAlert, nwItemType, nwDocAction, nwUnicode logger = logging.getLogger(__name__) @@ -57,8 +64,8 @@ class GuiDocViewer(QTextBrowser): self.setOpenExternalLinks(False) self.initViewer() - # Document Title and Footer - self.docTitle = GuiDocTitleBar(self, isEditor=False) + # Document Header and Footer + self.docHeader = GuiDocViewHeader(self) self.docFooter = GuiDocViewFooter(self) self.stickyRef = False @@ -83,7 +90,7 @@ class GuiDocViewer(QTextBrowser): self.clear() self.setSearchPaths([""]) self.theHandle = None - self.docTitle.setTitleFromHandle(self.theHandle) + self.docHeader.setTitleFromHandle(self.theHandle) return True def initViewer(self): @@ -156,7 +163,7 @@ class GuiDocViewer(QTextBrowser): self.verticalScrollBar().setValue(sPos) self.theHandle = tHandle self.theProject.setLastViewed(tHandle) - self.docTitle.setTitleFromHandle(self.theHandle) + self.docHeader.setTitleFromHandle(self.theHandle) self.updateDocMargins() # Make sure the main GUI knows we changed the content @@ -232,12 +239,12 @@ class GuiDocViewer(QTextBrowser): tB = self.frameWidth() tW = self.width() - 2*tB - sW - tH = self.docTitle.height() + tH = self.docHeader.height() fH = self.docFooter.height() fY = self.height() - fH - tB tT = self.mainConf.getTextMargin() - tH bT = self.mainConf.getTextMargin() - fH - self.docTitle.setGeometry(tB, tB, tW, tH) + self.docHeader.setGeometry(tB, tB, tW, tH) self.docFooter.setGeometry(tB, fY, tW, fH) self.setViewportMargins(0, tH, 0, fH) @@ -256,7 +263,7 @@ class GuiDocViewer(QTextBrowser): title bar needs updating, """ if tHandle == self.theHandle: - self.docTitle.setTitleFromHandle(self.theHandle) + self.docHeader.setTitleFromHandle(self.theHandle) self.updateDocMargins() return @@ -387,3 +394,359 @@ class GuiDocViewer(QTextBrowser): return True # END Class GuiDocViewer + +# =============================================================================================== # +# The Embedded Document Header +# Only used by DocViewer, and is at a fixed position in the QTextBrowser's viewport +# =============================================================================================== # + +class GuiDocViewHeader(QWidget): + + def __init__(self, theParent): + QWidget.__init__(self, theParent) + + logger.debug("Initialising GuiDocViewHeader ...") + + self.mainConf = nw.CONFIG + self.theParent = theParent + self.theProject = theParent.theProject + self.theTheme = theParent.theTheme + self.theHandle = None + + # Make a QPalette that matches the Syntax Theme + self.thePalette = QPalette() + self.thePalette.setColor(QPalette.Window, QColor(*self.theTheme.colBack)) + self.thePalette.setColor(QPalette.Text, QColor(*self.theTheme.colText)) + + fPx = int(0.9*self.theTheme.fontPixelSize) + hSp = self.mainConf.pxInt(6) + self.buttonSize = fPx + hSp + + # Main Widget Settings + self.setContentsMargins(2*self.buttonSize, 0, 0, 0) + self.setAutoFillBackground(True) + self.setPalette(self.thePalette) + + # Title Label + self.theTitle = QLabel() + self.theTitle.setText("") + self.theTitle.setIndent(0) + self.theTitle.setMargin(0) + self.theTitle.setContentsMargins(0, 0, 0, 0) + self.theTitle.setAutoFillBackground(True) + self.theTitle.setAlignment(Qt.AlignHCenter | Qt.AlignTop) + self.theTitle.setFixedHeight(fPx) + self.theTitle.setFrameShape(QFrame.NoFrame) + self.theTitle.setLineWidth(0) + self.theTitle.setPalette(self.thePalette) + + lblFont = self.theTitle.font() + lblFont.setPointSizeF(0.9*self.theTheme.fontPointSize) + self.theTitle.setFont(lblFont) + + buttonStyle = ( + "QToolButton {{border: none; background: transparent;}} " + "QToolButton:hover {{border: none; background: rgba({0},{1},{2},0.2);}}" + ).format(*self.theTheme.colText) + + # Buttons + self.closeButton = QToolButton(self) + self.closeButton.setIcon(self.theTheme.getIcon("close")) + self.closeButton.setContentsMargins(0, 0, 0, 0) + self.closeButton.setIconSize(QSize(fPx, fPx)) + self.closeButton.setFixedSize(fPx, fPx) + self.closeButton.setStyleSheet(buttonStyle) + self.closeButton.setToolButtonStyle(Qt.ToolButtonIconOnly) + self.closeButton.setVisible(False) + self.closeButton.clicked.connect(self._closeDocument) + + self.refreshButton = QToolButton(self) + self.refreshButton.setIcon(self.theTheme.getIcon("refresh")) + self.refreshButton.setContentsMargins(0, 0, 0, 0) + self.refreshButton.setIconSize(QSize(fPx, fPx)) + self.refreshButton.setFixedSize(fPx, fPx) + self.refreshButton.setStyleSheet(buttonStyle) + self.refreshButton.setToolButtonStyle(Qt.ToolButtonIconOnly) + self.refreshButton.setVisible(False) + self.refreshButton.clicked.connect(self._refreshDocument) + + # Assemble Layout + self.outerBox = QHBoxLayout() + self.outerBox.setSpacing(hSp) + self.outerBox.addWidget(self.theTitle, 1) + self.outerBox.addWidget(self.refreshButton, 0) + self.outerBox.addWidget(self.closeButton, 0) + self.setLayout(self.outerBox) + + logger.debug("GuiDocViewHeader initialisation complete") + + return + + ## + # Setters + ## + + def setTitleFromHandle(self, tHandle): + """Sets the document title from the handle, or alternatively, + set the whole document path. + """ + self.theTitle.setText("") + self.theHandle = tHandle + if tHandle is None: + self.closeButton.setVisible(False) + self.refreshButton.setVisible(False) + return False + + if self.mainConf.showFullPath: + tTitle = [] + tTree = self.theProject.projTree.getItemPath(tHandle) + for aHandle in reversed(tTree): + nwItem = self.theProject.projTree[aHandle] + if nwItem is not None: + tTitle.append(nwItem.itemName) + sSep = " %s " % nwUnicode.U_RSAQUO + self.theTitle.setText(sSep.join(tTitle)) + else: + nwItem = self.theProject.projTree[tHandle] + if nwItem is None: + return False + self.theTitle.setText(nwItem.itemName) + + self.closeButton.setVisible(True) + self.refreshButton.setVisible(True) + + return True + + ## + # Slots + ## + + def _closeDocument(self): + """Trigger the close editor/viewer on the main window. + """ + self.theParent.theParent.closeDocViewer() + return + + def _refreshDocument(self): + """Reload the content of the document. + """ + self.theParent.reloadText() + return + + ## + # Events + ## + + def mousePressEvent(self, theEvent): + """Capture a click on the title and ensure that the item is + selected in the project tree. + """ + self.theParent.setSelectedHandle(self.theHandle) + return + +# END Class GuiDocViewHeader + +# =============================================================================================== # +# The Embedded Document Footer +# Only used by DocViewer, and is at a fixed position in the QTextBrowser's viewport +# =============================================================================================== # + +class GuiDocViewFooter(QWidget): + + def __init__(self, theParent): + QWidget.__init__(self, theParent) + + logger.debug("Initialising GuiDocViewFooter ...") + + self.mainConf = nw.CONFIG + self.theParent = theParent + self.theTheme = theParent.theTheme + self.optState = theParent.theProject.optState + self.viewMeta = theParent.theParent.viewMeta + self.theHandle = None + + # Make a QPalette that matches the Syntax Theme + self.thePalette = QPalette() + self.thePalette.setColor(QPalette.Window, QColor(*self.theTheme.colBack)) + self.thePalette.setColor(QPalette.Text, QColor(*self.theTheme.colText)) + + fPx = int(0.9*self.theTheme.fontPixelSize) + hSp = self.mainConf.pxInt(6) + + # Main Widget Settings + self.setContentsMargins(0, 0, 0, 0) + self.setAutoFillBackground(True) + self.setPalette(self.thePalette) + + buttonStyle = ( + "QToolButton {{border: none; background: transparent;}} " + "QToolButton:hover {{border: none; background: rgba({0},{1},{2},0.2);}}" + ).format(*self.theTheme.colText) + + # Show/Hide Details + self.showHide = QToolButton(self) + self.showHide.setToolButtonStyle(Qt.ToolButtonIconOnly) + self.showHide.setStyleSheet(buttonStyle) + self.showHide.setIcon(self.theTheme.getIcon("reference")) + self.showHide.setIconSize(QSize(fPx, fPx)) + self.showHide.setFixedSize(QSize(fPx, fPx)) + self.showHide.clicked.connect(self._doShowHide) + + # Sticky Button + stickyOn = self.theTheme.getPixmap("sticky-on", (fPx, fPx)) + stickyOff = self.theTheme.getPixmap("sticky-off", (fPx, fPx)) + stickyIcon = QIcon() + stickyIcon.addPixmap(stickyOn, QIcon.Normal, QIcon.On) + stickyIcon.addPixmap(stickyOff, QIcon.Normal, QIcon.Off) + self.stickyRefs = QToolButton(self) + self.stickyRefs.setCheckable(True) + self.stickyRefs.setToolButtonStyle(Qt.ToolButtonIconOnly) + self.stickyRefs.setStyleSheet(buttonStyle) + self.stickyRefs.setIcon(stickyIcon) + self.stickyRefs.setIconSize(QSize(fPx, fPx)) + self.stickyRefs.setFixedSize(QSize(fPx, fPx)) + self.stickyRefs.toggled.connect(self._doToggleSticky) + + # Labels + self.lblRefs = QLabel("References") + self.lblRefs.setBuddy(self.showHide) + self.lblRefs.setIndent(0) + self.lblRefs.setMargin(0) + self.lblRefs.setContentsMargins(0, 0, 0, 0) + self.lblRefs.setAutoFillBackground(True) + self.lblRefs.setFixedHeight(fPx) + self.lblRefs.setAlignment(Qt.AlignLeft | Qt.AlignTop) + self.lblRefs.setPalette(self.thePalette) + + self.lblSticky = QLabel("Sticky") + self.lblSticky.setBuddy(self.stickyRefs) + self.lblSticky.setIndent(0) + self.lblSticky.setMargin(0) + self.lblSticky.setContentsMargins(0, 0, 0, 0) + self.lblSticky.setAutoFillBackground(True) + self.lblSticky.setFixedHeight(fPx) + self.lblSticky.setAlignment(Qt.AlignLeft | Qt.AlignTop) + self.lblSticky.setPalette(self.thePalette) + + lblFont = self.font() + lblFont.setPointSizeF(0.9*self.theTheme.fontPointSize) + self.lblRefs.setFont(lblFont) + self.lblSticky.setFont(lblFont) + + # Assemble Layout + self.outerBox = QHBoxLayout() + self.outerBox.setSpacing(hSp) + self.outerBox.addWidget(self.showHide, 0) + self.outerBox.addWidget(self.lblRefs, 0) + self.outerBox.addWidget(self.stickyRefs, 0) + self.outerBox.addWidget(self.lblSticky, 0) + self.outerBox.addStretch(1) + self.setLayout(self.outerBox) + + logger.debug("GuiDocViewFooter initialisation complete") + + return + + ## + # Slots + ## + + def _doShowHide(self): + """Toggle the expand/collapse of the panel. + """ + isVisible = self.viewMeta.isVisible() + self.viewMeta.setVisible(not isVisible) + return + + def _doToggleSticky(self, theState): + """Toggle the sticky flag for the reference panel. + """ + logger.verbose("Reference sticky is %s" % str(theState)) + self.theParent.stickyRef = theState + if not theState and self.theParent.theHandle is not None: + self.viewMeta.refreshReferences(self.theParent.theHandle) + return + +# END Class GuiDocViewFooter + +# =============================================================================================== # +# The Document Back-Reference Panel +# Placed in a separate QSplitter position in the main GUI window +# =============================================================================================== # + +class GuiDocViewDetails(QScrollArea): + + def __init__(self, theParent): + QScrollArea.__init__(self, theParent) + + logger.debug("Initialising GuiDocViewDetails ...") + self.mainConf = nw.CONFIG + self.theParent = theParent + self.theProject = theParent.theProject + self.theTheme = theParent.theTheme + self.currHandle = None + + self.refList = QLabel("") + self.refList.setWordWrap(True) + self.refList.setAlignment(Qt.AlignTop) + self.refList.setScaledContents(True) + self.refList.linkActivated.connect(self._linkClicked) + + hCol = self.palette().highlight().color() + self.linkStyle = "style='color: rgb({0},{1},{2})'".format( + *self.theTheme.colLink + ) + + # Assemble + self.outerWidget = QWidget() + self.outerBox = QHBoxLayout() + self.outerBox.addWidget(self.refList, 1) + + self.outerWidget.setLayout(self.outerBox) + self.setWidget(self.outerWidget) + + self.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) + self.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) + self.setWidgetResizable(True) + self.setMinimumHeight(self.mainConf.pxInt(50)) + + logger.debug("GuiDocViewDetails initialisation complete") + + return + + def refreshReferences(self, tHandle): + """Update the current list of document references from the + project index. + """ + self.currHandle = tHandle + if self.theParent.docViewer.stickyRef: + return + + theRefs = self.theParent.theIndex.getBackReferenceList(tHandle) + theList = [] + for tHandle in theRefs: + tItem = self.theProject.projTree[tHandle] + if tItem is not None: + theList.append("%s" % ( + tHandle, theRefs[tHandle], self.linkStyle, tItem.itemName + )) + + self.refList.setText(", ".join(theList)) + + return + + ## + # Internal Functions + ## + + def _linkClicked(self, theLink): + """Capture the link-click and forward it to the document viewer + class for handling. + """ + logger.verbose("Clicked link: '%s'" % theLink) + if len(theLink) == 27: + tHandle = theLink[6:19] + self.theParent.viewDocument(tHandle, theLink) + return + +# END Class GuiDocViewDetails