Moved the Protobuf class browser to this plugin. release-10.1.0

Mon, 12 Dec 2022 16:55:43 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Mon, 12 Dec 2022 16:55:43 +0100
changeset 10
362689624e2d
parent 9
eb218f60e411
child 11
edece47f29a5

Moved the Protobuf class browser to this plugin.

ExtensionProtobuf/Documentation/source/Plugin_Extension_Protobuf.ExtensionProtobuf.protoclbr.html file | annotate | diff | comparison | revisions
ExtensionProtobuf/Documentation/source/Plugin_Extension_Protobuf.PluginExtensionProtobuf.html file | annotate | diff | comparison | revisions
ExtensionProtobuf/Documentation/source/index-Plugin_Extension_Protobuf.ExtensionProtobuf.html file | annotate | diff | comparison | revisions
ExtensionProtobuf/i18n/protobuf_de.qm file | annotate | diff | comparison | revisions
ExtensionProtobuf/i18n/protobuf_de.ts file | annotate | diff | comparison | revisions
ExtensionProtobuf/i18n/protobuf_empty.ts file | annotate | diff | comparison | revisions
ExtensionProtobuf/i18n/protobuf_en.ts file | annotate | diff | comparison | revisions
ExtensionProtobuf/i18n/protobuf_es.ts file | annotate | diff | comparison | revisions
ExtensionProtobuf/i18n/protobuf_ru.ts file | annotate | diff | comparison | revisions
ExtensionProtobuf/protoclbr.py file | annotate | diff | comparison | revisions
PKGLIST file | annotate | diff | comparison | revisions
PluginExtensionProtobuf.py file | annotate | diff | comparison | revisions
PluginExtensionProtobuf.zip file | annotate | diff | comparison | revisions
PluginProtobuf.epj file | annotate | diff | comparison | revisions
changelog.md file | annotate | diff | comparison | revisions
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ExtensionProtobuf/Documentation/source/Plugin_Extension_Protobuf.ExtensionProtobuf.protoclbr.html	Mon Dec 12 16:55:43 2022 +0100
@@ -0,0 +1,465 @@
+<!DOCTYPE html>
+<html><head>
+<title>Plugin_Extension_Protobuf.ExtensionProtobuf.protoclbr</title>
+<meta charset="UTF-8">
+<link rel="stylesheet" href="styles.css">
+</head>
+<body>
+<a NAME="top" ID="top"></a>
+<h1>Plugin_Extension_Protobuf.ExtensionProtobuf.protoclbr</h1>
+
+<p>
+Parse a ProtoBuf protocol file and retrieve messages, enums, services and
+rpc methods.
+</p>
+<p>
+It is based on the Python class browser found in this package.
+</p>
+<h3>Global Attributes</h3>
+
+<table>
+<tr><td>_commentsub</td></tr><tr><td>_getnext</td></tr><tr><td>_normalize</td></tr>
+</table>
+<h3>Classes</h3>
+
+<table>
+
+<tr>
+<td><a href="#Enum">Enum</a></td>
+<td>Class to represent a ProtoBuf Enum.</td>
+</tr>
+<tr>
+<td><a href="#Message">Message</a></td>
+<td>Class to represent a ProtoBuf Message.</td>
+</tr>
+<tr>
+<td><a href="#Service">Service</a></td>
+<td>Class to represent a ProtoBuf Service.</td>
+</tr>
+<tr>
+<td><a href="#ServiceMethod">ServiceMethod</a></td>
+<td>Class to represent a ProtoBuf Service Method.</td>
+</tr>
+<tr>
+<td><a href="#VisibilityMixin">VisibilityMixin</a></td>
+<td>Mixin class implementing the notion of visibility.</td>
+</tr>
+</table>
+<h3>Functions</h3>
+
+<table>
+
+<tr>
+<td><a href="#calculateEndline">calculateEndline</a></td>
+<td>Function to calculate the end line.</td>
+</tr>
+<tr>
+<td><a href="#readmodule_ex">readmodule_ex</a></td>
+<td>Read a ProtoBuf protocol file and return a dictionary of messages, enums, services and rpc methods.</td>
+</tr>
+<tr>
+<td><a href="#scan">scan</a></td>
+<td>Public method to scan the given source text.</td>
+</tr>
+</table>
+<hr />
+<hr />
+<a NAME="Enum" ID="Enum"></a>
+<h2>Enum</h2>
+
+<p>
+    Class to represent a ProtoBuf Enum.
+</p>
+<h3>Derived from</h3>
+ClbrBaseClasses.Enum, VisibilityMixin
+<h3>Class Attributes</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Class Methods</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Methods</h3>
+
+<table>
+
+<tr>
+<td><a href="#Enum.__init__">Enum</a></td>
+<td>Constructor</td>
+</tr>
+</table>
+<h3>Static Methods</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+
+<a NAME="Enum.__init__" ID="Enum.__init__"></a>
+<h4>Enum (Constructor)</h4>
+<b>Enum</b>(<i>module, name, file, lineno</i>)
+
+<p>
+        Constructor
+</p>
+<dl>
+
+<dt><i>module</i> (str)</dt>
+<dd>
+name of the module containing this enum
+</dd>
+<dt><i>name</i> (str)</dt>
+<dd>
+name of this enum
+</dd>
+<dt><i>file</i> (str)</dt>
+<dd>
+filename containing this enum
+</dd>
+<dt><i>lineno</i> (int)</dt>
+<dd>
+linenumber of the message enum
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr />
+<hr />
+<a NAME="Message" ID="Message"></a>
+<h2>Message</h2>
+
+<p>
+    Class to represent a ProtoBuf Message.
+</p>
+<h3>Derived from</h3>
+ClbrBaseClasses.Module, VisibilityMixin
+<h3>Class Attributes</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Class Methods</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Methods</h3>
+
+<table>
+
+<tr>
+<td><a href="#Message.__init__">Message</a></td>
+<td>Constructor</td>
+</tr>
+</table>
+<h3>Static Methods</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+
+<a NAME="Message.__init__" ID="Message.__init__"></a>
+<h4>Message (Constructor)</h4>
+<b>Message</b>(<i>module, name, file, lineno</i>)
+
+<p>
+        Constructor
+</p>
+<dl>
+
+<dt><i>module</i> (str)</dt>
+<dd>
+name of the module containing this message
+</dd>
+<dt><i>name</i> (str)</dt>
+<dd>
+name of this message
+</dd>
+<dt><i>file</i> (str)</dt>
+<dd>
+filename containing this message
+</dd>
+<dt><i>lineno</i> (int)</dt>
+<dd>
+linenumber of the message definition
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr />
+<hr />
+<a NAME="Service" ID="Service"></a>
+<h2>Service</h2>
+
+<p>
+    Class to represent a ProtoBuf Service.
+</p>
+<h3>Derived from</h3>
+ClbrBaseClasses.Class, VisibilityMixin
+<h3>Class Attributes</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Class Methods</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Methods</h3>
+
+<table>
+
+<tr>
+<td><a href="#Service.__init__">Service</a></td>
+<td>Constructor</td>
+</tr>
+</table>
+<h3>Static Methods</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+
+<a NAME="Service.__init__" ID="Service.__init__"></a>
+<h4>Service (Constructor)</h4>
+<b>Service</b>(<i>module, name, file, lineno</i>)
+
+<p>
+        Constructor
+</p>
+<dl>
+
+<dt><i>module</i> (str)</dt>
+<dd>
+name of the module containing this service
+</dd>
+<dt><i>name</i> (str)</dt>
+<dd>
+name of this service
+</dd>
+<dt><i>file</i> (str)</dt>
+<dd>
+filename containing this service
+</dd>
+<dt><i>lineno</i> (int)</dt>
+<dd>
+linenumber of the service definition
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr />
+<hr />
+<a NAME="ServiceMethod" ID="ServiceMethod"></a>
+<h2>ServiceMethod</h2>
+
+<p>
+    Class to represent a ProtoBuf Service Method.
+</p>
+<h3>Derived from</h3>
+ClbrBaseClasses.Function, VisibilityMixin
+<h3>Class Attributes</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Class Methods</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Methods</h3>
+
+<table>
+
+<tr>
+<td><a href="#ServiceMethod.__init__">ServiceMethod</a></td>
+<td>Constructor</td>
+</tr>
+</table>
+<h3>Static Methods</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+
+<a NAME="ServiceMethod.__init__" ID="ServiceMethod.__init__"></a>
+<h4>ServiceMethod (Constructor)</h4>
+<b>ServiceMethod</b>(<i>name, file, lineno, signature, returns</i>)
+
+<p>
+        Constructor
+</p>
+<dl>
+
+<dt><i>name</i> (str)</dt>
+<dd>
+name of this service method
+</dd>
+<dt><i>file</i> (str)</dt>
+<dd>
+filename containing this service method
+</dd>
+<dt><i>lineno</i> (int)</dt>
+<dd>
+linenumber of the service method definition
+</dd>
+<dt><i>signature</i> (str)</dt>
+<dd>
+parameter list of the service method
+</dd>
+<dt><i>returns</i> (str)</dt>
+<dd>
+return type of the service method
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr />
+<hr />
+<a NAME="VisibilityMixin" ID="VisibilityMixin"></a>
+<h2>VisibilityMixin</h2>
+
+<p>
+    Mixin class implementing the notion of visibility.
+</p>
+<h3>Derived from</h3>
+ClbrBaseClasses.ClbrVisibilityMixinBase
+<h3>Class Attributes</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Class Methods</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Methods</h3>
+
+<table>
+
+<tr>
+<td><a href="#VisibilityMixin.__init__">VisibilityMixin</a></td>
+<td>Constructor</td>
+</tr>
+</table>
+<h3>Static Methods</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+
+<a NAME="VisibilityMixin.__init__" ID="VisibilityMixin.__init__"></a>
+<h4>VisibilityMixin (Constructor)</h4>
+<b>VisibilityMixin</b>(<i></i>)
+
+<p>
+        Constructor
+</p>
+<div align="right"><a href="#top">Up</a></div>
+<hr />
+<hr />
+<a NAME="calculateEndline" ID="calculateEndline"></a>
+<h2>calculateEndline</h2>
+<b>calculateEndline</b>(<i>lineno, lines</i>)
+
+<p>
+        Function to calculate the end line.
+</p>
+<dl>
+
+<dt><i>lineno</i> (int)</dt>
+<dd>
+line number to start at (one based)
+</dd>
+<dt><i>lines</i> (list of str)</dt>
+<dd>
+list of source lines
+</dd>
+</dl>
+<dl>
+<dt>Return:</dt>
+<dd>
+end line (one based)
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+int
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr />
+<hr />
+<a NAME="readmodule_ex" ID="readmodule_ex"></a>
+<h2>readmodule_ex</h2>
+<b>readmodule_ex</b>(<i>module, path=None</i>)
+
+<p>
+    Read a ProtoBuf protocol file and return a dictionary of messages, enums,
+    services and rpc methods.
+</p>
+<dl>
+
+<dt><i>module</i> (str)</dt>
+<dd>
+name of the ProtoBuf protocol file
+</dd>
+<dt><i>path</i> (list of str)</dt>
+<dd>
+path the file should be searched in
+</dd>
+</dl>
+<dl>
+<dt>Return:</dt>
+<dd>
+the resulting dictionary
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+dict
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr />
+<hr />
+<a NAME="scan" ID="scan"></a>
+<h2>scan</h2>
+<b>scan</b>(<i>src, file, module</i>)
+
+<p>
+    Public method to scan the given source text.
+</p>
+<dl>
+
+<dt><i>src</i> (str)</dt>
+<dd>
+source text to be scanned
+</dd>
+<dt><i>file</i> (str)</dt>
+<dd>
+file name associated with the source text
+</dd>
+<dt><i>module</i> (str)</dt>
+<dd>
+module name associated with the source text
+</dd>
+</dl>
+<dl>
+<dt>Return:</dt>
+<dd>
+dictionary containing the extracted data
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+dict
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr />
+</body></html>
\ No newline at end of file
--- a/ExtensionProtobuf/Documentation/source/Plugin_Extension_Protobuf.PluginExtensionProtobuf.html	Sun Dec 11 11:52:17 2022 +0100
+++ b/ExtensionProtobuf/Documentation/source/Plugin_Extension_Protobuf.PluginExtensionProtobuf.html	Mon Dec 12 16:55:43 2022 +0100
@@ -95,6 +95,14 @@
 <td>Public method to deactivate this plug-in.</td>
 </tr>
 <tr>
+<td><a href="#ProtobufExtensionPlugin.getFileIcon">getFileIcon</a></td>
+<td>Public method to get the name of a file icon.</td>
+</tr>
+<tr>
+<td><a href="#ProtobufExtensionPlugin.getLexer">getLexer</a></td>
+<td>Public method to instantiate a Pygments Protocol Buffer lexer object.</td>
+</tr>
+<tr>
 <td><a href="#ProtobufExtensionPlugin.getPreferences">getPreferences</a></td>
 <td>Public method to retrieve the various settings values.</td>
 </tr>
@@ -163,6 +171,58 @@
 <p>
         Public method to deactivate this plug-in.
 </p>
+<a NAME="ProtobufExtensionPlugin.getFileIcon" ID="ProtobufExtensionPlugin.getFileIcon"></a>
+<h4>ProtobufExtensionPlugin.getFileIcon</h4>
+<b>getFileIcon</b>(<i>filename=""</i>)
+
+<p>
+        Public method to get the name of a file icon.
+</p>
+<dl>
+
+<dt><i>filename</i> (str (optional))</dt>
+<dd>
+file name (defaults to "")
+</dd>
+</dl>
+<dl>
+<dt>Return:</dt>
+<dd>
+name of a file icon
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+str
+</dd>
+</dl>
+<a NAME="ProtobufExtensionPlugin.getLexer" ID="ProtobufExtensionPlugin.getLexer"></a>
+<h4>ProtobufExtensionPlugin.getLexer</h4>
+<b>getLexer</b>(<i>parent=None</i>)
+
+<p>
+        Public method to instantiate a Pygments Protocol Buffer lexer object.
+</p>
+<dl>
+
+<dt><i>parent</i> (QObject)</dt>
+<dd>
+reference to the parent object
+</dd>
+</dl>
+<dl>
+<dt>Return:</dt>
+<dd>
+reference to the instanciated lexer object
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+QsciLexer
+</dd>
+</dl>
 <a NAME="ProtobufExtensionPlugin.getPreferences" ID="ProtobufExtensionPlugin.getPreferences"></a>
 <h4>ProtobufExtensionPlugin.getPreferences</h4>
 <b>getPreferences</b>(<i>key</i>)
--- a/ExtensionProtobuf/Documentation/source/index-Plugin_Extension_Protobuf.ExtensionProtobuf.html	Sun Dec 11 11:52:17 2022 +0100
+++ b/ExtensionProtobuf/Documentation/source/index-Plugin_Extension_Protobuf.ExtensionProtobuf.html	Mon Dec 12 16:55:43 2022 +0100
@@ -27,5 +27,9 @@
 <td><a href="Plugin_Extension_Protobuf.ExtensionProtobuf.ProjectProtocolsBrowser.html">ProjectProtocolsBrowser</a></td>
 <td>Module implementing the a class used to display the protocols (protobuf) part of the project.</td>
 </tr>
+<tr>
+<td><a href="Plugin_Extension_Protobuf.ExtensionProtobuf.protoclbr.html">protoclbr</a></td>
+<td>Parse a ProtoBuf protocol file and retrieve messages, enums, services and rpc methods.</td>
+</tr>
 </table>
 </body></html>
\ No newline at end of file
Binary file ExtensionProtobuf/i18n/protobuf_de.qm has changed
--- a/ExtensionProtobuf/i18n/protobuf_de.ts	Sun Dec 11 11:52:17 2022 +0100
+++ b/ExtensionProtobuf/i18n/protobuf_de.ts	Mon Dec 12 16:55:43 2022 +0100
@@ -1,334 +1,345 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE TS>
 <TS version="2.1" language="de_DE">
-<context>
+  <context>
     <name>ProjectProtocolsBrowser</name>
     <message>
-        <location filename="../ProjectProtocolsBrowser.py" line="79"/>
-        <source>Protocols (protobuf)</source>
-        <translation>Protokolle (protobuf)</translation>
+      <location filename="../ProjectProtocolsBrowser.py" line="79" />
+      <source>Protocols (protobuf)</source>
+      <translation>Protokolle (protobuf)</translation>
     </message>
     <message>
-        <location filename="../ProjectProtocolsBrowser.py" line="82"/>
-        <source>&lt;b&gt;Project Protocols Browser&lt;/b&gt;&lt;p&gt;This allows to easily see all protocols (protobuf files) contained in the current project. Several actions can be executed via the context menu.&lt;/p&gt;</source>
-        <translation>&lt;b&gt;Projektprotokollebrowser&lt;/b&gt;&lt;p&gt;Dies bietet eine Übersicht aller im Projekt enthaltenen Protokolle (protobuf Dateien) an. Verschieden Aktionen können über das Kontextmenü ausgeführt werden.&lt;/p&gt;</translation>
+      <location filename="../ProjectProtocolsBrowser.py" line="82" />
+      <source>&lt;b&gt;Project Protocols Browser&lt;/b&gt;&lt;p&gt;This allows to easily see all protocols (protobuf files) contained in the current project. Several actions can be executed via the context menu.&lt;/p&gt;</source>
+      <translation>&lt;b&gt;Projektprotokollebrowser&lt;/b&gt;&lt;p&gt;Dies bietet eine Übersicht aller im Projekt enthaltenen Protokolle (protobuf Dateien) an. Verschieden Aktionen können über das Kontextmenü ausgeführt werden.&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../ProjectProtocolsBrowser.py" line="96"/>
-        <source>Protobuf Files ({0})</source>
-        <translation>Protobuf Dateien ({0})</translation>
+      <location filename="../ProjectProtocolsBrowser.py" line="96" />
+      <source>Protobuf Files ({0})</source>
+      <translation>Protobuf Dateien ({0})</translation>
     </message>
     <message>
-        <location filename="../ProjectProtocolsBrowser.py" line="98"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="97"/>
-        <source>Protobuf Files</source>
-        <translation>Protobuf Dateien</translation>
+      <location filename="../ProjectProtocolsBrowser.py" line="98" />
+      <location filename="../ProjectProtocolsBrowser.py" line="97" />
+      <source>Protobuf Files</source>
+      <translation>Protobuf Dateien</translation>
     </message>
     <message>
-        <location filename="../ProjectProtocolsBrowser.py" line="108"/>
-        <source>Protocols (protobuf) Browser</source>
-        <translation>Protokollebrowser (protobuf)</translation>
+      <location filename="../ProjectProtocolsBrowser.py" line="108" />
+      <source>Protocols (protobuf) Browser</source>
+      <translation>Protokollebrowser (protobuf)</translation>
     </message>
     <message>
-        <location filename="../ProjectProtocolsBrowser.py" line="236"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="188"/>
-        <source>Compile protocol</source>
-        <translation>Protokoll übersetzen</translation>
+      <location filename="../ProjectProtocolsBrowser.py" line="236" />
+      <location filename="../ProjectProtocolsBrowser.py" line="188" />
+      <source>Compile protocol</source>
+      <translation>Protokoll übersetzen</translation>
     </message>
     <message>
-        <location filename="../ProjectProtocolsBrowser.py" line="357"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="325"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="266"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="238"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="190"/>
-        <source>Compile all protocols</source>
-        <translation>Alle Protokolle übersetzen</translation>
+      <location filename="../ProjectProtocolsBrowser.py" line="357" />
+      <location filename="../ProjectProtocolsBrowser.py" line="325" />
+      <location filename="../ProjectProtocolsBrowser.py" line="266" />
+      <location filename="../ProjectProtocolsBrowser.py" line="238" />
+      <location filename="../ProjectProtocolsBrowser.py" line="190" />
+      <source>Compile all protocols</source>
+      <translation>Alle Protokolle übersetzen</translation>
     </message>
     <message>
-        <location filename="../ProjectProtocolsBrowser.py" line="242"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="194"/>
-        <source>Compile protocol as gRPC</source>
-        <translation>Protokoll als gRPC übersetzen</translation>
+      <location filename="../ProjectProtocolsBrowser.py" line="242" />
+      <location filename="../ProjectProtocolsBrowser.py" line="194" />
+      <source>Compile protocol as gRPC</source>
+      <translation>Protokoll als gRPC übersetzen</translation>
     </message>
     <message>
-        <location filename="../ProjectProtocolsBrowser.py" line="361"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="329"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="270"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="246"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="198"/>
-        <source>Compile all protocols as gRPC</source>
-        <translation>Alle Protokolle als gRPC übersetzen</translation>
+      <location filename="../ProjectProtocolsBrowser.py" line="361" />
+      <location filename="../ProjectProtocolsBrowser.py" line="329" />
+      <location filename="../ProjectProtocolsBrowser.py" line="270" />
+      <location filename="../ProjectProtocolsBrowser.py" line="246" />
+      <location filename="../ProjectProtocolsBrowser.py" line="198" />
+      <source>Compile all protocols as gRPC</source>
+      <translation>Alle Protokolle als gRPC übersetzen</translation>
     </message>
     <message>
-        <location filename="../ProjectProtocolsBrowser.py" line="305"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="250"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="202"/>
-        <source>Open</source>
-        <translation>Öffnen</translation>
+      <location filename="../ProjectProtocolsBrowser.py" line="305" />
+      <location filename="../ProjectProtocolsBrowser.py" line="250" />
+      <location filename="../ProjectProtocolsBrowser.py" line="202" />
+      <source>Open</source>
+      <translation>Öffnen</translation>
     </message>
     <message>
-        <location filename="../ProjectProtocolsBrowser.py" line="204"/>
-        <source>Rename file</source>
-        <translation>Datei umbenennen</translation>
+      <location filename="../ProjectProtocolsBrowser.py" line="204" />
+      <source>Rename file</source>
+      <translation>Datei umbenennen</translation>
     </message>
     <message>
-        <location filename="../ProjectProtocolsBrowser.py" line="332"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="307"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="207"/>
-        <source>Remove from project</source>
-        <translation>Aus dem Projekt entfernen</translation>
+      <location filename="../ProjectProtocolsBrowser.py" line="332" />
+      <location filename="../ProjectProtocolsBrowser.py" line="307" />
+      <location filename="../ProjectProtocolsBrowser.py" line="207" />
+      <source>Remove from project</source>
+      <translation>Aus dem Projekt entfernen</translation>
     </message>
     <message>
-        <location filename="../ProjectProtocolsBrowser.py" line="334"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="309"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="210"/>
-        <source>Delete</source>
-        <translation>Löschen</translation>
+      <location filename="../ProjectProtocolsBrowser.py" line="334" />
+      <location filename="../ProjectProtocolsBrowser.py" line="309" />
+      <location filename="../ProjectProtocolsBrowser.py" line="210" />
+      <source>Delete</source>
+      <translation>Löschen</translation>
     </message>
     <message>
-        <location filename="../ProjectProtocolsBrowser.py" line="365"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="337"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="275"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="252"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="213"/>
-        <source>Add protocols...</source>
-        <translation>Protokolle hinzufügen...</translation>
+      <location filename="../ProjectProtocolsBrowser.py" line="365" />
+      <location filename="../ProjectProtocolsBrowser.py" line="337" />
+      <location filename="../ProjectProtocolsBrowser.py" line="275" />
+      <location filename="../ProjectProtocolsBrowser.py" line="252" />
+      <location filename="../ProjectProtocolsBrowser.py" line="213" />
+      <source>Add protocols...</source>
+      <translation>Protokolle hinzufügen...</translation>
     </message>
     <message>
-        <location filename="../ProjectProtocolsBrowser.py" line="368"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="339"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="278"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="254"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="215"/>
-        <source>Add protocols directory...</source>
-        <translation>Protokolleverzeichnis hinzufügen...</translation>
+      <location filename="../ProjectProtocolsBrowser.py" line="368" />
+      <location filename="../ProjectProtocolsBrowser.py" line="339" />
+      <location filename="../ProjectProtocolsBrowser.py" line="278" />
+      <location filename="../ProjectProtocolsBrowser.py" line="254" />
+      <location filename="../ProjectProtocolsBrowser.py" line="215" />
+      <source>Add protocols directory...</source>
+      <translation>Protokolleverzeichnis hinzufügen...</translation>
     </message>
     <message>
-        <location filename="../ProjectProtocolsBrowser.py" line="342"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="219"/>
-        <source>Copy Path to Clipboard</source>
-        <translation>Pfad in die Zwischenablage kopieren</translation>
+      <location filename="../ProjectProtocolsBrowser.py" line="342" />
+      <location filename="../ProjectProtocolsBrowser.py" line="219" />
+      <source>Copy Path to Clipboard</source>
+      <translation>Pfad in die Zwischenablage kopieren</translation>
     </message>
     <message>
-        <location filename="../ProjectProtocolsBrowser.py" line="373"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="344"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="312"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="282"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="257"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="223"/>
-        <source>Expand all directories</source>
-        <translation>Alle Verzeichnisse aufklappen</translation>
+      <location filename="../ProjectProtocolsBrowser.py" line="373" />
+      <location filename="../ProjectProtocolsBrowser.py" line="344" />
+      <location filename="../ProjectProtocolsBrowser.py" line="312" />
+      <location filename="../ProjectProtocolsBrowser.py" line="282" />
+      <location filename="../ProjectProtocolsBrowser.py" line="257" />
+      <location filename="../ProjectProtocolsBrowser.py" line="223" />
+      <source>Expand all directories</source>
+      <translation>Alle Verzeichnisse aufklappen</translation>
     </message>
     <message>
-        <location filename="../ProjectProtocolsBrowser.py" line="376"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="346"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="314"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="284"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="258"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="226"/>
-        <source>Collapse all directories</source>
-        <translation>Alle Verzeichnisse einklappen</translation>
+      <location filename="../ProjectProtocolsBrowser.py" line="376" />
+      <location filename="../ProjectProtocolsBrowser.py" line="346" />
+      <location filename="../ProjectProtocolsBrowser.py" line="314" />
+      <location filename="../ProjectProtocolsBrowser.py" line="284" />
+      <location filename="../ProjectProtocolsBrowser.py" line="258" />
+      <location filename="../ProjectProtocolsBrowser.py" line="226" />
+      <source>Collapse all directories</source>
+      <translation>Alle Verzeichnisse einklappen</translation>
     </message>
     <message>
-        <location filename="../ProjectProtocolsBrowser.py" line="379"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="348"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="316"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="286"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="259"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="228"/>
-        <source>Collapse all files</source>
-        <translation>Alle Dateien einklappen</translation>
+      <location filename="../ProjectProtocolsBrowser.py" line="379" />
+      <location filename="../ProjectProtocolsBrowser.py" line="348" />
+      <location filename="../ProjectProtocolsBrowser.py" line="316" />
+      <location filename="../ProjectProtocolsBrowser.py" line="286" />
+      <location filename="../ProjectProtocolsBrowser.py" line="259" />
+      <location filename="../ProjectProtocolsBrowser.py" line="228" />
+      <source>Collapse all files</source>
+      <translation>Alle Dateien einklappen</translation>
     </message>
     <message>
-        <location filename="../ProjectProtocolsBrowser.py" line="382"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="350"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="318"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="288"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="261"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="230"/>
-        <source>Configure...</source>
-        <translation>Einstellungen...</translation>
+      <location filename="../ProjectProtocolsBrowser.py" line="382" />
+      <location filename="../ProjectProtocolsBrowser.py" line="350" />
+      <location filename="../ProjectProtocolsBrowser.py" line="318" />
+      <location filename="../ProjectProtocolsBrowser.py" line="288" />
+      <location filename="../ProjectProtocolsBrowser.py" line="261" />
+      <location filename="../ProjectProtocolsBrowser.py" line="230" />
+      <source>Configure...</source>
+      <translation>Einstellungen...</translation>
     </message>
     <message>
-        <location filename="../ProjectProtocolsBrowser.py" line="384"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="352"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="320"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="290"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="262"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="232"/>
-        <source>Configure Protobuf...</source>
-        <translation>Protobuf-Einstellungen...</translation>
+      <location filename="../ProjectProtocolsBrowser.py" line="384" />
+      <location filename="../ProjectProtocolsBrowser.py" line="352" />
+      <location filename="../ProjectProtocolsBrowser.py" line="320" />
+      <location filename="../ProjectProtocolsBrowser.py" line="290" />
+      <location filename="../ProjectProtocolsBrowser.py" line="262" />
+      <location filename="../ProjectProtocolsBrowser.py" line="232" />
+      <source>Configure Protobuf...</source>
+      <translation>Protobuf-Einstellungen...</translation>
     </message>
     <message>
-        <location filename="../ProjectProtocolsBrowser.py" line="297"/>
-        <source>Compile protocols</source>
-        <translation>Protokolle übersetzen</translation>
+      <location filename="../ProjectProtocolsBrowser.py" line="297" />
+      <source>Compile protocols</source>
+      <translation>Protokolle übersetzen</translation>
+    </message>
+    <message>
+      <location filename="../ProjectProtocolsBrowser.py" line="301" />
+      <source>Compile protocols as gRPC</source>
+      <translation>Protokolle als gRPC übersetzen</translation>
     </message>
     <message>
-        <location filename="../ProjectProtocolsBrowser.py" line="301"/>
-        <source>Compile protocols as gRPC</source>
-        <translation>Protokolle als gRPC übersetzen</translation>
+      <location filename="../ProjectProtocolsBrowser.py" line="571" />
+      <source>Delete Protocols</source>
+      <translation>Protokolle löschen</translation>
     </message>
     <message>
-        <location filename="../ProjectProtocolsBrowser.py" line="571"/>
-        <source>Delete Protocols</source>
-        <translation>Protokolle löschen</translation>
+      <location filename="../ProjectProtocolsBrowser.py" line="572" />
+      <source>Do you really want to delete these protocol files from the project?</source>
+      <translation>Wollen Sie wirklich diese Protokolldateien aus dem Projekt löschen?</translation>
     </message>
     <message>
-        <location filename="../ProjectProtocolsBrowser.py" line="572"/>
-        <source>Do you really want to delete these protocol files from the project?</source>
-        <translation>Wollen Sie wirklich diese Protokolldateien aus dem Projekt löschen?</translation>
+      <location filename="../ProjectProtocolsBrowser.py" line="688" />
+      <location filename="../ProjectProtocolsBrowser.py" line="674" />
+      <source>Protocol Compilation</source>
+      <translation>Protokollübersetzung</translation>
     </message>
     <message>
-        <location filename="../ProjectProtocolsBrowser.py" line="688"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="674"/>
-        <source>Protocol Compilation</source>
-        <translation>Protokollübersetzung</translation>
+      <location filename="../ProjectProtocolsBrowser.py" line="675" />
+      <source>The compilation of the protocol file was successful.</source>
+      <translation>Die Übersetzung der Protokolldatei war erfolgreich.</translation>
     </message>
     <message>
-        <location filename="../ProjectProtocolsBrowser.py" line="675"/>
-        <source>The compilation of the protocol file was successful.</source>
-        <translation>Die Übersetzung der Protokolldatei war erfolgreich.</translation>
+      <location filename="../ProjectProtocolsBrowser.py" line="689" />
+      <source>The compilation of the protocol file failed.</source>
+      <translation>Die Übersetzung der Protokolldatei ist fehlgeschlagen.</translation>
     </message>
     <message>
-        <location filename="../ProjectProtocolsBrowser.py" line="689"/>
-        <source>The compilation of the protocol file failed.</source>
-        <translation>Die Übersetzung der Protokolldatei ist fehlgeschlagen.</translation>
+      <location filename="../ProjectProtocolsBrowser.py" line="743" />
+      <source>Process Generation Error</source>
+      <translation>Fehler beim Prozessstart</translation>
     </message>
     <message>
-        <location filename="../ProjectProtocolsBrowser.py" line="743"/>
-        <source>Process Generation Error</source>
-        <translation>Fehler beim Prozessstart</translation>
+      <location filename="../ProjectProtocolsBrowser.py" line="744" />
+      <source>&lt;p&gt;Could not start {0}.&lt;br&gt;Ensure that it is in the search path.&lt;/p&gt;</source>
+      <translation>&lt;p&gt;{0} konnte nicht gestartet werden.&lt;br&gt;Stellen Sie sicher, dass es über den Suchpfad verfügbar ist.&lt;/p&gt;</translation>
     </message>
     <message>
-        <location filename="../ProjectProtocolsBrowser.py" line="744"/>
-        <source>&lt;p&gt;Could not start {0}.&lt;br&gt;Ensure that it is in the search path.&lt;/p&gt;</source>
-        <translation>&lt;p&gt;{0} konnte nicht gestartet werden.&lt;br&gt;Stellen Sie sicher, dass es über den Suchpfad verfügbar ist.&lt;/p&gt;</translation>
+      <location filename="../ProjectProtocolsBrowser.py" line="753" />
+      <source>Compiler Invalid</source>
+      <translation>Compiler ungültig</translation>
     </message>
     <message>
-        <location filename="../ProjectProtocolsBrowser.py" line="753"/>
-        <source>Compiler Invalid</source>
-        <translation>Compiler ungültig</translation>
+      <location filename="../ProjectProtocolsBrowser.py" line="754" />
+      <source>The configured compiler is invalid.</source>
+      <translation>Der konfigurierte Compiler ist ungültig.</translation>
     </message>
     <message>
-        <location filename="../ProjectProtocolsBrowser.py" line="754"/>
-        <source>The configured compiler is invalid.</source>
-        <translation>Der konfigurierte Compiler ist ungültig.</translation>
+      <location filename="../ProjectProtocolsBrowser.py" line="818" />
+      <location filename="../ProjectProtocolsBrowser.py" line="781" />
+      <source>Compiling Protocols...</source>
+      <translation>Protokolle übersetzen...</translation>
     </message>
     <message>
-        <location filename="../ProjectProtocolsBrowser.py" line="818"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="781"/>
-        <source>Compiling Protocols...</source>
-        <translation>Protokolle übersetzen...</translation>
+      <location filename="../ProjectProtocolsBrowser.py" line="819" />
+      <location filename="../ProjectProtocolsBrowser.py" line="782" />
+      <source>Abort</source>
+      <translation>Abbruch</translation>
     </message>
     <message>
-        <location filename="../ProjectProtocolsBrowser.py" line="819"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="782"/>
-        <source>Abort</source>
-        <translation>Abbruch</translation>
-    </message>
-    <message>
-        <location filename="../ProjectProtocolsBrowser.py" line="822"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="785"/>
-        <source>%v/%m Protocols</source>
-        <translation>%v/%m Protokolle</translation>
+      <location filename="../ProjectProtocolsBrowser.py" line="822" />
+      <location filename="../ProjectProtocolsBrowser.py" line="785" />
+      <source>%v/%m Protocols</source>
+      <translation>%v/%m Protokolle</translation>
     </message>
     <message>
-        <location filename="../ProjectProtocolsBrowser.py" line="827"/>
-        <location filename="../ProjectProtocolsBrowser.py" line="790"/>
-        <source>Protocols</source>
-        <translation>Protokolle</translation>
+      <location filename="../ProjectProtocolsBrowser.py" line="827" />
+      <location filename="../ProjectProtocolsBrowser.py" line="790" />
+      <source>Protocols</source>
+      <translation>Protokolle</translation>
     </message>
-</context>
-<context>
+  </context>
+  <context>
     <name>ProtobufExtensionPlugin</name>
     <message>
-        <location filename="../../PluginExtensionProtobuf.py" line="73"/>
-        <location filename="../../PluginExtensionProtobuf.py" line="55"/>
-        <source>Protobuf Compiler</source>
-        <translation>Protobuf Compiler</translation>
+      <location filename="../../PluginExtensionProtobuf.py" line="74" />
+      <location filename="../../PluginExtensionProtobuf.py" line="56" />
+      <source>Protobuf Compiler</source>
+      <translation>Protobuf Compiler</translation>
+    </message>
+    <message>
+      <location filename="../../PluginExtensionProtobuf.py" line="94" />
+      <location filename="../../PluginExtensionProtobuf.py" line="59" />
+      <source>Protobuf and gRPC Support plugin is not activated</source>
+      <translation>Das Protobuf und gRPC Plugin ist nicht aktiviert</translation>
     </message>
     <message>
-        <location filename="../../PluginExtensionProtobuf.py" line="93"/>
-        <location filename="../../PluginExtensionProtobuf.py" line="58"/>
-        <source>Protobuf and gRPC Support plugin is not activated</source>
-        <translation>Das Protobuf und gRPC Plugin ist nicht aktiviert</translation>
+      <location filename="../../PluginExtensionProtobuf.py" line="98" />
+      <location filename="../../PluginExtensionProtobuf.py" line="63" />
+      <source>(inactive)</source>
+      <translation>(inaktiv)</translation>
     </message>
     <message>
-        <location filename="../../PluginExtensionProtobuf.py" line="97"/>
-        <location filename="../../PluginExtensionProtobuf.py" line="62"/>
-        <source>(inactive)</source>
-        <translation>(inaktiv)</translation>
-    </message>
-    <message>
-        <location filename="../../PluginExtensionProtobuf.py" line="111"/>
-        <location filename="../../PluginExtensionProtobuf.py" line="90"/>
-        <source>gRPC Compiler</source>
-        <translation>gRPC Compiler</translation>
+      <location filename="../../PluginExtensionProtobuf.py" line="112" />
+      <location filename="../../PluginExtensionProtobuf.py" line="91" />
+      <source>gRPC Compiler</source>
+      <translation>gRPC Compiler</translation>
     </message>
     <message>
-        <location filename="../../PluginExtensionProtobuf.py" line="136"/>
-        <source>Protobuf and gRPC</source>
-        <translation>Protobuf und gRPC</translation>
+      <location filename="../../PluginExtensionProtobuf.py" line="137" />
+      <source>Protobuf and gRPC</source>
+      <translation>Protobuf und gRPC</translation>
     </message>
     <message>
-        <location filename="../../PluginExtensionProtobuf.py" line="225"/>
-        <source>Protobuf and gRPC Extension</source>
-        <translation>Protobuf und gRPC Erweiterung</translation>
+      <location filename="../../PluginExtensionProtobuf.py" line="227" />
+      <source>Protocol Buffer (protobuf)</source>
+      <translation>Protokoll-Puffer (protobuf)</translation>
     </message>
     <message>
-        <location filename="../../PluginExtensionProtobuf.py" line="231"/>
-        <location filename="../../PluginExtensionProtobuf.py" line="226"/>
-        <source>The Protobuf and gRPC extension cannot be activated because it requires eric7 23.1 or newer.</source>
-        <translation>Die Protobuf und gRPC Erweiterung kann nicht aktiviert werden, da sie eric7 23.1 oder neuer benötigt.</translation>
+      <location filename="../../PluginExtensionProtobuf.py" line="231" />
+      <location filename="../../PluginExtensionProtobuf.py" line="230" />
+      <source>Protocol Buffer Files (*.proto)</source>
+      <translation>Protokoll-Puffer Dateien (*.proto)</translation>
     </message>
-</context>
-<context>
-    <name>ProtobufPage</name>
     <message>
-        <location filename="../ConfigurationPage/ProtobufPage.ui" line="0"/>
-        <source>&lt;b&gt;Configure Protobuf support&lt;/b&gt;</source>
-        <translation>&lt;b&gt;Protobuf-Unterstützung einstellen&lt;/b&gt;</translation>
+      <location filename="../../PluginExtensionProtobuf.py" line="248" />
+      <source>Protobuf and gRPC Extension</source>
+      <translation>Protobuf und gRPC Erweiterung</translation>
     </message>
     <message>
-        <location filename="../ConfigurationPage/ProtobufPage.ui" line="0"/>
-        <source>Protobuf Compiler</source>
-        <translation>Protobuf Compiler</translation>
+      <location filename="../../PluginExtensionProtobuf.py" line="254" />
+      <location filename="../../PluginExtensionProtobuf.py" line="249" />
+      <source>The Protobuf and gRPC extension cannot be activated because it requires eric7 23.1 or newer.</source>
+      <translation>Die Protobuf und gRPC Erweiterung kann nicht aktiviert werden, da sie eric7 23.1 oder neuer benötigt.</translation>
+    </message>
+  </context>
+  <context>
+    <name>ProtobufPage</name>
+    <message>
+      <location filename="../ConfigurationPage/ProtobufPage.ui" line="0" />
+      <source>&lt;b&gt;Configure Protobuf support&lt;/b&gt;</source>
+      <translation>&lt;b&gt;Protobuf-Unterstützung einstellen&lt;/b&gt;</translation>
     </message>
     <message>
-        <location filename="../ConfigurationPage/ProtobufPage.ui" line="0"/>
-        <source>Enter the path to the protobuf compiler.</source>
-        <translation>Gib den Pfad zum protobuf-Compiler ein.</translation>
+      <location filename="../ConfigurationPage/ProtobufPage.ui" line="0" />
+      <source>Protobuf Compiler</source>
+      <translation>Protobuf Compiler</translation>
     </message>
     <message>
-        <location filename="../ConfigurationPage/ProtobufPage.ui" line="0"/>
-        <source>&lt;b&gt;Note:&lt;/b&gt; Leave this entry empty to use the default value (protoc or protoc.exe).</source>
-        <translation>&lt;b&gt;Hinweis:&lt;/b&gt; Lasse diesen Eintrag leer, um den Standardwert (protoc bzw. protoc.exe) zu verwenden.</translation>
-    </message>
-    <message>
-        <location filename="../ConfigurationPage/ProtobufPage.ui" line="0"/>
-        <source>gRPC Compiler</source>
-        <translation>gRPC Compiler</translation>
+      <location filename="../ConfigurationPage/ProtobufPage.ui" line="0" />
+      <source>Enter the path to the protobuf compiler.</source>
+      <translation>Gib den Pfad zum protobuf-Compiler ein.</translation>
     </message>
     <message>
-        <location filename="../ConfigurationPage/ProtobufPage.ui" line="0"/>
-        <source>Select the virtual environment containing the gRPC compiler.</source>
-        <translation>Wähle die Virtuelle Unmgebung, die den gRPC Compiler enthält, aus.</translation>
+      <location filename="../ConfigurationPage/ProtobufPage.ui" line="0" />
+      <source>&lt;b&gt;Note:&lt;/b&gt; Leave this entry empty to use the default value (protoc or protoc.exe).</source>
+      <translation>&lt;b&gt;Hinweis:&lt;/b&gt; Lasse diesen Eintrag leer, um den Standardwert (protoc bzw. protoc.exe) zu verwenden.</translation>
     </message>
     <message>
-        <location filename="../ConfigurationPage/ProtobufPage.ui" line="0"/>
-        <source>Press to refresh the list of vitual environments.</source>
-        <translation>Drücken, um die Liste der Virtuellen Umgebungen zu aktualisieren.</translation>
+      <location filename="../ConfigurationPage/ProtobufPage.ui" line="0" />
+      <source>gRPC Compiler</source>
+      <translation>gRPC Compiler</translation>
+    </message>
+    <message>
+      <location filename="../ConfigurationPage/ProtobufPage.ui" line="0" />
+      <source>Select the virtual environment containing the gRPC compiler.</source>
+      <translation>Wähle die Virtuelle Unmgebung, die den gRPC Compiler enthält, aus.</translation>
     </message>
     <message>
-        <location filename="../ConfigurationPage/ProtobufPage.ui" line="0"/>
-        <source>&lt;b&gt;Note:&lt;/b&gt; Leave this entry empty to use the virtual environment used by the eric IDE.</source>
-        <translation>&lt;b&gt;Hinweis:&lt;/b&gt; Diesen Eintrag leer lassen, um die von der eric IDE genutzte Virtuelle Umgebung zu verwenden.</translation>
+      <location filename="../ConfigurationPage/ProtobufPage.ui" line="0" />
+      <source>Press to refresh the list of vitual environments.</source>
+      <translation>Drücken, um die Liste der Virtuellen Umgebungen zu aktualisieren.</translation>
     </message>
     <message>
-        <location filename="../ConfigurationPage/ProtobufPage.py" line="42"/>
-        <source>Press to select the Protobuf compiler via a file selection dialog.</source>
-        <translation>Den Protobuf-Compiler mittels eines Dateiauswahldialoges wählen.</translation>
+      <location filename="../ConfigurationPage/ProtobufPage.ui" line="0" />
+      <source>&lt;b&gt;Note:&lt;/b&gt; Leave this entry empty to use the virtual environment used by the eric IDE.</source>
+      <translation>&lt;b&gt;Hinweis:&lt;/b&gt; Diesen Eintrag leer lassen, um die von der eric IDE genutzte Virtuelle Umgebung zu verwenden.</translation>
     </message>
-</context>
+    <message>
+      <location filename="../ConfigurationPage/ProtobufPage.py" line="42" />
+      <source>Press to select the Protobuf compiler via a file selection dialog.</source>
+      <translation>Den Protobuf-Compiler mittels eines Dateiauswahldialoges wählen.</translation>
+    </message>
+  </context>
 </TS>
--- a/ExtensionProtobuf/i18n/protobuf_empty.ts	Sun Dec 11 11:52:17 2022 +0100
+++ b/ExtensionProtobuf/i18n/protobuf_empty.ts	Mon Dec 12 16:55:43 2022 +0100
@@ -243,42 +243,53 @@
   <context>
     <name>ProtobufExtensionPlugin</name>
     <message>
-      <location filename="../../PluginExtensionProtobuf.py" line="73" />
-      <location filename="../../PluginExtensionProtobuf.py" line="55" />
+      <location filename="../../PluginExtensionProtobuf.py" line="74" />
+      <location filename="../../PluginExtensionProtobuf.py" line="56" />
       <source>Protobuf Compiler</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../../PluginExtensionProtobuf.py" line="93" />
-      <location filename="../../PluginExtensionProtobuf.py" line="58" />
+      <location filename="../../PluginExtensionProtobuf.py" line="94" />
+      <location filename="../../PluginExtensionProtobuf.py" line="59" />
       <source>Protobuf and gRPC Support plugin is not activated</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../../PluginExtensionProtobuf.py" line="97" />
-      <location filename="../../PluginExtensionProtobuf.py" line="62" />
+      <location filename="../../PluginExtensionProtobuf.py" line="98" />
+      <location filename="../../PluginExtensionProtobuf.py" line="63" />
       <source>(inactive)</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../../PluginExtensionProtobuf.py" line="111" />
-      <location filename="../../PluginExtensionProtobuf.py" line="90" />
+      <location filename="../../PluginExtensionProtobuf.py" line="112" />
+      <location filename="../../PluginExtensionProtobuf.py" line="91" />
       <source>gRPC Compiler</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../../PluginExtensionProtobuf.py" line="136" />
+      <location filename="../../PluginExtensionProtobuf.py" line="137" />
       <source>Protobuf and gRPC</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../../PluginExtensionProtobuf.py" line="225" />
+      <location filename="../../PluginExtensionProtobuf.py" line="227" />
+      <source>Protocol Buffer (protobuf)</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../../PluginExtensionProtobuf.py" line="231" />
+      <location filename="../../PluginExtensionProtobuf.py" line="230" />
+      <source>Protocol Buffer Files (*.proto)</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../../PluginExtensionProtobuf.py" line="248" />
       <source>Protobuf and gRPC Extension</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../../PluginExtensionProtobuf.py" line="231" />
-      <location filename="../../PluginExtensionProtobuf.py" line="226" />
+      <location filename="../../PluginExtensionProtobuf.py" line="254" />
+      <location filename="../../PluginExtensionProtobuf.py" line="249" />
       <source>The Protobuf and gRPC extension cannot be activated because it requires eric7 23.1 or newer.</source>
       <translation type="unfinished" />
     </message>
--- a/ExtensionProtobuf/i18n/protobuf_en.ts	Sun Dec 11 11:52:17 2022 +0100
+++ b/ExtensionProtobuf/i18n/protobuf_en.ts	Mon Dec 12 16:55:43 2022 +0100
@@ -243,42 +243,53 @@
   <context>
     <name>ProtobufExtensionPlugin</name>
     <message>
-      <location filename="../../PluginExtensionProtobuf.py" line="73" />
-      <location filename="../../PluginExtensionProtobuf.py" line="55" />
+      <location filename="../../PluginExtensionProtobuf.py" line="74" />
+      <location filename="../../PluginExtensionProtobuf.py" line="56" />
       <source>Protobuf Compiler</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../../PluginExtensionProtobuf.py" line="93" />
-      <location filename="../../PluginExtensionProtobuf.py" line="58" />
+      <location filename="../../PluginExtensionProtobuf.py" line="94" />
+      <location filename="../../PluginExtensionProtobuf.py" line="59" />
       <source>Protobuf and gRPC Support plugin is not activated</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../../PluginExtensionProtobuf.py" line="97" />
-      <location filename="../../PluginExtensionProtobuf.py" line="62" />
+      <location filename="../../PluginExtensionProtobuf.py" line="98" />
+      <location filename="../../PluginExtensionProtobuf.py" line="63" />
       <source>(inactive)</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../../PluginExtensionProtobuf.py" line="111" />
-      <location filename="../../PluginExtensionProtobuf.py" line="90" />
+      <location filename="../../PluginExtensionProtobuf.py" line="112" />
+      <location filename="../../PluginExtensionProtobuf.py" line="91" />
       <source>gRPC Compiler</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../../PluginExtensionProtobuf.py" line="136" />
+      <location filename="../../PluginExtensionProtobuf.py" line="137" />
       <source>Protobuf and gRPC</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../../PluginExtensionProtobuf.py" line="225" />
+      <location filename="../../PluginExtensionProtobuf.py" line="227" />
+      <source>Protocol Buffer (protobuf)</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../../PluginExtensionProtobuf.py" line="231" />
+      <location filename="../../PluginExtensionProtobuf.py" line="230" />
+      <source>Protocol Buffer Files (*.proto)</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../../PluginExtensionProtobuf.py" line="248" />
       <source>Protobuf and gRPC Extension</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../../PluginExtensionProtobuf.py" line="231" />
-      <location filename="../../PluginExtensionProtobuf.py" line="226" />
+      <location filename="../../PluginExtensionProtobuf.py" line="254" />
+      <location filename="../../PluginExtensionProtobuf.py" line="249" />
       <source>The Protobuf and gRPC extension cannot be activated because it requires eric7 23.1 or newer.</source>
       <translation type="unfinished" />
     </message>
--- a/ExtensionProtobuf/i18n/protobuf_es.ts	Sun Dec 11 11:52:17 2022 +0100
+++ b/ExtensionProtobuf/i18n/protobuf_es.ts	Mon Dec 12 16:55:43 2022 +0100
@@ -47334,42 +47334,53 @@
   <context>
     <name>ProtobufExtensionPlugin</name>
     <message>
-      <location filename="../../PluginExtensionProtobuf.py" line="73" />
-      <location filename="../../PluginExtensionProtobuf.py" line="55" />
+      <location filename="../../PluginExtensionProtobuf.py" line="74" />
+      <location filename="../../PluginExtensionProtobuf.py" line="56" />
       <source>Protobuf Compiler</source>
       <translation type="unfinished">Compilador de Protobuf</translation>
     </message>
     <message>
-      <location filename="../../PluginExtensionProtobuf.py" line="93" />
-      <location filename="../../PluginExtensionProtobuf.py" line="58" />
+      <location filename="../../PluginExtensionProtobuf.py" line="94" />
+      <location filename="../../PluginExtensionProtobuf.py" line="59" />
       <source>Protobuf and gRPC Support plugin is not activated</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../../PluginExtensionProtobuf.py" line="97" />
-      <location filename="../../PluginExtensionProtobuf.py" line="62" />
+      <location filename="../../PluginExtensionProtobuf.py" line="98" />
+      <location filename="../../PluginExtensionProtobuf.py" line="63" />
       <source>(inactive)</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../../PluginExtensionProtobuf.py" line="111" />
-      <location filename="../../PluginExtensionProtobuf.py" line="90" />
+      <location filename="../../PluginExtensionProtobuf.py" line="112" />
+      <location filename="../../PluginExtensionProtobuf.py" line="91" />
       <source>gRPC Compiler</source>
       <translation type="unfinished">Compilador gRPC</translation>
     </message>
     <message>
-      <location filename="../../PluginExtensionProtobuf.py" line="136" />
+      <location filename="../../PluginExtensionProtobuf.py" line="137" />
       <source>Protobuf and gRPC</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../../PluginExtensionProtobuf.py" line="225" />
-      <source>Protobuf and gRPC Extension</source>
-      <translation type="unfinished" />
+      <location filename="../../PluginExtensionProtobuf.py" line="227" />
+      <source>Protocol Buffer (protobuf)</source>
+      <translation type="unfinished">Buffer de Protocolo (protobuf)</translation>
     </message>
     <message>
       <location filename="../../PluginExtensionProtobuf.py" line="231" />
-      <location filename="../../PluginExtensionProtobuf.py" line="226" />
+      <location filename="../../PluginExtensionProtobuf.py" line="230" />
+      <source>Protocol Buffer Files (*.proto)</source>
+      <translation type="unfinished">Archivos de Buffer de Protocolo (*.proto)</translation>
+    </message>
+    <message>
+      <location filename="../../PluginExtensionProtobuf.py" line="248" />
+      <source>Protobuf and gRPC Extension</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../../PluginExtensionProtobuf.py" line="254" />
+      <location filename="../../PluginExtensionProtobuf.py" line="249" />
       <source>The Protobuf and gRPC extension cannot be activated because it requires eric7 23.1 or newer.</source>
       <translation type="unfinished" />
     </message>
--- a/ExtensionProtobuf/i18n/protobuf_ru.ts	Sun Dec 11 11:52:17 2022 +0100
+++ b/ExtensionProtobuf/i18n/protobuf_ru.ts	Mon Dec 12 16:55:43 2022 +0100
@@ -243,42 +243,53 @@
   <context>
     <name>ProtobufExtensionPlugin</name>
     <message>
-      <location filename="../../PluginExtensionProtobuf.py" line="73" />
-      <location filename="../../PluginExtensionProtobuf.py" line="55" />
+      <location filename="../../PluginExtensionProtobuf.py" line="74" />
+      <location filename="../../PluginExtensionProtobuf.py" line="56" />
       <source>Protobuf Compiler</source>
       <translation>Компилятор Protobuf</translation>
     </message>
     <message>
-      <location filename="../../PluginExtensionProtobuf.py" line="93" />
-      <location filename="../../PluginExtensionProtobuf.py" line="58" />
+      <location filename="../../PluginExtensionProtobuf.py" line="94" />
+      <location filename="../../PluginExtensionProtobuf.py" line="59" />
       <source>Protobuf and gRPC Support plugin is not activated</source>
       <translation>Плагин поддержки Protobuf и gRPC не активирован</translation>
     </message>
     <message>
-      <location filename="../../PluginExtensionProtobuf.py" line="97" />
-      <location filename="../../PluginExtensionProtobuf.py" line="62" />
+      <location filename="../../PluginExtensionProtobuf.py" line="98" />
+      <location filename="../../PluginExtensionProtobuf.py" line="63" />
       <source>(inactive)</source>
       <translation>(неактивен)</translation>
     </message>
     <message>
-      <location filename="../../PluginExtensionProtobuf.py" line="111" />
-      <location filename="../../PluginExtensionProtobuf.py" line="90" />
+      <location filename="../../PluginExtensionProtobuf.py" line="112" />
+      <location filename="../../PluginExtensionProtobuf.py" line="91" />
       <source>gRPC Compiler</source>
       <translation>Компилятор gRPC</translation>
     </message>
     <message>
-      <location filename="../../PluginExtensionProtobuf.py" line="136" />
+      <location filename="../../PluginExtensionProtobuf.py" line="137" />
       <source>Protobuf and gRPC</source>
       <translation>Protobuf и gRPC</translation>
     </message>
     <message>
-      <location filename="../../PluginExtensionProtobuf.py" line="225" />
+      <location filename="../../PluginExtensionProtobuf.py" line="227" />
+      <source>Protocol Buffer (protobuf)</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../../PluginExtensionProtobuf.py" line="231" />
+      <location filename="../../PluginExtensionProtobuf.py" line="230" />
+      <source>Protocol Buffer Files (*.proto)</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../../PluginExtensionProtobuf.py" line="248" />
       <source>Protobuf and gRPC Extension</source>
       <translation>Расширение Protobuf и gRPC</translation>
     </message>
     <message>
-      <location filename="../../PluginExtensionProtobuf.py" line="231" />
-      <location filename="../../PluginExtensionProtobuf.py" line="226" />
+      <location filename="../../PluginExtensionProtobuf.py" line="254" />
+      <location filename="../../PluginExtensionProtobuf.py" line="249" />
       <source>The Protobuf and gRPC extension cannot be activated because it requires eric7 23.1 or newer.</source>
       <translation>Расширение Protobuf и gRPC нельзя активировать, так как для этого требуется eric7 23.1 или новее.</translation>
     </message>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ExtensionProtobuf/protoclbr.py	Mon Dec 12 16:55:43 2022 +0100
@@ -0,0 +1,394 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2017 - 2022 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Parse a ProtoBuf protocol file and retrieve messages, enums, services and
+rpc methods.
+
+It is based on the Python class browser found in this package.
+"""
+
+import os
+import re
+
+from eric7 import Utilities
+from eric7.Utilities.ClassBrowsers import ClbrBaseClasses
+
+_getnext = re.compile(
+    r"""
+    (?P<String>
+        " [^"\\\n]* (?: \\. [^"\\\n]*)* "
+    )
+
+|   (?P<Comment>
+        ^ [ \t]* // .*? $
+    |
+        ^ [ \t]* /\* .*? \*/
+    )
+
+|   (?P<Message>
+        ^
+        (?P<MessageIndent> [ \t]* )
+        message [ \t]+
+        (?P<MessageName> [a-zA-Z_] [a-zA-Z0-9_]* )
+        [ \t]* {
+    )
+
+|   (?P<Enum>
+        ^
+        (?P<EnumIndent> [ \t]* )
+        enum [ \t]+
+        (?P<EnumName> [a-zA-Z_] [a-zA-Z0-9_]* )
+        [ \t]* {
+    )
+
+|   (?P<Service>
+        ^
+        (?P<ServiceIndent> [ \t]* )
+        service [ \t]+
+        (?P<ServiceName> [a-zA-Z_] [a-zA-Z0-9_]* )
+        [ \t]* {
+    )
+
+|   (?P<Method>
+        ^
+        (?P<MethodIndent> [ \t]* )
+        rpc [ \t]+
+        (?P<MethodName> [a-zA-Z_] [a-zA-Z0-9_]* )
+        [ \t]*
+        \(
+        (?P<MethodSignature> [^)]+? )
+        \)
+        [ \t]+
+        returns
+        [ \t]*
+        \(
+        (?P<MethodReturn> [^)]+? )
+        \)
+        [ \t]*
+    )
+
+|   (?P<Begin>
+        [ \t]* {
+    )
+
+|   (?P<End>
+        [ \t]* } [ \t]* ;?
+    )""",
+    re.VERBOSE | re.DOTALL | re.MULTILINE,
+).search
+
+# function to replace comments
+_commentsub = re.compile(r"""//[^\n]*\n|//[^\n]*$""").sub
+# function to normalize whitespace
+_normalize = re.compile(r"""[ \t]{2,}""").sub
+
+
+class VisibilityMixin(ClbrBaseClasses.ClbrVisibilityMixinBase):
+    """
+    Mixin class implementing the notion of visibility.
+    """
+
+    def __init__(self):
+        """
+        Constructor
+        """
+        self.setPublic()
+
+
+class Message(ClbrBaseClasses.Module, VisibilityMixin):
+    """
+    Class to represent a ProtoBuf Message.
+    """
+
+    def __init__(self, module, name, file, lineno):
+        """
+        Constructor
+
+        @param module name of the module containing this message
+        @type str
+        @param name name of this message
+        @type str
+        @param file filename containing this message
+        @type str
+        @param lineno linenumber of the message definition
+        @type int
+        """
+        ClbrBaseClasses.Module.__init__(self, module, name, file, lineno)
+        VisibilityMixin.__init__(self)
+
+
+class Enum(ClbrBaseClasses.Enum, VisibilityMixin):
+    """
+    Class to represent a ProtoBuf Enum.
+    """
+
+    def __init__(self, module, name, file, lineno):
+        """
+        Constructor
+
+        @param module name of the module containing this enum
+        @type str
+        @param name name of this enum
+        @type str
+        @param file filename containing this enum
+        @type str
+        @param lineno linenumber of the message enum
+        @type int
+        """
+        ClbrBaseClasses.Enum.__init__(self, module, name, file, lineno)
+        VisibilityMixin.__init__(self)
+
+
+class Service(ClbrBaseClasses.Class, VisibilityMixin):
+    """
+    Class to represent a ProtoBuf Service.
+    """
+
+    def __init__(self, module, name, file, lineno):
+        """
+        Constructor
+
+        @param module name of the module containing this service
+        @type str
+        @param name name of this service
+        @type str
+        @param file filename containing this service
+        @type str
+        @param lineno linenumber of the service definition
+        @type int
+        """
+        ClbrBaseClasses.Class.__init__(self, module, name, None, file, lineno)
+        VisibilityMixin.__init__(self)
+
+
+class ServiceMethod(ClbrBaseClasses.Function, VisibilityMixin):
+    """
+    Class to represent a ProtoBuf Service Method.
+    """
+
+    def __init__(self, name, file, lineno, signature, returns):
+        """
+        Constructor
+
+        @param name name of this service method
+        @type str
+        @param file filename containing this service method
+        @type str
+        @param lineno linenumber of the service method definition
+        @type int
+        @param signature parameter list of the service method
+        @type str
+        @param returns return type of the service method
+        @type str
+        """
+        ClbrBaseClasses.Function.__init__(
+            self,
+            None,
+            name,
+            file,
+            lineno,
+            signature,
+            annotation="-> {0}".format(returns),
+        )
+        VisibilityMixin.__init__(self)
+
+
+def readmodule_ex(module, path=None):
+    """
+    Read a ProtoBuf protocol file and return a dictionary of messages, enums,
+    services and rpc methods.
+
+    @param module name of the ProtoBuf protocol file
+    @type str
+    @param path path the file should be searched in
+    @type list of str
+    @return the resulting dictionary
+    @rtype dict
+    """
+    path = [] if path is None else path[:]
+    for p in path:  # search in path
+        pathname = os.path.join(p, module)
+        if os.path.exists(pathname):
+            filename = pathname
+            try:
+                src = Utilities.readEncodedFile(filename)[0]
+            except (UnicodeError, OSError):
+                # can't do anything with this module
+                return {}
+
+            return scan(src, filename, module)
+    return {}
+
+
+def scan(src, file, module):
+    """
+    Public method to scan the given source text.
+
+    @param src source text to be scanned
+    @type str
+    @param file file name associated with the source text
+    @type str
+    @param module module name associated with the source text
+    @type str
+    @return dictionary containing the extracted data
+    @rtype dict
+    """
+
+    def calculateEndline(lineno, lines):
+        """
+        Function to calculate the end line.
+
+        @param lineno line number to start at (one based)
+        @type int
+        @param lines list of source lines
+        @type list of str
+        @return end line (one based)
+        @rtype int
+        """
+        # convert lineno to be zero based
+        lineno -= 1
+        # 1. search for opening brace '{'
+        while lineno < len(lines) and "{" not in lines[lineno]:
+            lineno += 1
+        depth = lines[lineno].count("{") - lines[lineno].count("}")
+        # 2. search for ending line, i.e. matching closing brace '}'
+        while depth > 0 and lineno < len(lines) - 1:
+            lineno += 1
+            depth += lines[lineno].count("{") - lines[lineno].count("}")
+        if depth == 0:
+            # found a matching brace
+            return lineno + 1
+        else:
+            # nothing found
+            return -1
+
+    # convert eol markers the Python style
+    src = src.replace("\r\n", "\n").replace("\r", "\n")
+    srcLines = src.splitlines()
+
+    dictionary = {}
+
+    classstack = []  # stack of (class, indent) pairs
+    indent = 0
+
+    lineno, last_lineno_pos = 1, 0
+    i = 0
+    while True:
+        m = _getnext(src, i)
+        if not m:
+            break
+        start, i = m.span()
+
+        if m.start("Method") >= 0:
+            # found a method definition or function
+            thisindent = indent
+            meth_name = m.group("MethodName")
+            meth_sig = m.group("MethodSignature")
+            meth_sig = meth_sig and meth_sig.replace("\\\n", "") or ""
+            meth_sig = _commentsub("", meth_sig)
+            meth_sig = _normalize(" ", meth_sig)
+            meth_return = m.group("MethodReturn")
+            meth_return = meth_return and meth_return.replace("\\\n", "") or ""
+            meth_return = _commentsub("", meth_return)
+            meth_return = _normalize(" ", meth_return)
+            lineno += src.count("\n", last_lineno_pos, start)
+            last_lineno_pos = start
+            # close all interfaces/modules indented at least as much
+            while classstack and classstack[-1][1] >= thisindent:
+                del classstack[-1]
+            if classstack:
+                # it's an interface/module method
+                cur_class = classstack[-1][0]
+                if isinstance(cur_class, Service):
+                    # it's a method
+                    f = ServiceMethod(meth_name, file, lineno, meth_sig, meth_return)
+                    cur_class._addmethod(meth_name, f)
+                # else it's a nested def
+                else:
+                    f = None
+            else:
+                # the file is incorrect, ignore the entry
+                continue
+            if f:
+                endline = calculateEndline(lineno, srcLines)
+                f.setEndLine(endline)
+            classstack.append((f, thisindent))  # Marker for nested fns
+
+        elif m.start("String") >= 0 or m.start("Comment") >= 0:
+            pass
+
+        elif m.start("Message") >= 0:
+            # we found a message definition
+            thisindent = indent
+            indent += 1
+            lineno += src.count("\n", last_lineno_pos, start)
+            last_lineno_pos = start
+            message_name = m.group("MessageName")
+            # close all messages/services indented at least as much
+            while classstack and classstack[-1][1] >= thisindent:
+                del classstack[-1]
+            # remember this message
+            cur_class = Message(module, message_name, file, lineno)
+            endline = calculateEndline(lineno, srcLines)
+            cur_class.setEndLine(endline)
+            if not classstack:
+                dictionary[message_name] = cur_class
+            else:
+                msg = classstack[-1][0]
+                msg._addclass(message_name, cur_class)
+            classstack.append((cur_class, thisindent))
+
+        elif m.start("Enum") >= 0:
+            # we found a message definition
+            thisindent = indent
+            indent += 1
+            # close all messages/services indented at least as much
+            while classstack and classstack[-1][1] >= thisindent:
+                del classstack[-1]
+            lineno += src.count("\n", last_lineno_pos, start)
+            last_lineno_pos = start
+            enum_name = m.group("EnumName")
+            # remember this Enum
+            cur_class = Enum(module, enum_name, file, lineno)
+            endline = calculateEndline(lineno, srcLines)
+            cur_class.setEndLine(endline)
+            if not classstack:
+                dictionary[enum_name] = cur_class
+            else:
+                enum = classstack[-1][0]
+                enum._addclass(enum_name, cur_class)
+            classstack.append((cur_class, thisindent))
+
+        elif m.start("Service") >= 0:
+            # we found a message definition
+            thisindent = indent
+            indent += 1
+            # close all messages/services indented at least as much
+            while classstack and classstack[-1][1] >= thisindent:
+                del classstack[-1]
+            lineno += src.count("\n", last_lineno_pos, start)
+            last_lineno_pos = start
+            service_name = m.group("ServiceName")
+            # remember this Service
+            cur_class = Service(module, service_name, file, lineno)
+            endline = calculateEndline(lineno, srcLines)
+            cur_class.setEndLine(endline)
+            if not classstack:
+                dictionary[service_name] = cur_class
+            else:
+                service = classstack[-1][0]
+                service._addclass(service_name, cur_class)
+            classstack.append((cur_class, thisindent))
+
+        elif m.start("Begin") >= 0:
+            # a begin of a block we are not interested in
+            indent += 1
+
+        elif m.start("End") >= 0:
+            # an end of a block
+            indent -= 1
+
+    return dictionary
--- a/PKGLIST	Sun Dec 11 11:52:17 2022 +0100
+++ b/PKGLIST	Mon Dec 12 16:55:43 2022 +0100
@@ -11,4 +11,5 @@
 ExtensionProtobuf/icons/gRPC48.svg
 ExtensionProtobuf/icons/protobuf.svg
 ExtensionProtobuf/icons/protobuf48.svg
+ExtensionProtobuf/protoclbr.py
 PluginExtensionProtobuf.py
--- a/PluginExtensionProtobuf.py	Sun Dec 11 11:52:17 2022 +0100
+++ b/PluginExtensionProtobuf.py	Mon Dec 12 16:55:43 2022 +0100
@@ -14,6 +14,7 @@
 from eric7 import Globals, Preferences
 from eric7.EricWidgets import EricMessageBox
 from eric7.EricWidgets.EricApplication import ericApp
+from ExtensionProtobuf import protoclbr
 from ExtensionProtobuf.ProjectProtocolsBrowser import ProjectProtocolsBrowser
 
 # Start-Of-Header
@@ -21,7 +22,7 @@
 author = "Detlev Offenbach <detlev@die-offenbachs.de>"
 autoactivate = True
 deactivateable = True
-version = "10.0.2"
+version = "10.1.0"
 className = "ProtobufExtensionPlugin"
 packageName = "ExtensionProtobuf"
 shortDescription = "Support for the development of Protobuf and gRPC projects"
@@ -210,6 +211,9 @@
         @return tuple of None and activation status
         @rtype bool
         """
+        from eric7.QScintilla import Lexers
+        from eric7.Utilities import ClassBrowsers
+
         global error, protobufExtensionPluginObject
         error = ""  # clear previous error
 
@@ -218,6 +222,25 @@
 
             self.__browser = ProjectProtocolsBrowser(self)
 
+            Lexers.registerLexer(
+                "Protocol Buffer",
+                self.tr("Protocol Buffer (protobuf)"),
+                "dummy.proto",
+                self.getLexer,
+                [self.tr("Protocol Buffer Files (*.proto)")],
+                [self.tr("Protocol Buffer Files (*.proto)")],
+                ["*.proto"],
+                os.path.join("ExtensionProtobuf", "icons", "protobuf"),
+            )
+
+            ClassBrowsers.registerClassBrowser(
+                "Protocol Buffer",
+                protoclbr.readmodule_ex,
+                protoclbr.scan,
+                self.getFileIcon,
+                [".proto"],
+            )
+
             return None, True
         else:
             EricMessageBox.warning(
@@ -239,6 +262,12 @@
         """
         Public method to deactivate this plug-in.
         """
+        from eric7.QScintilla import Lexers
+        from eric7.Utilities import ClassBrowsers
+
+        Lexers.unregisterLexer("Protocol Buffer")
+        ClassBrowsers.registerClassBrowser("Protocol Buffer")
+
         self.__browser.deactivate()
 
         self.__initialize()
@@ -290,6 +319,34 @@
         """
         Preferences.Prefs.settings.setValue(self.PreferencesKey + "/" + key, value)
 
+    def getLexer(self, parent=None):
+        """
+        Public method to instantiate a Pygments Protocol Buffer lexer object.
+
+        @param parent reference to the parent object
+        @type QObject
+        @return reference to the instanciated lexer object
+        @rtype QsciLexer
+        """
+        from eric7.QScintilla.Lexers.LexerPygments import LexerPygments
+
+        lexer = LexerPygments(parent, name="Protocol Buffer")
+        if lexer.canStyle():
+            return lexer
+        else:
+            return None
+
+    def getFileIcon(self, filename=""):
+        """
+        Public method to get the name of a file icon.
+
+        @param filename file name (defaults to "")
+        @type str (optional)
+        @return name of a file icon
+        @rtype str
+        """
+        return os.path.join("ExtensionProtobuf", "icons", "protobuf")
+
 
 def installDependencies(pipInstall):
     """
Binary file PluginExtensionProtobuf.zip has changed
--- a/PluginProtobuf.epj	Sun Dec 11 11:52:17 2022 +0100
+++ b/PluginProtobuf.epj	Mon Dec 12 16:55:43 2022 +0100
@@ -241,6 +241,7 @@
     "PROGLANGUAGE": "Python3",
     "PROJECTTYPE": "E7Plugin",
     "PROJECTTYPESPECIFICDATA": {},
+    "PROTOCOLS": [],
     "RCCPARAMS": {
       "CompressLevel": 0,
       "CompressionDisable": false,
@@ -253,6 +254,7 @@
       "ExtensionProtobuf/ConfigurationPage/__init__.py",
       "ExtensionProtobuf/ProjectProtocolsBrowser.py",
       "ExtensionProtobuf/__init__.py",
+      "ExtensionProtobuf/protoclbr.py",
       "PluginExtensionProtobuf.py",
       "__init__.py"
     ],
--- a/changelog.md	Sun Dec 11 11:52:17 2022 +0100
+++ b/changelog.md	Mon Dec 12 16:55:43 2022 +0100
@@ -1,6 +1,10 @@
 ChangeLog
 ---------
 
+__Version 10.1.0__
+
+- moved the Protobuf class browser to this plugin
+
 __Version 10.0.2__
 
 - added a `Collapse all files` entry to the context menus

eric ide

mercurial