diff --git a/Base/data/ScadaBase_5.0_en.sdf b/Base/data/ScadaBase_5.0_en.sdf index 2c7c485db..13ce98ce6 100644 Binary files a/Base/data/ScadaBase_5.0_en.sdf and b/Base/data/ScadaBase_5.0_en.sdf differ diff --git a/Base/data/ScadaBase_5.0_ru.sdf b/Base/data/ScadaBase_5.0_ru.sdf index d060a1db3..44150a09d 100644 Binary files a/Base/data/ScadaBase_5.0_ru.sdf and b/Base/data/ScadaBase_5.0_ru.sdf differ diff --git a/Config/DefaultMono/SCADA/ScadaComm/Config/ScadaCommSvcConfig.xml b/Config/DefaultMono/SCADA/ScadaComm/Config/ScadaCommSvcConfig.xml new file mode 100644 index 000000000..8cb19fc10 --- /dev/null +++ b/Config/DefaultMono/SCADA/ScadaComm/Config/ScadaCommSvcConfig.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Config/DefaultMono/SCADA/ScadaServer/Config/ScadaServerSvcConfig.xml b/Config/DefaultMono/SCADA/ScadaServer/Config/ScadaServerSvcConfig.xml new file mode 100644 index 000000000..81de0225a --- /dev/null +++ b/Config/DefaultMono/SCADA/ScadaServer/Config/ScadaServerSvcConfig.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Config/DefaultMono/SCADA/ScadaWeb/config/WebSettings.xml b/Config/DefaultMono/SCADA/ScadaWeb/config/WebSettings.xml new file mode 100644 index 000000000..7ea00e403 --- /dev/null +++ b/Config/DefaultMono/SCADA/ScadaWeb/config/WebSettings.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -19,6 +20,7 @@ + <%= compScripts %> "); + + // формирование содержимого веб-страницы + string webPageContent = string.Format(webPageTemplate, + sbCompStyles.ToString(), + sbCompScripts.ToString(), + sbEditorScript.ToString()); + // запись файла веб-страницы using (StreamWriter writer = new StreamWriter(GetWebPageFilePath(webDir), false, Encoding.UTF8)) { writer.Write(webPageContent); @@ -698,48 +714,52 @@ public bool CreateComponent(int x, int y) { // проверка возможности создания компонента if (SchemeView == null) - throw new ScadaException(Localization.UseRussian ? + { + throw new ScadaException(Localization.UseRussian ? "Схема не загружена." : "Scheme is not loaded."); + } if (string.IsNullOrEmpty(NewComponentTypeName)) - throw new ScadaException(Localization.UseRussian ? + { + throw new ScadaException(Localization.UseRussian ? "Не определён тип создаваемого компонента." : "Type of the creating component is not defined."); - - // получение типа компонента - Type componentType; - if (!ComponentTypes.TryGetValue(NewComponentTypeName, out componentType)) - throw new ScadaException(string.Format(Localization.UseRussian ? - "Не найден тип создаваемого компонента {0}." : - "Type of the creating component {0} not found.", NewComponentTypeName)); + } // создание компонента - BaseComponent component = (BaseComponent)Activator.CreateInstance(componentType); - component.ID = SchemeView.GetNextComponentID(); - component.Location = new Point(x, y); - component.SchemeDoc = SchemeView.SchemeDoc; - component.ItemChanged += Scheme_ItemChanged; + BaseComponent component = compManager.CreateComponent(NewComponentTypeName); - // добавление компонента на схему - lock (SchemeView.SyncRoot) + if (component == null) { - SchemeView.Components[component.ID] = component; + return false; } + else + { + component.ID = SchemeView.GetNextComponentID(); + component.Location = new Point(x, y); + component.SchemeDoc = SchemeView.SchemeDoc; + component.ItemChanged += Scheme_ItemChanged; - SchemeView.SchemeDoc.OnItemChanged(SchemeChangeTypes.ComponentAdded, component); + // добавление компонента на схему + lock (SchemeView.SyncRoot) + { + SchemeView.Components[component.ID] = component; + } - // выбор добавленного компонента - lock (selComponents) - { - selComponents.Clear(); - selComponents.Add(component); - } + SchemeView.SchemeDoc.OnItemChanged(SchemeChangeTypes.ComponentAdded, component); - OnSelectionChanged(); - PointerMode = PointerModes.Select; + // выбор добавленного компонента + lock (selComponents) + { + selComponents.Clear(); + selComponents.Add(component); + } - return true; + OnSelectionChanged(); + PointerMode = PointerModes.Select; + return true; + } } catch (ScadaException ex) { diff --git a/ScadaWeb/ScadaScheme/ScadaSchemeEditor/AppCode/FormState.cs b/ScadaWeb/ScadaScheme/ScadaSchemeEditor/AppCode/FormState.cs index d11bd0744..f6454135f 100644 --- a/ScadaWeb/ScadaScheme/ScadaSchemeEditor/AppCode/FormState.cs +++ b/ScadaWeb/ScadaScheme/ScadaSchemeEditor/AppCode/FormState.cs @@ -124,6 +124,16 @@ public FormState(Form form, bool correct = false) /// public int Height { get; set; } + /// + /// Получить или установить директорию, из которой открывались схемы + /// + public string SchemeDir { get; set; } + + /// + /// Получить или установить директорию, из которой открывались изображения + /// + public string ImageDir { get; set; } + /// /// Установить значения по умолчанию @@ -138,6 +148,8 @@ private void SetToDefault() Top = 0; Width = 0; Height = 0; + SchemeDir = ""; + ImageDir = ""; } /// @@ -171,6 +183,8 @@ public bool Load(string fileName, out string errMsg) Top = rootElem.GetChildAsInt("Top"); Width = rootElem.GetChildAsInt("Width"); Height = rootElem.GetChildAsInt("Height"); + SchemeDir = rootElem.GetChildAsString("SchemeDir"); + ImageDir = rootElem.GetChildAsString("ImageDir"); IsEmpty = false; } @@ -203,6 +217,8 @@ public bool Save(string fileName, out string errMsg) rootElem.AppendElem("Top", Top); rootElem.AppendElem("Width", Width); rootElem.AppendElem("Height", Height); + rootElem.AppendElem("SchemeDir", SchemeDir); + rootElem.AppendElem("ImageDir", ImageDir); xmlDoc.Save(fileName); errMsg = ""; diff --git a/ScadaWeb/ScadaScheme/ScadaSchemeEditor/AppCode/IMainForm.cs b/ScadaWeb/ScadaScheme/ScadaSchemeEditor/AppCode/IMainForm.cs index 8db271c21..1157ea395 100644 --- a/ScadaWeb/ScadaScheme/ScadaSchemeEditor/AppCode/IMainForm.cs +++ b/ScadaWeb/ScadaScheme/ScadaSchemeEditor/AppCode/IMainForm.cs @@ -15,7 +15,7 @@ * * * Product : Rapid SCADA - * Module : ScadaSchemeCommon + * Module : Scheme Editor * Summary : Specifies the functionality provided by the main form * * Author : Mikhail Shiryaev diff --git a/ScadaWeb/ScadaScheme/ScadaSchemeEditor/AppCode/SchemeEditorSvc.cs b/ScadaWeb/ScadaScheme/ScadaSchemeEditor/AppCode/SchemeEditorSvc.cs index 13a3ecac3..f98a2bcb7 100644 --- a/ScadaWeb/ScadaScheme/ScadaSchemeEditor/AppCode/SchemeEditorSvc.cs +++ b/ScadaWeb/ScadaScheme/ScadaSchemeEditor/AppCode/SchemeEditorSvc.cs @@ -191,6 +191,38 @@ public string GetImages(string editorID, long viewStamp, int startIndex, int tot } } + /// + /// Получить ошибки при загрузке схемы + /// + /// Возвращает SchemeDTO в формате в JSON + [OperationContract] + [WebGet] + public string GetLoadErrors(string editorID, long viewStamp) + { + try + { + AllowAccess(); + SchemeDTO dto = new SchemeDTO(); + + if (CheckArguments(editorID, viewStamp, dto)) + { + lock (Editor.SchemeView.SyncRoot) + { + dto.Data = Editor.SchemeView.LoadErrors.ToArray(); + } + } + + return JsSerializer.Serialize(dto); + } + catch (Exception ex) + { + AppData.Log.WriteException(ex, Localization.UseRussian ? + "Ошибка при получении ошибок при загрузке схемы" : + "Error getting loading errors of the scheme"); + return JsSerializer.GetErrorJson(ex); + } + } + /// /// Получить изменения схемы /// diff --git a/ScadaWeb/ScadaScheme/ScadaSchemeEditor/AppCode/Settings.cs b/ScadaWeb/ScadaScheme/ScadaSchemeEditor/AppCode/Settings.cs index 317e2d03b..0f088bb6a 100644 --- a/ScadaWeb/ScadaScheme/ScadaSchemeEditor/AppCode/Settings.cs +++ b/ScadaWeb/ScadaScheme/ScadaSchemeEditor/AppCode/Settings.cs @@ -24,8 +24,8 @@ */ using System; -using System.Collections.Generic; -using System.Text; +using System.IO; +using System.Xml; namespace Scada.Scheme.Editor { @@ -35,5 +35,101 @@ namespace Scada.Scheme.Editor /// internal class Settings { + /// + /// Имя файла настроек по умолчанию + /// + public const string DefFileName = "ScadaSchemeEditorConfig.xml"; + + + /// + /// Конструктор + /// + public Settings() + { + SetToDefault(); + } + + + /// + /// Получить или установить директорию веб-приложения + /// + public string WebDir { get; set; } + + + /// + /// Установить настройки приложения по умолчанию + /// + private void SetToDefault() + { + WebDir = @"C:\SCADA\ScadaWeb\"; + } + + /// + /// Загрузить настройки приложения из файла + /// + public bool Load(string fileName, out string errMsg) + { + // установка значений по умолчанию + SetToDefault(); + + // загрузка настроек + try + { + if (!File.Exists(fileName)) + throw new FileNotFoundException(string.Format(CommonPhrases.NamedFileNotFound, fileName)); + + XmlDocument xmlDoc = new XmlDocument(); + xmlDoc.Load(fileName); + XmlNodeList paramNodes = xmlDoc.DocumentElement.SelectNodes("Param"); + + foreach (XmlElement paramElem in paramNodes) + { + string name = paramElem.GetAttribute("name"); + string nameL = name.ToLowerInvariant(); + string val = paramElem.GetAttribute("value"); + + if (nameL == "webdir") + WebDir = ScadaUtils.NormalDir(val); + } + + errMsg = ""; + return true; + } + catch (Exception ex) + { + errMsg = CommonPhrases.LoadAppSettingsError + ":" + Environment.NewLine + ex.Message; + return false; + } + } + + /// + /// Сохранить настройки приложения в файле + /// + public bool Save(string fileName, out string errMsg) + { + try + { + // формирование XML-документа + XmlDocument xmlDoc = new XmlDocument(); + + XmlDeclaration xmlDecl = xmlDoc.CreateXmlDeclaration("1.0", "utf-8", null); + xmlDoc.AppendChild(xmlDecl); + + XmlElement rootElem = xmlDoc.CreateElement("ScadaSchemeEditorConfig"); + xmlDoc.AppendChild(rootElem); + rootElem.AppendParamElem("WebDir", WebDir, + "Директория веб-приложения", "Web application directory"); + + // сохранение в файле + xmlDoc.Save(fileName); + errMsg = ""; + return true; + } + catch (Exception ex) + { + errMsg = CommonPhrases.SaveAppSettingsError + ":" + Environment.NewLine + ex.Message; + return false; + } + } } } diff --git a/ScadaWeb/ScadaScheme/ScadaSchemeEditor/Config/ScadaSchemeEditorConfig.xml b/ScadaWeb/ScadaScheme/ScadaSchemeEditor/Config/ScadaSchemeEditorConfig.xml new file mode 100644 index 000000000..98d37446b --- /dev/null +++ b/ScadaWeb/ScadaScheme/ScadaSchemeEditor/Config/ScadaSchemeEditorConfig.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/ScadaWeb/ScadaScheme/ScadaSchemeEditor/FrmMain.Designer.cs b/ScadaWeb/ScadaScheme/ScadaSchemeEditor/FrmMain.Designer.cs index aff86971e..14e49570d 100644 --- a/ScadaWeb/ScadaScheme/ScadaSchemeEditor/FrmMain.Designer.cs +++ b/ScadaWeb/ScadaScheme/ScadaSchemeEditor/FrmMain.Designer.cs @@ -52,7 +52,8 @@ private void InitializeComponent() this.sep3 = new System.Windows.Forms.ToolStripSeparator(); this.btnEditPointer = new System.Windows.Forms.ToolStripButton(); this.btnEditDelete = new System.Windows.Forms.ToolStripButton(); - this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.sep4 = new System.Windows.Forms.ToolStripSeparator(); + this.btnSettingsOptions = new System.Windows.Forms.ToolStripButton(); this.btnHelpAbout = new System.Windows.Forms.ToolStripButton(); this.statusStrip = new System.Windows.Forms.StatusStrip(); this.lblStatus = new System.Windows.Forms.ToolStripStatusLabel(); @@ -90,7 +91,8 @@ private void InitializeComponent() this.sep3, this.btnEditPointer, this.btnEditDelete, - this.toolStripSeparator1, + this.sep4, + this.btnSettingsOptions, this.btnHelpAbout}); this.toolStrip.Location = new System.Drawing.Point(0, 0); this.toolStrip.Name = "toolStrip"; @@ -233,10 +235,20 @@ private void InitializeComponent() this.btnEditDelete.ToolTipText = "Delete selected components (Del)"; this.btnEditDelete.Click += new System.EventHandler(this.btnEditDelete_Click); // - // toolStripSeparator1 + // sep4 // - this.toolStripSeparator1.Name = "toolStripSeparator1"; - this.toolStripSeparator1.Size = new System.Drawing.Size(6, 25); + this.sep4.Name = "sep4"; + this.sep4.Size = new System.Drawing.Size(6, 25); + // + // btnSettingsOptions + // + this.btnSettingsOptions.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.btnSettingsOptions.Image = ((System.Drawing.Image)(resources.GetObject("btnSettingsOptions.Image"))); + this.btnSettingsOptions.ImageTransparentColor = System.Drawing.Color.Magenta; + this.btnSettingsOptions.Name = "btnSettingsOptions"; + this.btnSettingsOptions.Size = new System.Drawing.Size(23, 20); + this.btnSettingsOptions.ToolTipText = "Settings"; + this.btnSettingsOptions.Click += new System.EventHandler(this.btnSettingsOptions_Click); // // btnHelpAbout // @@ -360,6 +372,7 @@ private void InitializeComponent() // propertyGrid // this.propertyGrid.Dock = System.Windows.Forms.DockStyle.Fill; + this.propertyGrid.LineColor = System.Drawing.SystemColors.ControlDark; this.propertyGrid.Location = new System.Drawing.Point(3, 24); this.propertyGrid.Name = "propertyGrid"; this.propertyGrid.Size = new System.Drawing.Size(295, 411); @@ -447,12 +460,13 @@ private void InitializeComponent() private System.Windows.Forms.ToolStripButton btnFileOpenBrowser; private System.Windows.Forms.ToolStripButton btnEditUndo; private System.Windows.Forms.ToolStripButton btnEditRedo; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripSeparator sep4; private System.Windows.Forms.OpenFileDialog ofdScheme; private System.Windows.Forms.SaveFileDialog sfdScheme; private System.Windows.Forms.ListView lvCompTypes; private System.Windows.Forms.ImageList ilCompTypes; private System.Windows.Forms.ColumnHeader colCompName; + private System.Windows.Forms.ToolStripButton btnSettingsOptions; } } diff --git a/ScadaWeb/ScadaScheme/ScadaSchemeEditor/FrmMain.cs b/ScadaWeb/ScadaScheme/ScadaSchemeEditor/FrmMain.cs index a3cc03c3e..898383d7a 100644 --- a/ScadaWeb/ScadaScheme/ScadaSchemeEditor/FrmMain.cs +++ b/ScadaWeb/ScadaScheme/ScadaSchemeEditor/FrmMain.cs @@ -28,14 +28,11 @@ using Scada.Scheme.Model.PropertyGrid; using Scada.UI; using System; -using System.Collections.Generic; using System.Diagnostics; using System.IO; -using System.Reflection; using System.Threading; using System.Windows.Forms; using Utils; -using CM = System.ComponentModel; namespace Scada.Scheme.Editor { @@ -45,14 +42,15 @@ namespace Scada.Scheme.Editor /// public partial class FrmMain : Form, IMainForm { - private readonly AppData appData; // общие данные приложения - private readonly Log log; // журнал приложения - private readonly Editor editor; // редактор + private readonly AppData appData; // общие данные приложения + private readonly Settings settings; // настройки приложения + private readonly Log log; // журнал приложения + private readonly Editor editor; // редактор - private Mutex mutex; // объект для проверки запуска второй копии приложения - private bool compTypesChanging; // пользователь изменяет выбранный элемент lvCompTypes - private bool schCompChanging; // пользователь изменяет выбранный элемент cbSchComp - private FormStateDTO formStateDTO; // состояние формы для передачи + private Mutex mutex; // объект для проверки запуска второй копии приложения + private bool compTypesChanging; // пользователь изменяет выбранный элемент lvCompTypes + private bool schCompChanging; // пользователь изменяет выбранный элемент cbSchComp + private FormStateDTO formStateDTO; // состояние формы для передачи /// @@ -63,6 +61,7 @@ public FrmMain() InitializeComponent(); appData = AppData.GetAppData(); + settings = appData.Settings; log = appData.Log; editor = appData.Editor; mutex = null; @@ -92,10 +91,14 @@ private void LocalizeForm() else log.WriteError(errMsg); + if (Localization.LoadDictionaries(appData.AppDirs.LangDir, "ScadaScheme", out errMsg)) + SchemePhrases.Init(); + else + log.WriteError(errMsg); + if (Localization.LoadDictionaries(appData.AppDirs.LangDir, "ScadaSchemeEditor", out errMsg)) { Translator.TranslateForm(this, "Scada.Scheme.Editor.FrmMain"); - SchemePhrases.Init(); AppPhrases.Init(); ofdScheme.Filter = sfdScheme.Filter = AppPhrases.SchemeFileFilter; } @@ -119,8 +122,9 @@ private void LocalizeAttributes() attrTranslator.TranslateAttrs(typeof(DynamicText)); attrTranslator.TranslateAttrs(typeof(StaticPicture)); attrTranslator.TranslateAttrs(typeof(DynamicPicture)); + attrTranslator.TranslateAttrs(typeof(UnknownComponent)); attrTranslator.TranslateAttrs(typeof(Condition)); - attrTranslator.TranslateAttrs(typeof(FrmImageDialog.ImageListItem)); + attrTranslator.TranslateAttrs(typeof(ImageListItem)); } catch (Exception ex) { @@ -150,6 +154,49 @@ private bool SecondInstanceExists() } } + /// + /// Заполнить список типов компонентов + /// + private void FillComponentTypes() + { + try + { + lvCompTypes.BeginUpdate(); + CompLibSpec[] specs = appData.CompManager.GetSortedSpecs(); + + foreach (CompLibSpec spec in specs) + { + ListViewGroup listViewGroup = new ListViewGroup(spec.GroupHeader); + + // добавление элемента с указателем + lvCompTypes.Items.Add(new ListViewItem( + "Pointer", "pointer.png", listViewGroup) { IndentCount = 1 }); + + // добавление компонентов + foreach (CompItem compItem in spec.CompItems) + { + string imageKey = "image" + ilCompTypes.Images.Count; + ilCompTypes.Images.Add(imageKey, compItem.Icon); + + lvCompTypes.Items.Add(new ListViewItem() + { + Text = compItem.DisplayName, + ImageKey = imageKey, + Tag = compItem.CompType?.FullName, + Group = listViewGroup, + IndentCount = 1 + }); + } + + lvCompTypes.Groups.Add(listViewGroup); + } + } + finally + { + lvCompTypes.EndUpdate(); + } + } + /// /// Открыть браузер со страницей редактора /// @@ -176,7 +223,7 @@ private void InitScheme(string fileName = "") } else { - loadOK = editor.LoadSchemeFromFile(ofdScheme.FileName, out errMsg); + loadOK = editor.LoadSchemeFromFile(fileName, out errMsg); } appData.AssignViewStamp(editor.SchemeView); @@ -539,17 +586,33 @@ private void FrmMain_Load(object sender, EventArgs e) return; } + // загрузка настроек приложения + string errMsg; + if (!settings.Load(appData.AppDirs.ConfigDir + Settings.DefFileName, out errMsg)) + { + log.WriteError(errMsg); + ScadaUiUtils.ShowError(errMsg); + } + + // загрузка компонентов + appData.LoadComponents(); + // настройка элментов управления lvCompTypes.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize); lblStatus.Text = ""; + FillComponentTypes(); // создание новой схемы InitScheme(); // загрузка состояния формы FormState formState = new FormState(); - string errMsg; - if (!formState.Load(appData.AppDirs.ConfigDir + FormState.DefFileName, out errMsg)) + if (formState.Load(appData.AppDirs.ConfigDir + FormState.DefFileName, out errMsg)) + { + ImageEditor.ImageDir = formState.ImageDir; + ofdScheme.InitialDirectory = formState.SchemeDir; + } + else { log.WriteError(errMsg); ScadaUiUtils.ShowError(errMsg); @@ -580,7 +643,10 @@ private void FrmMain_FormClosed(object sender, FormClosedEventArgs e) { // сохранение состояния формы FormState formState = new FormState(this); + formState.SchemeDir = ofdScheme.InitialDirectory; + formState.ImageDir = ImageEditor.ImageDir; string errMsg; + if (!formState.Save(appData.AppDirs.ConfigDir + FormState.DefFileName, out errMsg)) { log.WriteError(errMsg); @@ -679,12 +745,13 @@ private void btnFileOpen_Click(object sender, EventArgs e) // открытие схемы из файла if (ConfirmCloseScheme()) { - ofdScheme.InitialDirectory = string.IsNullOrEmpty(editor.FileName) ? - "" : Path.GetDirectoryName(editor.FileName); ofdScheme.FileName = ""; if (ofdScheme.ShowDialog() == DialogResult.OK) + { + ofdScheme.InitialDirectory = Path.GetDirectoryName(ofdScheme.FileName); InitScheme(ofdScheme.FileName); + } } } @@ -760,6 +827,19 @@ private void btnEditDelete_Click(object sender, EventArgs e) editor.DeleteSelected(); } + private void btnSettingsOptions_Click(object sender, EventArgs e) + { + // отображение формы настроек + if (FrmSettings.ShowDialog(settings)) + { + string errMsg; + if (settings.Save(appData.AppDirs.ConfigDir + Settings.DefFileName, out errMsg)) + ScadaUiUtils.ShowInfo(AppPhrases.RestartNeeded); + else + ScadaUiUtils.ShowError(errMsg); + } + } + private void btnHelpAbout_Click(object sender, EventArgs e) { // отображение формы о программе diff --git a/ScadaWeb/ScadaScheme/ScadaSchemeEditor/FrmMain.resx b/ScadaWeb/ScadaScheme/ScadaSchemeEditor/FrmMain.resx index 3a096c4b6..af86ae39b 100644 --- a/ScadaWeb/ScadaScheme/ScadaSchemeEditor/FrmMain.resx +++ b/ScadaWeb/ScadaScheme/ScadaSchemeEditor/FrmMain.resx @@ -203,15 +203,15 @@ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHPSURBVDhPYyAG/P//nwXKJAxWbNjXPXvpuidQLsO/f//0 - b958+q66ddIGqBB+MHnOapP6+q5/VS0zJEH8r9+/t06aufhfck5lDFgBMaB+9spfk+esWgx0Ov+jF29e - puXX/BPn51eEShMGyzbu+tQ1ecrP46cvNhw8du63vVvQXyEhTmmoNGEwf+W2zfX1nf96py7cX15f/8/H - L/oVVIo40DlxgWMJUGNyXt0/e5eAv27eQaugUsSDhLz6d2EJhf+t0+r/+MW3RkCFCYOo9re6Ee2vN9s3 - P/jpXXJirU/82d9++ee/e5eenu+StcsLqgw7iGh/ZRjZ9e6zf8P575aB076Y+nXddcvb98a/+up/1+yd - /61i5k+AKsUOQlufbQhre/rfMW3Df9Og+h8mQb1bvEs2/fIquSLhlL4xwcSn/hdUKXbgU//oV3DTfUP7 - lC0GUkDFFiG9Qj7VV395VZ03MIuYli3vEP8bqhQ78Km/98u/5IqBXdLqJEmobZ5Fx8/aJa36r2mT/F9G - XukLWCEu4F158Zx90ur/xgFd/9WNwh4DhZjtU1ZHqpokvFM3D39v7NeWAVGJAzhlbI4wCpn0WNUk9p2B - V1UeVJiWgIEBAG94yZrR/OCkAAAAAElFTkSuQmCC + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHQSURBVDhPYyAG/P//nwXKJAxWbNjXPXvpuidQLsO/f//0 + b958+q66ddIGqBB+MHnOapP6+vZ/VS0zJEH8r9+/t/ZPW/AvOacyBqyAGFA/e+WvyXNWLQY6nf/Rizcv + 0/Jr/onz8ytCpQmDZRt3feqaPOXn8dMXGw4eO/fb3tn/r5AQpzRUmjCYv3Lb5vr6tn+9UxfuL6+v/+fj + F/0KKkUc6Jy4wLEEqDE5r+6fvaPvXzfvoFVQKeJBQl79u7CEwv8WafV//OJbI6DChEFU+1vdiPbXm+2b + H/z0Ljmx1if+7G+//PPfvUtPz3fJ2uUFVYYdRLS/MozsevfZv+H8d8vAaV9M/bruuuXte+NfffW/a/bO + /1Yx8ydAlWIHoa3PNoS1Pf3vmLbhv2lQ/Q+ToN4t3iWbfnmVXJFwSt+YYOJT/wuqFDvwqX/0K7jpvqF9 + yhYDSaBii5BeIZ/qq7+8qs4bmEVMy5Z3iP8NVYod+NTf++VfcsXALml1EsgAkJhn0fGzdkmr/mvaJP+X + kVf6AlaIC3hXXjxnn7T6v3FA1391o7DHQCFm+5TVkaomCe/UzcPfG/u1ZUBU4gBOGZsjjEImPVY1iX1n + 4FWVBxWmJWBgAAAW6cl7Sl+CBAAAAABJRU5ErkJggg== @@ -249,14 +249,14 @@ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHnSURBVDhPY6ApmLTlW8zEjV93zNz98dGyA1+OrNj/Zcqy - I1+loNL4Qe+GrzvqN9z/073u6/PGFR8f1y/+cmfuzo+Pl+36+gmrId2rXv1fcvKLAYjdtfbLsv75D36n - 9Lx64xJ/4rdW6vY/+gnrv9uX3f04c+vXN6v2f7kJ1gQDK4/942xc8vL/vP1fr9Yv/9pQv+nBn7j6i/9c - C47/t8vY9MskdtVx+/ytD7XiJ/4J63j5c/GBz/ehWhGgeObz/1mzPv8vnPPlf2TXuxdWvlv+mkUv/mES - vTIfJO9bv0PFMHjBC9fy6+/rl37ZA9aEDJL6nv33bnrzP7r38/+yOW/+a3hNWm0UtcIRKs3AEBrKrBF/ - 6Ldr2Z3X9Su/HIKKIkBQ89P/ZsX3/3s2vQK7JLHn0f/ahW8todIMxsZprHbB+/+61T371rTi8xaoMAI4 - VTz+71B07b9V5vH/JvHb/htGrf2v4TP1P1SawSRxjZJt5up/9i1X/+ZPe1QKFcYNQAELZYKBuvdkd/2y - K3/S6m/+q1/1nw0qTDywSNl3MaT+1r+wurO5UCHiQGLfByX7vPMx/kDNbpVXvjEw/GeEShEHPCqfOPvU - P/1ln7X/p3HkCi+oMPEgoudzpHPJ1UaDxJWiUKFBBRgYACLx9CGk9R7TAAAAAElFTkSuQmCC + I1+loNL4Qe+GrzvqN9z5073u6/PGFR8f1y/+cmfuzo+Pl+36+gmrId2rXv1fcvKLAYjdtfbLsv7593+n + 9Lx64xJ/4rdW6vY/+gnrv9uX3f04c+vXN6v2f7kJ1gQDK4/942xc8vL/vP1fr9Yv/9pQv+nun7j6c/9c + C47/t8vY9MskdtVx+/ytD7Xi+/6Edbz8ufjA5/tQrQhQPPP5/6xZn/8XzvnyP7Lr3Qsrry1/zaIX/zCJ + XpkPkvet36FiGLzghWv59ff1S7/sAWtCBkl9z/57N735H937+X/ZnDf/NbwmrTaKWuEIlWZgCA1lVo0/ + 9Nu17M7r+pVfDkFFESCo+el/s+L7/z2bXoFdktjz6H/twreWUGkGY+M0VruA/X/d6p59a1rxeQtUGAGc + Kh7/dyi69t8q8/h/k/ht/w2j1v7X8Jn6HyrNYJK4Rsk2c8U/+5ZLf/OnPSqFCuMGoICFMsFA3Xuyu07Z + lT9p9df+1a/6zwYVJh5YpOy7GFJ//V9Y3dlcqBBxILHvg5J93vkYf6Bmt8or3xgY/jNCpYgDHpVPnH3q + n/6yz9r/0zhyhRdUmHgQ0fM50rnkaqNB4kpRqNCgAgwMAMm48/nVnj2wAAAAAElFTkSuQmCC @@ -264,13 +264,13 @@ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHPSURBVDhPY6AaWHbkq9SK/V+mLDvw5cjM3R8f9az/klK4 8h8nVBo/AGletuvrp7k7Pz6uX/zlTuOKj49bV325UzL/y+fKhV9Socpwg1X7v9ycufXrG/fyB+/1E9Z/ - 10rZ9sc+d//XlMnvXhTO+fKiYO7nMJC6JSe/GDgUXfsP1oQMFh/4fD+s4+VPhej5v13y1t80jl5zzDR2 - zReF+Pm/fSff/Zs++f2zrLmfI+ft/3rVOvP4/5XH0LxWv/TLHtfy6+9VPXpu+dbvUAGJmUSvzFeLXPpV + 10rZ9sc+d//XlMnvXhTO+fKiYO7nMJC6JSe/GDgUXfsP1oQMFh/4fD+s4+VP+ej5v13y1t80jl5zzDR2 + zRf5+Pm/vSbf+ps++f2zrLmfI+ft/3rVOvP4/5XH0LxWv/TLHtfy6+9VPXpu+dbvUAGJmUSvzFeLXPpV 0mf2L/+W98+BLvmfNevzf5P4rZguqF/55ZBT8b1XKp59hxlCQ5mhwgxGUSscNbwmrS6b8+Z/dO/n/95N - b/7rhS7GNKBpxect9kUvvqp4T7hpbJzGChVmmLz1s+6UrV/BNns2vfpvVnz/v4bPVEwD8qc9KrVvvfZX - xmfNL3HXYm6oMAMowKyAfjaJ3/ZfL2QJWLOqWxcWL6z6z5ZWf/OfftmVP+rek92hwmCAEWC4QFjd2dyQ - +lv/LFL2XYQKkQr+M3pXXntp33Lrr33e+ZjEvg9KUAnigYrHYj6vypunAlo/ffWofOIMFSYdeDe+Co3o - +RwJ5Q5qwMAAAJmM6YroQVmAAAAAAElFTkSuQmCC + b/7rhS7GNKBpxect9kUvvqp4T7hpbJzGChVmmLz1s+6UrV/BNns2vfpvVnz/v4bPVEwD8qc9KrVvvfxX + 0mfNL3HXYm6oMAMowKyAfjaJ3/ZfL2QJWLOqWxcWL6z6z5ZWf+2fTtmVP+rek92hwmCAEWC4QFjd2dyQ + +uv/LFL2XYQKkQr+M3pXXntp33L9r33e+ZjEvg9KUAnigYrHYj6vypunAlo/ffWofOIMFSYdeDe+Co3o + +RwJ5Q5qwMAAAGPd6XAH/bCPAAAAAElFTkSuQmCC @@ -289,16 +289,30 @@ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAH2SURBVDhPY6AK+G/Kb/DXWHDPPzNhp/8MDExQYeLA/1AG - 5n/Ggun/0rz/P41z/v3PVCgQJAaVRgH/7RlY/pvwKwHV5EGFIIL/TISS/poKbfuX5Pb/aZLuHyC/Ct2Q - //byHCAXPo1z+v3XRGAOVBgC/hmJSP4zE7IAGxJs8v9fpPX/v6aCG//piXOD5S1kOP/aK258Giz/G6im - +7+WKA9YIzr4r8XABrS94Kmb/G+QQUDFy/6ZC+gBDZsMNXTyf2NBfqhy7AAYiIz/zIU0/xgJnQd7yUfy - 1xcvvc/AQF4HcglUGWHw31jYAeTkf766/38bCd37Z8EnBJUiDP6b8yv8MRW69MxU6N83Q4H/nw35/v82 - FrwFlcYNQGngn6GA/G9j/qvPtCT+PNPm3fPPVNgEFLgvdfj+/zMVyAR5EaocE/w3FZX4Yy52/oujwv+r - Kly3d4szO4BiAoT/mghNvyDP+fuSEqcJVDkqAMXzXwux1Z8tub+cleX8dEqOMxgqBU0DQnyP1bhuX1Xi - 2LFekEEWI0D/mQl4fzMX+39RifP/ZUWu9bA0AAMQ74mq7Jdh/XpFldMMJcmD4h8Yx60PNXj+X1HmvP7P - VEQNRQEUgFLnBz2+ef9MhE0x5IGp0eivieBEYEDZ/bMS5sUVWOD8YCzJBeVSChgYACr20YlMFsoEAAAA - AElFTkSuQmCC + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAH3SURBVDhPrZNPTBNBFMYHQcMW2D+ztNAEXKhItGJjuzPd + qokFTDiIHkzjwQuHHiBejGfvnjwZDlwIRy8mEi7GRBLuJAZFGhNJTNxGE2+GFg7s7nvOtMOhVIKJ/pI9 + zHvfvn3zvbfkv4DcuBa51jrk7Wkk5IwK/x34gHSCay3A/Cz6c7cD4PS+jKl0C1gkXciMlNA8VqFmEBgt + R5y+gfIM+uV0KM5PjxfBotMtO/TnpoOImcsq3ARy/UnI00KjSIkhPLyJEbfWIDPQ08gXhrSoOLrml5xA + aJ5jOt7bePE4mCbnxNef+DNOIAsJ8UvwzIwotqiKLqJrGUr+Z4SJHeDRy2GObskrfb+bPKzfydSEya9l + J0p2Oujak7JluHcVgxz9CgWdqtTpoGeMhJxuVzmFg6yJtayOgWt9UemTkTsAWdMJXKNSTQ+GP670rQO3 + mTT354SOwM1H8opK3g7y+GDoJbbqUyNYGYvtvhvonJSTkE/E6NIHRwu2UxpT8lbknKNC4lXtek/9/bC2 + t3leK6mU2gGqV8dju5VU99tViwy3GQp5c/bAS+DHlIafRmOrRztwRPN68bGNobP7Oxe1fMvKy/mLGT/7 + dqkXdy5on4H3j7cIFHI7f2X0FWA2b8uLbcxFzHohjLoFN+y+k8xq/A9uMqaO/wohvwHhoNFulVAurwAA + AABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHMSURBVDhPtY5dSxtBGIUHCv6vglf5MVILLQhC2BVTW8wa + zNeyoIK6uqya24pXVuONuBhFUte4mjQGg8FgZ0MSHYbpHJ0l8careuBhzrzvOTtL3k2W4xjm2hoF8Gr8 + tvK2HTPX1ws4c7LYY0wAeNNxPsq5jVPFXytn26NLW1vhZbXKljY3w/TqKu0+PQkAv7ixEfrX1wwZZFVt + oMzysnMuA53HR/Gn2eSRB+UgYLXbWw6PObKqNpCxsDBqrqyEV40G/9vrCVCTHwLRHTtkkFW1FyUty0ia + JgVn8rV2tyu2i8X+D8sqgZ/7+33Mjn2fRTl0VJ2QRDZLW52OiLi4ueHfcjkv7rojrut++J7PH/r1Oh/O + oKPqhOjpNG1SKiIu5K9Oz8+XUQbTmYz3u1bjwxl0VJ0QbW7OiKdSFByWy6zx8CDcnZ2+lkp5AB6zg9NT + FuXQUfUXTSaTMflb4XGlwuvttgAnQcBBdMcOGWRVbaCJmZlCUb5Qvb8XR77P90qlZw92PY9hBo8Msqo2 + 0JdEIqZns51fsjg5Oxt+nZqiQaslADxm2CGDrKq91riuxz7regHnJ02jlbs7AeCHdyr+tsY1zRiLxymA + V+P/LUL+AeYZ1VhnTxJCAAAAAElFTkSuQmCC @@ -320,7 +334,7 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAA4 - EAAAAk1TRnQBSQFMAgEBBQEAATgBAAE4AQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA + EAAAAk1TRnQBSQFMAgEBBQEAAVABAAFQAQABEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA AwABIAMAAQEBAAEgBgABIP8A/wAUAAMFAQcDDwEVAxYBHwMXASADFwEgAxQBGwMLAQ8DAwEEAwUBBwMP ARQDEAEWAwYBCNAAAw4BEwMmAT4DLgFSAyoBRwMpAUMDKQFFAyIBNQMQARYDEAEWAyYBPQMnAUADEQEX 0AACHwGvAdECAAHcAf8CAAHcAf8CAAHcAf8CCwHNAfECMgFxAZoDLQFQAyEBMwIdAagB0wIJAc0B8wMv diff --git a/ScadaWeb/ScadaScheme/ScadaSchemeEditor/FrmSettings.Designer.cs b/ScadaWeb/ScadaScheme/ScadaSchemeEditor/FrmSettings.Designer.cs new file mode 100644 index 000000000..e8e7da6a4 --- /dev/null +++ b/ScadaWeb/ScadaScheme/ScadaSchemeEditor/FrmSettings.Designer.cs @@ -0,0 +1,122 @@ +namespace Scada.Scheme.Editor +{ + partial class FrmSettings + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmSettings)); + this.lblWebDir = new System.Windows.Forms.Label(); + this.txtWebDir = new System.Windows.Forms.TextBox(); + this.btnWebDir = new System.Windows.Forms.Button(); + this.btnOK = new System.Windows.Forms.Button(); + this.btnCancel = new System.Windows.Forms.Button(); + this.folderBrowserDialog = new System.Windows.Forms.FolderBrowserDialog(); + this.SuspendLayout(); + // + // lblWebDir + // + this.lblWebDir.AutoSize = true; + this.lblWebDir.Location = new System.Drawing.Point(9, 9); + this.lblWebDir.Name = "lblWebDir"; + this.lblWebDir.Size = new System.Drawing.Size(127, 13); + this.lblWebDir.TabIndex = 0; + this.lblWebDir.Text = "Web application directory"; + // + // txtWebDir + // + this.txtWebDir.Location = new System.Drawing.Point(12, 25); + this.txtWebDir.Name = "txtWebDir"; + this.txtWebDir.Size = new System.Drawing.Size(334, 20); + this.txtWebDir.TabIndex = 1; + // + // btnWebDir + // + this.btnWebDir.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.btnWebDir.Image = ((System.Drawing.Image)(resources.GetObject("btnWebDir.Image"))); + this.btnWebDir.Location = new System.Drawing.Point(352, 25); + this.btnWebDir.Name = "btnWebDir"; + this.btnWebDir.Size = new System.Drawing.Size(20, 20); + this.btnWebDir.TabIndex = 2; + this.btnWebDir.UseVisualStyleBackColor = true; + this.btnWebDir.Click += new System.EventHandler(this.btnWebDir_Click); + // + // btnOK + // + this.btnOK.Location = new System.Drawing.Point(216, 61); + this.btnOK.Name = "btnOK"; + this.btnOK.Size = new System.Drawing.Size(75, 23); + this.btnOK.TabIndex = 3; + this.btnOK.Text = "OK"; + this.btnOK.UseVisualStyleBackColor = true; + this.btnOK.Click += new System.EventHandler(this.btnOK_Click); + // + // btnCancel + // + this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.btnCancel.Location = new System.Drawing.Point(297, 61); + this.btnCancel.Name = "btnCancel"; + this.btnCancel.Size = new System.Drawing.Size(75, 23); + this.btnCancel.TabIndex = 4; + this.btnCancel.Text = "Cancel"; + this.btnCancel.UseVisualStyleBackColor = true; + // + // FrmSettings + // + this.AcceptButton = this.btnOK; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.btnCancel; + this.ClientSize = new System.Drawing.Size(384, 96); + this.Controls.Add(this.btnCancel); + this.Controls.Add(this.btnOK); + this.Controls.Add(this.btnWebDir); + this.Controls.Add(this.txtWebDir); + this.Controls.Add(this.lblWebDir); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "FrmSettings"; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Settings"; + this.Load += new System.EventHandler(this.FrmSettings_Load); + this.Shown += new System.EventHandler(this.FrmSettings_Shown); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label lblWebDir; + private System.Windows.Forms.TextBox txtWebDir; + private System.Windows.Forms.Button btnWebDir; + private System.Windows.Forms.Button btnOK; + private System.Windows.Forms.Button btnCancel; + private System.Windows.Forms.FolderBrowserDialog folderBrowserDialog; + } +} \ No newline at end of file diff --git a/ScadaWeb/ScadaScheme/ScadaSchemeEditor/FrmSettings.cs b/ScadaWeb/ScadaScheme/ScadaSchemeEditor/FrmSettings.cs new file mode 100644 index 000000000..bfe9f1f47 --- /dev/null +++ b/ScadaWeb/ScadaScheme/ScadaSchemeEditor/FrmSettings.cs @@ -0,0 +1,106 @@ +/* + * Copyright 2017 Mikhail Shiryaev + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + * Product : Rapid SCADA + * Module : Scheme Editor + * Summary : Application settings form + * + * Author : Mikhail Shiryaev + * Created : 2017 + * Modified : 2017 + */ + +using Scada.UI; +using System; +using System.IO; +using System.Windows.Forms; + +namespace Scada.Scheme.Editor +{ + /// + /// Application settings form + /// Форма настройки приложения + /// + internal partial class FrmSettings : Form + { + private Settings settings; // настройки приложения + + + /// + /// Конструктор + /// + public FrmSettings() + { + InitializeComponent(); + settings = null; + } + + + /// + /// Отобразить форму модально + /// + /// Возвращает true, если настройки были изменена + public static bool ShowDialog(Settings settings) + { + if (settings == null) + throw new ArgumentNullException("settings"); + + string oldWebDir = settings.WebDir; + FrmSettings frmSettings = new FrmSettings(); + frmSettings.settings = settings; + + return frmSettings.ShowDialog() == DialogResult.OK && oldWebDir != settings.WebDir; + } + + + private void FrmSettings_Load(object sender, EventArgs e) + { + // перевод формы + Translator.TranslateForm(this, "Scada.Scheme.Editor.FrmSettings"); + + // настройка элементов управления + txtWebDir.Text = settings.WebDir; + } + + private void FrmSettings_Shown(object sender, EventArgs e) + { + txtWebDir.Focus(); + txtWebDir.DeselectAll(); + } + + private void btnWebDir_Click(object sender, EventArgs e) + { + // выбор директории веб-приложения + folderBrowserDialog.SelectedPath = txtWebDir.Text.Trim(); + folderBrowserDialog.Description = AppPhrases.ChooseWebDir; + + if (folderBrowserDialog.ShowDialog() == DialogResult.OK) + txtWebDir.Text = ScadaUtils.NormalDir(folderBrowserDialog.SelectedPath); + + txtWebDir.Focus(); + txtWebDir.DeselectAll(); + } + + private void btnOK_Click(object sender, EventArgs e) + { + if (!Directory.Exists(txtWebDir.Text)) + ScadaUiUtils.ShowWarning(AppPhrases.WebDirNotExists); + + settings.WebDir = txtWebDir.Text; + DialogResult = DialogResult.OK; + } + } +} diff --git a/ScadaWeb/ScadaScheme/ScadaSchemeEditor/FrmSettings.resx b/ScadaWeb/ScadaScheme/ScadaSchemeEditor/FrmSettings.resx new file mode 100644 index 000000000..ef027b9bc --- /dev/null +++ b/ScadaWeb/ScadaScheme/ScadaSchemeEditor/FrmSettings.resx @@ -0,0 +1,140 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAI3SURBVDhPpZLdS5NhGIffv0AiJQpByBKxYBgYUh2E + JH1oCEVpomQJaVYUQiHOtE1Np5vzo0Y6rE23Nt2sVpqihZBoEqGljhJTs6CoFFNDR37s6nXCmLaDPg6u + g+fmuX78uJ9HAP4Lr8O/QWgwlsaJsJbmekWJN2EtywEM9etxTFld/Jw0sTCuw1JTgs2Yn+tN8kSw1qqZ + mzSvkpe+VLJgT8d8pwhDVQG6m7loy3K4pZJyQ5Eheh4BdXolc9/0btkpygxJwZ7qld8C7lYr+PFZ65Zb + G5QuWizFNJoUPDAUYNHlYdLKqdFc43b5VarUUjTKTFeYYNAWMPOhwlV7tFOGzaxmaVQOY/mreS/ORrJg + 8DK8OU9ffSyXkmNqBZ0mj+nhIvio4mFdCd1tqpVLntVfJ0HPMRa7onE8ieBdrYQLJw9MiwHbhepyGd/f + yhnrysZmUuEckcHA2RWxL1kUT7DYHYOjfT8zzXuYaNiBPC2I+Ei/MtcOKtXZTPRncs+opLdDbDKYLgac + gd5EnC+OMP/sELOte5m0hfG1LoSe6+tIiA4kLNgn2BWgKZYy0J7DfWMxDOfAK7Huy+PMdx5m9mkEU43h + jFskfNJvxa7yRZa6hdBt/k3uV6gozMBaU4T90TmeW9PoMKfQbkimTZdES3UijyvjafIgIWqzMzw0IMod + UJp/hVJZCoWZp8i6GLe8WU7HRnL04C727ZawUxJESKA/AZv82LDeh42+PqLn8Q88D/+C1+Gfg/ALxG7h + vXXgo3oAAAAASUVORK5CYII= + + + + 17, 17 + + \ No newline at end of file diff --git a/ScadaWeb/ScadaScheme/ScadaSchemeEditor/Lang/ScadaSchemeEditor.en-GB.xml b/ScadaWeb/ScadaScheme/ScadaSchemeEditor/Lang/ScadaSchemeEditor.en-GB.xml index 61ca2dced..47d0f657c 100644 --- a/ScadaWeb/ScadaScheme/ScadaSchemeEditor/Lang/ScadaSchemeEditor.en-GB.xml +++ b/ScadaWeb/ScadaScheme/ScadaSchemeEditor/Lang/ScadaSchemeEditor.en-GB.xml @@ -1,5 +1,5 @@  - + Scheme Editor @@ -16,6 +16,7 @@ Redo (Ctrl+Y) Cancel adding component (Esc) Delete selected components (Del) + Settings About Components Properties @@ -29,6 +30,15 @@ Failed to start Scada Editor. See the details in {0} Schemes (*.sch)|*.sch|All Files (*.*)|*.* The scheme has been modified. Save the changes? + Settings changes will take effect after restarting the application. + + + Settings + Web application directory + OK + Cancel + Web application directory does not exist. + Choose the web application directory Error loading form state @@ -41,57 +51,4 @@ Scheme Editor was probably closed. It is recommended to close the web page. Your browser is out of date. Please update to a modern browser. - - Error loading scheme from file - Error saving scheme to file - Incorrect format of the scheme file - - - Unable to convert string - Property value must be unique - Yes - No - (None) - (Collection) - B - I - U - - - Channel Filter - Input channels numbers - OK - Cancel - - - Image Output Conditions - Conditions - Condition properties - OK - Cancel - - - Font - Font - Size - Style - Bold - Italic - Underline - OK - Cancel - - - Images - Images - Image properties - Preview - Empty - Select - Close - Images (*.jpg;*.png;*.gif;*.svg)|*.jpg;*.png;*.gif;*.svg|All Files (*.*)|*.* - Error displaying image - Error loading image - Error saving image - - + diff --git a/ScadaWeb/ScadaScheme/ScadaSchemeEditor/Lang/ScadaSchemeEditor.ru-RU.xml b/ScadaWeb/ScadaScheme/ScadaSchemeEditor/Lang/ScadaSchemeEditor.ru-RU.xml index b7239fc78..1b232f67f 100644 --- a/ScadaWeb/ScadaScheme/ScadaSchemeEditor/Lang/ScadaSchemeEditor.ru-RU.xml +++ b/ScadaWeb/ScadaScheme/ScadaSchemeEditor/Lang/ScadaSchemeEditor.ru-RU.xml @@ -1,5 +1,5 @@  - + Редактор схем @@ -16,6 +16,7 @@ Вернуть (Ctrl+Y) Отменить добавление компонента (Esc) Удалить выбранные компоненты (Del) + Настройки О программе Компоненты Свойства @@ -29,6 +30,15 @@ Не удалось запустить Редактор схем. Смотрите подробности в {0} Схемы (*.sch)|*.sch|Все файлы (*.*)|*.* Схема была изменена. Сохранить изменения? + Изменения настроек вступят в силу после перезапуска приложения. + + + Настройки + Директория веб-приложения + OK + Отмена + Директория веб-приложения не существует. + Выберите директорию веб-приложения Ошибка при загрузке состояния формы @@ -41,252 +51,4 @@ Редактор схем, вероятно, был закрыт. Рекомендуется закрыть веб-страницу. Ваш браузер устарел. Установите современный браузер, пожалуйста. - - Ошибка при загрузке схемы из файла - Ошибка при сохранении схемы в файл - Некорректный формат файла схемы - - - Невозможно преобразовать строку - Значение свойства должно быть уникальным - Да - Нет - (Нет) - (Коллекция) - Ж - К - П - - - Фильтр по каналам - Номера входных каналов - OK - Отмена - - - Условия вывода изображений - Условия - Свойства условия - OK - Отмена - - - Шрифт - Шрифт - Размер - Стиль - Жирный - Курсив - Подчеркнутый - OK - Отмена - - - Изображения - Изображения - Свойства изображения - Предварительный просмотр - Пустое - Выбрать - Закрыть - Изображения (*.jpg;*.png;*.gif;*.svg)|*.jpg;*.png;*.gif;*.svg|Все файлы (*.*)|*.* - Ошибка при отображении изображения - Ошибка при загрузке изображения - Ошибка при сохранении изображения - - - Наименование - Изображение - Размер данных - Изображение - Размер - Изображение - Формат - Изображение - - - Версия - Дизайн - Версия редактора схем, в котором сохранён файл схемы. - Размер - Макет - Размер схемы в пикселях. - Цвет фона - Внешний вид - Цвет фона схемы. - Фоновое изображение - Внешний вид - Фоновое изображение схемы. - Шрифт - Внешний вид - Шрифт, используемый для отображения текста на схеме. - Основной цвет - Внешний вид - Основной цвет схемы, используемый для отображения текста. - Заголовок - Внешний вид - Заголовок схемы. - Фильтр по каналам - Данные - Входные каналы, используемые как фильтр для вывода событий по схеме. - Изображения - Данные - Коллекция изображений, используемых на схеме. - - - Идентификатор - Дизайн - Уникальный идентификатор компонента схемы. - Наименование - Дизайн - Наименование компонента схемы. - Имя типа - Дизайн - Полное имя типа компонента схемы. - Положение - Макет - Координаты левого верхнего угла компонента схемы. - Размер - Макет - Размер компонента схемы в пикселях. - Порядок - Макет - Порядок отображения компонента схемы по оси Z. - - - Авто размер - Макет - Автоматическая установка размера надписи по содержимому. - Цвет фона - Внешний вид - Цвет фона надписи. - Цвет рамки - Внешний вид - Цвет рамки надписи. - Цвет текста - Внешний вид - Основной цвет надписи, используемый для отображения текста. - Шрифт - Внешний вид - Шрифт, используемый для отображения текста надписи. - Текст - Внешний вид - Текст надписи. - Перенос по словам - Внешний вид - Автоматический перенос текста по словам. - Гор. выравнивание - Внешний вид - Горизонтальное выравнивание текста внутри надписи. - Верт. выравнивание - Внешний вид - Вертикальное выравнивание текста внутри надписи. - - - Подсказка - Поведение - Всплывающая подсказка, которая отображается при наведении указателя мыши на надпись. - Подчёркивание при наведени - Поведение - Подчёркивание надписи при наведени указателя мыши. - Цвет фона при наведении - Поведение - Цвет фона надписи при наведении указателя мыши. - Цвет рамки при наведени - Поведение - Цвет рамки надписи при наведени указателя мыши. - Цвет текста при наведени - Поведение - Основной цвет надписи, используемый для отображения текста при наведени указателя мыши. - Действие - Поведение - Действие, выполняемое по щелчку левой кнопкой мыши на надписи. - Вывод значения - Поведение - Вывод значения входного канала, связанного с надписью. - Входной канал - Данные - Номер входного канала, связанного с надписью. - Канал управления - Данные - Номер канала управления, связанного с надписью. - - - Цвет рамки - Внешний вид - Цвет рамки рисунка. - Изображение - Внешний вид - Изображение из коллекции изображений схемы. - Растяжение - Внешний вид - Растяжение изображения. - - - Подсказка - Поведение - Всплывающая подсказка, которая отображается при наведении указателя мыши на рисунок. - Изображение при наведении - Поведение - Изображение, отображаемое при наведении указателя мыши. - Цвет рамки при наведени - Поведение - Цвет рамки рисунка при наведени указателя мыши. - Действие - Поведение - Действие, выполняемое по щелчку левой кнопкой мыши на рисунке. - Условия - Поведение - Условия для вывода изображений в зависимости от значения входного канала. - Входной канал - Данные - Номер входного канала, связанного с рисунком. - Канал управления - Данные - Номер канала управления, связанного с рисунком. - - - Не задано - Построить график - Отправить команду - - - Опер. сравн. 1 - Условие - Аргумент 1 - Условие - Логич. опер. - Условие - Опер. сравн. 2 - Условие - Аргумент 2 - Условие - Изображение - Внешний вид - - - Слева - По центру - Справа - - - Не задано - Заполнить размер - Растянуть пропорционально - - - Не задан - И - Или - - - Нет - С размерностью - Без размерности - - - Сверху - По центру - Снизу - - + diff --git a/ScadaWeb/ScadaScheme/ScadaSchemeEditor/ScadaSchemeEditor.csproj b/ScadaWeb/ScadaScheme/ScadaSchemeEditor/ScadaSchemeEditor.csproj index bedc9d701..8a9f20e0d 100644 --- a/ScadaWeb/ScadaScheme/ScadaSchemeEditor/ScadaSchemeEditor.csproj +++ b/ScadaWeb/ScadaScheme/ScadaSchemeEditor/ScadaSchemeEditor.csproj @@ -62,7 +62,6 @@ - @@ -84,6 +83,12 @@ FrmMain.cs + + Form + + + FrmSettings.cs + @@ -93,6 +98,9 @@ FrmMain.cs + + FrmSettings.cs + ResXFileCodeGenerator Resources.Designer.cs @@ -152,6 +160,17 @@ Web\plugins\Scheme\js\schemerender.js PreserveNewest + + Lang\ScadaScheme.en-GB.xml + PreserveNewest + + + Lang\ScadaScheme.ru-RU.xml + PreserveNewest + + + PreserveNewest + PreserveNewest @@ -191,7 +210,6 @@ - diff --git a/ScadaWeb/ScadaScheme/ScadaSchemeEditor/Web/plugins/SchemeEditor/editor.html b/ScadaWeb/ScadaScheme/ScadaSchemeEditor/Web/plugins/SchemeEditor/editor.html index 359d0c2e2..c6fd97f46 100644 --- a/ScadaWeb/ScadaScheme/ScadaSchemeEditor/Web/plugins/SchemeEditor/editor.html +++ b/ScadaWeb/ScadaScheme/ScadaSchemeEditor/Web/plugins/SchemeEditor/editor.html @@ -5,17 +5,17 @@ Scheme Editor +{0} +{1} - +{2} "; StringBuilder sbHtml = new StringBuilder(); if (!string.IsNullOrEmpty(ChartScriptPath)) - sbHtml.AppendLine(string.Format(ScriptTemplate, VirtualPathUtility.ToAbsolute(ChartScriptPath))); + sbHtml.AppendLine(string.Format(WebUtils.ScriptTemplate, VirtualPathUtility.ToAbsolute(ChartScriptPath))); if (!string.IsNullOrEmpty(CmdScriptPath)) - sbHtml.AppendLine(string.Format(ScriptTemplate, VirtualPathUtility.ToAbsolute(CmdScriptPath))); + sbHtml.AppendLine(string.Format(WebUtils.ScriptTemplate, VirtualPathUtility.ToAbsolute(CmdScriptPath))); if (!string.IsNullOrEmpty(EventAckScriptPath)) - sbHtml.AppendLine(string.Format(ScriptTemplate, VirtualPathUtility.ToAbsolute(EventAckScriptPath))); + sbHtml.AppendLine(string.Format(WebUtils.ScriptTemplate, VirtualPathUtility.ToAbsolute(EventAckScriptPath))); return sbHtml.ToString(); } diff --git a/ScadaWeb/ScadaWebCommon5/Shell/StandardMenuItems.cs b/ScadaWeb/ScadaWebCommon5/Shell/StandardMenuItems.cs index 2d8228dca..6d7974688 100644 --- a/ScadaWeb/ScadaWebCommon5/Shell/StandardMenuItems.cs +++ b/ScadaWeb/ScadaWebCommon5/Shell/StandardMenuItems.cs @@ -51,12 +51,16 @@ public enum StandardMenuItems /// Config = 4, /// + /// Регистрация + /// + Reg = 8, + /// /// Плагины /// - Plugins = 8, + Plugins = 16, /// /// О приложении /// - About = 16 + About = 32 } } diff --git a/ScadaWeb/ScadaWebCommon5/Shell/ViewNode.cs b/ScadaWeb/ScadaWebCommon5/Shell/ViewNode.cs index db6b05d4f..773997f9c 100644 --- a/ScadaWeb/ScadaWebCommon5/Shell/ViewNode.cs +++ b/ScadaWeb/ScadaWebCommon5/Shell/ViewNode.cs @@ -1,5 +1,5 @@ /* - * Copyright 2016 Mikhail Shiryaev + * Copyright 2017 Mikhail Shiryaev * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,7 +20,7 @@ * * Author : Mikhail Shiryaev * Created : 2016 - * Modified : 2016 + * Modified : 2017 */ using Scada.Web.Plugins; @@ -168,6 +168,7 @@ public IList Children protected void InitDataAttrs() { DataAttrs = new SortedList(); + DataAttrs.Add("view", ViewID.ToString()); DataAttrs.Add("cnl", AlarmCnlNum.ToString()); } diff --git a/ScadaWeb/ScadaWebCommon5/WebPhrases.cs b/ScadaWeb/ScadaWebCommon5/WebPhrases.cs index 14ac67e3b..7800a0dcc 100644 --- a/ScadaWeb/ScadaWebCommon5/WebPhrases.cs +++ b/ScadaWeb/ScadaWebCommon5/WebPhrases.cs @@ -77,6 +77,7 @@ static WebPhrases() public static string ReportsMenuItem { get; private set; } public static string AdminMenuItem { get; private set; } public static string ConfigMenuItem { get; private set; } + public static string RegMenuItem { get; private set; } public static string PluginsMenuItem { get; private set; } public static string AboutMenuItem { get; private set; } @@ -122,6 +123,7 @@ private static void SetToDefault() ReportsMenuItem = Localization.Dict.GetEmptyPhrase("ReportsMenuItem"); AdminMenuItem = Localization.Dict.GetEmptyPhrase("AdminMenuItem"); ConfigMenuItem = Localization.Dict.GetEmptyPhrase("ConfigMenuItem"); + RegMenuItem = Localization.Dict.GetEmptyPhrase("RegMenuItem"); PluginsMenuItem = Localization.Dict.GetEmptyPhrase("PluginsMenuItem"); AboutMenuItem = Localization.Dict.GetEmptyPhrase("AboutMenuItem"); @@ -190,6 +192,7 @@ public static void Init() ReportsMenuItem = dict.GetPhrase("ReportsMenuItem", ReportsMenuItem); AdminMenuItem = dict.GetPhrase("AdminMenuItem", AdminMenuItem); ConfigMenuItem = dict.GetPhrase("ConfigMenuItem", ConfigMenuItem); + RegMenuItem = dict.GetPhrase("RegMenuItem", RegMenuItem); PluginsMenuItem = dict.GetPhrase("PluginsMenuItem", PluginsMenuItem); AboutMenuItem = dict.GetPhrase("AboutMenuItem", AboutMenuItem); } diff --git a/ScadaWeb/ScadaWebCommon5/WebUtils.cs b/ScadaWeb/ScadaWebCommon5/WebUtils.cs index 331adcf2c..725f374c4 100644 --- a/ScadaWeb/ScadaWebCommon5/WebUtils.cs +++ b/ScadaWeb/ScadaWebCommon5/WebUtils.cs @@ -40,7 +40,15 @@ public static partial class WebUtils /// /// Версия веб-приложения /// - public const string AppVersion = "5.0.3.0"; + public const string AppVersion = "5.0.3.1"; + /// + /// Шиблон для вставки стилей на веб-страницу + /// + public const string StyleTemplate = ""; + /// + /// Шиблон для вставки скрипта на веб-страницу + /// + public const string ScriptTemplate = ""; /// /// Начало отчёта времени в Unix, которое используется в Javascript реализации даты /// diff --git a/ScadaWeb/ScadaWebShell5/Login.aspx.cs b/ScadaWeb/ScadaWebShell5/Login.aspx.cs index 736afcf96..1dfff5806 100644 --- a/ScadaWeb/ScadaWebShell5/Login.aspx.cs +++ b/ScadaWeb/ScadaWebShell5/Login.aspx.cs @@ -122,15 +122,23 @@ protected void Page_Load(object sender, EventArgs e) if (!alertIsEmpty) AddShowAlertScript(alert); - // обработка сохранённого входа в систему - if (alertIsEmpty && !userData.LoggedOn && userData.WebSettings.RemEnabled) + // переход на стартовую страницу, если вход выполнен + if (alertIsEmpty) { - string username; - if (appData.RememberMe.ValidateUser(Context, out username, out alert) && - userData.Login(username, out alert)) + if (userData.LoggedOn) + { GoToStartPage(); - else if (alert != "") - AddShowAlertScript(alert); + } + else if (userData.WebSettings.RemEnabled) + { + // обработка сохранённого входа в систему + string username; + if (appData.RememberMe.ValidateUser(Context, out username, out alert) && + userData.Login(username, out alert)) + GoToStartPage(); + else if (alert != "") + AddShowAlertScript(alert); + } } // настройка элементов управления diff --git a/ScadaWeb/ScadaWebShell5/js/api/clientapi.js b/ScadaWeb/ScadaWebShell5/js/api/clientapi.js index 52f4f5704..761741135 100644 --- a/ScadaWeb/ScadaWebShell5/js/api/clientapi.js +++ b/ScadaWeb/ScadaWebShell5/js/api/clientapi.js @@ -3,7 +3,7 @@ * * Author : Mikhail Shiryaev * Created : 2016 - * Modified : 2016 + * Modified : 2017 * * Requires: * - jquery @@ -168,7 +168,7 @@ scada.clientAPI = { // callback is a function (success, loggedOn) // URL example: http://webserver/scada/ClientApiSvc.svc/CheckLoggedOn checkLoggedOn: function (callback) { - this._request("ClientApiSvc.svc/CheckLoggedOn", "", callback, false); + this._request("ClientApiSvc.svc/CheckLoggedOn", "", callback, null); }, // Get current data of the input channel. diff --git a/ScadaWeb/ScadaWebShell5/js/api/utils.js b/ScadaWeb/ScadaWebShell5/js/api/utils.js index 8e21b80ad..e98707982 100644 --- a/ScadaWeb/ScadaWebShell5/js/api/utils.js +++ b/ScadaWeb/ScadaWebShell5/js/api/utils.js @@ -252,6 +252,16 @@ scada.utils = { } }, + // Set frame source creating new frame to prevent writing frame history. Returns the new frame + setFrameSrc: function (jqFrame, url) { + var frameParent = jqFrame.parent(); + var frameClone = jqFrame.clone(); + jqFrame.remove(); + frameClone.attr("src", url); + frameClone.appendTo(frameParent); + return frameClone; + }, + // Detect if iOS is used iOS: function () { return /iPad|iPhone|iPod/.test(navigator.platform); diff --git a/ScadaWeb/ScadaWebShell5/js/controls/notifier.js b/ScadaWeb/ScadaWebShell5/js/controls/notifier.js index 313097eb0..491959771 100644 --- a/ScadaWeb/ScadaWebShell5/js/controls/notifier.js +++ b/ScadaWeb/ScadaWebShell5/js/controls/notifier.js @@ -3,7 +3,7 @@ * * Author : Mikhail Shiryaev * Created : 2016 - * Modified : 2016 + * Modified : 2017 * * Requires: * - jquery @@ -13,6 +13,12 @@ // Rapid SCADA namespace var scada = scada || {}; +// Notification types enumeration +scada.NotifTypes = { + INFO: 0, + ERROR: 1, +}; + // Notifier type scada.Notifier = function (selector) { // jQuery object of the notification area @@ -29,7 +35,7 @@ scada.Notifier = function (selector) { }; // Add notification to the notification area -scada.Notifier.prototype.addNotification = function (messageHtml, error, lifetime) { +scada.Notifier.prototype.addNotification = function (messageHtml, notifType, lifetime) { // remove the previous message if it is equal the new var divPrevMessage = this._notifier.children(".message:last"); @@ -40,7 +46,7 @@ scada.Notifier.prototype.addNotification = function (messageHtml, error, lifetim // add the new message var divMessage = $("
").html(messageHtml); - if (error) { + if (notifType == scada.NotifTypes.ERROR) { divMessage.addClass("error"); } diff --git a/ScadaWeb/ScadaWebShell5/js/mastermain.js b/ScadaWeb/ScadaWebShell5/js/mastermain.js index e01cbf20c..cbe93249f 100644 --- a/ScadaWeb/ScadaWebShell5/js/mastermain.js +++ b/ScadaWeb/ScadaWebShell5/js/mastermain.js @@ -47,14 +47,15 @@ scada.masterMain = { _checkLoggedOn: function () { var thisObj = this; scada.clientAPI.checkLoggedOn(function (success, loggedOn) { - if (loggedOn) { - // enqueue the next check - setTimeout(function () { thisObj._checkLoggedOn(); }, thisObj.CHECK_LOGGEDON_RATE); - } else { + if (loggedOn === false) { // redirect to login page setTimeout(function () { location.href = scada.env.rootPath + "Login.aspx?return=" + encodeURIComponent(location.href); }, thisObj.LOGIN_DELAY); + } else { + // loggedOn is true or null + // enqueue the next check + setTimeout(function () { thisObj._checkLoggedOn(); }, thisObj.CHECK_LOGGEDON_RATE); } }); }, @@ -179,6 +180,12 @@ scada.masterMain = { } }, + // Select the specified view in the explorer tree + selectView: function (viewID) { + $("#divMainExplorer .node").removeClass("selected"); + $("#divMainExplorer .node[data-view=" + viewID + "]").addClass("selected"); + }, + // Start cyclic checking user logged on startCheckingLoggedOn: function () { var thisObj = this; diff --git a/ScadaWeb/ScadaWebShell5/js/view.js b/ScadaWeb/ScadaWebShell5/js/view.js index 257679111..47a7dbec1 100644 --- a/ScadaWeb/ScadaWebShell5/js/view.js +++ b/ScadaWeb/ScadaWebShell5/js/view.js @@ -31,12 +31,12 @@ scada.view = { var newUrl = this.dependsOnView && viewID > 0 ? scada.utils.setQueryParam("viewID", viewID, this.url) : this.url; - var frameDataWindow = $("#frameDataWindow"); + var frameDataWindow = scada.utils.setFrameSrc($("#frameDataWindow"), newUrl); frameDataWindow - .load(function () { + .off("load") + .on("load", function () { viewHub.addDataWindow(frameDataWindow[0].contentWindow); - }) - .attr("src", newUrl); + }); } }, // Clear the data window and release resources @@ -56,6 +56,11 @@ scada.view = { initialPageTitle: "", + // Get URL of the view page that contains view frame + _getUrl: function (viewID) { + return "View.aspx?viewID=" + viewID; + }, + // Get outer height of the specified object considering its displaying _getOuterHeight: function (jqObj) { return jqObj.css("display") == "none" ? 0 : jqObj.outerHeight(); @@ -169,19 +174,31 @@ scada.view = { }, // Load the specified view and reload an active data window - loadView: function (viewID, viewUrl) { - // load view + loadView: function (viewID, viewUrl, opt_from_history) { + console.log(scada.utils.getCurTime() + " Load view " + viewID + " by " + viewUrl); + + // write history manually + var state = null; + if (!opt_from_history && viewHub.curViewID > 0) { + state = { viewID: viewID, viewUrl: "" }; + history.pushState(state, "", this._getUrl(viewID)); + } + + // load the specified view document.title = this.initialPageTitle; viewHub.curViewID = viewID; - var frameView = $("#frameView"); + var frameView = scada.utils.setFrameSrc($("#frameView"), viewUrl); + var thisObj = this; frameView .off("load") .on("load", function () { var wnd = frameView[0].contentWindow; + // add the view to the view hub viewHub.addView(wnd); + // update document title try { // set the page title the same as the frame title document.title = wnd.document.title; @@ -190,8 +207,13 @@ scada.view = { // security error if the frame has the different origin document.title = phrases.ExternalLinkTitle; } - }) - .attr("src", viewUrl); + + // update view URL in the history + if (state != null) { + state.viewUrl = wnd.location.href; + history.replaceState(state, "", thisObj._getUrl(viewID)); + } + }); // reload a data window with the new view ID if (this._dataWindow.dependsOnView) { @@ -255,6 +277,18 @@ $(document).ready(function () { } }); + // process history + $(window).on("popstate", function (event) { + var state = event.originalEvent.state; + if (state) { + scada.view.loadView(state.viewID, state.viewUrl, true); + scada.masterMain.selectView(state.viewID); + } else { + scada.view.loadView(initialViewID, initialViewUrl, true); + scada.masterMain.selectView(initialViewID); + } + }); + // activate a data window if the tab is clicked $("#divBottomTabsContainer .tab").click(function () { scada.view.activateDataWindow($(this)); diff --git a/ScadaWeb/ScadaWebShell5/lang/ScadaWeb.en-GB.xml b/ScadaWeb/ScadaWebShell5/lang/ScadaWeb.en-GB.xml index 4763bf9e9..698ca3185 100644 --- a/ScadaWeb/ScadaWebShell5/lang/ScadaWeb.en-GB.xml +++ b/ScadaWeb/ScadaWebShell5/lang/ScadaWeb.en-GB.xml @@ -105,6 +105,7 @@ Reports Administration Configuration + Registration Plugins About diff --git a/ScadaWeb/ScadaWebShell5/lang/ScadaWeb.ru-RU.xml b/ScadaWeb/ScadaWebShell5/lang/ScadaWeb.ru-RU.xml index f34db9034..eed851c12 100644 --- a/ScadaWeb/ScadaWebShell5/lang/ScadaWeb.ru-RU.xml +++ b/ScadaWeb/ScadaWebShell5/lang/ScadaWeb.ru-RU.xml @@ -105,6 +105,7 @@ Отчёты Администрирование Конфигурация + Регистрация Плагины О приложении