src/eric7/Project/Project.py

branch
eric7
changeset 9514
2b104ad132a4
parent 9512
6e29913ba7b6
child 9515
275334bc9607
diff -r 6e260b424396 -r 2b104ad132a4 src/eric7/Project/Project.py
--- a/src/eric7/Project/Project.py	Wed Nov 16 10:10:06 2022 +0100
+++ b/src/eric7/Project/Project.py	Wed Nov 16 10:53:40 2022 +0100
@@ -483,7 +483,7 @@
             "redirect": True,
         }
 
-        self.pdata = {
+        self.__pdata = {
             "DESCRIPTION": "",
             "VERSION": "",
             "SOURCES": [],
@@ -547,6 +547,15 @@
             "LICENSE": "",
             "EMBEDDED_VENV": False,
         }
+        self.__knownFileCategories = [
+            "FORMS",
+            "OTHERS",
+            "RESOURCES",
+            "SOURCES",
+            "TRANSLATIONS",
+            "INTERFACES",
+            "PROTOCOLS",
+        ]
 
         self.__initDebugProperties()
 
@@ -559,6 +568,48 @@
 
         self.__initVenvConfiguration()
 
+    def getProjectData(self, dataKey=None, default=None):
+        """
+        Public method to get the data associated with the given data key.
+
+        Note: If dataKey is None, a copy of the project data structure
+        is returned.
+
+        @param dataKey key of the data to get (defaults to None)
+        @type str (optional)
+        @param default default value for non-existent keys (defaults to None)
+        @type Any (optional)
+        @return requested data or None if the data key doesn't exist or
+            a copy of the project data dictionary
+        @rtype Any
+        """
+        if dataKey is None:
+            return copy.deepcopy(self.__pdata)
+
+        try:
+            return self.__pdata[dataKey]
+        except KeyError:
+            return default
+
+    def setProjectData(self, data, dataKey=None):
+        """
+        Public method to set data associated with the given data key in the project
+        dictionary
+
+        Note: If no data key is given or is None, the data must be a dictionary used
+        to update the project data.
+
+        @param data data to be set or a dictionary to update the project data
+        @type Any
+        @param dataKey key of the data to set (defaults to None)
+        @type str (optional)
+        """
+        if dataKey is None:
+            self.__pdata.update(data)
+        else:
+            self.__pdata[dataKey] = data
+        self.setDirty(True)
+
     def getData(self, category, key):
         """
         Public method to get data out of the project data store.
@@ -579,9 +630,9 @@
                 "DOCUMENTATIONPARMS",
                 "OTHERTOOLSPARMS",
             ]
-            and key in self.pdata[category]
+            and key in self.__pdata[category]
         ):
-            return copy.deepcopy(self.pdata[category][key])
+            return copy.deepcopy(self.__pdata[category][key])
         else:
             return None
 
@@ -608,29 +659,38 @@
 
         # test for changes of data and save them in the project
         # 1. there were none, now there are
-        if key not in self.pdata[category] and len(data) > 0:
-            self.pdata[category][key] = copy.deepcopy(data)
+        if key not in self.__pdata[category] and len(data) > 0:
+            self.__pdata[category][key] = copy.deepcopy(data)
             self.setDirty(True)
         # 2. there were some, now there aren't
-        elif key in self.pdata[category] and len(data) == 0:
-            del self.pdata[category][key]
+        elif key in self.__pdata[category] and len(data) == 0:
+            del self.__pdata[category][key]
             self.setDirty(True)
         # 3. there were some and still are
-        elif key in self.pdata[category] and len(data) > 0:
-            if data != self.pdata[category][key]:
-                self.pdata[category][key] = copy.deepcopy(data)
+        elif key in self.__pdata[category] and len(data) > 0:
+            if data != self.__pdata[category][key]:
+                self.__pdata[category][key] = copy.deepcopy(data)
                 self.setDirty(True)
         # 4. there were none and none are given
         else:
             return False
         return True
 
+    def getFileCategories(self):
+        """
+        Public method to get the list of known file categories.
+
+        @return list of known file categories
+        @rtype list of str
+        """
+        return self.__knownFileCategories[:]
+
     def initFileTypes(self):
         """
         Public method to initialize the filetype associations with default
         values.
         """
-        self.pdata["FILETYPES"] = {
+        self.__pdata["FILETYPES"] = {
             "*.txt": "OTHERS",
             "*.md": "OTHERS",
             "*.rst": "OTHERS",
@@ -645,29 +705,29 @@
 
         # Sources
         sourceKey = (
-            "Mixed" if self.pdata["MIXEDLANGUAGE"] else self.pdata["PROGLANGUAGE"]
+            "Mixed" if self.__pdata["MIXEDLANGUAGE"] else self.__pdata["PROGLANGUAGE"]
         )
         for ext in self.__sourceExtensions(sourceKey):
-            self.pdata["FILETYPES"]["*{0}".format(ext)] = "SOURCES"
+            self.__pdata["FILETYPES"]["*{0}".format(ext)] = "SOURCES"
 
         # IDL interfaces
-        self.pdata["FILETYPES"]["*.idl"] = "INTERFACES"
+        self.__pdata["FILETYPES"]["*.idl"] = "INTERFACES"
 
         # Protobuf Files
-        self.pdata["FILETYPES"]["*.proto"] = "PROTOCOLS"
+        self.__pdata["FILETYPES"]["*.proto"] = "PROTOCOLS"
 
         # Forms
-        if self.pdata["PROJECTTYPE"] in [
+        if self.__pdata["PROJECTTYPE"] in [
             "E7Plugin",
             "PyQt5",
             "PyQt6",
             "PySide2",
             "PySide6",
         ]:
-            self.pdata["FILETYPES"]["*.ui"] = "FORMS"
+            self.__pdata["FILETYPES"]["*.ui"] = "FORMS"
 
         # Resources
-        if self.pdata["PROJECTTYPE"] in [
+        if self.__pdata["PROJECTTYPE"] in [
             "PyQt5",
             "PyQt5C",
             "PySide2",
@@ -675,10 +735,10 @@
             "PySide6",
             "PySide6C",
         ]:
-            self.pdata["FILETYPES"]["*.qrc"] = "RESOURCES"
+            self.__pdata["FILETYPES"]["*.qrc"] = "RESOURCES"
 
         # Translations
-        if self.pdata["PROJECTTYPE"] in [
+        if self.__pdata["PROJECTTYPE"] in [
             "E7Plugin",
             "PyQt5",
             "PyQt5C",
@@ -689,14 +749,14 @@
             "PySide6",
             "PySide6C",
         ]:
-            self.pdata["FILETYPES"]["*.ts"] = "TRANSLATIONS"
-            self.pdata["FILETYPES"]["*.qm"] = "TRANSLATIONS"
+            self.__pdata["FILETYPES"]["*.ts"] = "TRANSLATIONS"
+            self.__pdata["FILETYPES"]["*.qm"] = "TRANSLATIONS"
 
         # Project type specific ones
         with contextlib.suppress(KeyError):
-            if self.__fileTypeCallbacks[self.pdata["PROJECTTYPE"]] is not None:
-                ftypes = self.__fileTypeCallbacks[self.pdata["PROJECTTYPE"]]()
-                self.pdata["FILETYPES"].update(ftypes)
+            if self.__fileTypeCallbacks[self.__pdata["PROJECTTYPE"]] is not None:
+                ftypes = self.__fileTypeCallbacks[self.__pdata["PROJECTTYPE"]]()
+                self.__pdata["FILETYPES"].update(ftypes)
 
         self.setDirty(True)
 
@@ -705,7 +765,7 @@
         Public method to update the filetype associations with new default
         values.
         """
-        if self.pdata["PROJECTTYPE"] in [
+        if self.__pdata["PROJECTTYPE"] in [
             "E7Plugin",
             "PyQt5",
             "PyQt5C",
@@ -716,16 +776,16 @@
             "PySide6",
             "PySide6C",
         ]:
-            if "*.ts" not in self.pdata["FILETYPES"]:
-                self.pdata["FILETYPES"]["*.ts"] = "TRANSLATIONS"
-            if "*.qm" not in self.pdata["FILETYPES"]:
-                self.pdata["FILETYPES"]["*.qm"] = "TRANSLATIONS"
+            if "*.ts" not in self.__pdata["FILETYPES"]:
+                self.__pdata["FILETYPES"]["*.ts"] = "TRANSLATIONS"
+            if "*.qm" not in self.__pdata["FILETYPES"]:
+                self.__pdata["FILETYPES"]["*.qm"] = "TRANSLATIONS"
         with contextlib.suppress(KeyError):
-            if self.__fileTypeCallbacks[self.pdata["PROJECTTYPE"]] is not None:
-                ftypes = self.__fileTypeCallbacks[self.pdata["PROJECTTYPE"]]()
+            if self.__fileTypeCallbacks[self.__pdata["PROJECTTYPE"]] is not None:
+                ftypes = self.__fileTypeCallbacks[self.__pdata["PROJECTTYPE"]]()
                 for pattern, ftype in list(ftypes.items()):
-                    if pattern not in self.pdata["FILETYPES"]:
-                        self.pdata["FILETYPES"][pattern] = ftype
+                    if pattern not in self.__pdata["FILETYPES"]:
+                        self.__pdata["FILETYPES"][pattern] = ftype
                         self.setDirty(True)
 
     def __loadRecent(self):
@@ -844,14 +904,14 @@
         """
         removed = False
         removelist = []
-        for file in self.pdata[index]:
+        for file in self.__pdata[index]:
             if not os.path.exists(os.path.join(self.ppath, file)):
                 removelist.append(file)
                 removed = True
 
         if removed:
             for file in removelist:
-                self.pdata[index].remove(file)
+                self.__pdata[index].remove(file)
             self.setDirty(True)
 
     def __readProject(self, fn):
@@ -875,7 +935,7 @@
                 f.close()
 
                 # create hash value, if it doesn't have one
-                if reader.version.startswith("5.") and not self.pdata["HASH"]:
+                if reader.version.startswith("5.") and not self.__pdata["HASH"]:
                     hashStr = str(
                         QCryptographicHash.hash(
                             QByteArray(self.ppath.encode("utf-8")),
@@ -883,7 +943,7 @@
                         ).toHex(),
                         encoding="utf-8",
                     )
-                    self.pdata["HASH"] = hashStr
+                    self.__pdata["HASH"] = hashStr
                     self.setDirty(True)
             else:
                 EricMessageBox.critical(
@@ -902,12 +962,12 @@
             # insert filename into list of recently opened projects
             self.__syncRecent()
 
-            if self.pdata["TRANSLATIONPATTERN"]:
-                self.translationsRoot = self.pdata["TRANSLATIONPATTERN"].split(
+            if self.__pdata["TRANSLATIONPATTERN"]:
+                self.translationsRoot = self.__pdata["TRANSLATIONPATTERN"].split(
                     "%language%"
                 )[0]
-            elif self.pdata["MAINSCRIPT"]:
-                self.translationsRoot = os.path.splitext(self.pdata["MAINSCRIPT"])[0]
+            elif self.__pdata["MAINSCRIPT"]:
+                self.translationsRoot = os.path.splitext(self.__pdata["MAINSCRIPT"])[0]
             if os.path.isdir(os.path.join(self.ppath, self.translationsRoot)):
                 dn = self.translationsRoot
             else:
@@ -919,29 +979,34 @@
 
             # check, if the files of the project still exist in the
             # project directory
-            self.__checkFilesExist("SOURCES")
-            self.__checkFilesExist("FORMS")
-            self.__checkFilesExist("INTERFACES")
-            self.__checkFilesExist("PROTOCOLS")
-            self.__checkFilesExist("TRANSLATIONS")
-            self.__checkFilesExist("RESOURCES")
-            self.__checkFilesExist("OTHERS")
+            for fileCategory in self.__knownFileCategories:
+                self.__checkFilesExist(fileCategory)
+            ##self.__checkFilesExist("SOURCES")
+            ##self.__checkFilesExist("FORMS")
+            ##self.__checkFilesExist("INTERFACES")
+            ##self.__checkFilesExist("PROTOCOLS")
+            ##self.__checkFilesExist("TRANSLATIONS")
+            ##self.__checkFilesExist("RESOURCES")
+            ##self.__checkFilesExist("OTHERS")
 
             # get the names of subdirectories the files are stored in
-            for fn in (
-                self.pdata["SOURCES"]
-                + self.pdata["FORMS"]
-                + self.pdata["INTERFACES"]
-                + self.pdata["PROTOCOLS"]
-                + self.pdata["RESOURCES"]
-                + self.pdata["TRANSLATIONS"]
-            ):
-                dn = os.path.dirname(fn)
-                if dn not in self.subdirs:
-                    self.subdirs.append(dn)
+            for fileCategory in [
+                c for c in self.__knownFileCategories if c != "OTHERS"
+            ]:
+                for fn in self.__pdata[fileCategory]:
+                    ##self.__pdata["SOURCES"]
+                    ##+ self.__pdata["FORMS"]
+                    ##+ self.__pdata["INTERFACES"]
+                    ##+ self.__pdata["PROTOCOLS"]
+                    ##+ self.__pdata["RESOURCES"]
+                    ##+ self.__pdata["TRANSLATIONS"]
+                    ##):
+                    dn = os.path.dirname(fn)
+                    if dn not in self.subdirs:
+                        self.subdirs.append(dn)
 
             # get the names of other subdirectories
-            for fn in self.pdata["OTHERS"]:
+            for fn in self.__pdata["OTHERS"]:
                 dn = os.path.dirname(fn)
                 if dn not in self.otherssubdirs:
                     self.otherssubdirs.append(dn)
@@ -960,10 +1025,10 @@
         @return flag indicating success
         """
         if self.vcs is not None:
-            self.pdata["VCSOPTIONS"] = copy.deepcopy(self.vcs.vcsGetOptions())
-            self.pdata["VCSOTHERDATA"] = copy.deepcopy(self.vcs.vcsGetOtherData())
-
-        if not self.pdata["HASH"]:
+            self.__pdata["VCSOPTIONS"] = copy.deepcopy(self.vcs.vcsGetOptions())
+            self.__pdata["VCSOTHERDATA"] = copy.deepcopy(self.vcs.vcsGetOtherData())
+
+        if not self.__pdata["HASH"]:
             hashStr = str(
                 QCryptographicHash.hash(
                     QByteArray(self.ppath.encode("utf-8")),
@@ -971,7 +1036,7 @@
                 ).toHex(),
                 encoding="utf-8",
             )
-            self.pdata["HASH"] = hashStr
+            self.__pdata["HASH"] = hashStr
 
         if fn is None:
             fn = self.pfile
@@ -1353,7 +1418,7 @@
 
         @return load status of debug properties (boolean)
         """
-        return self.debugPropertiesLoaded or self.pdata["EMBEDDED_VENV"]
+        return self.debugPropertiesLoaded or self.__pdata["EMBEDDED_VENV"]
 
     def __showDebugProperties(self):
         """
@@ -1458,7 +1523,7 @@
 
         @return translation pattern (string)
         """
-        return self.pdata["TRANSLATIONPATTERN"]
+        return self.__pdata["TRANSLATIONPATTERN"]
 
     def setTranslationPattern(self, pattern):
         """
@@ -1467,7 +1532,7 @@
         @param pattern translation pattern
         @type str
         """
-        self.pdata["TRANSLATIONPATTERN"] = pattern
+        self.__pdata["TRANSLATIONPATTERN"] = pattern
 
     def addLanguage(self):
         """
@@ -1475,7 +1540,7 @@
         """
         from .AddLanguageDialog import AddLanguageDialog
 
-        if not self.pdata["TRANSLATIONPATTERN"]:
+        if not self.__pdata["TRANSLATIONPATTERN"]:
             EricMessageBox.critical(
                 self.ui,
                 self.tr("Add Language"),
@@ -1486,7 +1551,7 @@
         dlg = AddLanguageDialog(self.parent())
         if dlg.exec() == QDialog.DialogCode.Accepted:
             lang = dlg.getSelectedLanguage()
-            if self.pdata["PROJECTTYPE"] in [
+            if self.__pdata["PROJECTTYPE"] in [
                 "PyQt5",
                 "PyQt5C",
                 "PyQt6",
@@ -1497,7 +1562,9 @@
                 "PySide6",
                 "PySide6C",
             ]:
-                langFile = self.pdata["TRANSLATIONPATTERN"].replace("%language%", lang)
+                langFile = self.__pdata["TRANSLATIONPATTERN"].replace(
+                    "%language%", lang
+                )
                 self.appendFile(langFile)
             self.projectLanguageAddedByCode.emit(lang)
 
@@ -1512,12 +1579,12 @@
         qmFile = ""
         try:
             if (
-                self.__binaryTranslationsCallbacks[self.pdata["PROJECTTYPE"]]
+                self.__binaryTranslationsCallbacks[self.__pdata["PROJECTTYPE"]]
                 is not None
             ):
-                qmFile = self.__binaryTranslationsCallbacks[self.pdata["PROJECTTYPE"]](
-                    langFile
-                )
+                qmFile = self.__binaryTranslationsCallbacks[
+                    self.__pdata["PROJECTTYPE"]
+                ](langFile)
         except KeyError:
             qmFile = langFile.replace(".ts", ".qm")
         if qmFile == langFile:
@@ -1528,17 +1595,17 @@
         """
         Public slot to check the language files after a release process.
         """
-        tbPath = self.pdata["TRANSLATIONSBINPATH"]
-        for langFile in self.pdata["TRANSLATIONS"][:]:
+        tbPath = self.__pdata["TRANSLATIONSBINPATH"]
+        for langFile in self.__pdata["TRANSLATIONS"][:]:
             qmFile = self.__binaryTranslationFile(langFile)
             if qmFile:
-                if qmFile not in self.pdata["TRANSLATIONS"] and os.path.exists(
+                if qmFile not in self.__pdata["TRANSLATIONS"] and os.path.exists(
                     os.path.join(self.ppath, qmFile)
                 ):
                     self.appendFile(qmFile)
                 if tbPath:
                     qmFile = os.path.join(tbPath, os.path.basename(qmFile))
-                    if qmFile not in self.pdata["TRANSLATIONS"] and os.path.exists(
+                    if qmFile not in self.__pdata["TRANSLATIONS"] and os.path.exists(
                         os.path.join(self.ppath, qmFile)
                     ):
                         self.appendFile(qmFile)
@@ -1553,17 +1620,18 @@
         """
         langFile = self.getRelativePath(langFile)
         qmFile = self.__binaryTranslationFile(langFile)
-        self.pdata["TRANSLATIONS"].remove(langFile)
+        self.__pdata["TRANSLATIONS"].remove(langFile)
         self.__model.removeItem(langFile)
         if qmFile:
             with contextlib.suppress(ValueError):
-                if self.pdata["TRANSLATIONSBINPATH"]:
+                if self.__pdata["TRANSLATIONSBINPATH"]:
                     qmFile = self.getRelativePath(
                         os.path.join(
-                            self.pdata["TRANSLATIONSBINPATH"], os.path.basename(qmFile)
+                            self.__pdata["TRANSLATIONSBINPATH"],
+                            os.path.basename(qmFile),
                         )
                     )
-                self.pdata["TRANSLATIONS"].remove(qmFile)
+                self.__pdata["TRANSLATIONS"].remove(qmFile)
                 self.__model.removeItem(qmFile)
         self.setDirty(True)
 
@@ -1601,10 +1669,11 @@
         # now get rid of the .qm file
         if qmFile:
             try:
-                if self.pdata["TRANSLATIONSBINPATH"]:
+                if self.__pdata["TRANSLATIONSBINPATH"]:
                     qmFile = self.getRelativePath(
                         os.path.join(
-                            self.pdata["TRANSLATIONSBINPATH"], os.path.basename(qmFile)
+                            self.__pdata["TRANSLATIONSBINPATH"],
+                            os.path.basename(qmFile),
                         )
                     )
                 fn = os.path.join(self.ppath, qmFile)
@@ -1646,50 +1715,51 @@
             if fnmatch.fnmatch(bfn, "*.ts") or fnmatch.fnmatch(bfn, "*.qm"):
                 filetype = "TRANSLATIONS"
             else:
-                for pattern in sorted(self.pdata["FILETYPES"].keys(), reverse=True):
+                for pattern in sorted(self.__pdata["FILETYPES"].keys(), reverse=True):
                     if fnmatch.fnmatch(bfn, pattern):
-                        filetype = self.pdata["FILETYPES"][pattern]
+                        filetype = self.__pdata["FILETYPES"][pattern]
                         break
 
         if filetype == "__IGNORE__":
             return
 
+        # TODO: change this logic to be more generic (use fileCategory)
         if filetype in ["SOURCES", "FORMS", "INTERFACES", "PROTOCOLS", "RESOURCES"]:
             if filetype == "SOURCES":
-                if newfn not in self.pdata["SOURCES"]:
-                    self.pdata["SOURCES"].append(newfn)
+                if newfn not in self.__pdata["SOURCES"]:
+                    self.__pdata["SOURCES"].append(newfn)
                     self.projectSourceAdded.emit(newfn)
                     updateModel and self.__model.addNewItem("SOURCES", newfn)
                     dirty = True
                 else:
                     updateModel and self.repopulateItem(newfn)
             elif filetype == "FORMS":
-                if newfn not in self.pdata["FORMS"]:
-                    self.pdata["FORMS"].append(newfn)
+                if newfn not in self.__pdata["FORMS"]:
+                    self.__pdata["FORMS"].append(newfn)
                     self.projectFormAdded.emit(newfn)
                     updateModel and self.__model.addNewItem("FORMS", newfn)
                     dirty = True
                 else:
                     updateModel and self.repopulateItem(newfn)
             elif filetype == "INTERFACES":
-                if newfn not in self.pdata["INTERFACES"]:
-                    self.pdata["INTERFACES"].append(newfn)
+                if newfn not in self.__pdata["INTERFACES"]:
+                    self.__pdata["INTERFACES"].append(newfn)
                     self.projectInterfaceAdded.emit(newfn)
                     (updateModel and self.__model.addNewItem("INTERFACES", newfn))
                     dirty = True
                 else:
                     updateModel and self.repopulateItem(newfn)
             elif filetype == "PROTOCOLS":
-                if newfn not in self.pdata["PROTOCOLS"]:
-                    self.pdata["PROTOCOLS"].append(newfn)
+                if newfn not in self.__pdata["PROTOCOLS"]:
+                    self.__pdata["PROTOCOLS"].append(newfn)
                     self.projectProtocolAdded.emit(newfn)
                     (updateModel and self.__model.addNewItem("PROTOCOLS", newfn))
                     dirty = True
                 else:
                     updateModel and self.repopulateItem(newfn)
             elif filetype == "RESOURCES":
-                if newfn not in self.pdata["RESOURCES"]:
-                    self.pdata["RESOURCES"].append(newfn)
+                if newfn not in self.__pdata["RESOURCES"]:
+                    self.__pdata["RESOURCES"].append(newfn)
                     self.projectResourceAdded.emit(newfn)
                     updateModel and self.__model.addNewItem("RESOURCES", newfn)
                     dirty = True
@@ -1698,16 +1768,16 @@
             if newdir not in self.subdirs:
                 self.subdirs.append(newdir)
         elif filetype == "TRANSLATIONS":
-            if newfn not in self.pdata["TRANSLATIONS"]:
-                self.pdata["TRANSLATIONS"].append(newfn)
+            if newfn not in self.__pdata["TRANSLATIONS"]:
+                self.__pdata["TRANSLATIONS"].append(newfn)
                 updateModel and self.__model.addNewItem("TRANSLATIONS", newfn)
                 self.projectLanguageAdded.emit(newfn)
                 dirty = True
             else:
                 updateModel and self.repopulateItem(newfn)
         else:  # filetype == "OTHERS"
-            if newfn not in self.pdata["OTHERS"]:
-                self.pdata["OTHERS"].append(newfn)
+            if newfn not in self.__pdata["OTHERS"]:
+                self.__pdata["OTHERS"].append(newfn)
                 self.othersAdded(newfn, updateModel)
                 dirty = True
             else:
@@ -1791,7 +1861,7 @@
         # get all relevant filename patterns
         patterns = []
         ignorePatterns = []
-        for pattern, patterntype in list(self.pdata["FILETYPES"].items()):
+        for pattern, patterntype in list(self.__pdata["FILETYPES"].items()):
             if patterntype == filetype:
                 patterns.append(pattern)
             elif patterntype == "__IGNORE__":
@@ -1871,7 +1941,7 @@
 
         ignore_patterns = [
             pattern
-            for pattern, filetype in self.pdata["FILETYPES"].items()
+            for pattern, filetype in self.__pdata["FILETYPES"].items()
             if filetype == "__IGNORE__"
         ]
 
@@ -1947,8 +2017,8 @@
             if fn.endswith(os.sep):
                 fn = fn[:-1]
 
-            if fn not in self.pdata["OTHERS"]:
-                self.pdata["OTHERS"].append(fn)
+            if fn not in self.__pdata["OTHERS"]:
+                self.__pdata["OTHERS"].append(fn)
                 self.othersAdded(fn)
                 self.setDirty(True)
 
@@ -2038,13 +2108,13 @@
         @param oldfn old filename (string)
         @param newfn new filename of the main script (string)
         """
-        if self.pdata["MAINSCRIPT"]:
+        if self.__pdata["MAINSCRIPT"]:
             ofn = self.getRelativePath(oldfn)
-            if ofn != self.pdata["MAINSCRIPT"]:
+            if ofn != self.__pdata["MAINSCRIPT"]:
                 return
 
             fn = self.getRelativePath(newfn)
-            self.pdata["MAINSCRIPT"] = fn
+            self.__pdata["MAINSCRIPT"] = fn
             self.setDirty(True)
 
     def renameFile(self, oldfn, newfn=None):
@@ -2056,7 +2126,7 @@
         @return flag indicating success
         """
         fn = self.getRelativePath(oldfn)
-        isSourceFile = fn in self.pdata["SOURCES"]
+        isSourceFile = fn in self.__pdata["SOURCES"]
 
         if newfn is None:
             newfn = EricFileDialog.getSaveFileName(
@@ -2096,22 +2166,23 @@
             )
             return False
 
-        if (
-            fn in self.pdata["SOURCES"]
-            or fn in self.pdata["FORMS"]
-            or fn in self.pdata["TRANSLATIONS"]
-            or fn in self.pdata["INTERFACES"]
-            or fn in self.pdata["PROTOCOLS"]
-            or fn in self.pdata["RESOURCES"]
-            or fn in self.pdata["OTHERS"]
-        ):
+        ##if (
+        ##fn in self.__pdata["SOURCES"]
+        ##or fn in self.__pdata["FORMS"]
+        ##or fn in self.__pdata["TRANSLATIONS"]
+        ##or fn in self.__pdata["INTERFACES"]
+        ##or fn in self.__pdata["PROTOCOLS"]
+        ##or fn in self.__pdata["RESOURCES"]
+        ##or fn in self.__pdata["OTHERS"]
+        ##):
+        if any(fn in self.__pdata[category] for category in self.__knownFileCategories):
             self.renameFileInPdata(oldfn, newfn, isSourceFile)
 
         return True
 
     def renameFileInPdata(self, oldname, newname, isSourceFile=False):
         """
-        Public method to rename a file in the pdata structure.
+        Public method to rename a file in the __pdata structure.
 
         @param oldname old filename (string)
         @param newname new filename (string)
@@ -2140,15 +2211,18 @@
         """
         filelist = []
         start = self.getRelativePath(start)
-        for key in [
-            "SOURCES",
-            "FORMS",
-            "INTERFACES",
-            "PROTOCOLS",
-            "RESOURCES",
-            "OTHERS",
+        ##for key in [
+        ##"SOURCES",
+        ##"FORMS",
+        ##"INTERFACES",
+        ##"PROTOCOLS",
+        ##"RESOURCES",
+        ##"OTHERS",
+        ##]:
+        for fileCategory in [
+            c for c in self.__knownFileCategories if c != "TRANSLATIONS"
         ]:
-            for entry in self.pdata[key][:]:
+            for entry in self.__pdata[fileCategory][:]:
                 if entry.startswith(start):
                     filelist.append(os.path.join(self.ppath, entry))
         return filelist
@@ -2161,52 +2235,55 @@
 
         # init data store for the reorganization
         newPdata = {}
-        for key in [
-            "SOURCES",
-            "FORMS",
-            "INTERFACES",
-            "PROTOCOLS",
-            "RESOURCES",
-            "OTHERS",
-            "TRANSLATIONS",
-        ]:
-            newPdata[key] = []
+        ##for key in [
+        ##"SOURCES",
+        ##"FORMS",
+        ##"INTERFACES",
+        ##"PROTOCOLS",
+        ##"RESOURCES",
+        ##"OTHERS",
+        ##"TRANSLATIONS",
+        ##]:
+        for fileCategory in self.__knownFileCategories:
+            newPdata[fileCategory] = []
 
         # iterate over all files checking for a reassignment
-        for key in [
-            "SOURCES",
-            "FORMS",
-            "INTERFACES",
-            "PROTOCOLS",
-            "RESOURCES",
-            "OTHERS",
-            "TRANSLATIONS",
-        ]:
-            for fn in self.pdata[key][:]:
-                filetype = key
+        ##for key in [
+        ##"SOURCES",
+        ##"FORMS",
+        ##"INTERFACES",
+        ##"PROTOCOLS",
+        ##"RESOURCES",
+        ##"OTHERS",
+        ##"TRANSLATIONS",
+        ##]:
+        for fileCategory in self.__knownFileCategories:
+            for fn in self.__pdata[fileCategory][:]:
+                filetype = fileCategory
                 bfn = os.path.basename(fn)
-                for pattern in sorted(self.pdata["FILETYPES"].keys(), reverse=True):
+                for pattern in sorted(self.__pdata["FILETYPES"].keys(), reverse=True):
                     if fnmatch.fnmatch(bfn, pattern):
-                        filetype = self.pdata["FILETYPES"][pattern]
+                        filetype = self.__pdata["FILETYPES"][pattern]
                         break
 
                 if filetype != "__IGNORE__":
                     newPdata[filetype].append(fn)
-                    if filetype != key:
+                    if filetype != fileCategory:
                         reorganized = True
 
         if reorganized:
             # copy the reorganized files back to the project
-            for key in [
-                "SOURCES",
-                "FORMS",
-                "INTERFACES",
-                "PROTOCOLS",
-                "RESOURCES",
-                "OTHERS",
-                "TRANSLATIONS",
-            ]:
-                self.pdata[key] = newPdata[key][:]
+            ##for key in [
+            ##"SOURCES",
+            ##"FORMS",
+            ##"INTERFACES",
+            ##"PROTOCOLS",
+            ##"RESOURCES",
+            ##"OTHERS",
+            ##"TRANSLATIONS",
+            ##]:
+            for fileCategory in self.__knownFileCategories:
+                self.__pdata[fileCategory] = newPdata[fileCategory][:]
 
             # repopulate the model
             self.__model.projectClosed(False)
@@ -2221,18 +2298,23 @@
         """
         olddn = self.getRelativePath(olddn)
         newdn = self.getRelativePath(newdn)
-        for key in [
-            "SOURCES",
-            "FORMS",
-            "INTERFACES",
-            "PROTOCOLS",
-            "RESOURCES",
-            "OTHERS",
+        ##for key in [
+        ##"SOURCES",
+        ##"FORMS",
+        ##"INTERFACES",
+        ##"PROTOCOLS",
+        ##"RESOURCES",
+        ##"OTHERS",
+        ##]:
+        for fileCategory in [
+            c for c in self.__knownFileCategories if c != "TRANSLATIONS"
         ]:
-            for entry in self.pdata[key][:]:
+            for entry in self.__pdata[fileCategory][:]:
                 if entry.startswith(olddn):
                     entry = entry.replace(olddn, newdn)
-                    self.appendFile(os.path.join(self.ppath, entry), key == "SOURCES")
+                    self.appendFile(
+                        os.path.join(self.ppath, entry), fileCategory == "SOURCES"
+                    )
         self.setDirty(True)
 
     def moveDirectory(self, olddn, newdn):
@@ -2245,22 +2327,25 @@
         olddn = self.getRelativePath(olddn)
         newdn = self.getRelativePath(newdn)
         typeStrings = []
-        for key in [
-            "SOURCES",
-            "FORMS",
-            "INTERFACES",
-            "PROTOCOLS",
-            "RESOURCES",
-            "OTHERS",
+        ##for key in [
+        ##"SOURCES",
+        ##"FORMS",
+        ##"INTERFACES",
+        ##"PROTOCOLS",
+        ##"RESOURCES",
+        ##"OTHERS",
+        ##]:
+        for fileCategory in [
+            c for c in self.__knownFileCategories if c != "TRANSLATIONS"
         ]:
-            for entry in self.pdata[key][:]:
+            for entry in self.__pdata[fileCategory][:]:
                 if entry.startswith(olddn):
-                    if key not in typeStrings:
-                        typeStrings.append(key)
-                    self.pdata[key].remove(entry)
+                    if fileCategory not in typeStrings:
+                        typeStrings.append(fileCategory)
+                    self.__pdata[fileCategory].remove(entry)
                     entry = entry.replace(olddn, newdn)
-                    self.pdata[key].append(entry)
-            if key == "OTHERS":
+                    self.__pdata[fileCategory].append(entry)
+            if fileCategory == "OTHERS":
                 if newdn not in self.otherssubdirs:
                     self.otherssubdirs.append(newdn)
             else:
@@ -2289,26 +2374,27 @@
         """
         fn = self.getRelativePath(fn)
         dirty = True
-        if fn in self.pdata["SOURCES"]:
-            self.pdata["SOURCES"].remove(fn)
+        # TODO: change this logic to be more generic (use fileCategory)
+        if fn in self.__pdata["SOURCES"]:
+            self.__pdata["SOURCES"].remove(fn)
             self.projectSourceRemoved.emit(fn)
-        elif fn in self.pdata["FORMS"]:
-            self.pdata["FORMS"].remove(fn)
+        elif fn in self.__pdata["FORMS"]:
+            self.__pdata["FORMS"].remove(fn)
             self.projectFormRemoved.emit(fn)
-        elif fn in self.pdata["INTERFACES"]:
-            self.pdata["INTERFACES"].remove(fn)
+        elif fn in self.__pdata["INTERFACES"]:
+            self.__pdata["INTERFACES"].remove(fn)
             self.projectInterfaceRemoved.emit(fn)
-        elif fn in self.pdata["PROTOCOLS"]:
-            self.pdata["PROTOCOLS"].remove(fn)
+        elif fn in self.__pdata["PROTOCOLS"]:
+            self.__pdata["PROTOCOLS"].remove(fn)
             self.projectProtocolRemoved.emit(fn)
-        elif fn in self.pdata["RESOURCES"]:
-            self.pdata["RESOURCES"].remove(fn)
+        elif fn in self.__pdata["RESOURCES"]:
+            self.__pdata["RESOURCES"].remove(fn)
             self.projectResourceRemoved.emit(fn)
-        elif fn in self.pdata["OTHERS"]:
-            self.pdata["OTHERS"].remove(fn)
+        elif fn in self.__pdata["OTHERS"]:
+            self.__pdata["OTHERS"].remove(fn)
             self.projectOthersRemoved.emit(fn)
-        elif fn in self.pdata["TRANSLATIONS"]:
-            self.pdata["TRANSLATIONS"].remove(fn)
+        elif fn in self.__pdata["TRANSLATIONS"]:
+            self.__pdata["TRANSLATIONS"].remove(fn)
             self.projectLanguageRemoved.emit(fn)
         else:
             dirty = False
@@ -2326,22 +2412,23 @@
         """
         dirty = False
         dn = self.getRelativePath(dn)
-        for entry in self.pdata["OTHERS"][:]:
+        for entry in self.__pdata["OTHERS"][:]:
             if entry.startswith(dn):
-                self.pdata["OTHERS"].remove(entry)
+                self.__pdata["OTHERS"].remove(entry)
                 dirty = True
         dn2 = dn if dn.endswith(os.sep) else dn + os.sep
-        for key in [
-            "SOURCES",
-            "FORMS",
-            "INTERFACES",
-            "PROTOCOLS",
-            "RESOURCES",
-            "TRANSLATIONS",
-        ]:
-            for entry in self.pdata[key][:]:
+        ##for key in [
+        ##"SOURCES",
+        ##"FORMS",
+        ##"INTERFACES",
+        ##"PROTOCOLS",
+        ##"RESOURCES",
+        ##"TRANSLATIONS",
+        ##]:
+        for fileCategory in [c for c in self.__knownFileCategories if c != "OTHERS"]:
+            for entry in self.__pdata[fileCategory][:]:
                 if entry.startswith(dn2):
-                    self.pdata[key].remove(entry)
+                    self.__pdata[fileCategory].remove(entry)
                     dirty = True
         self.__model.removeItem(dn)
         if dirty:
@@ -2431,14 +2518,18 @@
         @return flag indicating, if the project contains the file (boolean)
         """
         fn = self.getRelativePath(fn)
-        return (
-            fn in self.pdata["SOURCES"]
-            or fn in self.pdata["FORMS"]
-            or fn in self.pdata["INTERFACES"]
-            or fn in self.pdata["PROTOCOLS"]
-            or fn in self.pdata["RESOURCES"]
-            or fn in self.pdata["OTHERS"]
-        )
+        return any(
+            fn in self.__pdata[category]
+            for category in self.__knownFileCategories
+            if category != "TRANSLATIONS"
+        )
+        ##fn in self.__pdata["SOURCES"]
+        ##or fn in self.__pdata["FORMS"]
+        ##or fn in self.__pdata["INTERFACES"]
+        ##or fn in self.__pdata["PROTOCOLS"]
+        ##or fn in self.__pdata["RESOURCES"]
+        ##or fn in self.__pdata["OTHERS"]
+        ##)
 
     def createNewProject(self):
         """
@@ -2458,9 +2549,9 @@
         if dlg.exec() == QDialog.DialogCode.Accepted:
             self.closeProject()
             dlg.storeData()
-            self.pdata["VCS"] = "None"
+            self.__pdata["VCS"] = "None"
             self.opened = True
-            if not self.pdata["FILETYPES"]:
+            if not self.__pdata["FILETYPES"]:
                 self.initFileTypes()
             self.setDirty(True)
             self.closeAct.setEnabled(True)
@@ -2479,10 +2570,10 @@
             self.menuDiagramAct.setEnabled(True)
             self.menuApidocAct.setEnabled(True)
             self.menuPackagersAct.setEnabled(True)
-            self.pluginGrp.setEnabled(self.pdata["PROJECTTYPE"] in ["E7Plugin"])
-            self.addLanguageAct.setEnabled(bool(self.pdata["TRANSLATIONPATTERN"]))
-            self.makeGrp.setEnabled(self.pdata["MAKEPARAMS"]["MakeEnabled"])
-            self.menuMakeAct.setEnabled(self.pdata["MAKEPARAMS"]["MakeEnabled"])
+            self.pluginGrp.setEnabled(self.__pdata["PROJECTTYPE"] in ["E7Plugin"])
+            self.addLanguageAct.setEnabled(bool(self.__pdata["TRANSLATIONPATTERN"]))
+            self.makeGrp.setEnabled(self.__pdata["MAKEPARAMS"]["MakeEnabled"])
+            self.menuMakeAct.setEnabled(self.__pdata["MAKEPARAMS"]["MakeEnabled"])
             self.menuOtherToolsAct.setEnabled(True)
             self.menuFormattingAct.setEnabled(True)
 
@@ -2495,11 +2586,11 @@
                 ).toHex(),
                 encoding="utf-8",
             )
-            self.pdata["HASH"] = hashStr
-
-            if self.pdata["PROGLANGUAGE"] == "MicroPython":
+            self.__pdata["HASH"] = hashStr
+
+            if self.__pdata["PROGLANGUAGE"] == "MicroPython":
                 # change the lexer association for *.py files
-                self.pdata["LEXERASSOCS"] = {
+                self.__pdata["LEXERASSOCS"] = {
                     "*.py": "MicroPython",
                 }
 
@@ -2521,25 +2612,25 @@
 
                 # create an empty __init__.py file to make it a Python package
                 # (only for Python and Python3)
-                if self.pdata["PROGLANGUAGE"] in ["Python3", "MicroPython"]:
+                if self.__pdata["PROGLANGUAGE"] in ["Python3", "MicroPython"]:
                     fn = os.path.join(self.ppath, "__init__.py")
                     with open(fn, "w", encoding="utf-8"):
                         pass
                     self.appendFile(fn, True)
 
                 # create an empty main script file, if a name was given
-                if self.pdata["MAINSCRIPT"]:
-                    if not os.path.isabs(self.pdata["MAINSCRIPT"]):
-                        ms = os.path.join(self.ppath, self.pdata["MAINSCRIPT"])
+                if self.__pdata["MAINSCRIPT"]:
+                    if not os.path.isabs(self.__pdata["MAINSCRIPT"]):
+                        ms = os.path.join(self.ppath, self.__pdata["MAINSCRIPT"])
                     else:
-                        ms = self.pdata["MAINSCRIPT"]
+                        ms = self.__pdata["MAINSCRIPT"]
                     os.makedirs(os.path.dirname(ms), exist_ok=True)
                     with open(ms, "w"):
                         pass
                     self.appendFile(ms, True)
 
-                if self.pdata["MAKEPARAMS"]["MakeEnabled"]:
-                    mf = self.pdata["MAKEPARAMS"]["MakeFile"]
+                if self.__pdata["MAKEPARAMS"]["MakeEnabled"]:
+                    mf = self.__pdata["MAKEPARAMS"]["MakeFile"]
                     if mf:
                         if not os.path.isabs(mf):
                             mf = os.path.join(self.ppath, mf)
@@ -2555,8 +2646,8 @@
                     tpd = os.path.dirname(tpd)
                 if not os.path.isdir(tpd):
                     os.makedirs(tpd, exist_ok=True)
-                if self.pdata["TRANSLATIONSBINPATH"]:
-                    tpd = os.path.join(self.ppath, self.pdata["TRANSLATIONSBINPATH"])
+                if self.__pdata["TRANSLATIONSBINPATH"]:
+                    tpd = os.path.join(self.ppath, self.__pdata["TRANSLATIONSBINPATH"])
                     if not os.path.isdir(tpd):
                         os.makedirs(tpd, exist_ok=True)
 
@@ -2580,11 +2671,11 @@
                     )
                     return
 
-                if self.pdata["MAINSCRIPT"]:
-                    if not os.path.isabs(self.pdata["MAINSCRIPT"]):
-                        ms = os.path.join(self.ppath, self.pdata["MAINSCRIPT"])
+                if self.__pdata["MAINSCRIPT"]:
+                    if not os.path.isabs(self.__pdata["MAINSCRIPT"]):
+                        ms = os.path.join(self.ppath, self.__pdata["MAINSCRIPT"])
                     else:
-                        ms = self.pdata["MAINSCRIPT"]
+                        ms = self.__pdata["MAINSCRIPT"]
                     if not os.path.exists(ms):
                         try:
                             os.makedirs(os.path.dirname(ms))
@@ -2603,8 +2694,8 @@
                 else:
                     ms = ""
 
-                if self.pdata["MAKEPARAMS"]["MakeEnabled"]:
-                    mf = self.pdata["MAKEPARAMS"]["MakeFile"]
+                if self.__pdata["MAKEPARAMS"]["MakeEnabled"]:
+                    mf = self.__pdata["MAKEPARAMS"]["MakeFile"]
                     if mf:
                         if not os.path.isabs(mf):
                             mf = os.path.join(self.ppath, mf)
@@ -2638,7 +2729,7 @@
                 addAllToVcs = res
                 # create an empty __init__.py file to make it a Python package
                 # if none exists (only for Python and Python3)
-                if self.pdata["PROGLANGUAGE"] in ["Python3", "MicroPython"]:
+                if self.__pdata["PROGLANGUAGE"] in ["Python3", "MicroPython"]:
                     fn = os.path.join(self.ppath, "__init__.py")
                     if not os.path.exists(fn):
                         with open(fn, "w", encoding="utf-8"):
@@ -2676,7 +2767,7 @@
                                 vcsSystem = "None"
                         else:
                             vcsSystem = vcsData[0][1]
-                        self.pdata["VCS"] = vcsSystem
+                        self.__pdata["VCS"] = vcsSystem
                         self.vcs = self.initVCS()
                         self.setDirty(True)
                         if self.vcs is not None:
@@ -2711,7 +2802,7 @@
                                     self.saveProject()
                                     self.vcs.vcsAdd(self.pfile)
                         else:
-                            self.pdata["VCS"] = "None"
+                            self.__pdata["VCS"] = "None"
                         self.saveProject()
                         break
 
@@ -2737,19 +2828,19 @@
                 if ok and vcsSelected != self.tr("None"):
                     for vcsSystem, vcsSystemDisplay in vcsSystemsDict.items():
                         if vcsSystemDisplay == vcsSelected:
-                            self.pdata["VCS"] = vcsSystem
+                            self.__pdata["VCS"] = vcsSystem
                             break
                     else:
-                        self.pdata["VCS"] = "None"
+                        self.__pdata["VCS"] = "None"
                 else:
-                    self.pdata["VCS"] = "None"
+                    self.__pdata["VCS"] = "None"
                 self.vcs = self.initVCS()
                 if self.vcs is not None:
                     vcsdlg = self.vcs.vcsOptionsDialog(self, self.name)
                     if vcsdlg.exec() == QDialog.DialogCode.Accepted:
                         vcsDataDict = vcsdlg.getData()
                     else:
-                        self.pdata["VCS"] = "None"
+                        self.__pdata["VCS"] = "None"
                         self.vcs = self.initVCS()
                 self.setDirty(True)
                 if self.vcs is not None:
@@ -2782,9 +2873,9 @@
                 self.newProjectHooks.emit()
                 self.newProject.emit()
 
-            if self.pdata["EMBEDDED_VENV"]:
+            if self.__pdata["EMBEDDED_VENV"]:
                 self.__createEmbeddedEnvironment()
-            self.menuEnvironmentAct.setEnabled(self.pdata["EMBEDDED_VENV"])
+            self.menuEnvironmentAct.setEnabled(self.__pdata["EMBEDDED_VENV"])
 
     def newProjectAddFiles(self, mainscript):
         """
@@ -2797,7 +2888,7 @@
 
         with EricOverrideCursor():
             # search the project directory for files with known extensions
-            filespecs = list(self.pdata["FILETYPES"].keys())
+            filespecs = list(self.__pdata["FILETYPES"].keys())
             for filespec in filespecs:
                 files = Utilities.direntries(self.ppath, True, filespec)
                 for file in files:
@@ -2811,12 +2902,12 @@
             else:
                 tpd = self.ppath
             tslist = []
-            if self.pdata["TRANSLATIONPATTERN"]:
-                pattern = os.path.basename(self.pdata["TRANSLATIONPATTERN"])
+            if self.__pdata["TRANSLATIONPATTERN"]:
+                pattern = os.path.basename(self.__pdata["TRANSLATIONPATTERN"])
                 if "%language%" in pattern:
                     pattern = pattern.replace("%language%", "*")
                 else:
-                    tpd = self.pdata["TRANSLATIONPATTERN"].split("%language%")[0]
+                    tpd = self.__pdata["TRANSLATIONPATTERN"].split("%language%")[0]
             else:
                 pattern = "*.ts"
             tslist.extend(Utilities.direntries(tpd, True, pattern))
@@ -2830,7 +2921,7 @@
                         os.path.splitext(mainscript)[0]
                         or os.path.basename(tslist[0]).split("_")[0]
                     )
-                    self.pdata["TRANSLATIONPATTERN"] = os.path.join(
+                    self.__pdata["TRANSLATIONPATTERN"] = os.path.join(
                         os.path.dirname(tslist[0]),
                         "{0}_%language%{1}".format(
                             os.path.basename(tslist[0]).split("_")[0],
@@ -2851,35 +2942,35 @@
                         tslist[0],
                     )
                     if pattern:
-                        self.pdata["TRANSLATIONPATTERN"] = pattern
-                if self.pdata["TRANSLATIONPATTERN"]:
-                    self.pdata["TRANSLATIONPATTERN"] = self.getRelativePath(
-                        self.pdata["TRANSLATIONPATTERN"]
+                        self.__pdata["TRANSLATIONPATTERN"] = pattern
+                if self.__pdata["TRANSLATIONPATTERN"]:
+                    self.__pdata["TRANSLATIONPATTERN"] = self.getRelativePath(
+                        self.__pdata["TRANSLATIONPATTERN"]
                     )
-                    pattern = self.pdata["TRANSLATIONPATTERN"].replace(
+                    pattern = self.__pdata["TRANSLATIONPATTERN"].replace(
                         "%language%", "*"
                     )
                     for ts in tslist:
                         if fnmatch.fnmatch(ts, pattern):
-                            self.pdata["TRANSLATIONS"].append(ts)
+                            self.__pdata["TRANSLATIONS"].append(ts)
                             self.projectLanguageAdded.emit(ts)
-                    if self.pdata["TRANSLATIONSBINPATH"]:
+                    if self.__pdata["TRANSLATIONSBINPATH"]:
                         tpd = os.path.join(
-                            self.ppath, self.pdata["TRANSLATIONSBINPATH"]
+                            self.ppath, self.__pdata["TRANSLATIONSBINPATH"]
                         )
                         pattern = os.path.basename(
-                            self.pdata["TRANSLATIONPATTERN"]
+                            self.__pdata["TRANSLATIONPATTERN"]
                         ).replace("%language%", "*")
                         pattern = self.__binaryTranslationFile(pattern)
                         qmlist = Utilities.direntries(tpd, True, pattern)
                         for qm in qmlist:
-                            self.pdata["TRANSLATIONS"].append(qm)
+                            self.__pdata["TRANSLATIONS"].append(qm)
                             self.projectLanguageAdded.emit(qm)
-                if not self.pdata["MAINSCRIPT"] and bool(mainscriptname):
-                    if self.pdata["PROGLANGUAGE"] in ["Python3", "MicroPython"]:
-                        self.pdata["MAINSCRIPT"] = "{0}.py".format(mainscriptname)
-                    elif self.pdata["PROGLANGUAGE"] == "Ruby":
-                        self.pdata["MAINSCRIPT"] = "{0}.rb".format(mainscriptname)
+                if not self.__pdata["MAINSCRIPT"] and bool(mainscriptname):
+                    if self.__pdata["PROGLANGUAGE"] in ["Python3", "MicroPython"]:
+                        self.__pdata["MAINSCRIPT"] = "{0}.py".format(mainscriptname)
+                    elif self.__pdata["PROGLANGUAGE"] == "Ruby":
+                        self.__pdata["MAINSCRIPT"] = "{0}.rb".format(mainscriptname)
             self.setDirty(True)
 
     def __showProperties(self):
@@ -2890,19 +2981,19 @@
 
         dlg = PropertiesDialog(self, False)
         if dlg.exec() == QDialog.DialogCode.Accepted:
-            projectType = self.pdata["PROJECTTYPE"]
+            projectType = self.__pdata["PROJECTTYPE"]
             dlg.storeData()
             self.setDirty(True)
-            if self.pdata["MAINSCRIPT"]:
-                if not os.path.isabs(self.pdata["MAINSCRIPT"]):
-                    ms = os.path.join(self.ppath, self.pdata["MAINSCRIPT"])
+            if self.__pdata["MAINSCRIPT"]:
+                if not os.path.isabs(self.__pdata["MAINSCRIPT"]):
+                    ms = os.path.join(self.ppath, self.__pdata["MAINSCRIPT"])
                 else:
-                    ms = self.pdata["MAINSCRIPT"]
+                    ms = self.__pdata["MAINSCRIPT"]
                 if os.path.exists(ms):
                     self.appendFile(ms)
 
-            if self.pdata["MAKEPARAMS"]["MakeEnabled"]:
-                mf = self.pdata["MAKEPARAMS"]["MakeFile"]
+            if self.__pdata["MAKEPARAMS"]["MakeEnabled"]:
+                mf = self.__pdata["MAKEPARAMS"]["MakeFile"]
                 if mf:
                     if not os.path.isabs(mf):
                         mf = os.path.join(self.ppath, mf)
@@ -2923,7 +3014,7 @@
                         )
                 self.appendFile(mf)
 
-            if self.pdata["PROJECTTYPE"] != projectType:
+            if self.__pdata["PROJECTTYPE"] != projectType:
                 # reinitialize filetype associations
                 self.initFileTypes()
 
@@ -2938,22 +3029,22 @@
             if tp != self.ppath and tp not in self.subdirs:
                 self.subdirs.append(tp)
 
-            if self.pdata["TRANSLATIONSBINPATH"]:
-                tp = os.path.join(self.ppath, self.pdata["TRANSLATIONSBINPATH"])
+            if self.__pdata["TRANSLATIONSBINPATH"]:
+                tp = os.path.join(self.ppath, self.__pdata["TRANSLATIONSBINPATH"])
                 if not os.path.isdir(tp):
                     os.makedirs(tp)
                 if tp != self.ppath and tp not in self.subdirs:
                     self.subdirs.append(tp)
 
-            self.pluginGrp.setEnabled(self.pdata["PROJECTTYPE"] in ["E7Plugin"])
+            self.pluginGrp.setEnabled(self.__pdata["PROJECTTYPE"] in ["E7Plugin"])
 
             self.__model.projectPropertiesChanged()
             self.projectPropertiesChanged.emit()
 
-            if self.pdata["PROJECTTYPE"] != projectType:
+            if self.__pdata["PROJECTTYPE"] != projectType:
                 self.__reorganizeFiles()
 
-            if self.pdata["EMBEDDED_VENV"] and not self.__findEmbeddedEnvironment():
+            if self.__pdata["EMBEDDED_VENV"] and not self.__findEmbeddedEnvironment():
                 self.__createEmbeddedEnvironment()
 
     def __showUserProperties(self):
@@ -2962,7 +3053,7 @@
         """
         from .UserPropertiesDialog import UserPropertiesDialog
 
-        vcsSystem = self.pdata["VCS"] or None
+        vcsSystem = self.__pdata["VCS"] or None
         vcsSystemOverride = self.pudata["VCSOVERRIDE"] or None
 
         dlg = UserPropertiesDialog(self)
@@ -2970,7 +3061,7 @@
             dlg.storeData()
 
             if (
-                (self.pdata["VCS"] and self.pdata["VCS"] != vcsSystem)
+                (self.__pdata["VCS"] and self.__pdata["VCS"] != vcsSystem)
                 or (
                     self.pudata["VCSOVERRIDE"]
                     and self.pudata["VCSOVERRIDE"] != vcsSystemOverride
@@ -3023,8 +3114,8 @@
         """
         return [
             assoc
-            for assoc in self.pdata["FILETYPES"]
-            if self.pdata["FILETYPES"][assoc] == associationType
+            for assoc in self.__pdata["FILETYPES"]
+            if self.__pdata["FILETYPES"][assoc] == associationType
         ]
 
     def __showLexerAssociations(self):
@@ -3048,12 +3139,12 @@
         @return the requested lexer language (string)
         """
         # try user settings first
-        for pattern, language in list(self.pdata["LEXERASSOCS"].items()):
+        for pattern, language in list(self.__pdata["LEXERASSOCS"].items()):
             if fnmatch.fnmatch(filename, pattern):
                 return language
 
         # try project type specific defaults next
-        projectType = self.pdata["PROJECTTYPE"]
+        projectType = self.__pdata["PROJECTTYPE"]
         with contextlib.suppress(KeyError):
             if self.__lexerAssociationCallbacks[projectType] is not None:
                 return self.__lexerAssociationCallbacks[projectType](filename)
@@ -3098,7 +3189,7 @@
                 ok = self.__readProject(fn)
             if ok:
                 self.opened = True
-                if not self.pdata["FILETYPES"]:
+                if not self.__pdata["FILETYPES"]:
                     self.initFileTypes()
                 else:
                     self.updateFileTypes()
@@ -3155,14 +3246,14 @@
                                         vcsSystem = "None"
                                 else:
                                     vcsSystem = vcsData[0][0]
-                                self.pdata["VCS"] = vcsSystem
+                                self.__pdata["VCS"] = vcsSystem
                                 self.vcs = self.initVCS()
                                 self.setDirty(True)
                     if self.vcs is not None and (
                         self.vcs.vcsRegisteredState(self.ppath)
                         != self.vcs.canBeCommitted
                     ):
-                        self.pdata["VCS"] = "None"
+                        self.__pdata["VCS"] = "None"
                         self.vcs = self.initVCS()
                     self.closeAct.setEnabled(True)
                     self.saveasAct.setEnabled(True)
@@ -3180,12 +3271,16 @@
                     self.menuDiagramAct.setEnabled(True)
                     self.menuApidocAct.setEnabled(True)
                     self.menuPackagersAct.setEnabled(True)
-                    self.pluginGrp.setEnabled(self.pdata["PROJECTTYPE"] in ["E7Plugin"])
+                    self.pluginGrp.setEnabled(
+                        self.__pdata["PROJECTTYPE"] in ["E7Plugin"]
+                    )
                     self.addLanguageAct.setEnabled(
-                        bool(self.pdata["TRANSLATIONPATTERN"])
+                        bool(self.__pdata["TRANSLATIONPATTERN"])
                     )
-                    self.makeGrp.setEnabled(self.pdata["MAKEPARAMS"]["MakeEnabled"])
-                    self.menuMakeAct.setEnabled(self.pdata["MAKEPARAMS"]["MakeEnabled"])
+                    self.makeGrp.setEnabled(self.__pdata["MAKEPARAMS"]["MakeEnabled"])
+                    self.menuMakeAct.setEnabled(
+                        self.__pdata["MAKEPARAMS"]["MakeEnabled"]
+                    )
                     self.menuOtherToolsAct.setEnabled(True)
                     self.menuFormattingAct.setEnabled(True)
 
@@ -3196,7 +3291,7 @@
 
                     self.__model.projectOpened()
 
-                if self.pdata["EMBEDDED_VENV"]:
+                if self.__pdata["EMBEDDED_VENV"]:
                     envPath = self.__findEmbeddedEnvironment()
                     if bool(envPath):
                         self.__loadEnvironmentConfiguration()
@@ -3208,7 +3303,7 @@
                             self.__configureEnvironment(envPath)
                     else:
                         self.__createEmbeddedEnvironment()
-                self.menuEnvironmentAct.setEnabled(self.pdata["EMBEDDED_VENV"])
+                self.menuEnvironmentAct.setEnabled(self.__pdata["EMBEDDED_VENV"])
 
                 self.projectOpenedHooks.emit()
                 self.projectOpened.emit()
@@ -3225,11 +3320,11 @@
 
                 if restoreSession:
                     # open the main script
-                    if self.pdata["MAINSCRIPT"]:
-                        if not os.path.isabs(self.pdata["MAINSCRIPT"]):
-                            ms = os.path.join(self.ppath, self.pdata["MAINSCRIPT"])
+                    if self.__pdata["MAINSCRIPT"]:
+                        if not os.path.isabs(self.__pdata["MAINSCRIPT"]):
+                            ms = os.path.join(self.ppath, self.__pdata["MAINSCRIPT"])
                         else:
-                            ms = self.pdata["MAINSCRIPT"]
+                            ms = self.__pdata["MAINSCRIPT"]
                         self.sourceFile.emit(ms)
 
                     # open a project session file being quiet about errors
@@ -3485,7 +3580,7 @@
         filesWithSyntaxErrors = 0
         for fn in vm.getOpenFilenames():
             rfn = self.getRelativePath(fn)
-            if rfn in self.pdata["SOURCES"] or rfn in self.pdata["OTHERS"]:
+            if rfn in self.__pdata["SOURCES"] or rfn in self.__pdata["OTHERS"]:
                 editor = vm.getOpenEditor(fn)
                 success &= vm.saveEditorEd(editor)
                 if reportSyntaxErrors and editor.hasSyntaxErrors():
@@ -3519,7 +3614,7 @@
         filesWithSyntaxErrors = 0
         for fn in vm.getOpenFilenames():
             rfn = self.getRelativePath(fn)
-            if rfn in self.pdata["SOURCES"] or rfn in self.pdata["OTHERS"]:
+            if rfn in self.__pdata["SOURCES"] or rfn in self.__pdata["OTHERS"]:
                 editor = vm.getOpenEditor(fn)
                 success &= editor.checkDirty()
                 if reportSyntaxErrors and editor.hasSyntaxErrors():
@@ -3551,11 +3646,11 @@
         @return filename of the projects main script
         @rtype str
         """
-        if self.pdata["MAINSCRIPT"]:
+        if self.__pdata["MAINSCRIPT"]:
             if normalized:
-                return os.path.join(self.ppath, self.pdata["MAINSCRIPT"])
+                return os.path.join(self.ppath, self.__pdata["MAINSCRIPT"])
             else:
-                return self.pdata["MAINSCRIPT"]
+                return self.__pdata["MAINSCRIPT"]
         else:
             return ""
 
@@ -3583,21 +3678,22 @@
         @rtype list of str
         @exception ValueError raised when an unsupported file type is given
         """
-        if fileType not in [
-            "SOURCES",
-            "FORMS",
-            "RESOURCES",
-            "INTERFACES",
-            "PROTOCOLS",
-            "OTHERS",
-            "TRANSLATIONS",
-        ]:
+        if fileType not in self.__knownFileCategories:
+            ##[
+            ##"SOURCES",
+            ##"FORMS",
+            ##"RESOURCES",
+            ##"INTERFACES",
+            ##"PROTOCOLS",
+            ##"OTHERS",
+            ##"TRANSLATIONS",
+            ##]:
             raise ValueError("Given file type has incorrect value.")
 
         if normalized:
-            return [os.path.join(self.ppath, fn) for fn in self.pdata[fileType]]
+            return [os.path.join(self.ppath, fn) for fn in self.__pdata[fileType]]
         else:
-            return self.pdata[fileType]
+            return self.__pdata[fileType]
 
     def getProjectType(self):
         """
@@ -3605,7 +3701,7 @@
 
         @return UI type of the project (string)
         """
-        return self.pdata["PROJECTTYPE"]
+        return self.__pdata["PROJECTTYPE"]
 
     def getProjectLanguage(self):
         """
@@ -3613,7 +3709,7 @@
 
         @return programming language (string)
         """
-        return self.pdata["PROGLANGUAGE"]
+        return self.__pdata["PROGLANGUAGE"]
 
     def isMixedLanguageProject(self):
         """
@@ -3622,7 +3718,7 @@
         @return flag indicating a mixed language project
         @rtype bool
         """
-        return self.pdata["MIXEDLANGUAGE"]
+        return self.__pdata["MIXEDLANGUAGE"]
 
     def isPythonProject(self):
         """
@@ -3631,7 +3727,7 @@
 
         @return flag indicating a Python project (boolean)
         """
-        return self.pdata["PROGLANGUAGE"] in ["Python3", "MicroPython"]
+        return self.__pdata["PROGLANGUAGE"] in ["Python3", "MicroPython"]
 
     def isPy3Project(self):
         """
@@ -3639,7 +3735,7 @@
 
         @return flag indicating a Python3 project (boolean)
         """
-        return self.pdata["PROGLANGUAGE"] == "Python3"
+        return self.__pdata["PROGLANGUAGE"] == "Python3"
 
     def isMicroPythonProject(self):
         """
@@ -3648,7 +3744,7 @@
         @return flag indicating a MicroPython project
         @rtype bool
         """
-        return self.pdata["PROGLANGUAGE"] == "MicroPython"
+        return self.__pdata["PROGLANGUAGE"] == "MicroPython"
 
     def isRubyProject(self):
         """
@@ -3656,7 +3752,7 @@
 
         @return flag indicating a Ruby project (boolean)
         """
-        return self.pdata["PROGLANGUAGE"] == "Ruby"
+        return self.__pdata["PROGLANGUAGE"] == "Ruby"
 
     def isJavaScriptProject(self):
         """
@@ -3664,7 +3760,7 @@
 
         @return flag indicating a JavaScript project (boolean)
         """
-        return self.pdata["PROGLANGUAGE"] == "JavaScript"
+        return self.__pdata["PROGLANGUAGE"] == "JavaScript"
 
     def getProjectSpellLanguage(self):
         """
@@ -3672,7 +3768,7 @@
 
         @return programming language (string)
         """
-        return self.pdata["SPELLLANGUAGE"]
+        return self.__pdata["SPELLLANGUAGE"]
 
     def getProjectDictionaries(self):
         """
@@ -3682,14 +3778,14 @@
             project specific word and exclude list
         """
         pwl = ""
-        if self.pdata["SPELLWORDS"]:
-            pwl = os.path.join(self.ppath, self.pdata["SPELLWORDS"])
+        if self.__pdata["SPELLWORDS"]:
+            pwl = os.path.join(self.ppath, self.__pdata["SPELLWORDS"])
             if not os.path.isfile(pwl):
                 pwl = ""
 
         pel = ""
-        if self.pdata["SPELLEXCLUDES"]:
-            pel = os.path.join(self.ppath, self.pdata["SPELLEXCLUDES"])
+        if self.__pdata["SPELLEXCLUDES"]:
+            pel = os.path.join(self.ppath, self.__pdata["SPELLEXCLUDES"])
             if not os.path.isfile(pel):
                 pel = ""
 
@@ -3702,7 +3798,7 @@
 
         @return default extension (including the dot) (string)
         """
-        lang = self.pdata["PROGLANGUAGE"]
+        lang = self.__pdata["PROGLANGUAGE"]
         if lang in ("", "Python"):
             lang = "Python3"
         return self.__sourceExtensions(lang)[0]
@@ -3778,7 +3874,7 @@
 
         @return project hash as a hex string (string)
         """
-        return self.pdata["HASH"]
+        return self.__pdata["HASH"]
 
     def getRelativePath(self, path):
         """
@@ -3835,8 +3931,8 @@
 
         @return eol string (string)
         """
-        if self.pdata["EOL"] >= 0:
-            return self.eols[self.pdata["EOL"]]
+        if self.__pdata["EOL"] >= 0:
+            return self.eols[self.__pdata["EOL"]]
         else:
             eolMode = Preferences.getEditor("EOLMode")
             if eolMode == QsciScintilla.EolMode.EolWindows:
@@ -3855,7 +3951,7 @@
 
         @return flag indicating the usage of system eol (boolean)
         """
-        return self.pdata["EOL"] == 0
+        return self.__pdata["EOL"] == 0
 
     def getProjectVersion(self):
         """
@@ -3864,7 +3960,7 @@
         @return version number
         @rtype str
         """
-        return self.pdata["VERSION"]
+        return self.__pdata["VERSION"]
 
     def getProjectAuthor(self):
         """
@@ -3873,7 +3969,7 @@
         @return author name
         @rtype str
         """
-        return self.pdata["AUTHOR"]
+        return self.__pdata["AUTHOR"]
 
     def getProjectAuthorEmail(self):
         """
@@ -3882,7 +3978,7 @@
         @return project author email
         @rtype str
         """
-        return self.pdata["EMAIL"]
+        return self.__pdata["EMAIL"]
 
     def getProjectDescription(self):
         """
@@ -3891,7 +3987,7 @@
         @return project description
         @rtype str
         """
-        return self.pdata["DESCRIPTION"]
+        return self.__pdata["DESCRIPTION"]
 
     def getProjectVenv(self, resolveDebugger=True):
         """
@@ -3906,7 +4002,7 @@
         """
         venvName = (
             self.__venvConfiguration["name"]
-            if self.pdata["EMBEDDED_VENV"] and bool(self.__venvConfiguration["name"])
+            if self.__pdata["EMBEDDED_VENV"] and bool(self.__venvConfiguration["name"])
             else self.getDebugProperty("VIRTUALENV")
         )
         if (
@@ -3931,7 +4027,7 @@
         """
         interpreter = (
             self.__venvConfiguration["interpreter"]
-            if self.pdata["EMBEDDED_VENV"]
+            if self.__pdata["EMBEDDED_VENV"]
             else ""
         )
         if not interpreter:
@@ -3954,7 +4050,7 @@
         @return executable search path prefix
         @rtype str
         """
-        if self.pdata["EMBEDDED_VENV"]:
+        if self.__pdata["EMBEDDED_VENV"]:
             execPath = self.__venvConfiguration["exec_path"]
         else:
             execPath = ""
@@ -3976,7 +4072,7 @@
         @rtype str
         """
         try:
-            return self.pdata["TESTING_FRAMEWORK"]
+            return self.__pdata["TESTING_FRAMEWORK"]
         except KeyError:
             return ""
 
@@ -3988,7 +4084,7 @@
         @rtype str
         """
         try:
-            return self.pdata["LICENSE"]
+            return self.__pdata["LICENSE"]
         except KeyError:
             return ""
 
@@ -4005,16 +4101,17 @@
         newfn = os.path.abspath(fn)
         newfn = self.getRelativePath(newfn)
         return any(
-            newfn in self.pdata[group]
-            for group in [
-                "SOURCES",
-                "FORMS",
-                "INTERFACES",
-                "PROTOCOLS",
-                "RESOURCES",
-                "TRANSLATIONS",
-                "OTHERS",
-            ]
+            newfn in self.__pdata[category]
+            for category in self.__knownFileCategories
+            ##[
+            ##"SOURCES",
+            ##"FORMS",
+            ##"INTERFACES",
+            ##"PROTOCOLS",
+            ##"RESOURCES",
+            ##"TRANSLATIONS",
+            ##"OTHERS",
+            ##]
         )
 
     def isProjectFile(self, fn):
@@ -4026,16 +4123,17 @@
         @return flag indicating membership (boolean)
         """
         return any(
-            self.__checkProjectFileGroup(fn, group)
-            for group in [
-                "SOURCES",
-                "FORMS",
-                "INTERFACES",
-                "PROTOCOLS",
-                "RESOURCES",
-                "TRANSLATIONS",
-                "OTHERS",
-            ]
+            self.__checkProjectFileGroup(fn, category)
+            for category in self.__knownFileCategories
+            ##[
+            ##"SOURCES",
+            ##"FORMS",
+            ##"INTERFACES",
+            ##"PROTOCOLS",
+            ##"RESOURCES",
+            ##"TRANSLATIONS",
+            ##"OTHERS",
+            ##]
         )
 
     def __checkProjectFileGroup(self, fn, group):
@@ -4049,25 +4147,26 @@
         """
         newfn = os.path.abspath(fn)
         newfn = self.getRelativePath(newfn)
-        if newfn in self.pdata[group] or (
+        if newfn in self.__pdata[group] or (
             group == "OTHERS"
-            and any(newfn.startswith(entry) for entry in self.pdata[group])
+            and any(newfn.startswith(entry) for entry in self.__pdata[group])
         ):
             return True
 
         if Utilities.isWindowsPlatform():
             # try the above case-insensitive
             newfn = newfn.lower()
-            if any(entry.lower() == newfn for entry in self.pdata[group]):
+            if any(entry.lower() == newfn for entry in self.__pdata[group]):
                 return True
 
             elif group == "OTHERS" and any(
-                newfn.startswith(entry.lower()) for entry in self.pdata[group]
+                newfn.startswith(entry.lower()) for entry in self.__pdata[group]
             ):
                 return True
 
         return False
 
+    # TODO: change the following methods to a more generic logix using fileCategories
     def isProjectSource(self, fn):
         """
         Public method used to check, if the passed in filename belongs to the
@@ -5392,7 +5491,7 @@
         Private method to set up the project menu.
         """
         self.menuRecentAct.setEnabled(len(self.recent) > 0)
-        self.menuEnvironmentAct.setEnabled(self.pdata["EMBEDDED_VENV"])
+        self.menuEnvironmentAct.setEnabled(self.__pdata["EMBEDDED_VENV"])
 
         self.showMenu.emit("Main", self.__menus["Main"])
 
@@ -5502,7 +5601,7 @@
 
         ignore_patterns = [
             pattern
-            for pattern, filetype in self.pdata["FILETYPES"].items()
+            for pattern, filetype in self.__pdata["FILETYPES"].items()
             if filetype == "__IGNORE__"
         ]
 
@@ -5522,8 +5621,8 @@
             except OSError:
                 newSources = []
             pattern = (
-                self.pdata["TRANSLATIONPATTERN"].replace("%language%", "*")
-                if self.pdata["TRANSLATIONPATTERN"]
+                self.__pdata["TRANSLATIONPATTERN"].replace("%language%", "*")
+                if self.__pdata["TRANSLATIONPATTERN"]
                 else "*.ts"
             )
             binpattern = self.__binaryTranslationFile(pattern)
@@ -5555,27 +5654,40 @@
 
                 filetype = ""
                 bfn = os.path.basename(fn)
-                for pattern in sorted(self.pdata["FILETYPES"].keys(), reverse=True):
+                for pattern in sorted(self.__pdata["FILETYPES"].keys(), reverse=True):
                     if fnmatch.fnmatch(bfn, pattern):
-                        filetype = self.pdata["FILETYPES"][pattern]
+                        filetype = self.__pdata["FILETYPES"][pattern]
                         break
 
                 if (
-                    (filetype == "SOURCES" and fn not in self.pdata["SOURCES"])
-                    or (filetype == "FORMS" and fn not in self.pdata["FORMS"])
-                    or (filetype == "INTERFACES" and fn not in self.pdata["INTERFACES"])
-                    or (filetype == "PROTOCOLS" and fn not in self.pdata["PROTOCOLS"])
-                    or (filetype == "RESOURCES" and fn not in self.pdata["RESOURCES"])
-                    or (filetype == "OTHERS" and fn not in self.pdata["OTHERS"])
-                    or (
-                        filetype == "TRANSLATIONS"
-                        and fn not in self.pdata["TRANSLATIONS"]
-                        and (
-                            fnmatch.fnmatch(ns, pattern)
-                            or fnmatch.fnmatch(ns, binpattern)
+                    filetype in self.__knownFileCategories
+                    and fn not in self.__pdata[filetype]
+                    and (
+                        filetype != "TRANSLATIONS"
+                        or (
+                            filetype == "TRANSLATIONS"
+                            and (
+                                fnmatch.fnmatch(ns, pattern)
+                                or fnmatch.fnmatch(ns, binpattern)
+                            )
                         )
                     )
                 ):
+                    ##(filetype == "SOURCES" and fn not in self.__pdata["SOURCES"])
+                    ##or (filetype == "FORMS" and fn not in self.__pdata["FORMS"])
+                    ##or (filetype == "INTERFACES" and fn not in self.__pdata["INTERFACES"])
+                    ##or (filetype == "PROTOCOLS" and fn not in self.__pdata["PROTOCOLS"])
+                    ##or (filetype == "RESOURCES" and fn not in self.__pdata["RESOURCES"])
+                    ##or (filetype == "OTHERS" and fn not in self.__pdata["OTHERS"])
+                    ##or (
+                    ##filetype == "TRANSLATIONS"
+                    ##and fn not in self.__pdata["TRANSLATIONS"]
+                    ##and (
+                    ##fnmatch.fnmatch(ns, pattern)
+                    ##or fnmatch.fnmatch(ns, binpattern)
+                    ##)
+                    ##)
+                    ##):
                     if autoInclude and AI:
                         self.appendFile(ns)
                     else:
@@ -5695,15 +5807,15 @@
         override = False
 
         if vcsSystem is None:
-            if self.pdata["VCS"] and self.pdata["VCS"] != "None":
-                vcsSystem = self.pdata["VCS"]
+            if self.__pdata["VCS"] and self.__pdata["VCS"] != "None":
+                vcsSystem = self.__pdata["VCS"]
         else:
             forProject = False
 
         if (
             forProject
-            and self.pdata["VCS"]
-            and self.pdata["VCS"] != "None"
+            and self.__pdata["VCS"]
+            and self.__pdata["VCS"] != "None"
             and self.pudata["VCSOVERRIDE"]
             and not nooverride
         ):
@@ -5749,7 +5861,7 @@
                     )
                 vcs = None
                 if forProject:
-                    self.pdata["VCS"] = "None"
+                    self.__pdata["VCS"] = "None"
                     self.setDirty(True)
             else:
                 vcs.vcsInitConfig(self)
@@ -5758,11 +5870,11 @@
             # set the vcs options
             if vcs.vcsSupportCommandOptions():
                 with contextlib.suppress(LookupError):
-                    vcsopt = copy.deepcopy(self.pdata["VCSOPTIONS"])
+                    vcsopt = copy.deepcopy(self.__pdata["VCSOPTIONS"])
                     vcs.vcsSetOptions(vcsopt)
             # set vcs specific data
             with contextlib.suppress(LookupError):
-                vcsother = copy.deepcopy(self.pdata["VCSOTHERDATA"])
+                vcsother = copy.deepcopy(self.__pdata["VCSOTHERDATA"])
                 vcs.vcsSetOtherData(vcsother)
 
         if forProject:
@@ -5782,7 +5894,7 @@
         """
         Public method to reset the VCS.
         """
-        self.pdata["VCS"] = "None"
+        self.__pdata["VCS"] = "None"
         self.vcs = self.initVCS()
         ericApp().getObject("PluginManager").deactivateVcsPlugins()
 
@@ -5871,7 +5983,7 @@
 
         files = [
             os.path.join(self.ppath, file)
-            for file in self.pdata["SOURCES"]
+            for file in self.__pdata["SOURCES"]
             if file.endswith(".py")
         ]
         self.codemetrics = CodeMetricsDialog()
@@ -5917,7 +6029,7 @@
 
         files = [
             os.path.join(self.ppath, file)
-            for file in self.pdata["SOURCES"]
+            for file in self.__pdata["SOURCES"]
             if os.path.splitext(file)[1].startswith(".py")
         ]
         self.codecoverage = PyCoverageDialog()
@@ -6145,16 +6257,17 @@
 
         # build the list of entries
         lst_ = []
-        for key in [
-            "SOURCES",
-            "FORMS",
-            "RESOURCES",
-            "TRANSLATIONS",
-            "INTERFACES",
-            "PROTOCOLS",
-            "OTHERS",
-        ]:
-            lst_.extend(self.pdata[key])
+        for key in self.__knownFileCategories:
+            ##[
+            ##"SOURCES",
+            ##"FORMS",
+            ##"RESOURCES",
+            ##"TRANSLATIONS",
+            ##"INTERFACES",
+            ##"PROTOCOLS",
+            ##"OTHERS",
+            ##]:
+            lst_.extend(self.__pdata[key])
         lst = []
         for entry in lst_:
             if os.path.isdir(self.getAbsolutePath(entry)):
@@ -6181,7 +6294,7 @@
 
         # write the file
         try:
-            newline = None if self.pdata["EOL"] == 0 else self.getEolString()
+            newline = None if self.__pdata["EOL"] == 0 else self.getEolString()
             with open(pkglist, "w", encoding="utf-8", newline=newline) as pkglistFile:
                 pkglistFile.write("\n".join(header) + "\n")
                 pkglistFile.write(
@@ -6200,7 +6313,7 @@
             )
             return
 
-        if "PKGLIST" not in self.pdata["OTHERS"]:
+        if "PKGLIST" not in self.__pdata["OTHERS"]:
             self.appendFile("PKGLIST")
 
     @pyqtSlot()
@@ -6210,7 +6323,7 @@
 
         @param snapshot flag indicating snapshot archives (boolean)
         """
-        if not self.pdata["MAINSCRIPT"]:
+        if not self.__pdata["MAINSCRIPT"]:
             EricMessageBox.critical(
                 self.ui,
                 self.tr("Create Plugin Archive"),
@@ -6324,7 +6437,7 @@
                 os.path.join(self.ppath, archiveName)
                 if archiveName
                 else os.path.join(
-                    self.ppath, self.pdata["MAINSCRIPT"].replace(".py", ".zip")
+                    self.ppath, self.__pdata["MAINSCRIPT"].replace(".py", ".zip")
                 )
             )
             try:
@@ -6346,16 +6459,16 @@
                 if name:
                     try:
                         self.__createZipDirEntries(os.path.split(name)[0], archiveFile)
-                        if snapshot and name == self.pdata["MAINSCRIPT"]:
+                        if snapshot and name == self.__pdata["MAINSCRIPT"]:
                             snapshotSource, version = self.__createSnapshotSource(
-                                os.path.join(self.ppath, self.pdata["MAINSCRIPT"])
+                                os.path.join(self.ppath, self.__pdata["MAINSCRIPT"])
                             )
                             archiveFile.writestr(name, snapshotSource)
                         else:
                             archiveFile.write(os.path.join(self.ppath, name), name)
-                            if name == self.pdata["MAINSCRIPT"]:
+                            if name == self.__pdata["MAINSCRIPT"]:
                                 version = self.__pluginExtractVersion(
-                                    os.path.join(self.ppath, self.pdata["MAINSCRIPT"])
+                                    os.path.join(self.ppath, self.__pdata["MAINSCRIPT"])
                                 )
                                 if archiveVersion and (
                                     self.__pluginVersionToTuple(version)
@@ -6375,7 +6488,7 @@
             archiveFile.writestr("VERSION", version.encode("utf-8"))
             archiveFile.close()
 
-            if archive not in self.pdata["OTHERS"]:
+            if archive not in self.__pdata["OTHERS"]:
                 self.appendFile(archive)
 
         progress.setValue(len(selectedLists))
@@ -6520,7 +6633,7 @@
         @return flag indicating default parameter set
         @rtype bool
         """
-        return self.pdata["MAKEPARAMS"] == {
+        return self.__pdata["MAKEPARAMS"] == {
             "MakeEnabled": False,
             "MakeExecutable": "",
             "MakeFile": "",
@@ -6536,7 +6649,7 @@
         @return flag indicating enabled make support
         @rtype bool
         """
-        return self.pdata["MAKEPARAMS"]["MakeEnabled"]
+        return self.__pdata["MAKEPARAMS"]["MakeEnabled"]
 
     @pyqtSlot()
     def executeMake(self):
@@ -6545,7 +6658,7 @@
         (execute or question).
         """
         self.__executeMake(
-            questionOnly=self.pdata["MAKEPARAMS"]["MakeTestOnly"], interactive=False
+            questionOnly=self.__pdata["MAKEPARAMS"]["MakeTestOnly"], interactive=False
         )
 
     @pyqtSlot()
@@ -6560,31 +6673,33 @@
         @type bool
         """
         if (
-            not self.pdata["MAKEPARAMS"]["MakeEnabled"]
+            not self.__pdata["MAKEPARAMS"]["MakeEnabled"]
             or self.__makeProcess is not None
         ):
             return
 
         prog = (
-            self.pdata["MAKEPARAMS"]["MakeExecutable"]
-            if self.pdata["MAKEPARAMS"]["MakeExecutable"]
+            self.__pdata["MAKEPARAMS"]["MakeExecutable"]
+            if self.__pdata["MAKEPARAMS"]["MakeExecutable"]
             else Project.DefaultMake
         )
 
         args = []
-        if self.pdata["MAKEPARAMS"]["MakeParameters"]:
+        if self.__pdata["MAKEPARAMS"]["MakeParameters"]:
             args.extend(
-                Utilities.parseOptionString(self.pdata["MAKEPARAMS"]["MakeParameters"])
+                Utilities.parseOptionString(
+                    self.__pdata["MAKEPARAMS"]["MakeParameters"]
+                )
             )
 
-        if self.pdata["MAKEPARAMS"]["MakeFile"]:
-            args.append("--makefile={0}".format(self.pdata["MAKEPARAMS"]["MakeFile"]))
+        if self.__pdata["MAKEPARAMS"]["MakeFile"]:
+            args.append("--makefile={0}".format(self.__pdata["MAKEPARAMS"]["MakeFile"]))
 
         if questionOnly:
             args.append("--question")
 
-        if self.pdata["MAKEPARAMS"]["MakeTarget"]:
-            args.append(self.pdata["MAKEPARAMS"]["MakeTarget"])
+        if self.__pdata["MAKEPARAMS"]["MakeTarget"]:
+            args.append(self.__pdata["MAKEPARAMS"]["MakeTarget"])
 
         self.__makeProcess = QProcess(self)
         self.__makeProcess.readyReadStandardOutput.connect(self.__makeReadStdOut)
@@ -6657,11 +6772,11 @@
                 # a rebuild is needed
                 title = self.tr("Test for Changes")
 
-                if self.pdata["MAKEPARAMS"]["MakeTarget"]:
+                if self.__pdata["MAKEPARAMS"]["MakeTarget"]:
                     message = self.tr(
                         """<p>There are changes that require the configured"""
                         """ make target <b>{0}</b> to be rebuilt.</p>"""
-                    ).format(self.pdata["MAKEPARAMS"]["MakeTarget"])
+                    ).format(self.__pdata["MAKEPARAMS"]["MakeTarget"])
                 else:
                     message = self.tr(
                         """<p>There are changes that require the default"""
@@ -6706,7 +6821,7 @@
         @return flag indicating default parameter set
         @rtype bool
         """
-        return self.pdata["IDLPARAMS"] == {
+        return self.__pdata["IDLPARAMS"] == {
             "IncludeDirs": [],
             "DefinedNames": [],
             "UndefinedNames": [],
@@ -6724,7 +6839,7 @@
         @return flag indicating default parameter set
         @rtype bool
         """
-        return self.pdata["UICPARAMS"] == {
+        return self.__pdata["UICPARAMS"] == {
             "Package": "",
             "RcSuffix": "",
             "PackagesRoot": "",
@@ -6739,8 +6854,8 @@
         @return value of the given parameter
         @rtype any, None in case on non-existence
         """
-        if name in self.pdata["UICPARAMS"]:
-            return self.pdata["UICPARAMS"][name]
+        if name in self.__pdata["UICPARAMS"]:
+            return self.__pdata["UICPARAMS"][name]
         else:
             return None
 
@@ -6756,7 +6871,7 @@
         @return flag indicating default parameter set
         @rtype bool
         """
-        return self.pdata["RCCPARAMS"] == self.getDefaultRccCompilerParameters()
+        return self.__pdata["RCCPARAMS"] == self.getDefaultRccCompilerParameters()
 
     def getDefaultRccCompilerParameters(self):
         """
@@ -6784,7 +6899,7 @@
         @return flag indicating default parameter
         @rtype bool
         """
-        return self.pdata["DOCSTRING"] == ""
+        return self.__pdata["DOCSTRING"] == ""
 
     def getDocstringType(self):
         """
@@ -6793,7 +6908,7 @@
         @return configured docstring style
         @rtype str
         """
-        return self.pdata["DOCSTRING"]
+        return self.__pdata["DOCSTRING"]
 
     #########################################################################
     ## Below are methods implementing the 'SBOM' support
@@ -6956,8 +7071,8 @@
         @param value flag indicating an embedded environment
         @type bool
         """
-        if value != self.pdata["EMBEDDED_VENV"]:
-            self.pdata["EMBEDDED_VENV"] = value
+        if value != self.__pdata["EMBEDDED_VENV"]:
+            self.__pdata["EMBEDDED_VENV"] = value
             self.setDirty(True)
 
     def __initVenvConfiguration(self):

eric ide

mercurial