1# -*- coding: utf-8 -*-
2
3# Copyright (c) 2007 - 2021 Detlev Offenbach <detlev@die-offenbachs.de>
4#
5
6"""
7Module implementing the Python re wizard plugin.
8"""
9
10from PyQt5.QtCore import QObject
11from PyQt5.QtWidgets import QDialog
12
13from E5Gui.E5Application import e5App
14from E5Gui.E5Action import E5Action
15from E5Gui import E5MessageBox
16
17import UI.Info
18
19# Start-Of-Header
20name = "Python re Wizard Plugin"
21author = "Detlev Offenbach <detlev@die-offenbachs.de>"
22autoactivate = True
23deactivateable = True
24version = UI.Info.VersionOnly
25className = "PyRegExpWizard"
26packageName = "__core__"
27shortDescription = "Show the Python re wizard."
28longDescription = """This plugin shows the Python re wizard."""
29pyqtApi = 2
30# End-Of-Header
31
32error = ""
33
34
35class PyRegExpWizard(QObject):
36    """
37    Class implementing the Python re wizard plugin.
38    """
39    def __init__(self, ui):
40        """
41        Constructor
42
43        @param ui reference to the user interface object (UI.UserInterface)
44        """
45        super().__init__(ui)
46        self.__ui = ui
47
48    def activate(self):
49        """
50        Public method to activate this plugin.
51
52        @return tuple of None and activation status (boolean)
53        """
54        self.__initAction()
55        self.__initMenu()
56
57        return None, True
58
59    def deactivate(self):
60        """
61        Public method to deactivate this plugin.
62        """
63        menu = self.__ui.getMenu("wizards")
64        if menu:
65            menu.removeAction(self.action)
66        self.__ui.removeE5Actions([self.action], 'wizards')
67
68    def __initAction(self):
69        """
70        Private method to initialize the action.
71        """
72        self.action = E5Action(
73            self.tr('Python re Wizard'),
74            self.tr('&Python re Wizard...'), 0, 0, self,
75            'wizards_python_re')
76        self.action.setStatusTip(self.tr('Python re Wizard'))
77        self.action.setWhatsThis(self.tr(
78            """<b>Python re Wizard</b>"""
79            """<p>This wizard opens a dialog for entering all the parameters"""
80            """ needed to create a Python re string. The generated code is"""
81            """ inserted at the current cursor position.</p>"""
82        ))
83        self.action.triggered.connect(self.__handle)
84
85        self.__ui.addE5Actions([self.action], 'wizards')
86
87    def __initMenu(self):
88        """
89        Private method to add the actions to the right menu.
90        """
91        menu = self.__ui.getMenu("wizards")
92        if menu:
93            menu.addAction(self.action)
94
95    def __callForm(self, editor):
96        """
97        Private method to display a dialog and get the code.
98
99        @param editor reference to the current editor
100        @return the generated code (string)
101        """
102        from WizardPlugins.PyRegExpWizard.PyRegExpWizardDialog import (
103            PyRegExpWizardDialog
104        )
105        dlg = PyRegExpWizardDialog(None, True)
106        if dlg.exec() == QDialog.DialogCode.Accepted:
107            line, index = editor.getCursorPosition()
108            indLevel = editor.indentation(line) // editor.indentationWidth()
109            if editor.indentationsUseTabs():
110                indString = '\t'
111            else:
112                indString = editor.indentationWidth() * ' '
113            return (dlg.getCode(indLevel, indString), 1)
114        else:
115            return (None, False)
116
117    def __handle(self):
118        """
119        Private method to handle the wizards action.
120        """
121        editor = e5App().getObject("ViewManager").activeWindow()
122
123        if editor is None:
124            E5MessageBox.critical(
125                self.__ui,
126                self.tr('No current editor'),
127                self.tr('Please open or create a file first.'))
128        else:
129            code, ok = self.__callForm(editor)
130            if ok:
131                line, index = editor.getCursorPosition()
132                # It should be done on this way to allow undo
133                editor.beginUndoAction()
134                editor.insertAt(code, line, index)
135                editor.endUndoAction()
136