TeacherControlPlugin - вылизывание входа

This commit is contained in:
Mikhalkovich Stanislav 2022-08-07 13:38:40 +03:00
parent 308da7ab5c
commit e1ae47aee9
27 changed files with 1059 additions and 61 deletions

View file

@ -15,7 +15,7 @@ internal static class RevisionClass
public const string Major = "3";
public const string Minor = "8";
public const string Build = "3";
public const string Revision = "3150";
public const string Revision = "3152";
public const string MainVersion = Major + "." + Minor;
public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision;

View file

@ -1,4 +1,4 @@
%COREVERSION%=3
%REVISION%=3150
%REVISION%=3152
%MINOR%=8
%MAJOR%=3

Binary file not shown.

View file

@ -17,6 +17,9 @@ namespace VisualPascalABCPlugins
System.Windows.Forms.Keys shortcutKeys = System.Windows.Forms.Keys.None;
string shortcutKeyDisplayString = null;
public object menuItem { get; set; }
public object toolStripButton { get; set; }
public PluginGUIItem(string text, string hint, Image image, Color imageTransparentColor, PluginGUIItemExecuteDelegate executeDelegate)
{
this.text = text;

View file

@ -32,6 +32,13 @@ namespace VisualPascalABCPlugins
{
get;
}
/// SSM 07.08.22 кнопка пункта меню. В плагине преобразовать к ToolStripMenuItem
object menuItem { get; set; }
/// SSM 07.08.22 кнопка панели инструментов. В плагине преобразовать к ToolStripButton
object toolStripButton { get; set; }
void Execute();
}

View file

@ -17,6 +17,9 @@ namespace VisualPascalABCPlugins
System.Windows.Forms.Keys shortcutKeys = System.Windows.Forms.Keys.None;
string shortcutKeyDisplayString = null;
public object menuItem { get; set; }
public object toolStripButton { get; set; }
public PluginGUIItem(string text, string hint, Image image, Color imageTransparentColor, PluginGUIItemExecuteDelegate executeDelegate)
{
this.text = text;

View file

@ -32,6 +32,13 @@ namespace VisualPascalABCPlugins
{
get;
}
/// SSM 07.08.22 кнопка пункта меню. В плагине преобразовать к ToolStripMenuItem
object menuItem { get; set; }
/// SSM 07.08.22 кнопка панели инструментов. В плагине преобразовать к ToolStripButton
object toolStripButton { get; set; }
void Execute();
}

View file

@ -1 +1 @@
3.8.3.3150
3.8.3.3152

View file

@ -1 +1 @@
!define VERSION '3.8.3.3150'
!define VERSION '3.8.3.3152'

View file

@ -81,6 +81,8 @@ type
property Parent: Node read getParent write SetParent;
property Data: integer read getData write SetData;
end;
var TaskName: string;
/// Вывести формулировку задания
procedure Task(name: string);
@ -833,7 +835,7 @@ procedure StartPT(options: integer); external '%PABCSYSTEM%\PT4\PT4PABC.dll'
procedure FreePT; external '%PABCSYSTEM%\PT4\PT4PABC.dll' name 'freept';
function CheckPT(var res: integer):string;external '%PABCSYSTEM%\PT4\PT4PABC.dll' name 'checkptf';
procedure RaisePT(s1,s2: string); external '%PABCSYSTEM%\PT4\PT4PABC.dll' name 'raisept';
procedure Task(name: string); external '%PABCSYSTEM%\PT4\PT4PABC.dll' name 'task';
procedure Task__(name: string); external '%PABCSYSTEM%\PT4\PT4PABC.dll' name 'task';
procedure GetR(var param: real); external '%PABCSYSTEM%\PT4\PT4PABC.dll' name 'getr';
procedure PutR(param: real); external '%PABCSYSTEM%\PT4\PT4PABC.dll' name 'putr';
procedure GetN(var param: integer); external '%PABCSYSTEM%\PT4\PT4PABC.dll' name 'getn';
@ -850,6 +852,12 @@ procedure DisposeP(sNode: IntPtr); external '%PABCSYSTEM%\PT4\PT4PABC.dll'
function FinishPT(): integer; external '%PABCSYSTEM%\PT4\PT4PABC.dll' name 'finishpt'; // == 4.13 ==
procedure _GetSolutionInfo(info: System.Text.StringBuilder);external '%PABCSYSTEM%\PT4\PT4PABC.dll' name 'getsolutioninfo';
procedure Task(name: string);
begin
Task__(name);
TaskName := name;
end;
procedure Dispose(p: pointer);
begin
DisposeP(IntPtr(p));

View file

@ -48,6 +48,7 @@ namespace PascalABCCompiler.TreeConverter
}
// SSM 29.07.16 - если in_what - одномерный массив, то заменить код foreach на for
// Лямбды обходят старое дерево, поэтому не работает. Кстати, почему? SSM 04/08/22
// if (OptimizeForeachInCase1DArray(_foreach_stmt, foreachCollection)) return;
statements_list sl = new statements_list(get_location(_foreach_stmt.stmt));

View file

@ -76,8 +76,9 @@ namespace VisualPascalABCPlugins
menuItem.Image = Item.Image;
menuItem.ImageTransparentColor = Item.ImageTransparentColor;
menuItem.Text = Item.Text;
menuItem.ToolTipText = Item.Hint;
//menuItem.ToolTipText = Item.Hint;
menuItem.Tag = Item;
Item.menuItem = menuItem;
menuItem.ShortcutKeys = Item.ShortcutKeys;
if (Item.ShortcutKeyDisplayString != null)
menuItem.ShortcutKeyDisplayString = Item.ShortcutKeyDisplayString;
@ -110,6 +111,7 @@ namespace VisualPascalABCPlugins
button.ToolTipText = Item.Hint;
button.Click += new EventHandler(button_Click);
button.Tag = Item;
Item.toolStripButton = button;
ToolStrip.Items.Add(button);
PascalABCCompiler.StringResources.SetTextForObject(button, "");
}

View file

@ -78,6 +78,7 @@ namespace VisualPascalABCPlugins
menuItem.Text = Item.Text;
//menuItem.ToolTipText = Item.Hint;
menuItem.Tag = Item;
Item.menuItem = menuItem;
menuItem.ShortcutKeys = Item.ShortcutKeys;
if (Item.ShortcutKeyDisplayString != null)
menuItem.ShortcutKeyDisplayString = Item.ShortcutKeyDisplayString;
@ -110,6 +111,7 @@ namespace VisualPascalABCPlugins
button.ToolTipText = Item.Hint;
button.Click += new EventHandler(button_Click);
button.Tag = Item;
Item.toolStripButton = button;
ToolStrip.Items.Add(button);
PascalABCCompiler.StringResources.SetTextForObject(button, "");
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

View file

@ -0,0 +1,214 @@
namespace DBAccessPluginNamespace
{
partial class LoginForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(LoginForm));
this.groupNamesBox = new System.Windows.Forms.ComboBox();
this.usersNamesBox = new System.Windows.Forms.ComboBox();
this.labelGroup = new System.Windows.Forms.Label();
this.labelUser = new System.Windows.Forms.Label();
this.passwordBox = new System.Windows.Forms.TextBox();
this.labelPassword = new System.Windows.Forms.Label();
this.enterButton = new System.Windows.Forms.Button();
this.closeButton = new System.Windows.Forms.Button();
this.userImage = new System.Windows.Forms.PictureBox();
this.groupImage = new System.Windows.Forms.PictureBox();
this.PluginImage = new System.Windows.Forms.PictureBox();
this.PluginImageAuthorized = new System.Windows.Forms.PictureBox();
((System.ComponentModel.ISupportInitialize)(this.userImage)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.groupImage)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.PluginImage)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.PluginImageAuthorized)).BeginInit();
this.SuspendLayout();
//
// groupNamesBox
//
this.groupNamesBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.groupNamesBox.FormattingEnabled = true;
this.groupNamesBox.Location = new System.Drawing.Point(114, 12);
this.groupNamesBox.Name = "groupNamesBox";
this.groupNamesBox.Size = new System.Drawing.Size(258, 21);
this.groupNamesBox.TabIndex = 1;
this.groupNamesBox.SelectedIndexChanged += new System.EventHandler(this.GroupNamesBox_SelectedIndexChanged);
//
// usersNamesBox
//
this.usersNamesBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.usersNamesBox.FormattingEnabled = true;
this.usersNamesBox.Location = new System.Drawing.Point(114, 50);
this.usersNamesBox.Name = "usersNamesBox";
this.usersNamesBox.Size = new System.Drawing.Size(258, 21);
this.usersNamesBox.TabIndex = 2;
//
// labelGroup
//
this.labelGroup.AutoSize = true;
this.labelGroup.Location = new System.Drawing.Point(63, 15);
this.labelGroup.Name = "labelGroup";
this.labelGroup.Size = new System.Drawing.Size(45, 13);
this.labelGroup.TabIndex = 3;
this.labelGroup.Text = "Группа:";
//
// labelUser
//
this.labelUser.AutoSize = true;
this.labelUser.Location = new System.Drawing.Point(25, 53);
this.labelUser.Name = "labelUser";
this.labelUser.Size = new System.Drawing.Size(83, 13);
this.labelUser.TabIndex = 4;
this.labelUser.Text = "Пользователь:";
//
// passwordBox
//
this.passwordBox.Location = new System.Drawing.Point(114, 92);
this.passwordBox.Name = "passwordBox";
this.passwordBox.Size = new System.Drawing.Size(258, 20);
this.passwordBox.TabIndex = 5;
//
// labelPassword
//
this.labelPassword.AutoSize = true;
this.labelPassword.Location = new System.Drawing.Point(60, 95);
this.labelPassword.Name = "labelPassword";
this.labelPassword.Size = new System.Drawing.Size(48, 13);
this.labelPassword.TabIndex = 6;
this.labelPassword.Text = "Пароль:";
//
// enterButton
//
this.enterButton.Location = new System.Drawing.Point(87, 131);
this.enterButton.Name = "enterButton";
this.enterButton.Size = new System.Drawing.Size(118, 34);
this.enterButton.TabIndex = 8;
this.enterButton.Text = "Вход";
this.enterButton.UseVisualStyleBackColor = true;
this.enterButton.Click += new System.EventHandler(this.enterButton_Click);
//
// closeButton
//
this.closeButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.closeButton.Location = new System.Drawing.Point(225, 131);
this.closeButton.Name = "closeButton";
this.closeButton.Size = new System.Drawing.Size(118, 34);
this.closeButton.TabIndex = 7;
this.closeButton.Text = "Закрыть";
this.closeButton.UseVisualStyleBackColor = true;
this.closeButton.Click += new System.EventHandler(this.cancelButton_Click);
//
// userImage
//
this.userImage.InitialImage = null;
this.userImage.Location = new System.Drawing.Point(378, 45);
this.userImage.Name = "userImage";
this.userImage.Size = new System.Drawing.Size(32, 32);
this.userImage.TabIndex = 10;
this.userImage.TabStop = false;
//
// groupImage
//
this.groupImage.InitialImage = null;
this.groupImage.Location = new System.Drawing.Point(378, 7);
this.groupImage.Name = "groupImage";
this.groupImage.Size = new System.Drawing.Size(32, 32);
this.groupImage.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize;
this.groupImage.TabIndex = 9;
this.groupImage.TabStop = false;
//
// PluginImage
//
this.PluginImage.BackColor = System.Drawing.Color.Magenta;
this.PluginImage.Image = ((System.Drawing.Image)(resources.GetObject("PluginImage.Image")));
this.PluginImage.Location = new System.Drawing.Point(379, 95);
this.PluginImage.Margin = new System.Windows.Forms.Padding(6);
this.PluginImage.Name = "PluginImage";
this.PluginImage.Size = new System.Drawing.Size(25, 26);
this.PluginImage.TabIndex = 11;
this.PluginImage.TabStop = false;
this.PluginImage.Visible = false;
//
// PluginImageAuthorized
//
this.PluginImageAuthorized.BackColor = System.Drawing.Color.Magenta;
this.PluginImageAuthorized.Image = ((System.Drawing.Image)(resources.GetObject("PluginImageAuthorized.Image")));
this.PluginImageAuthorized.InitialImage = null;
this.PluginImageAuthorized.Location = new System.Drawing.Point(379, 131);
this.PluginImageAuthorized.Name = "PluginImageAuthorized";
this.PluginImageAuthorized.Size = new System.Drawing.Size(25, 26);
this.PluginImageAuthorized.TabIndex = 12;
this.PluginImageAuthorized.TabStop = false;
this.PluginImageAuthorized.Visible = false;
//
// LoginForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.closeButton;
this.ClientSize = new System.Drawing.Size(422, 175);
this.Controls.Add(this.PluginImageAuthorized);
this.Controls.Add(this.PluginImage);
this.Controls.Add(this.userImage);
this.Controls.Add(this.groupImage);
this.Controls.Add(this.closeButton);
this.Controls.Add(this.enterButton);
this.Controls.Add(this.labelPassword);
this.Controls.Add(this.passwordBox);
this.Controls.Add(this.labelUser);
this.Controls.Add(this.labelGroup);
this.Controls.Add(this.usersNamesBox);
this.Controls.Add(this.groupNamesBox);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "LoginForm";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "Авторизация";
this.Load += new System.EventHandler(this.LoginForm_Load);
((System.ComponentModel.ISupportInitialize)(this.userImage)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.groupImage)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.PluginImage)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.PluginImageAuthorized)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.ComboBox groupNamesBox;
private System.Windows.Forms.ComboBox usersNamesBox;
private System.Windows.Forms.Label labelGroup;
private System.Windows.Forms.Label labelUser;
private System.Windows.Forms.TextBox passwordBox;
private System.Windows.Forms.Label labelPassword;
private System.Windows.Forms.Button enterButton;
private System.Windows.Forms.Button closeButton;
private System.Windows.Forms.PictureBox groupImage;
private System.Windows.Forms.PictureBox userImage;
public System.Windows.Forms.PictureBox PluginImage;
public System.Windows.Forms.PictureBox PluginImageAuthorized;
}
}

View file

@ -0,0 +1,111 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using VisualPascalABCPlugins;
namespace DBAccessPluginNamespace
{
public partial class LoginForm : Form
{
public SiteAccessProvider SiteProvider = null;
public VisualPascalABCPlugin_TeacherControlPlugin Plugin = null;
public LoginForm(VisualPascalABCPlugin_TeacherControlPlugin Plugin)
{
this.Plugin = Plugin;
InitializeComponent();
}
public bool Authorized = false;
private async void enterButton_Click(object sender, EventArgs e)
{
if (SiteProvider == null)
throw new Exception("Error in Login form! Site credentials cannot be empty!");
if (!Authorized)
{
var answer = await SiteProvider.Login("", usersNamesBox.Text, passwordBox.Text);
if(answer == "Success")
{
//DialogResult = DialogResult.OK;
//Close();
Text = "Авторизация: вход выполнен";
passwordBox.Text = "";
enterButton.Text = "Выход";
passwordBox.Visible = false;
labelPassword.Visible = false;
groupNamesBox.Enabled = false;
usersNamesBox.Enabled = false;
Authorized = true;
Plugin.toolStripButton.ToolTipText = "Авторизация выполнена: " + SiteProvider.FullFIO;
Plugin.toolStripButton.Image = PluginImageAuthorized.Image;
Plugin.menuItem.Image = PluginImageAuthorized.Image;
this.Icon = VisualPascalABCPlugins.Properties.Resources.IconAuthorized;
closeButton.Focus();
}
else MessageBox.Show(answer,"Ошибка");
}
else
{
SiteProvider.Logout();
Text = "Авторизация";
passwordBox.Text = "";
enterButton.Text = "Вход";
groupNamesBox.SelectedIndex = -1;
usersNamesBox.Items.Clear();
usersNamesBox.SelectedIndex = -1;
groupNamesBox.Enabled = true;
usersNamesBox.Enabled = true;
passwordBox.Visible = true;
labelPassword.Visible = true;
Authorized = false;
Plugin.toolStripButton.ToolTipText = "Авторизация: вход не выполнен";
Plugin.toolStripButton.Image = PluginImage.Image;
Plugin.menuItem.Image = PluginImage.Image;
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(LoginForm));
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
}
}
private async void LoginForm_Load(object sender, EventArgs e)
{
// Получить список групп и заполнить выпадающий список значениями
if (SiteProvider == null)
throw new Exception("Error in Login form! Site credentials cannot be empty!");
if (groupNamesBox.Items.Count > 0) // Группы уже загружены
return;
//groupImage.Image = Properties.Resources.LoadingImg;
var groups = await SiteProvider.GetGroupsNames();
groupNamesBox.Items.Clear();
groupNamesBox.Items.AddRange(groups.Split(';').Where(Item => Item != "").ToArray());
//groupImage.Image = null;
}
private async void GroupNamesBox_SelectedIndexChanged(object sender, EventArgs e)
{
// Получить список участников группы
if (groupNamesBox.Text == "") return;
if (SiteProvider == null)
throw new Exception("Error in Login form! Site credentials cannot be empty!");
//userImage.Image = Properties.Resources.LoadingImg;
var users = await SiteProvider.GetUsersNames(groupNamesBox.Text);
usersNamesBox.Items.Clear();
usersNamesBox.Items.AddRange(users.Split(';').Where(Item => Item != "").ToArray());
//userImage.Image = null;
}
private void cancelButton_Click(object sender, EventArgs e)
{
Close();
passwordBox.Text = "";
}
}
}

View file

@ -0,0 +1,347 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="PluginImage.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
Qk02DAAAAAAAADYAAAAoAAAAIAAAACAAAAABABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wD/d3Z2
RUNDRUNDRUNDRUNDRUNDRUNDRUNDRUNDRUNDRUNDRUNDRUNDRUNDRUNDRUNDRUNDRUNDRUNDRUNDRUND
RUNDRUNDUlBQeXh4/wD//wD//wD//wD//wD//wD//wD/W1paR0VFWVdXW1paW1paW1paW1paW1paW1pa
W1paW1paW1paW1paW1paW1paW1paWlhYSkhIRUNDRUNDRkREUU9PWFdXU1FRR0VFSUdHdXNz/wD//wD/
/wD//wD//wD/W1paWFdX09HR5+bm5+bm5+bm5+bm5+bm5+bm5+bm5+bm5+bm5+bm5+bm5+bm5+bmu7q6
U1FRRUNDaGZmrq2t19fX4ODg2tnZsbGxa2lpRkREY2Fh/wD//wD//wD//wD/W1paW1pa5+bm////////
////////////////////////////////////////7OzscnFxRkREgH9/5OTk/v7+1dXViYeH1dXV/v7+
5+bmhIKCRkREdXNz/wD//wD//wD/W1paW1pa5+bm////////////////////////////////////////
////////s7OzSEdHaGZm5eTk////////pKOjRUNDpKOj////////5+fna2lpSUdH/wD//wD//wD/XVxc
WVdX5OPj////////////////////////////////////////////9/f3fHt7R0VFrq2t/v7+////////
oaCgRUNDoaCg/////////v7+sbGxR0VFf35+/wD//wD/ZmRkUlBQ2tnZ////////////////////////
////////////////////7OzsYmBgUU9P19fX1dXVpKOjoaCgcnFxRUNDcnFxoaCgpKOj1dXV2dnZUlFR
ZGJi/wD//wD/fHp6SEZGvby8////////////////////////////////////////////5+bmW1paWFdX
4ODgiYeHRUNDRUNDRUNDRUNDRUNDRUNDRUNDiYeH4uLiWlhYXVtb/wD//wD/pqWlRkREi4qK+/n5////
////////////////////////////////////6+vrYV9fUlBQ2NjY1dXVpKOjoaCgcnFxRUNDcnFxoaCg
pKOj1dXV2dnZUlFRZGJi/wD//wD//wD/VVNTWFdX2tra////////////////////////////////////
////9/f3e3p6R0VFrq2t/v7+////////oaCgRUNDoaCg/////////v7+sbGxR0VFf35+/wD//wD//wD/
iYiIRUNDiomJ9fX1////////////////////////////////////////s7KySUdHaGdn5eXl////////
pKOjRUNDpKOj////////5+bmamhoSUdH/wD//wD//wD//wD//wD/W1lZTEpKrKys+/v7////////////
////////////////////////7ezscXBwRkREgX9/5eXl/v7+1dXViYeH1dXV/v7+5+bmg4GBRkREdXNz
/wD//wD//wD//wD//wD/tLOzTkxMUU9PrKys9fX1/////////v7+9PT06enp6enp9PT0/v7+/v7+0tHR
Xl1dRkREaGdnsbGx2tra4uHh2trasrGxa2lpRkREY2Fh/wD//wD//wD//wD//wD//wD//wD/p6WlTkxM
TEpKiomJ2dnZ5OTkp6amcnBwXVxcXVxccnBwp6am5OTk2trac3FxRUNDRUNDR0VFU1JSWlhYU1FRR0VF
SUdHdXNz/wD//wD//wD//wD//wD//wD//wD//wD//wD/tbS0XFpaRUNDWFZWYF5eR0VFSEZGVlRUVlRU
SEZGRkREYF5eWFZWRUNDXFtbl5aW/wD/ZGNjXVtbZGJif35+/wD//wD//wD//wD//wD//wD//wD//wD/
/wD//wD//wD//wD//wD/cG5uRUNDR0VFb21turm5397e397eurm5cG5uR0VFRUNDb21t/wD//wD//wD/
/wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD/YmBgSEZGjYyM
6urq/v7+////////////6urqjYyMSEZGYmBg/wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD/
/wD//wD//wD//wD//wD//wD//wD//wD/hYSERkREgYCA7+/v////////////////////////7+/vgYCA
RkREhoSE/wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD/
TkxMXlxc3Nzc////////////////////////////////3NzcXlxcTkxM/wD//wD//wD//wD//wD//wD/
/wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD/hIODRkREoaCg/f39////////////////////
/////////////f39oaCgRkREhYSE/wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD/
/wD//wD//wD/W1lZV1VV3Nzc////////////////////////////////////////3dzcVlRUW1lZ/wD/
/wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD/xcXFSkhIdnV19vb2////////
////////////////////////////////9vb2d3V1SkhIxcTE/wD//wD//wD//wD//wD//wD//wD//wD/
/wD//wD//wD//wD//wD//wD/rKurRUNDk5KS/f39////////////////////////////////////////
/f39k5KSRUNDrKur/wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD/o6KiRUND
n52d////////////////////////////////////////////////n56eRUNDo6Ki/wD//wD//wD//wD/
/wD//wD//wD//wD//wD//wD//wD//wD//wD//wD/rq2tRUNDkpCQ/f39////////////////////////
/////////////////f39kY+PRUNDrq2t/wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD/
/wD//wD//wD/S0lJb21t8/Ly////////////////////////////////////////8/Lyb21tS0lJ/wD/
/wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD/ZGJiTUtLxcXF////////
////////////////////////////////xcXFTUtLZGJi/wD//wD//wD//wD//wD//wD//wD//wD//wD/
/wD//wD//wD//wD//wD//wD//wD/o6KiR0VFbm1t5eTk////////////////////////////////5OTk
bm1tR0VFo6Ki/wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD/
c3JyRkREeXd329vb/f39/////////////////f393NvbeXd3RkREc3Jy/wD//wD//wD//wD//wD//wD/
/wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD/a2lpRkREXVxcnpyc0NDQ4+Pj4+Pj
0dDQn56eXlxcRkREbGpq/wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD/
/wD//wD//wD//wD//wD//wD/hYSETkxMRUNDTkxMWFdXWFdXTkxMRURETkxMhoWF/wD//wD//wD//wD/
/wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD/
jYyMYF5eSUdHSUdHYF5ejIuL/wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD//wD/
/wD//wD/
</value>
</data>
<data name="PluginImageAuthorized.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
Qk02EAAAAAAAADYAAAAoAAAAIAAAACAAAAABACAAAAAAAAAAAADEDgAAxA4AAAAAAAAAAAAAPz8/EERD
Q7lFQ0P+RUND/0VDQ/9FQ0P/RUND/0VDQ/9FQ0P/RUND/0VDQ/9FQ0P/RUND/0VDQ/9FQ0P/RUND/0VD
Q/9FQ0P/RUND/0VDQ/9FQ0P/RUND/0VDQ/9FQ0P/RUJC7ERDQ7ZGQ0Ni/wD///8A////AP///wD///8A
//9HPz8gREND30VDQ/tFQ0PjREND30RDQ99EQ0PfREND30RDQ99EQ0PfREND30RDQ99EQ0PfREND30RD
Q99EQ0PfREND30VCQuFFQ0P3RUND/0VDQ/9EQkL8REJC7URDQ+NFQ0PrRUND+0RCQvhFQkK8REREOP8A
////AP///wD//0c/PyBEQ0PfREND40LIU/9CyFP/QshT/0LIU/9CyFP/QshT/0LIU/9CyFP/QshT/0LI
U/9CyFP/QshT/0LIU/9CyFP/RUJCXERCQupEQkL9RUJCzkVDQ25CyFP/QshT/0LIU/9DQ0NpRUJCykRC
QvxFQ0PVREREOP8A////AP//Rz8/IERDQ99EQ0PfQshT/0LIU/9CyFP/QshT/0LIU/9CyFP/QshT/0LI
U/9CyFP/QshT/0LIU/9CyFP/QshT/0LIU/9FQ0PAREJC/EVDQ61CyFP/QshT/0LIU/9FQkKhQshT/0LI
U/9CyFP/RUJCqERCQvxFQkK8RUVFFv8A//9HPz8gREND30RDQ99CyFP/QshT/0LIU/9CyFP/QshT/0LI
U/9CyFP/QshT/0LIU/9CyFP/QshT/0LIU/9CyFP/Q0NDZkRDQ/lFQkLOQshT/0LIU/9CyFP/RUNDfEVD
Q/5FQ0N8QshT/0LIU/9CyFP/RUJCykRCQvhERERh/wD//0ZGRh1EQ0PcREJC4kLIU/9CyFP/QshT/0LI
U/9CyFP/QshT/0LIU/9CyFP/QshT/0LIU/9CyFP/QshT/0LIU/9EQ0OyRUND+0VDQ25CyFP/QshT/0LI
U/9FQ0OARUND/0VDQ4BCyFP/QshT/0LIU/9DQ0NpRUND+0RDQ67/AP//SDw8FURCQtBFQkLsQshT/0LI
U/9CyFP/QshT/0LIU/9CyFP/QshT/0LIU/9CyFP/QshT/0LIU/9CyFP/QshT/0VCQtZEQkLtQshT/0LI
U/9FQ0N8RUNDgEVDQ8BFQ0P/RUNDwEVDQ4BFQ0N8QshT/0LIU/9EQ0PrREJC0/8A////AP//REFBskVD
Q/pEQUFZQshT/0LIU/9CyFP/QshT/0LIU/9CyFP/QshT/0LIU/9CyFP/QshT/0LIU/9CyFP/REND30RD
Q+NCyFP/RUJCoUVDQ/5FQ0P/RUND/0VDQ/9FQ0P/RUND/0VDQ/5FQkKhQshT/0VCQuFFQkLd/wD///8A
//9FQ0N5RUND/UVDQ55CyFP/QshT/0LIU/9CyFP/QshT/0LIU/9CyFP/QshT/0LIU/9CyFP/QshT/0LI
U/9EQkLXRUJC7ELIU/9CyFP/RUNDfEVDQ4BFQ0PARUND/0VDQ8BFQ0OARUNDfELIU/9CyFP/REND60RC
QtP/AP///wD//0RERDRFQ0PoREND40LIU/9CyFP/QshT/0LIU/9CyFP/QshT/0LIU/9CyFP/QshT/0LI
U/9CyFP/QshT/0RCQrNFQ0P7Q0FBbULIU/9CyFP/QshT/0VDQ4BFQ0P/RUNDgELIU/9CyFP/QshT/0ND
Q2lFQ0P7RENDrv8A////AP///wD//0RCQqBEQkL9RENDn0LIU/9CyFP/QshT/0LIU/9CyFP/QshT/0LI
U/9CyFP/QshT/0LIU/9CyFP/RUJCZ0VDQ/lEQ0PNQshT/0LIU/9CyFP/RUNDfEVDQ/5FQ0N8QshT/0LI
U/9CyFP/RUJCy0RCQvhEQUFh/wD///8A////AP//RkFBM0RCQt9EQkL0REREcELIU/9CyFP/QshT/0LI
U/9CyFP/QshT/0LIU/9CyFP/QshT/0LIU/9CyFP/RENDwURCQvxFQkKsQshT/0LIU/9CyFP/RUJCoULI
U/9CyFP/QshT/0VCQqlEQkL8RUJCvP8A////AP///wD///8A////AP//REFBZURCQvFEQkLtREREcELI
U/9CyFP/QshT/0LIU/9CyFP/QshT/0LIU/9CyFP/QshT/0LIU/9CyFP/REND20RCQvxEQ0PNQ0NDaULI
U/9CyFP/QshT/0ZDQ2lFQkLKREJC/EVDQ9VEREQ4/wD///8A////AP///wD///8A////AP//RkFBeERC
QvFEQkL0RENDn0LIU/9CyFP/REJCd0VCQsBEQ0PcREND3EVCQsBEQkJ3QshT/0LIU/9FQkK/RUND/0VD
Q/9FQ0P7REND6kVCQuFFQ0PrRUND+0RCQvhFQkK8REREOP8A////AP///wD///8A////AP///wD///8A
////AP//REJCZERCQt5EQkL9RUND5EVCQtlFQ0P7REJC+UVDQ+dFQ0PnREJC+URCQvxFQkLZRUND5ERC
Qv1EQ0PeREJCjURDQ65EQ0PTRUJC3URCQtNEQ0OuREFBYf8A////AP///wD///8A////AP///wD///8A
////AP///wD///8A////AP///wD//0VCQsNFQ0P/RUND+0RCQsREQUFdQshT/0LIU/9EQUFdRUJCw0VD
Q/tFQ0P/REJCxP8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
////AP///wD///8A////AP///wD///8A////AP//RUJC1kVDQ/pFQ0ObQshT/0LIU/9CyFP/QshT/0LI
U/9CyFP/RUNDm0VDQ/pFQkLW/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
////AP///wD///8A////AP///wD///8A////AP///wD//0VDQ6ZEQkL8RENDq0LIU/9CyFP/QshT/0LI
U/9CyFP/QshT/0LIU/9CyFP/RENDq0RCQvxFQkKl/wD///8A////AP///wD///8A////AP///wD///8A
////AP///wD///8A////AP///wD///8A////AP///wD///8A//9DQ0NLREJC8UVDQ9xCyFP/QshT/0LI
U/9CyFP/QshT/0LIU/9CyFP/QshT/0LIU/9CyFP/RUND3ERCQvFDQ0NL/wD///8A////AP///wD///8A
////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD//0RDQ6dEQkL8REJCf0LI
U/9CyFP/QshT/0LIU/9CyFP/QshT/0LIU/9CyFP/QshT/0LIU/9EQkJ/REJC/EVDQ6b/AP///wD///8A
////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A//9EREQlRUND4EVC
QuVCyFP/QshT/0LIU/9CyFP/QshT/0LIU/9CyFP/QshT/0LIU/9CyFP/QshT/0LIU/9EQkLmRUND4P8A
////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD//0RE
RE5FQ0P3RENDukLIU/9CyFP/QshT/0LIU/9CyFP/QshT/0LIU/9CyFP/QshT/0LIU/9CyFP/QshT/0VD
Q7pFQ0P3REFBTv8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
////AP//REJCcEVDQ/5FQ0OTQshT/0LIU/9CyFP/QshT/0LIU/9CyFP/QshT/0LIU/9CyFP/QshT/0LI
U/9CyFP/RUNDk0VDQ/5EQkJw/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
////AP///wD///8A//9FQ0N9RUND/0ZCQoNCyFP/QshT/0LIU/9CyFP/QshT/0LIU/9CyFP/QshT/0LI
U/9CyFP/QshT/0LIU/9GRESDRUND/0VDQ33/AP///wD///8A////AP///wD///8A////AP///wD///8A
////AP///wD///8A////AP///wD//0VDQ25FQ0P+RkJClULIU/9CyFP/QshT/0LIU/9CyFP/QshT/0LI
U/9CyFP/QshT/0LIU/9CyFP/QshT/0VCQpZFQ0P+RUNDbv8A////AP///wD///8A////AP///wD///8A
////AP///wD///8A////AP///wD///8A////AP//RkNDSERCQvVEQkLEQshT/0LIU/9CyFP/QshT/0LI
U/9CyFP/QshT/0LIU/9CyFP/QshT/0LIU/9CyFP/REJCxERCQvVGQ0NI/wD///8A////AP///wD///8A
////AP///wD///8A////AP///wD///8A////AP///wD///8A//9IPz8cREJC00RCQvJEREROQshT/0LI
U/9CyFP/QshT/0LIU/9CyFP/QshT/0LIU/9CyFP/QshT/0RERE5EQkLyREJC0/8A////AP///wD///8A
////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A//9DQUF8RUND+0RD
Q8VCyFP/QshT/0LIU/9CyFP/QshT/0LIU/9CyFP/QshT/0LIU/9CyFP/RENDxUVDQ/tDQUF8/wD///8A
////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD//0JC
QhtEQ0O+REJC/EVCQrdCyFP/QshT/0LIU/9CyFP/QshT/0LIU/9CyFP/QshT/0VCQrdEQkL8RENDvv8A
////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
////AP///wD//0dCQjJFQkLKREJC/ERDQ9xFQUGEQshT/0LIU/9CyFP/QshT/0ZERINFQ0PcREJC/EVD
Q8lCQkIy/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
////AP///wD///8A////AP///wD//0RERClDQkKlREJC8URCQv1EQkLxREND40RDQ+NEQkLxREND/URC
QvFFQ0OlREREKf8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
////AP///wD///8A////AP///wD///8A////AP///wD///8A//9GQ0NIRUNDm0VCQtlEQkL4REJC+EVC
QtlEQ0OcRUJCSf8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A
////AP///wD//w==
</value>
</data>
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAIAICAAAAEAIACoEAAAJgAAABAQAAABACAAaAQAAM4QAAAoAAAAIAAAAEAAAAABACAAAAAAAIAQ
AAAAAAAAAAAAAAAAAAAAAAAAPz8/EERDQ7lFQ0P+RUND/0VDQ/9FQ0P/RUND/0VDQ/9FQ0P/RUND/0VD
Q/9FQ0P/RUND/0VDQ/9FQ0P/RUND/0VDQ/9FQ0P/RUND/0VDQ/9FQ0P/RUND/0VDQ/9FQ0P/RUJC7ERD
Q7ZGQ0NiRUVFFgAAAAAAAAAAAAAAAAAAAABHPz8gREND30VDQ/tFQ0PjREND30RDQ99EQ0PfREND30RD
Q99EQ0PfREND30RDQ99EQ0PfREND30RDQ99EQ0PfREND30VCQuFFQ0P3RUND/0VDQ/9EQkL8REJC7URD
Q+NFQ0PrRUND+0RCQvhFQkK8REREOAAAAAIAAAAAAAAAAEc/PyBEQ0PfREND40g/PzxHPz8gRz8/IEc/
PyBHPz8gRz8/IEc/PyBHPz8gRz8/IEc/PyBHPz8gRz8/IEc/PyBHPz8gRUJCXERCQupEQkL9RUJCzkVD
Q25DQ0M1REREKUdCQjJDQ0NpRUJCykRCQvxFQ0PVREREOAAAAAAAAAAARz8/IERDQ99EQ0PfRz8/IAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8/PxhFQ0PAREJC/EVD
Q61BQUEjAAAAAURERDhFQkKhREREOAAAAAFHPz8gRUJCqERCQvxFQkK8RUVFFgAAAABHPz8gREND30RD
Q99HPz8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQ0NDZkRD
Q/lFQkLOSEFBIwAAAAAAAAAARUNDfEVDQ/5FQ0N8AAAAAAAAAABHR0cgRUJCykRCQvhERERhAAAAAEZG
Rh1EQ0PcREJC4kY/PyQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADg4
OAlEQ0OyRUND+0VDQ24AAAABAAAAAAAAAABFQ0OARUND/0VDQ4AAAAAAAAAAAAAAAAFDQ0NpRUND+0RD
Q64/Pz8ISDw8FURCQtBFQkLsRkFBMwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
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
</value>
</data>
</root>

View file

@ -1,7 +1,7 @@
//------------------------------------------------------------------------------
// <auto-generated>
// Этот код создан программой.
// Исполняемая версия:4.0.30319.1
// Исполняемая версия:4.0.30319.42000
//
// Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае
// повторной генерации кода.
@ -19,7 +19,7 @@ namespace VisualPascalABCPlugins.Properties {
// с помощью такого средства, как ResGen или Visual Studio.
// Чтобы добавить или удалить член, измените файл .ResX и снова запустите ResGen
// с параметром /str или перестройте свой проект VS.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
@ -59,5 +59,15 @@ namespace VisualPascalABCPlugins.Properties {
resourceCulture = value;
}
}
/// <summary>
/// Поиск локализованного ресурса типа System.Drawing.Icon, аналогичного (Значок).
/// </summary>
internal static System.Drawing.Icon IconAuthorized {
get {
object obj = ResourceManager.GetObject("IconAuthorized", resourceCulture);
return ((System.Drawing.Icon)(obj));
}
}
}
}

View file

@ -112,9 +112,13 @@
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="IconAuthorized" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\IconAuthorized.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root>

View file

@ -0,0 +1,207 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
namespace DBAccessPluginNamespace
{
public enum UserTypeEnum {None, Student, Teacher, Admin };
// Информация о пользователе для доступа к сайту, а также для работы с сайтом
// Это можно сохранять между запусками программы
public class SiteAccessProvider
{
// Данные о пользователе
public string ShortFIO { get; set; } = "";
public string FullFIO { get; set; } = "";
public string Password { get; set; } = "";
public string Group { get; set; } = "";
public UserTypeEnum UserType { get; set; } = UserTypeEnum.None;
// Базовый адрес папки со скриптами (адрес сервера)
public string ServAddr = "";
// Клиент для обработки запросов http
private HttpClient client = null;
/// <summary>
/// Запрос на добавление информации об активности в БДИм
/// </summary>
/// <param name="TaskName">Имя задания</param>
/// <param name="LessonName">Имя урока</param>
/// <param name="TypeString">Тип записи - например, выполнено или нет задание</param>
/// <param name="ContentInfo">Дополнительные данные - например, текст программы</param>
/// <returns></returns>
async public Task<string> SendPostRequest(string TaskName, string LessonName, string TypeString, string ContentInfo)
{
// Если не выполнен вход, то выход с ошибкой
if (UserType == UserTypeEnum.None) return "Error";
// Если не выполнен вход, то выход с ошибкой
if (UserType != UserTypeEnum.Student) return "Cannot write activity, because you're teacher!";
// Если клиент ещё не создан был, пересоздаём
if (client == null) client = new HttpClient();
// Словарик для параметров запроса
var values = new Dictionary<string, string>
{
//`id`, `pupilId`, `taskName`, `lessonName`, `type`, `content`, `time`, `IP`
{ "shortFIO", ShortFIO }, // shortFIO или FIO, и они должны совпадать с такими же в базе
{"FIO", FullFIO },
{ "taskName", TaskName },
{ "lessonName", LessonName },
{ "type", TypeString },
{ "content", ContentInfo },
{ "password", Password }
};
// Отправка запроса на сервер
var content = new FormUrlEncodedContent(values);
var response = await client.PostAsync(ServAddr + "//add.php", content);
return await response.Content.ReadAsStringAsync();
}
public void Clear()
{
ShortFIO = "";
FullFIO = "";
Password = "";
Group = "";
UserType = UserTypeEnum.None;
}
/// <summary>
/// Получение начальной информации (начальная страница)
/// </summary>
/// <returns></returns>
async public Task<string> GetContents()
{
// Если клиент ещё не создан был, пересоздаём
if (client == null) client = new HttpClient();
// Тут не столь важно что отправлять, можно и пустой список параметров
var values = new Dictionary<string, string>
{
{ "password", "123" },
};
var content = new FormUrlEncodedContent(values);
var response = await client.PostAsync(ServAddr + "/index.php", content);
return await response.Content.ReadAsStringAsync();
}
/// <summary>
/// Получить из БД список групп
/// </summary>
/// <returns></returns>
async public Task<string> GetGroupsNames(string ServerAddr = "")
{
// Этот метод может быть вызван без предварительного входа
if (ServerAddr != "")
ServAddr = ServerAddr;
if (ServAddr == "") return "Error";
// Если клиент ещё не создан был, пересоздаём
if (client == null) client = new HttpClient();
var values = new Dictionary<string, string>();
var content = new FormUrlEncodedContent(values);
var response = await client.PostAsync(ServAddr + "/groupslist.php", content);
return await response.Content.ReadAsStringAsync();
}
/// <summary>
/// Получить из БД список учеников определенной группы
/// </summary>
/// <returns></returns>
async public Task<string> GetUsersNames(string GroupName, string ServerAddr = "")
{
// Этот метод может быть вызван без предварительного входа
if (ServerAddr != "" || GroupName == "")
ServAddr = ServerAddr;
if (ServAddr == "") return "Error";
// Если клиент ещё не создан был, пересоздаём
if (client == null) client = new HttpClient();
Group = GroupName;
var values = new Dictionary<string, string>
{
//`id`, `pupilId`, `taskName`, `lessonName`, `type`, `content`, `time`, `IP`
{ "userGroup", Group } // shortFIO или FIO, и они должны совпадать с такими же в базе
};
var content = new FormUrlEncodedContent(values);
var response = await client.PostAsync(ServAddr + "/userslist.php", content);
return await response.Content.ReadAsStringAsync();
}
async public Task<string> Login(string shortFIO, string fullFIO, string password, string ServerAddr = "")
{
// Если передана строка адреса - то и хорошо, а если нет, то используем предыдущее значение
Clear();
if (ServerAddr != "")
ServAddr = ServerAddr;
if (ServAddr == "" && ServerAddr == "") return "Error";
if (shortFIO == "" && fullFIO == "") return "Error";
ShortFIO = shortFIO;
FullFIO = fullFIO;
Password = password;
if (client == null) client = new HttpClient();
// Словарик для параметров запроса
var values = new Dictionary<string, string>
{
//`id`, `pupilId`, `taskName`, `lessonName`, `type`, `content`, `time`, `IP`
{ "shortFIO", ShortFIO }, // shortFIO или FIO, и они должны совпадать с такими же в базе
{ "FIO", FullFIO },
{ "password", Password}
};
// Отправка запроса на сервер
var content = new FormUrlEncodedContent(values);
var response = await client.PostAsync(ServAddr + "/login.php", content);
string responseText = await response.Content.ReadAsStringAsync();
// Разобрать ответ от сервера - как пары key:value;
// Это сложно, т.к. тут могут быть сообщения об ошибках
//return responseText;
var pieces = responseText.Split(';');
// Сбрасываем тип пользователя, по нему и будем проверять успешность ответа
// В сообщениях об ошибках его не должно быть
foreach(var s in pieces)
{
if (s.IndexOf(':') < 1) continue;
var pair = s.Split(':');
switch(pair[0])
{
case "FIO" : FullFIO = pair[1]; break;
case "ShortFIO": ShortFIO = pair[1]; break;
case "type" : {
if (pair[1] == "prepod") UserType = UserTypeEnum.Teacher;
else if (pair[1] == "student") UserType = UserTypeEnum.Student;
break;
}
}
}
if(UserType == UserTypeEnum.None)
{
Clear();
return responseText;
}
return "Success";
}
// Так как мы на сервере пока ничего не запоминаем, то процесс выхода - просто стереть всё
public void Logout()
{
// Данные о пользователе
Clear();
if (client != null)
client.Dispose();
client = null;
}
}
}

View file

@ -5,43 +5,24 @@ using System.Text;
using System.Linq;
using PascalABCCompiler.SyntaxTreeConverters;
using PascalABCCompiler.SyntaxTree;
using DBAccessPluginNamespace;
namespace VisualPascalABCPlugins
{
/*public class TeacherContolConverter: ISyntaxTreeConverter
{
public string Name { get => "TeacherContolConverter"; }
public syntax_tree_node Convert(syntax_tree_node root)
{
var program = root as program_module;
if (program == null) // если это не главная программа, то не преобразовывать
return root;
var FileName = program.file_name;
var fi = new System.IO.FileInfo(FileName);
var SourceFileDirectory = fi.DirectoryName;
var FullLightPTName = System.IO.Path.Combine(SourceFileDirectory, "lightpt.dat");
if (!System.IO.File.Exists(FullLightPTName))
return root;
if (program.used_units == null)
program.used_units = new uses_list();
program.used_units.Add(new unit_or_namespace("LightPT", null));
program.used_units.Add(new unit_or_namespace("Tasks", null));
return root;
}
}*/
//имя класса *_VisualPascalABCPlugin
public class VisualPascalABCPlugin_TeacherControlPlugin : IVisualPascalABCPlugin
{
private const string LabelEntered = "Личный кабинет: ";
private const string LabelNotEntered = "Личный кабинет: вход не выполнен";
private const string LabelEntered = "Авторизация: ";
private const string LabelNotEntered = "Авторизация: вход не выполнен";
public static string StringsPrefix = "VPP_REGISTER_AND_CONTROL_PLUGIN_";
IVisualEnvironmentCompiler VisualEnvironmentCompiler;
IWorkbench Workbench;
private TeacherControlForm RegisterForm = new TeacherControlForm();
//private TeacherControlForm RegisterForm = new TeacherControlForm(); // старая форма авторизации
//private LoginForm RegisterFormNew = new LoginForm(); // новая форма авторизации
// User
SiteAccessProvider User = new SiteAccessProvider();
private PluginGUIItem Item;
public string Name { get => "Teacher Control Plugin"; }
public string Version { get => "0.1"; }
@ -49,27 +30,53 @@ namespace VisualPascalABCPlugins
public string Login = null;
public string Password = null;
public void Execute()
{
var dr = RegisterForm.ShowDialog();
if (RegisterForm.Registered)
Item.Hint = LabelEntered + RegisterForm.Login;
else Item.Hint = LabelNotEntered;
}
public LoginForm loginForm;
bool firstTime = true;
public ToolStripMenuItem menuItem = null;
public ToolStripButton toolStripButton = null;
public VisualPascalABCPlugin_TeacherControlPlugin(IWorkbench Workbench)
{
loginForm = new LoginForm(this);
this.Workbench = Workbench;
VisualEnvironmentCompiler = Workbench.VisualEnvironmentCompiler;
RegisterForm.VisualEnvironmentCompiler = VisualEnvironmentCompiler;
//var tbitem = Workbench.MainForm.Controls.Find("", true);
// RegisterForm.VisualEnvironmentCompiler = VisualEnvironmentCompiler; // Пока форма регистрации никак не связана с компилятором
// Регистрация обработчика
this.Workbench.ServiceContainer.RunService.Starting += RunStartingHandler;
//Workbench.ServiceContainer.BuildService.BeforeCompile += BeforeCompileHandler;
}
public void Execute()
{
if (firstTime)
{
firstTime = false;
menuItem = (ToolStripMenuItem)Item.menuItem;
toolStripButton = (ToolStripButton)Item.toolStripButton;
}
User.ServAddr = "https://air.mmcs.sfedu.ru/pascalabc";
loginForm.SiteProvider = User;
loginForm.ShowDialog(); // OK никогда не будет
/*if (loginForm.Authorized)
{
toolStripButton.ToolTipText = "Авторизация выполнена";
toolStripButton.Image = loginForm.PluginImageAuthorized.Image;
}
else
{
toolStripButton.ToolTipText = "Авторизация: вход не выполнен";
toolStripButton.Image = loginForm.PluginImage.Image;
}*/
}
public void GetGUI(List<IPluginGUIItem> MenuItems, List<IPluginGUIItem> ToolBarItems)
{
Item = new PluginGUIItem(StringsPrefix + "NAME", StringsPrefix + "DESCRIPTION", RegisterForm.PluginImage.Image, RegisterForm.PluginImage.BackColor, Execute);
Item = new PluginGUIItem(StringsPrefix + "NAME", StringsPrefix + "DESCRIPTION", loginForm.PluginImage.Image, loginForm.PluginImage.BackColor, Execute);
MenuItems.Add(Item);
ToolBarItems.Add(Item);
}
@ -99,10 +106,10 @@ namespace VisualPascalABCPlugins
private void RunStartingHandler(string filename)
{
if (RegisterForm.Registered)
/*if (RegisterForm.Registered)
{
System.IO.File.AppendAllText("d:\\runs.txt", filename + " " + DateTime.Now + '\n');
}
}*/
}
}
}

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="12.0">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
@ -15,7 +15,7 @@
<OldToolsVersion>4.0</OldToolsVersion>
<UpgradeBackupLocation>
</UpgradeBackupLocation>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<TargetFrameworkVersion>v4.7.1</TargetFrameworkVersion>
<TargetFrameworkProfile />
<PublishUrl>publish\</PublishUrl>
<Install>true</Install>
@ -43,6 +43,7 @@
<WarningLevel>4</WarningLevel>
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
<UseVSHostingProcess>true</UseVSHostingProcess>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
@ -52,20 +53,29 @@
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Drawing" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="LoginForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="LoginForm.designer.cs">
<DependentUpon>LoginForm.cs</DependentUpon>
</Compile>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Include="SiteAccessInfo.cs" />
<Compile Include="TeacherControlForm.cs">
<SubType>Form</SubType>
</Compile>
@ -76,6 +86,9 @@
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="LoginForm.resx">
<DependentUpon>LoginForm.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<SubType>Designer</SubType>
<Generator>ResXFileCodeGenerator</Generator>
@ -137,6 +150,15 @@
<Install>true</Install>
</BootstrapperPackage>
</ItemGroup>
<ItemGroup>
<None Include="IconAuthorized1.ico" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\IconAuthorized.ico" />
</ItemGroup>
<ItemGroup>
<None Include="IconAuthorized.ico" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.

View file

@ -119,8 +119,6 @@ type
function AddGeom(n: integer; a0,step: real): ObjectList; begin lst.AddRange(ArrGen(n,a0,x->x*step).Select(x -> object(x))); Result := Self end;
end;
var
OutputString := new StringBuilder;
OutputList := new List<object>;
@ -132,7 +130,7 @@ var
Cur := 0;
function TaskName := ExtractFileName(System.Environment.GetCommandLineArgs[0]).Replace('.exe', '');
var TaskName := ExtractFileName(System.Environment.GetCommandLineArgs[0]).Replace('.exe', '');
function IsPT := System.Type.GetType('PT4.PT4') <> nil;
@ -687,6 +685,13 @@ begin
var bool := IsSol.Invoke(f.GetValue(nil),nil);
if boolean(bool) then
TaskResult := Solved;
// RobField.TaskName
var RBTaskNameInfo := f.FieldType.GetField('TaskName');
var v := string(RBTaskNameInfo.GetValue(f.GetValue(nil)));
// Добавлять RB к имени задания если его там нет
if not v.ToLower.StartsWith('rb') then
v := v.Insert(0,'RB');
TaskName := v;
end;
end;
@ -702,11 +707,18 @@ begin
var bool := IsSol.Invoke(f.GetValue(nil),nil);
if boolean(bool) then
TaskResult := Solved;
// DMField.TaskName
var DMTaskNameInfo := f.FieldType.GetField('TaskName');
var v := string(DMTaskNameInfo.GetValue(f.GetValue(nil)));
// Добавлять DM к имени задания если его там нет
if not v.ToLower.StartsWith('dm') then
v := v.Insert(0,'DM');
TaskName := v;
end;
end;
// Вызов PT4.PT4.__FinalizeModule__ отражением
procedure FinalizeModulePT4;
procedure PT4CheckSolution;
begin
var t := System.Type.GetType('PT4.PT4');
if t<>nil then
@ -714,6 +726,9 @@ begin
var meth := t.GetMethod('__FinalizeModule__',System.Reflection.BindingFlags.Public or System.Reflection.BindingFlags.Static);
if meth <> nil then
meth.Invoke(nil,nil);
//
var f := t.GetField('TaskName',System.Reflection.BindingFlags.Public or System.Reflection.BindingFlags.Static);
TaskName := string(f.GetValue(nil));
end;
end;
@ -889,15 +904,27 @@ begin
ColoredMessage('PT4: '+info.Replace(#13#10, ' ').TrimStart().TrimEnd('.',' '));}
end;
function ConvertTaskName(tn: string): string;
begin
var TName := tn;
// Если есть номер с подчеркиванием в начале, то отбросить его
var ind := TName.IndexOf('_');
if (ind >= 0) and TName[1].IsDigit then // Значит, в начале - номер, он служит лишь для упорядочения файлов
TName := TName.Remove(0,ind + 1);
if TName.ToLower in TaskNamesMap then
TName := TaskNamesMap[TName.ToLower];
Result := TName;
end;
procedure CheckMyPT;
begin
if CheckTask = nil then
exit;
var TName := TaskName;
try
var TName := TaskName;
if TName.ToLower in TaskNamesMap then
TName := TaskNamesMap[TName.ToLower];
TName := ConvertTaskName(TaskName);
CheckTask(TName);
// Если это задача из задачника, то результат будет NotUnderControl. И дальше необходимо это преобразовывать
case TaskResult of
@ -943,16 +970,24 @@ begin
// Теперь тщательно проверяем задачник и исполнителей
if IsPT then
begin
FinalizeModulePT4;
PT4CheckSolution;
TName := TaskName;
var info := GetSolutionInfoPT4;
CalcPT4Result(info,TaskResult,TaskResultInfo);
end
else if IsRobot then
RobotCheckSolution
begin
RobotCheckSolution;
TName := TaskName;
end
else if IsDrawman then
begin
DrawmanCheckSolution;
TName := TaskName;
end;
// Хотелось бы писать в БД для Робота и др. имя задания в Task
if WriteInfoCallBack<>nil then
WriteInfoCallBack(TaskName, TaskResult, TaskResultInfo);
WriteInfoCallBack(TName, TaskResult, TaskResultInfo);
end;
procedure LoadLightPTInfo;

View file

@ -81,6 +81,8 @@ type
property Parent: Node read getParent write SetParent;
property Data: integer read getData write SetData;
end;
var TaskName: string;
/// Вывести формулировку задания
procedure Task(name: string);
@ -833,7 +835,7 @@ procedure StartPT(options: integer); external '%PABCSYSTEM%\PT4\PT4PABC.dll'
procedure FreePT; external '%PABCSYSTEM%\PT4\PT4PABC.dll' name 'freept';
function CheckPT(var res: integer):string;external '%PABCSYSTEM%\PT4\PT4PABC.dll' name 'checkptf';
procedure RaisePT(s1,s2: string); external '%PABCSYSTEM%\PT4\PT4PABC.dll' name 'raisept';
procedure Task(name: string); external '%PABCSYSTEM%\PT4\PT4PABC.dll' name 'task';
procedure Task__(name: string); external '%PABCSYSTEM%\PT4\PT4PABC.dll' name 'task';
procedure GetR(var param: real); external '%PABCSYSTEM%\PT4\PT4PABC.dll' name 'getr';
procedure PutR(param: real); external '%PABCSYSTEM%\PT4\PT4PABC.dll' name 'putr';
procedure GetN(var param: integer); external '%PABCSYSTEM%\PT4\PT4PABC.dll' name 'getn';
@ -850,6 +852,12 @@ procedure DisposeP(sNode: IntPtr); external '%PABCSYSTEM%\PT4\PT4PABC.dll'
function FinishPT(): integer; external '%PABCSYSTEM%\PT4\PT4PABC.dll' name 'finishpt'; // == 4.13 ==
procedure _GetSolutionInfo(info: System.Text.StringBuilder);external '%PABCSYSTEM%\PT4\PT4PABC.dll' name 'getsolutioninfo';
procedure Task(name: string);
begin
Task__(name);
TaskName := name;
end;
procedure Dispose(p: pointer);
begin
DisposeP(IntPtr(p));