def focusInEvent(self, event):
     # check for file changes
     try:
         if self.filename and self.file_info:
             if self.file_info.lastModified() != QFileInfo(
                     self.filename).lastModified():
                 self.file_info = QFileInfo(self.filename)
                 result = MessageBox.question(self,
                                              "File changed",
                                              "File was changed, reload?",
                                              buttons=MessageBox.Yes
                                              | MessageBox.No)
                 if result == MessageBox.Yes:
                     f = QFile(self.filename)
                     if f.open(QIODevice.ReadOnly | QIODevice.Text):
                         self.setText(unicode(f.readAll(), "utf-8"))
                         self.document().setModified(False)
                         self.textChanged.emit()
                     else:
                         MessageBox.critical(
                             self, "Error",
                             "Cannot open launch file%s" % self.filename)
     except:
         pass
     QTextEdit.focusInEvent(self, event)
Example #2
0
    def __init__(self, filename, parent=None):
        self.parent = parent
        QTextEdit.__init__(self, parent)
        self.setObjectName(' - '.join(['Editor', filename]))
        self.setContextMenuPolicy(Qt.CustomContextMenu)
        self.customContextMenuRequested.connect(self.show_custom_context_menu)
        #        self.setFrameStyle(QFrame.StyledPanel | QFrame.Sunken)
        self.setAcceptRichText(False)
        font = QFont()
        font.setFamily("Fixed".decode("utf-8"))
        font.setPointSize(12)
        self.setFont(font)
        self.setLineWrapMode(QTextEdit.NoWrap)
        self.setTabStopWidth(25)
        self.setAcceptRichText(False)
        self.setCursorWidth(2)
        self.setFontFamily("courier new")
        self.setProperty("backgroundVisible", True)
        self.regexp_list = [
            QRegExp("\\binclude\\b"),
            QRegExp("\\btextfile\\b"),
            QRegExp("\\bfile\\b"),
            QRegExp("\\bvalue=.*pkg:\/\/\\b"),
            QRegExp("\\bvalue=.*package:\/\/\\b"),
            QRegExp("\\bvalue=.*\$\(find\\b"),
            QRegExp("\\bargs=.*\$\(find\\b"),
            QRegExp("\\bdefault=.*\$\(find\\b")
        ]
        self.filename = filename
        self.file_info = None
        if self.filename:
            f = QFile(filename)
            if f.open(QIODevice.ReadOnly | QIODevice.Text):
                self.file_info = QFileInfo(filename)
                self.setText(unicode(f.readAll(), "utf-8"))

        self.path = '.'
        # enables drop events
        self.setAcceptDrops(True)
        if filename.endswith('.launch'):
            self.hl = XmlHighlighter(self.document())
            self.cursorPositionChanged.connect(self._document_position_changed)
        else:
            self.hl = YamlHighlighter(self.document())
        # variables for threaded search
        self._search_thread = None
        self._stop = False
Example #3
0
 def on_editor_modificationChanged(self, value=None):
     '''
     If the content was changed, a '*' will be shown in the tab name.
     '''
     tab_name = self.__getTabName(self.tabWidget.currentWidget().filename)
     if (self.tabWidget.currentWidget().document().isModified()) or not QFileInfo(self.tabWidget.currentWidget().filename).exists():
         tab_name = ''.join(['*', tab_name])
     self.tabWidget.setTabText(self.tabWidget.currentIndex(), tab_name)
 def _handle_load_clicked(self):
     filenames = QFileDialog.getOpenFileNames(
         self, self.tr('Load from Files'), self.last_open_dir,
         self.tr('Bag files {.bag} (*.bag)'))
     if filenames and filenames[0]:
         self.last_open_dir = QFileInfo(
             filenames[0][0]).absoluteDir().absolutePath()
     for filename in filenames[0]:
         self.load_bag(filename)
Example #5
0
    def save(self, force=False):
        '''
        Saves changes to the file.
        :return: saved, errors, msg
        :rtype: bool, bool, str
        '''
        if force or self.document().isModified() or not QFileInfo(
                self.filename).exists():
            f = QFile(self.filename)
            if f.open(QIODevice.WriteOnly | QIODevice.Text):
                f.write(self.toPlainText().encode('utf-8'))
                self.document().setModified(False)
                self.file_info = QFileInfo(self.filename)

                ext = os.path.splitext(self.filename)
                # validate the xml structure of the launch files
                if ext[1] in self.CONTEXT_FILE_EXT:
                    imported = False
                    try:
                        from lxml import etree
                        imported = True
                        parser = etree.XMLParser()
                        etree.fromstring(self.toPlainText().encode('utf-8'),
                                         parser)
                    except Exception as e:
                        if imported:
                            self.markLine(e.position[0])
                            return True, True, "%s" % e
                # validate the yaml structure of yaml files
                elif ext[1] in self.YAML_VALIDATION_FILES:
                    try:
                        import yaml
                        yaml.load(self.toPlainText().encode('utf-8'))
                    except yaml.MarkedYAMLError as e:
                        return True, True, "%s" % e
                return True, False, ''
            else:
                return False, True, "Cannot write XML file"
        return False, False, ''
Example #6
0
    def _handle_load_clicked(self):
        filenames = QFileDialog.getOpenFileNames(
            self, self.tr('Load from Files'), self.last_open_dir, self.tr('Bag files {.bag} (*.bag)'))
        if filenames and filenames[0]:
            self.last_open_dir = QFileInfo(filenames[0][0]).absoluteDir().absolutePath()
        for filename in filenames[0]:
            self.load_bag(filename)

        # After loading bag(s), force a resize event on the bag widget so that
        # it can take the new height of the timeline into account (and show
        # the scroll bar if necessary)
        self._timeline._timeline_frame._layout()
        self._resizeEvent(QResizeEvent(self.size(), self.size()))
 def focusInEvent(self, event):
     # check for file changes
     try:
         if self.filename and self.file_info:
             if self.file_info.lastModified() != QFileInfo(self.filename).lastModified():
                 self.file_info = QFileInfo(self.filename)
                 result = MessageBox.question(self, "File changed", "File was changed, reload?", buttons=MessageBox.Yes | MessageBox.No)
                 if result == MessageBox.Yes:
                     f = QFile(self.filename)
                     if f.open(QIODevice.ReadOnly | QIODevice.Text):
                         self.setText(unicode(f.readAll(), "utf-8"))
                         self.document().setModified(False)
                         self.textChanged.emit()
                     else:
                         MessageBox.critical(self, "Error", "Cannot open launch file%s" % self.filename)
     except:
         pass
     QTextEdit.focusInEvent(self, event)
    def __init__(self, filename, parent=None):
        self.parent = parent
        QTextEdit.__init__(self, parent)
        self.setObjectName(' - '.join(['Editor', filename]))
        self.setContextMenuPolicy(Qt.CustomContextMenu)
        self.customContextMenuRequested.connect(self.show_custom_context_menu)
#        self.setFrameStyle(QFrame.StyledPanel | QFrame.Sunken)
        self.setAcceptRichText(False)
        font = QFont()
        font.setFamily("Fixed".decode("utf-8"))
        font.setPointSize(12)
        self.setFont(font)
        self.setLineWrapMode(QTextEdit.NoWrap)
        self.setTabStopWidth(25)
        self.setAcceptRichText(False)
        self.setCursorWidth(2)
        self.setFontFamily("courier new")
        self.setProperty("backgroundVisible", True)
        self.regexp_list = [QRegExp("\\binclude\\b"), QRegExp("\\btextfile\\b"),
                            QRegExp("\\bfile\\b"), QRegExp("\\bvalue=.*pkg:\/\/\\b"),
                            QRegExp("\\bvalue=.*package:\/\/\\b"),
                            QRegExp("\\bvalue=.*\$\(find\\b"),
                            QRegExp("\\bargs=.*\$\(find\\b"),
                            QRegExp("\\bdefault=.*\$\(find\\b")]
        self.filename = filename
        self.file_info = None
        if self.filename:
            f = QFile(filename)
            if f.open(QIODevice.ReadOnly | QIODevice.Text):
                self.file_info = QFileInfo(filename)
                self.setText(unicode(f.readAll(), "utf-8"))

        self.path = '.'
        # enables drop events
        self.setAcceptDrops(True)
        if filename.endswith('.launch'):
            self.hl = XmlHighlighter(self.document())
            self.cursorPositionChanged.connect(self._document_position_changed)
        else:
            self.hl = YamlHighlighter(self.document())
        # variables for threaded search
        self._search_thread = None
        self._stop = False
    def save(self, force=False):
        '''
        Saves changes to the file.
        :return: saved, errors, msg
        :rtype: bool, bool, str
        '''
        if force or self.document().isModified() or not QFileInfo(self.filename).exists():
            f = QFile(self.filename)
            if f.open(QIODevice.WriteOnly | QIODevice.Text):
                f.write(self.toPlainText().encode('utf-8'))
                self.document().setModified(False)
                self.file_info = QFileInfo(self.filename)

                ext = os.path.splitext(self.filename)
                # validate the xml structure of the launch files
                if ext[1] in self.CONTEXT_FILE_EXT:
                    imported = False
                    try:
                        from lxml import etree
                        imported = True
                        parser = etree.XMLParser()
                        etree.fromstring(self.toPlainText().encode('utf-8'), parser)
                    except Exception as e:
                        if imported:
                            self.markLine(e.position[0])
                            return True, True, "%s" % e
                # validate the yaml structure of yaml files
                elif ext[1] in self.YAML_VALIDATION_FILES:
                    try:
                        import yaml
                        yaml.load(self.toPlainText().encode('utf-8'))
                    except yaml.MarkedYAMLError as e:
                        return True, True, "%s" % e
                return True, False, ''
            else:
                return False, True, "Cannot write XML file"
        return False, False, ''
class TextEdit(QTextEdit):
    '''
    The XML editor to handle the included files. If an included file in the opened
    launch file is detected, this can be open by STRG+(mouse click) in a new
    editor.
    '''

    load_request_signal = Signal(str)
    ''' @ivar: A signal for request to open a configuration file'''

    search_result_signal = Signal(str, bool, str, int)
    ''' @ivar: A signal emitted after search_threaded was started.
        (search text, found or not, file, position in text)
        for each result a signal will be emitted.
    '''

    SUBSTITUTION_ARGS = ['env', 'optenv', 'find', 'anon', 'arg']
    CONTEXT_FILE_EXT = ['.launch', '.test', '.xml']
    YAML_VALIDATION_FILES = ['.yaml', '.iface', '.sync']

    def __init__(self, filename, parent=None):
        self.parent = parent
        QTextEdit.__init__(self, parent)
        self.setObjectName(' - '.join(['Editor', filename]))
        self.setContextMenuPolicy(Qt.CustomContextMenu)
        self.customContextMenuRequested.connect(self.show_custom_context_menu)
#        self.setFrameStyle(QFrame.StyledPanel | QFrame.Sunken)
        self.setAcceptRichText(False)
        font = QFont()
        font.setFamily("Fixed".decode("utf-8"))
        font.setPointSize(12)
        self.setFont(font)
        self.setLineWrapMode(QTextEdit.NoWrap)
        self.setTabStopWidth(25)
        self.setAcceptRichText(False)
        self.setCursorWidth(2)
        self.setFontFamily("courier new")
        self.setProperty("backgroundVisible", True)
        self.regexp_list = [QRegExp("\\binclude\\b"), QRegExp("\\btextfile\\b"),
                            QRegExp("\\bfile\\b"), QRegExp("\\bvalue=.*pkg:\/\/\\b"),
                            QRegExp("\\bvalue=.*package:\/\/\\b"),
                            QRegExp("\\bvalue=.*\$\(find\\b"),
                            QRegExp("\\bargs=.*\$\(find\\b"),
                            QRegExp("\\bdefault=.*\$\(find\\b")]
        self.filename = filename
        self.file_info = None
        if self.filename:
            f = QFile(filename)
            if f.open(QIODevice.ReadOnly | QIODevice.Text):
                self.file_info = QFileInfo(filename)
                self.setText(unicode(f.readAll(), "utf-8"))

        self.path = '.'
        # enables drop events
        self.setAcceptDrops(True)
        if filename.endswith('.launch'):
            self.hl = XmlHighlighter(self.document())
            self.cursorPositionChanged.connect(self._document_position_changed)
        else:
            self.hl = YamlHighlighter(self.document())
        # variables for threaded search
        self._search_thread = None
        self._stop = False

    def _document_position_changed(self):
        if isinstance(self.hl, XmlHighlighter) and nm.settings().highlight_xml_blocks:
            #            import time
            #            start_time = time.time()
            self.hl.mark_block(self.textCursor().block(), self.textCursor().positionInBlock())
            #            print("--- mark_tag_block %.6f seconds ---" % (time.time() - start_time))

    def save(self, force=False):
        '''
        Saves changes to the file.
        :return: saved, errors, msg
        :rtype: bool, bool, str
        '''
        if force or self.document().isModified() or not QFileInfo(self.filename).exists():
            f = QFile(self.filename)
            if f.open(QIODevice.WriteOnly | QIODevice.Text):
                f.write(self.toPlainText().encode('utf-8'))
                self.document().setModified(False)
                self.file_info = QFileInfo(self.filename)

                ext = os.path.splitext(self.filename)
                # validate the xml structure of the launch files
                if ext[1] in self.CONTEXT_FILE_EXT:
                    imported = False
                    try:
                        from lxml import etree
                        imported = True
                        parser = etree.XMLParser()
                        etree.fromstring(self.toPlainText().encode('utf-8'), parser)
                    except Exception as e:
                        if imported:
                            self.markLine(e.position[0])
                            return True, True, "%s" % e
                # validate the yaml structure of yaml files
                elif ext[1] in self.YAML_VALIDATION_FILES:
                    try:
                        import yaml
                        yaml.load(self.toPlainText().encode('utf-8'))
                    except yaml.MarkedYAMLError as e:
                        return True, True, "%s" % e
                return True, False, ''
            else:
                return False, True, "Cannot write XML file"
        return False, False, ''

    def markLine(self, no):
        try:
            cursor = self.textCursor()
            cursor.setPosition(0, QTextCursor.MoveAnchor)
            while (cursor.block().blockNumber() + 1 < no):
                cursor.movePosition(QTextCursor.NextBlock, QTextCursor.MoveAnchor)
            cursor.movePosition(QTextCursor.EndOfBlock, QTextCursor.KeepAnchor)
            self.setTextCursor(cursor)
        except:
            pass

    def setCurrentPath(self, path):
        '''
        Sets the current working path. This path is to open the included files,
        which contains the relative path.
        @param path: the path of the current opened file (without the file)
        @type path: C{str}
        '''
        self.path = path

    def index(self, text):
        '''
        Searches in the given text for key indicates the including of a file and
        return their index.
        @param text: text to find
        @type text: C{str}
        @return: the index of the including key or -1
        @rtype: C{int}
        '''
        for pattern in self.regexp_list:
            index = pattern.indexIn(text)
            if index > -1:
                return index
        return -1

    def includedFiles(self):
        '''
        Returns all included files in the document.
        '''
        result = []
        b = self.document().begin()
        while b != self.document().end():
            text = b.text()
            index = self.index(text)
            if index > -1:
                startIndex = text.find('"', index)
                if startIndex > -1:
                    endIndex = text.find('"', startIndex + 1)
                    fileName = text[startIndex + 1:endIndex]
                    if len(fileName) > 0:
                        try:
                            path = interpret_path(fileName)
                            f = QFile(path)
                            ext = os.path.splitext(path)
                            if f.exists() and ext[1] in nm.settings().SEARCH_IN_EXT:
                                result.append(path)
                        except:
                            import traceback
                            print traceback.format_exc(1)
            b = b.next()
        return result

    def focusInEvent(self, event):
        # check for file changes
        try:
            if self.filename and self.file_info:
                if self.file_info.lastModified() != QFileInfo(self.filename).lastModified():
                    self.file_info = QFileInfo(self.filename)
                    result = MessageBox.question(self, "File changed", "File was changed, reload?", buttons=MessageBox.Yes | MessageBox.No)
                    if result == MessageBox.Yes:
                        f = QFile(self.filename)
                        if f.open(QIODevice.ReadOnly | QIODevice.Text):
                            self.setText(unicode(f.readAll(), "utf-8"))
                            self.document().setModified(False)
                            self.textChanged.emit()
                        else:
                            MessageBox.critical(self, "Error", "Cannot open launch file%s" % self.filename)
        except:
            pass
        QTextEdit.focusInEvent(self, event)

    def mouseReleaseEvent(self, event):
        '''
        Opens the new editor, if the user clicked on the included file and sets the
        default cursor.
        '''
        if event.modifiers() == Qt.ControlModifier or event.modifiers() == Qt.ShiftModifier:
            cursor = self.cursorForPosition(event.pos())
            inc_files = LaunchConfig.included_files(cursor.block().text(), recursive=False)
            if inc_files:
                try:
                    qf = QFile(inc_files[0])
                    if not qf.exists():
                        # create a new file, if it does not exists
                        result = MessageBox.question(self, "File not found", '\n\n'.join(["Create a new file?", qf.fileName()]), buttons=MessageBox.Yes | MessageBox.No)
                        if result == MessageBox.Yes:
                            d = os.path.dirname(qf.fileName())
                            if not os.path.exists(d):
                                os.makedirs(d)
                            with open(qf.fileName(), 'w') as f:
                                if qf.fileName().endswith('.launch'):
                                    f.write('<launch>\n\n</launch>')
                            event.setAccepted(True)
                            self.load_request_signal.emit(qf.fileName())
                    else:
                        event.setAccepted(True)
                        self.load_request_signal.emit(qf.fileName())
                except Exception, e:
                    MessageBox.critical(self, "Error", "File not found %s" % inc_files[0], detailed_text=utf8(e))
        QTextEdit.mouseReleaseEvent(self, event)
Example #11
0
class TextEdit(QTextEdit):
    '''
    The XML editor to handle the included files. If an included file in the opened
    launch file is detected, this can be open by STRG+(mouse click) in a new
    editor.
    '''

    load_request_signal = Signal(str)
    ''' @ivar: A signal for request to open a configuration file'''

    search_result_signal = Signal(str, bool, str, int)
    ''' @ivar: A signal emitted after search_threaded was started.
        (search text, found or not, file, position in text)
        for each result a signal will be emitted.
    '''

    SUBSTITUTION_ARGS = ['env', 'optenv', 'find', 'anon', 'arg']
    CONTEXT_FILE_EXT = ['.launch', '.test', '.xml']
    YAML_VALIDATION_FILES = ['.yaml', '.iface', '.sync']

    def __init__(self, filename, parent=None):
        self.parent = parent
        QTextEdit.__init__(self, parent)
        self.setObjectName(' - '.join(['Editor', filename]))
        self.setContextMenuPolicy(Qt.CustomContextMenu)
        self.customContextMenuRequested.connect(self.show_custom_context_menu)
        #        self.setFrameStyle(QFrame.StyledPanel | QFrame.Sunken)
        self.setAcceptRichText(False)
        font = QFont()
        font.setFamily("Fixed".decode("utf-8"))
        font.setPointSize(12)
        self.setFont(font)
        self.setLineWrapMode(QTextEdit.NoWrap)
        self.setTabStopWidth(25)
        self.setAcceptRichText(False)
        self.setCursorWidth(2)
        self.setFontFamily("courier new")
        self.setProperty("backgroundVisible", True)
        self.regexp_list = [
            QRegExp("\\binclude\\b"),
            QRegExp("\\btextfile\\b"),
            QRegExp("\\bfile\\b"),
            QRegExp("\\bvalue=.*pkg:\/\/\\b"),
            QRegExp("\\bvalue=.*package:\/\/\\b"),
            QRegExp("\\bvalue=.*\$\(find\\b"),
            QRegExp("\\bargs=.*\$\(find\\b"),
            QRegExp("\\bdefault=.*\$\(find\\b")
        ]
        self.filename = filename
        self.file_info = None
        if self.filename:
            f = QFile(filename)
            if f.open(QIODevice.ReadOnly | QIODevice.Text):
                self.file_info = QFileInfo(filename)
                self.setText(unicode(f.readAll(), "utf-8"))

        self.path = '.'
        # enables drop events
        self.setAcceptDrops(True)
        if filename.endswith('.launch'):
            self.hl = XmlHighlighter(self.document())
            self.cursorPositionChanged.connect(self._document_position_changed)
        else:
            self.hl = YamlHighlighter(self.document())
        # variables for threaded search
        self._search_thread = None
        self._stop = False

    def _document_position_changed(self):
        if isinstance(self.hl,
                      XmlHighlighter) and nm.settings().highlight_xml_blocks:
            #            import time
            #            start_time = time.time()
            self.hl.mark_block(self.textCursor().block(),
                               self.textCursor().positionInBlock())
            #            print("--- mark_tag_block %.6f seconds ---" % (time.time() - start_time))

    def save(self, force=False):
        '''
        Saves changes to the file.
        :return: saved, errors, msg
        :rtype: bool, bool, str
        '''
        if force or self.document().isModified() or not QFileInfo(
                self.filename).exists():
            f = QFile(self.filename)
            if f.open(QIODevice.WriteOnly | QIODevice.Text):
                f.write(self.toPlainText().encode('utf-8'))
                self.document().setModified(False)
                self.file_info = QFileInfo(self.filename)

                ext = os.path.splitext(self.filename)
                # validate the xml structure of the launch files
                if ext[1] in self.CONTEXT_FILE_EXT:
                    imported = False
                    try:
                        from lxml import etree
                        imported = True
                        parser = etree.XMLParser()
                        etree.fromstring(self.toPlainText().encode('utf-8'),
                                         parser)
                    except Exception as e:
                        if imported:
                            self.markLine(e.position[0])
                            return True, True, "%s" % e
                # validate the yaml structure of yaml files
                elif ext[1] in self.YAML_VALIDATION_FILES:
                    try:
                        import yaml
                        yaml.load(self.toPlainText().encode('utf-8'))
                    except yaml.MarkedYAMLError as e:
                        return True, True, "%s" % e
                return True, False, ''
            else:
                return False, True, "Cannot write XML file"
        return False, False, ''

    def markLine(self, no):
        try:
            cursor = self.textCursor()
            cursor.setPosition(0, QTextCursor.MoveAnchor)
            while (cursor.block().blockNumber() + 1 < no):
                cursor.movePosition(QTextCursor.NextBlock,
                                    QTextCursor.MoveAnchor)
            cursor.movePosition(QTextCursor.EndOfBlock, QTextCursor.KeepAnchor)
            self.setTextCursor(cursor)
        except:
            pass

    def setCurrentPath(self, path):
        '''
        Sets the current working path. This path is to open the included files,
        which contains the relative path.
        @param path: the path of the current opened file (without the file)
        @type path: C{str}
        '''
        self.path = path

    def index(self, text):
        '''
        Searches in the given text for key indicates the including of a file and
        return their index.
        @param text: text to find
        @type text: C{str}
        @return: the index of the including key or -1
        @rtype: C{int}
        '''
        for pattern in self.regexp_list:
            index = pattern.indexIn(text)
            if index > -1:
                return index
        return -1

    def includedFiles(self):
        '''
        Returns all included files in the document.
        '''
        result = []
        b = self.document().begin()
        while b != self.document().end():
            text = b.text()
            index = self.index(text)
            if index > -1:
                startIndex = text.find('"', index)
                if startIndex > -1:
                    endIndex = text.find('"', startIndex + 1)
                    fileName = text[startIndex + 1:endIndex]
                    if len(fileName) > 0:
                        try:
                            path = interpret_path(fileName)
                            f = QFile(path)
                            ext = os.path.splitext(path)
                            if f.exists() and ext[1] in nm.settings(
                            ).SEARCH_IN_EXT:
                                result.append(path)
                        except:
                            import traceback
                            print traceback.format_exc(1)
            b = b.next()
        return result

    def focusInEvent(self, event):
        # check for file changes
        try:
            if self.filename and self.file_info:
                if self.file_info.lastModified() != QFileInfo(
                        self.filename).lastModified():
                    self.file_info = QFileInfo(self.filename)
                    result = QMessageBox.question(
                        self, "File changed", "File was changed, reload?",
                        QMessageBox.Yes | QMessageBox.No)
                    if result == QMessageBox.Yes:
                        f = QFile(self.filename)
                        if f.open(QIODevice.ReadOnly | QIODevice.Text):
                            self.setText(unicode(f.readAll(), "utf-8"))
                            self.document().setModified(False)
                            self.textChanged.emit()
                        else:
                            QMessageBox.critical(
                                self, "Error",
                                "Cannot open launch file%s" % self.filename)
        except:
            pass
        QTextEdit.focusInEvent(self, event)

    def mouseReleaseEvent(self, event):
        '''
        Opens the new editor, if the user clicked on the included file and sets the
        default cursor.
        '''
        if event.modifiers() == Qt.ControlModifier or event.modifiers(
        ) == Qt.ShiftModifier:
            cursor = self.cursorForPosition(event.pos())
            inc_files = LaunchConfig.included_files(cursor.block().text(),
                                                    recursive=False)
            if inc_files:
                try:
                    qf = QFile(inc_files[0])
                    if not qf.exists():
                        # create a new file, if it does not exists
                        result = QMessageBox.question(
                            self, "File not found",
                            '\n\n'.join(["Create a new file?",
                                         qf.fileName()]),
                            QMessageBox.Yes | QMessageBox.No)
                        if result == QMessageBox.Yes:
                            d = os.path.dirname(qf.fileName())
                            if not os.path.exists(d):
                                os.makedirs(d)
                            with open(qf.fileName(), 'w') as f:
                                if qf.fileName().endswith('.launch'):
                                    f.write('<launch>\n\n</launch>')
                            event.setAccepted(True)
                            self.load_request_signal.emit(qf.fileName())
                    else:
                        event.setAccepted(True)
                        self.load_request_signal.emit(qf.fileName())
                except Exception, e:
                    WarningMessageBox(QMessageBox.Warning,
                                      "File not found %s" % inc_files[0],
                                      str(e)).exec_()
        QTextEdit.mouseReleaseEvent(self, event)