def __init__(self, filename, parent=None): self.parent = parent QtGui.QTextEdit.__init__(self, parent) self.setObjectName(' - '.join(['Editor', filename])) font = QtGui.QFont() font.setFamily("Fixed".decode("utf-8")) font.setPointSize(12) self.setFont(font) self.setLineWrapMode(QtGui.QTextEdit.NoWrap) self.setTabStopWidth(25) self.setAcceptRichText(False) self.setCursorWidth(2) self.setFontFamily("courier new") self.setProperty("backgroundVisible", True) self.regexp_list = [QtCore.QRegExp("\\binclude\\b"), QtCore.QRegExp("\\btextfile\\b"), QtCore.QRegExp("\\bfile\\b"), QtCore.QRegExp("\\bvalue=.*pkg:\/\/\\b"), QtCore.QRegExp("\\bvalue=.*package:\/\/\\b"), QtCore.QRegExp("\\bvalue=.*\$\(find\\b")] self.filename = filename self.file_info = None if self.filename: f = QtCore.QFile(filename); if f.open(QtCore.QIODevice.ReadOnly | QtCore.QIODevice.Text): self.file_info = QtCore.QFileInfo(filename) self.setText(unicode(f.readAll(), "utf-8")) self.path = '.' # enables drop events self.setAcceptDrops(True)
def mouseReleaseEvent(self, event): ''' Opens the new editor, if the user clicked on the included file and sets the default cursor. ''' if event.modifiers() == QtCore.Qt.ControlModifier or event.modifiers() == QtCore.Qt.ShiftModifier: cursor = self.cursorForPosition(event.pos()) index = self.index(cursor.block().text()) if index > -1: startIndex = cursor.block().text().find('"', index) if startIndex > -1: endIndex = cursor.block().text().find('"', startIndex+1) fileName = cursor.block().text()[startIndex+1:endIndex] if len(fileName) > 0: try: f = QtCore.QFile(self.interpretPath(fileName)) if not f.exists(): # create a new file, if it does not exists result = QtGui.QMessageBox.question(self, "File not found", '\n\n'.join(["Create a new file?", f.fileName()]), QtGui.QMessageBox.Yes | QtGui.QMessageBox.No) if result == QtGui.QMessageBox.Yes: d = os.path.dirname(f.fileName()) if not os.path.exists(dir): os.makedirs(d) with open(f.fileName(),'w') as f: if f.fileName().endswith('.launch'): f.write('<launch>\n\n</launch>') self.load_request_signal.emit(f.fileName()) else: self.load_request_signal.emit(f.fileName()) except Exception, e: WarningMessageBox(QtGui.QMessageBox.Warning, "File not found", fileName, str(e)).exec_()
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 = self.interpretPath(fileName) f = QtCore.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() 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() != QtCore.QFileInfo(self.filename).lastModified(): self.file_info = QtCore.QFileInfo(self.filename) result = QtGui.QMessageBox.question(self, "File changed", "File was changed, reload?", QtGui.QMessageBox.Yes | QtGui.QMessageBox.No) if result == QtGui.QMessageBox.Yes: f = QtCore.QFile(self.filename); if f.open(QtCore.QIODevice.ReadOnly | QtCore.QIODevice.Text): self.setText(unicode(f.readAll(), "utf-8")) self.document().setModified(False) self.textChanged.emit() else: QtGui.QMessageBox.critical(self, "Error", "Cannot open launch file%s"%self.filename) except: pass QtGui.QTextEdit.focusInEvent(self, event)
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 QtCore.QFileInfo(self.filename).exists(): f = QtCore.QFile(self.filename) if f.open(QtCore.QIODevice.WriteOnly | QtCore.QIODevice.Text): f.write(self.toPlainText().encode('utf-8')) self.document().setModified(False) self.file_info = QtCore.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, ''