def onRemoveCustomColors(self): """Removing the previously set custom colors""" if not self.__actionPrerequisites(): return # Memorize the current selection selection = self.serializeSelection() editor = self.selectedItems()[0].getEditor() with editor: for item in self.sortSelectedReverse(): if item.kind in [ CellElement.OPENED_GROUP_BEGIN, CellElement.COLLAPSED_GROUP, CellElement.EMPTY_GROUP ]: item.groupBeginCMLRef.removeCustomColors(editor) continue if item.isDocstring(): cmlComment = CMLVersion.find( item.ref.docstring.leadingCMLComments, CMLcc) else: cmlComment = CMLVersion.find(item.ref.leadingCMLComments, CMLcc) if cmlComment is not None: cmlComment.removeFromText(editor) QApplication.processEvents() self.parent().redrawNow() self.restoreSelectionByID(selection)
def onCustomColors(self): """Custom background and foreground colors""" if not self.__actionPrerequisites(): return # Memorize the current selection selection = self.serializeSelection() bgcolor, fgcolor, bordercolor = self.selectedItems()[0].getColors() hasDocstring = self.isDocstringInSelection() dlg = CustomColorsDialog(bgcolor, fgcolor, None if hasDocstring else bordercolor, self.parent()) if dlg.exec_(): bgcolor = dlg.backgroundColor() fgcolor = dlg.foregroundColor() bordercolor = dlg.borderColor() editor = self.selectedItems()[0].getEditor() with editor: for item in self.sortSelectedReverse(): if item.kind in [ CellElement.OPENED_GROUP_BEGIN, CellElement.COLLAPSED_GROUP, CellElement.EMPTY_GROUP ]: # The group always exists so just add/change the colors item.groupBeginCMLRef.updateCustomColors( editor, bgcolor, fgcolor, bordercolor) continue if item.isDocstring(): cmlComment = CMLVersion.find( item.ref.docstring.leadingCMLComments, CMLcc) else: cmlComment = CMLVersion.find( item.ref.leadingCMLComments, CMLcc) if cmlComment is not None: # Existed, so remove the old one first lineNo = cmlComment.ref.beginLine cmlComment.removeFromText(editor) else: lineNo = item.getFirstLine() pos = item.ref.body.beginPos if item.isDocstring(): pos = item.ref.docstring.beginPos line = CMLcc.generate(bgcolor, fgcolor, bordercolor, pos) editor.insertLines(line, lineNo) QApplication.processEvents() self.parent().redrawNow() self.restoreSelectionByID(selection)
def onSwitchIfBranch(self): """If primitive should switch the branches""" if not self.__actionPrerequisites(): return # Memorize the current selection selection = self.serializeSelection() # The selected items need to be sorted in the reverse line no oreder editor = self.selectedItems()[0].getEditor() with editor: for item in self.sortSelectedReverse(): if item.kind == CellElement.IF: cmlComment = CMLVersion.find(item.ref.leadingCMLComments, CMLsw) if cmlComment is None: # Did not exist, so needs to be generated line = CMLsw.generate(item.ref.body.beginPos) lineNo = item.getFirstLine() editor.insertLines(line, lineNo) else: # Existed, so it just needs to be deleted cmlComment.removeFromText(editor) QApplication.processEvents() self.parent().redrawNow() self.restoreSelectionByID(selection)
def generateCMLHelp(): """Generates CML comments help""" cmlHelpHeader = """<h3 align="center">CML Comments Reference<br> (CML version """ + str(CMLVersion.VERSION) + ")</h3>" cmlCodes = list(CMLVersion.COMMENT_TYPES.keys()) cmlCodes.sort() rows = ['<tr><td width="15%" bgcolor="#E9E9F3"></td>' '<td width="85%" bgcolor="#F6F4E4">' + CMLVersion.description().replace('\n', '<br/>') + '</td></tr>'] for code in cmlCodes: descr = CMLVersion.COMMENT_TYPES[code].description() descr = descr.replace("\n", "<br/>") rows.append("""<tr><td width="15%" bgcolor="#E9E9F3">""" + code + """</td><td width="85%" bgcolor="#F6F4E4">""" + descr + "</td></tr>") return cmlHelpHeader + \ """<p align="center"> <table border="0" cellspacing="1" cellpadding="4" width="95%" align="center">""" + \ "\n".join(rows) + \ """</table></p>"""
def process( self ): """ Parses the content and displays the results """ if not self.__connected: self.__connectEditorSignals() content = self.__editor.text() cf = getControlFlowFromMemory( content ) if cf.errors: self.__navBar.updateInfoIcon( self.__navBar.STATE_BROKEN_UTD ) errors = [] for err in cf.errors: if err[ 0 ] == -1 and err[ 1 ] == -1: errors.append( err[ 2 ] ) elif err[ 1 ] == -1: errors.append( "[" + str( err[0] ) + ":] " + err[ 2 ] ) elif err[ 0 ] == -1: errors.append( "[:" + str( err[1] ) + "] " + err[ 2 ] ) else: errors.append( "[" + str( err[0] ) + ":" + str( err[1] ) + "] " + err[ 2 ] ) self.__navBar.setErrors( errors ) return self.__cf = cf # Validate CML comments cmlWarnings = CMLVersion.validateCMLComments( self.__cf ) if cmlWarnings: self.__cf.warnings += cmlWarnings # That will clear the error tooltip as well self.__navBar.updateInfoIcon( self.__navBar.STATE_OK_UTD ) if self.__cf.warnings: warnings = [] for warn in self.__cf.warnings: if warn[ 0 ] == -1 and warn[ 1 ] == -1: warnings.append( warn[ 2 ] ) elif warn[ 1 ] == -1: warnings.append( "[" + str( warn[0] ) + ":] " + warn[ 2 ] ) elif warn[ 0 ] == -1: warnings.append( "[:" + str( warn[1] ) + "] " + warn[ 2 ] ) else: warnings.append( "[" + str( warn[0] ) + ":" + str( warn[1] ) + "] " + warn[ 2 ] ) self.__navBar.setWarnings( warnings ) else: self.__navBar.clearWarnings() self.scene.clear() try: # Top level canvas has no adress and no parent canvas canvas = VirtualCanvas( self.cflowSettings, None, None, None ) canvas.layoutModule( self.__cf ) canvas.setEditor( self.__editor ) width, height = canvas.render() self.scene.setSceneRect( 0, 0, width, height ) canvas.draw( self.scene, 0, 0 ) except Exception, exc: logging.error( str( exc ) ) raise
def process(self): """Parses the content and displays the results""" if not self.__connected: self.__connectEditorSignals() start = timer() cf = getControlFlowFromMemory(self.__editor.text) end = timer() if cf.errors: self.__navBar.updateInfoIcon(self.__navBar.STATE_BROKEN_UTD) errors = [] for err in cf.errors: if err[0] == -1 and err[1] == -1: errors.append(err[2]) elif err[1] == -1: errors.append('[' + str(err[0]) + ':] ' + err[2]) elif err[0] == -1: errors.append('[:' + str(err[1]) + '] ' + err[2]) else: errors.append('[' + str(err[0]) + ':' + str(err[1]) + '] ' + err[2]) self.__navBar.setErrors(errors) return self.__cf = cf if self.isDebugMode(): logging.info('Parsed file: %s', formatFlow(str(self.__cf))) logging.info('Parse timing: %f', end - start) # Collect warnings (parser + CML warnings) and valid groups self.__validGroups = [] self.__allGroupId = set() allWarnings = self.__cf.warnings + \ CMLVersion.validateCMLComments(self.__cf, self.__validGroups, self.__allGroupId) # That will clear the error tooltip as well self.__navBar.updateInfoIcon(self.__navBar.STATE_OK_UTD) if allWarnings: warnings = [] for warn in allWarnings: if warn[0] == -1 and warn[1] == -1: warnings.append(warn[2]) elif warn[1] == -1: warnings.append('[' + str(warn[0]) + ':] ' + warn[2]) elif warn[0] == -1: warnings.append('[:' + str(warn[1]) + '] ' + warn[2]) else: warnings.append('[' + str(warn[0]) + ':' + str(warn[1]) + '] ' + warn[2]) self.__navBar.setWarnings(warnings) else: self.__navBar.clearWarnings() self.redrawScene()
def __findCMLinItem(self, item, cmlType): """Finds a related CML item""" if item.isComment(): # Doc links are comments so they are skipped here return None if item.isDocstring(): # Side comments for docstrings? Nonesense! So they are ignored # even if they are collected cml = CMLVersion.find(item.ref.docstring.leadingCMLComments, cmlType) if cml is not None: return cml if hasattr(item.ref, 'leadingCMLComments'): cml = CMLVersion.find(item.ref.leadingCMLComments, cmlType) if cml is not None: return cml if hasattr(item.ref, 'sideCMLComments'): cml = CMLVersion.find(item.ref.sideCMLComments, cmlType) if cml is not None: return cml return None
def onRemoveCustomColors(self): """Removing the previously set custom colors""" if not self.__actionPrerequisites(): return # Memorize the current selection selection = self.serializeSelection() editor = self.selectedItems()[0].getEditor() with editor: # Remove colors is done via delete/insert for the Doc and group # items. So it is safer to do first because the cc comment may be # in a set of selected which is inserted before the doc cml and # thus breaks the line numbering for item in self.selectedItems(): # The doc always exists if item.isCMLDoc(): item.cmlRef.removeCustomColors(editor) continue # The group always exists if item.isGroupItem(): item.groupBeginCMLRef.removeCustomColors(editor) # Now handle the rest of items for item in self.sortSelectedReverse(): if item.isCMLDoc() or item.isGroupItem(): continue if item.isDocstring(): cmlComment = CMLVersion.find( item.ref.docstring.leadingCMLComments, CMLcc) else: cmlComment = CMLVersion.find( item.ref.leadingCMLComments, CMLcc) if cmlComment is not None: cmlComment.removeFromText(editor) QApplication.processEvents() self.parent().redrawNow() self.restoreSelectionByID(selection)
def onReplaceText(self): """Replace the code with a title""" if not self.__actionPrerequisites(): return # Memorize the current selection selection = self.serializeSelection() dlg = ReplaceTextDialog('Replace text', 'Item caption:', self.parent()) # If it was one item selection and there was a previous text then # set it for editing if len(self.selectedItems()) == 1: cmlComment = CMLVersion.find( self.selectedItems()[0].ref.leadingCMLComments, CMLrt) if cmlComment is not None: dlg.setText(cmlComment.getText()) if dlg.exec_(): replacementText = dlg.text() editor = self.selectedItems()[0].getEditor() with editor: for item in self.sortSelectedReverse(): cmlComment = CMLVersion.find( item.ref.leadingCMLComments, CMLrt) if cmlComment is not None: # Existed, so remove the old one first lineNo = cmlComment.ref.beginLine cmlComment.removeFromText(editor) else: lineNo = item.getFirstLine() line = CMLrt.generate(replacementText, item.ref.body.beginPos) editor.insertLines(line, lineNo) QApplication.processEvents() self.parent().redrawNow() self.restoreSelectionByID(selection)
def onRemoveDoc(self): """Removing the CML doc comment""" if not self.__actionPrerequisites(): return editor = self.selectedItems()[0].getEditor() with editor: for item in self.sortSelectedReverse(): cmlComment = CMLVersion.find(item.ref.leadingCMLComments, CMLdoc) if cmlComment is not None: cmlComment.removeFromText(editor) QApplication.processEvents() self.parent().redrawNow()
def countItemsWithCML(self, cmlType): """Counts items with have a certain type of a CML comment""" count = 0 for item in self.selectedItems(): if item.isComment(): continue if item.isDocstring(): # Side comments for docstrings? Nonesense! So they are ignored # even if they are collected if CMLVersion.find(item.ref.docstring.leadingCMLComments, cmlType) is not None: count += 1 continue if hasattr(item.ref, 'leadingCMLComments'): if CMLVersion.find(item.ref.leadingCMLComments, cmlType) is not None: count += 1 continue if hasattr(item.ref, 'sideCMLComments'): if CMLVersion.find(item.ref.sideCMLComments, cmlType) is not None: count += 1 return count
def onRemoveReplacementText(self): """Removing replacement text""" if self.__actionPrerequisites(): # Memorize the current selection selection = self.serializeSelection() editor = self.selectedItems()[0].getEditor() with editor: for item in self.sortSelectedReverse(): cmlComment = CMLVersion.find(item.ref.leadingCMLComments, CMLrt) if cmlComment is not None: cmlComment.removeFromText(editor) QApplication.processEvents() self.parent().redrawNow() self.restoreSelectionByID(selection)
def process(self): """ Parses the content and displays the results """ if not self.__connected: self.__connectEditorSignals() content = self.__editor.text() cf = getControlFlowFromMemory(content) if cf.errors: self.__navBar.updateInfoIcon(self.__navBar.STATE_BROKEN_UTD) errors = [] for err in cf.errors: if err[0] == -1 and err[1] == -1: errors.append(err[2]) elif err[1] == -1: errors.append("[" + str(err[0]) + ":] " + err[2]) elif err[0] == -1: errors.append("[:" + str(err[1]) + "] " + err[2]) else: errors.append("[" + str(err[0]) + ":" + str(err[1]) + "] " + err[2]) self.__navBar.setErrors(errors) return self.__cf = cf # Validate CML comments cmlWarnings = CMLVersion.validateCMLComments(self.__cf) if cmlWarnings: self.__cf.warnings += cmlWarnings # That will clear the error tooltip as well self.__navBar.updateInfoIcon(self.__navBar.STATE_OK_UTD) if self.__cf.warnings: warnings = [] for warn in self.__cf.warnings: if warn[0] == -1 and warn[1] == -1: warnings.append(warn[2]) elif warn[1] == -1: warnings.append("[" + str(warn[0]) + ":] " + warn[2]) elif warn[0] == -1: warnings.append("[:" + str(warn[1]) + "] " + warn[2]) else: warnings.append("[" + str(warn[0]) + ":" + str(warn[1]) + "] " + warn[2]) self.__navBar.setWarnings(warnings) else: self.__navBar.clearWarnings() self.scene.clear() try: # Top level canvas has no adress and no parent canvas canvas = VirtualCanvas(self.cflowSettings, None, None, None) canvas.layoutModule(self.__cf) canvas.setEditor(self.__editor) width, height = canvas.render() self.scene.setSceneRect(0, 0, width, height) canvas.draw(self.scene, 0, 0) except Exception, exc: logging.error(str(exc)) raise
def onCustomColors(self): """Custom background and foreground colors""" if not self.__actionPrerequisites(): return # Memorize the current selection selection = self.serializeSelection() bgcolor, fgcolor, bordercolor = self.selectedItems()[0].getColors() hasDocstring = self.isDocstringInSelection() dlg = CustomColorsDialog(bgcolor, fgcolor, None if hasDocstring else bordercolor, self.parent()) if dlg.exec_(): bgcolor = dlg.backgroundColor() fgcolor = dlg.foregroundColor() bordercolor = dlg.borderColor() editor = self.selectedItems()[0].getEditor() with editor: # Add colors is done via delete/insert for the Doc and group # items. So it is safer to do first because the cc comment may be # in a set of selected which is inserted before the doc cml and # thus breaks the line numbering for item in self.selectedItems(): if item.isCMLDoc(): # The doc always exists so just add/change the colors item.cmlRef.updateCustomColors(editor, bgcolor, fgcolor, bordercolor) continue if item.isGroupItem(): # The group always exists so just add/change the colors item.groupBeginCMLRef.updateCustomColors(editor, bgcolor, fgcolor, bordercolor) for item in self.sortSelectedReverse(): if item.isCMLDoc() or item.isGroupItem(): continue if item.isDocstring(): cmlComment = CMLVersion.find( item.ref.docstring.leadingCMLComments, CMLcc) else: cmlComment = CMLVersion.find( item.ref.leadingCMLComments, CMLcc) if cmlComment is not None: # Existed, so remove the old one first lineNo = cmlComment.ref.beginLine cmlComment.removeFromText(editor) else: lineNo = item.getFirstLine() pos = item.ref.body.beginPos if item.isDocstring(): pos = item.ref.docstring.beginPos line = CMLcc.generate(bgcolor, fgcolor, bordercolor, pos) editor.insertLines(line, lineNo) QApplication.processEvents() self.parent().redrawNow() self.restoreSelectionByID(selection)