1# -*- coding: utf-8 -*-
2
3# Copyright (c) 2014 - 2021 Detlev Offenbach <detlev@die-offenbachs.de>
4#
5
6"""
7Module implementing the eric plug-in wizard plug-in.
8"""
9
10import os
11
12from PyQt5.QtCore import QObject
13from PyQt5.QtWidgets import QDialog
14
15from E5Gui.E5Application import e5App
16from E5Gui.E5Action import E5Action
17from E5Gui import E5MessageBox
18
19import UI.Info
20
21# Start-of-Header
22name = "eric plug-in Wizard Plug-in"
23author = "Detlev Offenbach <detlev@die-offenbachs.de>"
24autoactivate = True
25deactivateable = True
26version = UI.Info.VersionOnly
27className = "WizardEricPluginWizard"
28packageName = "__core__"
29shortDescription = "Wizard for the creation of an eric plug-in file."
30longDescription = (
31    """This plug-in implements a wizard to generate code for"""
32    """ an eric plug-in main script file."""
33)
34needsRestart = False
35pyqtApi = 2
36# End-of-Header
37
38error = ""
39
40
41class WizardEricPluginWizard(QObject):
42    """
43    Class implementing the eric plug-in wizard plug-in.
44    """
45    def __init__(self, ui):
46        """
47        Constructor
48
49        @param ui reference to the user interface object (UI.UserInterface)
50        """
51        super().__init__(ui)
52        self.__ui = ui
53        self.__action = None
54
55    def __initialize(self):
56        """
57        Private slot to (re)initialize the plug-in.
58        """
59        self.__act = None
60
61    def activate(self):
62        """
63        Public method to activate this plug-in.
64
65        @return tuple of None and activation status (boolean)
66        """
67        self.__initAction()
68        self.__initMenu()
69
70        return None, True
71
72    def deactivate(self):
73        """
74        Public method to deactivate this plug-in.
75        """
76        menu = self.__ui.getMenu("wizards")
77        if menu:
78            menu.removeAction(self.__action)
79        self.__ui.removeE5Actions([self.__action], 'wizards')
80
81    def __initAction(self):
82        """
83        Private method to initialize the action.
84        """
85        self.__action = E5Action(
86            self.tr('eric Plug-in Wizard'),
87            self.tr('&eric Plug-in Wizard...'),
88            0, 0, self,
89            'wizards_eric_plugin')
90        self.__action.setStatusTip(self.tr('eric Plug-in Wizard'))
91        self.__action.setWhatsThis(self.tr(
92            """<b>eric Plug-in Wizard</b>"""
93            """<p>This wizard opens a dialog for entering all the parameters"""
94            """ needed to create the basic contents of an eric plug-in file."""
95            """ The generated code is inserted at the current cursor"""
96            """ position.</p>"""
97        ))
98        self.__action.triggered.connect(self.__handle)
99
100        self.__ui.addE5Actions([self.__action], 'wizards')
101
102    def __initMenu(self):
103        """
104        Private method to add the actions to the right menu.
105        """
106        menu = self.__ui.getMenu("wizards")
107        if menu:
108            menu.addAction(self.__action)
109
110    def __callForm(self, editor):
111        """
112        Private method to display a dialog and get the code.
113
114        @param editor reference to the current editor
115        @return generated code (string), the plug-in package name (string)
116            and a flag indicating success (boolean)
117        """
118        from WizardPlugins.EricPluginWizard.PluginWizardDialog import (
119            PluginWizardDialog
120        )
121        dlg = PluginWizardDialog(None)
122        if dlg.exec() == QDialog.DialogCode.Accepted:
123            return (dlg.getCode(), dlg.packageName(), True)
124        else:
125            return (None, "", False)
126
127    def __handle(self):
128        """
129        Private method to handle the wizards action.
130        """
131        editor = e5App().getObject("ViewManager").activeWindow()
132
133        if editor is None:
134            E5MessageBox.critical(
135                self.__ui,
136                self.tr('No current editor'),
137                self.tr('Please open or create a file first.'))
138        else:
139            code, packageName, ok = self.__callForm(editor)
140            if ok:
141                line, index = editor.getCursorPosition()
142                # It should be done on this way to allow undo
143                editor.beginUndoAction()
144                editor.insertAt(code, line, index)
145                editor.endUndoAction()
146                if not editor.getFileName():
147                    editor.setLanguage("dummy.py")
148
149                if packageName:
150                    project = e5App().getObject("Project")
151                    packagePath = os.path.join(project.getProjectPath(),
152                                               packageName)
153                    if not os.path.exists(packagePath):
154                        try:
155                            os.mkdir(packagePath)
156                        except OSError as err:
157                            E5MessageBox.critical(
158                                self,
159                                self.tr("Create Package"),
160                                self.tr(
161                                    """<p>The package directory <b>{0}</b>"""
162                                    """ could not be created. Aborting..."""
163                                    """</p><p>Reason: {1}</p>""")
164                                .format(packagePath, str(err)))
165                            return
166                    packageFile = os.path.join(packagePath, "__init__.py")
167                    if not os.path.exists(packageFile):
168                        try:
169                            with open(packageFile, "w", encoding="utf-8"):
170                                pass
171                        except OSError as err:
172                            E5MessageBox.critical(
173                                self,
174                                self.tr("Create Package"),
175                                self.tr(
176                                    """<p>The package file <b>{0}</b> could"""
177                                    """ not be created. Aborting...</p>"""
178                                    """<p>Reason: {1}</p>""")
179                                .format(packageFile, str(err)))
180                            return
181                    project.appendFile(packageFile)
182                    project.saveProject()
183                    e5App().getObject("ViewManager").openSourceFile(
184                        packageFile)
185
186#
187# eflag: noqa = M801
188