Plugins/WizardPlugins/QRegularExpressionWizard/QRegularExpressionWizardDialog.py

changeset 2748
3731148a7cdf
parent 2747
68b920f307ff
child 2770
fd5ee85f0450
equal deleted inserted replaced
2747:68b920f307ff 2748:3731148a7cdf
99 self.validateButton = None 99 self.validateButton = None
100 self.executeButton = None 100 self.executeButton = None
101 self.nextButton = None 101 self.nextButton = None
102 102
103 if fromEric: 103 if fromEric:
104 self.buttonBox.button(QDialogButtonBox.Close).hide() 104 self.buttonBox.setStandardButtons(
105 QDialogButtonBox.Cancel | QDialogButtonBox.Ok)
105 self.copyButton = None 106 self.copyButton = None
106 else: 107 else:
107 self.copyButton = \ 108 self.copyButton = \
108 self.buttonBox.addButton(self.trUtf8("Copy"), QDialogButtonBox.ActionRole) 109 self.buttonBox.addButton(self.trUtf8("Copy"), QDialogButtonBox.ActionRole)
109 self.copyButton.setToolTip( 110 self.copyButton.setToolTip(
110 self.trUtf8("Copy the regular expression to the clipboard")) 111 self.trUtf8("Copy the regular expression to the clipboard"))
111 self.buttonBox.button(QDialogButtonBox.Ok).hide() 112 self.buttonBox.setStandardButtons(QDialogButtonBox.Close)
112 self.buttonBox.button(QDialogButtonBox.Cancel).hide()
113 self.variableLabel.hide() 113 self.variableLabel.hide()
114 self.variableLineEdit.hide() 114 self.variableLineEdit.hide()
115 self.variableLine.hide() 115 self.variableLine.hide()
116 self.importCheckBox.hide()
117 self.regexpTextEdit.setFocus() 116 self.regexpTextEdit.setFocus()
118 117
119 def __sendCommand(self, command, **kw): 118 def __sendCommand(self, command, **kw):
120 """ 119 """
121 Private method to send a command to the PyQt5 server. 120 Private method to send a command to the PyQt5 server.
512 """ 511 """
513 if qVersion() < "5.0.0" or not self.__pyqt5Available: 512 if qVersion() < "5.0.0" or not self.__pyqt5Available:
514 # only available for Qt5 513 # only available for Qt5
515 return 514 return
516 515
517 regex = self.regexpTextEdit.toPlainText() 516 regexp = self.regexpTextEdit.toPlainText()
518 text = self.textTextEdit.toPlainText() 517 text = self.textTextEdit.toPlainText()
519 if regex and text: 518 if regexp and text:
520 options = QRegularExpression.NoPatternOption 519 options = []
521 if self.caseInsensitiveCheckBox.isChecked(): 520 if self.caseInsensitiveCheckBox.isChecked():
522 options |= QRegularExpression.CaseInsensitiveOption 521 options.append("CaseInsensitiveOption")
523 if self.multilineCheckBox.isChecked(): 522 if self.multilineCheckBox.isChecked():
524 options |= QRegularExpression.MultilineOption 523 options.append("MultilineOption")
525 if self.dotallCheckBox.isChecked(): 524 if self.dotallCheckBox.isChecked():
526 options |= QRegularExpression.DotMatchesEverythingOption 525 options.append("DotMatchesEverythingOption")
527 if self.extendedCheckBox.isChecked(): 526 if self.extendedCheckBox.isChecked():
528 options |= QRegularExpression.ExtendedPatternSyntaxOption 527 options.append("ExtendedPatternSyntaxOption")
529 if self.greedinessCheckBox.isChecked(): 528 if self.greedinessCheckBox.isChecked():
530 options |= QRegularExpression.InvertedGreedinessOption 529 options.append("InvertedGreedinessOption")
531 if self.unicodeCheckBox.isChecked(): 530 if self.unicodeCheckBox.isChecked():
532 options |= QRegularExpression.UseUnicodePropertiesOption 531 options.append("UseUnicodePropertiesOption")
533 if self.captureCheckBox.isChecked(): 532 if self.captureCheckBox.isChecked():
534 options |= QRegularExpression.DontCaptureOption 533 options.append("DontCaptureOption")
535 534
536 re = QRegularExpression(regex, options) 535 if self.__sendCommand("execute", options=options, regexp=regexp,
537 if not re.isValid(): 536 text=text, startpos=startpos):
537 response = self.__receiveResponse()
538 if response and ("valid" in response or "matched" in response):
539 if "valid" in response:
540 E5MessageBox.critical(self,
541 self.trUtf8("Error"),
542 self.trUtf8("""Invalid regular expression: {0}""")
543 .format(response["errorMessage"]))
544 # move cursor to error offset
545 offset = response["errorOffset"]
546 tc = self.regexpTextEdit.textCursor()
547 tc.setPosition(offset)
548 self.regexpTextEdit.setTextCursor(tc)
549 self.regexpTextEdit.setFocus()
550 return
551 else:
552 row = 0
553 OFFSET = 5
554
555 self.resultTable.setColumnCount(0)
556 self.resultTable.setColumnCount(3)
557 self.resultTable.setRowCount(0)
558 self.resultTable.setRowCount(OFFSET)
559 self.resultTable.setItem(
560 row, 0, QTableWidgetItem(self.trUtf8("Regexp")))
561 self.resultTable.setItem(
562 row, 1, QTableWidgetItem(regexp))
563 if response["matched"]:
564 captures = response["captures"]
565 # index 0 is the complete match
566 offset = captures[0][1]
567 self.lastMatchEnd = captures[0][2]
568 self.nextButton.setEnabled(True)
569 row += 1
570 self.resultTable.setItem(row, 0,
571 QTableWidgetItem(self.trUtf8("Offset")))
572 self.resultTable.setItem(row, 1,
573 QTableWidgetItem("{0:d}".format(offset)))
574
575 row += 1
576 self.resultTable.setItem(row, 0,
577 QTableWidgetItem(self.trUtf8("Captures")))
578 self.resultTable.setItem(row, 1,
579 QTableWidgetItem("{0:d}".format(len(captures) - 1)))
580 row += 1
581 self.resultTable.setItem(row, 1,
582 QTableWidgetItem(self.trUtf8("Text")))
583 self.resultTable.setItem(row, 2,
584 QTableWidgetItem(self.trUtf8("Characters")))
585
586 row += 1
587 self.resultTable.setItem(row, 0,
588 QTableWidgetItem(self.trUtf8("Match")))
589 self.resultTable.setItem(row, 1,
590 QTableWidgetItem(captures[0][0]))
591 self.resultTable.setItem(row, 2,
592 QTableWidgetItem("{0:d}".format(captures[0][3])))
593
594 for i in range(1, len(captures)):
595 if captures[i][0]:
596 row += 1
597 self.resultTable.insertRow(row)
598 self.resultTable.setItem(row, 0,
599 QTableWidgetItem(
600 self.trUtf8("Capture #{0}").format(i)))
601 self.resultTable.setItem(row, 1,
602 QTableWidgetItem(captures[i][0]))
603 self.resultTable.setItem(row, 2,
604 QTableWidgetItem("{0:d}".format(captures[i][3])))
605
606 # highlight the matched text
607 tc = self.textTextEdit.textCursor()
608 tc.setPosition(offset)
609 tc.setPosition(self.lastMatchEnd, QTextCursor.KeepAnchor)
610 self.textTextEdit.setTextCursor(tc)
611 else:
612 self.nextButton.setEnabled(False)
613 self.resultTable.setRowCount(2)
614 row += 1
615 if startpos > 0:
616 self.resultTable.setItem(row, 0,
617 QTableWidgetItem(self.trUtf8("No more matches")))
618 else:
619 self.resultTable.setItem(row, 0,
620 QTableWidgetItem(self.trUtf8("No matches")))
621
622 # remove the highlight
623 tc = self.textTextEdit.textCursor()
624 tc.setPosition(0)
625 self.textTextEdit.setTextCursor(tc)
626
627 self.resultTable.resizeColumnsToContents()
628 self.resultTable.resizeRowsToContents()
629 self.resultTable.verticalHeader().hide()
630 self.resultTable.horizontalHeader().hide()
631 else:
632 E5MessageBox.critical(self,
633 self.trUtf8("Communication Error"),
634 self.trUtf8("""Invalid response received from PyQt5 backend."""))
635 else:
538 E5MessageBox.critical(self, 636 E5MessageBox.critical(self,
539 self.trUtf8("Error"), 637 self.trUtf8("Communication Error"),
540 self.trUtf8("""Invalid regular expression: {0}""") 638 self.trUtf8("""Communication with PyQt5 backend failed."""))
541 .format(re.errorString()))
542 # move cursor to error offset
543 offset = re.errorPatternOffset()
544 tc = self.regexpTextEdit.textCursor()
545 tc.setPosition(offset)
546 self.regexpTextEdit.setTextCursor(tc)
547 return
548
549 match = re.match(text, startpos)
550 if match.hasMatch():
551 captures = match.lastCapturedIndex()
552 else:
553 captures = 0
554 row = 0
555 OFFSET = 5
556
557 self.resultTable.setColumnCount(0)
558 self.resultTable.setColumnCount(3)
559 self.resultTable.setRowCount(0)
560 self.resultTable.setRowCount(OFFSET)
561 self.resultTable.setItem(row, 0, QTableWidgetItem(self.trUtf8("Regexp")))
562 self.resultTable.setItem(row, 1, QTableWidgetItem(regex))
563
564 if match.hasMatch():
565 # index 0 is the complete match
566 offset = match.capturedStart(0)
567 self.lastMatchEnd = match.capturedEnd(0)
568 self.nextButton.setEnabled(True)
569 row += 1
570 self.resultTable.setItem(row, 0,
571 QTableWidgetItem(self.trUtf8("Offset")))
572 self.resultTable.setItem(row, 1,
573 QTableWidgetItem("{0:d}".format(match.capturedStart(0))))
574
575 row += 1
576 self.resultTable.setItem(row, 0,
577 QTableWidgetItem(self.trUtf8("Captures")))
578 self.resultTable.setItem(row, 1,
579 QTableWidgetItem("{0:d}".format(captures)))
580 row += 1
581 self.resultTable.setItem(row, 1,
582 QTableWidgetItem(self.trUtf8("Text")))
583 self.resultTable.setItem(row, 2,
584 QTableWidgetItem(self.trUtf8("Characters")))
585
586 row += 1
587 self.resultTable.setItem(row, 0,
588 QTableWidgetItem(self.trUtf8("Match")))
589 self.resultTable.setItem(row, 1,
590 QTableWidgetItem(match.captured(0)))
591 self.resultTable.setItem(row, 2,
592 QTableWidgetItem("{0:d}".format(match.capturedLength(0))))
593
594 for i in range(1, captures + 1):
595 if match.captured(i):
596 row += 1
597 self.resultTable.insertRow(row)
598 self.resultTable.setItem(row, 0,
599 QTableWidgetItem(self.trUtf8("Capture #{0}").format(i)))
600 self.resultTable.setItem(row, 1,
601 QTableWidgetItem(match.captured(i)))
602 self.resultTable.setItem(row, 2,
603 QTableWidgetItem("{0:d}".format(match.capturedLength(i))))
604
605 # highlight the matched text
606 tc = self.textTextEdit.textCursor()
607 tc.setPosition(offset)
608 tc.setPosition(self.lastMatchEnd, QTextCursor.KeepAnchor)
609 self.textTextEdit.setTextCursor(tc)
610 else:
611 self.nextButton.setEnabled(False)
612 self.resultTable.setRowCount(2)
613 row += 1
614 if startpos > 0:
615 self.resultTable.setItem(row, 0,
616 QTableWidgetItem(self.trUtf8("No more matches")))
617 else:
618 self.resultTable.setItem(row, 0,
619 QTableWidgetItem(self.trUtf8("No matches")))
620
621 # remove the highlight
622 tc = self.textTextEdit.textCursor()
623 tc.setPosition(0)
624 self.textTextEdit.setTextCursor(tc)
625
626 self.resultTable.resizeColumnsToContents()
627 self.resultTable.resizeRowsToContents()
628 self.resultTable.verticalHeader().hide()
629 self.resultTable.horizontalHeader().hide()
630 else: 639 else:
631 E5MessageBox.critical(self, 640 E5MessageBox.critical(self,
632 self.trUtf8("Error"), 641 self.trUtf8("Error"),
633 self.trUtf8("""A regular expression and a text must be given.""")) 642 self.trUtf8("""A regular expression and a text must be given."""))
634 643

eric ide

mercurial