// // BootstrapScriptEditor.cs // // Author: // Michael Becker // // Copyright (c) 2020 Mike Becker's Software // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . using System; using System.Collections.Generic; using MBS.Framework; using MBS.Framework.Settings; using MBS.Framework.UserInterface; using MBS.Framework.UserInterface.Controls; using MBS.Framework.UserInterface.Controls.ListView; using MBS.Framework.UserInterface.Dialogs; using UniversalEditor.ObjectModels.Setup.Microsoft.ACME.BootstrapScript; using UniversalEditor.UserInterface; namespace UniversalEditor.Plugins.Setup.UserInterface { [ContainerLayout("~/Editors/Setup/BootstrapScript/BootstrapScriptEditor.glade")] public class BootstrapScriptEditor : Editor { private ListViewControl tvPlatforms; private ListViewControl tvParameters; private ListViewControl tvFiles; private Toolbar tbPlatforms; private Toolbar tbParameters; private Toolbar tbFiles; private static EditorReference _er = null; public override EditorReference MakeReference() { if (_er == null) { _er = base.MakeReference(); _er.SupportedObjectModels.Add(typeof(BootstrapScriptObjectModel)); } return _er; } [EventHandler(nameof(tvPlatforms), "SelectionChanged")] private void tvPlatforms_SelectionChanged(object sender, EventArgs e) { tvParameters.Model.Rows.Clear(); tvFiles.Model.Rows.Clear(); if (tvPlatforms.SelectedRows.Count < 1) return; BootstrapOperatingSystem os = tvPlatforms.SelectedRows[0].GetExtraData("item"); foreach (KeyValuePair kvp in os.Parameters) { TreeModelRow row = new TreeModelRow(new TreeModelRowColumn[] { new TreeModelRowColumn(tvParameters.Model.Columns[0], kvp.Key), new TreeModelRowColumn(tvParameters.Model.Columns[1], kvp.Value) }); row.SetExtraData>("item", kvp); tvParameters.Model.Rows.Add(row); } foreach (BootstrapFile file in os.Files) { TreeModelRow row = new TreeModelRow(new TreeModelRowColumn[] { new TreeModelRowColumn(tvFiles.Model.Columns[0], file.SourceFileName), new TreeModelRowColumn(tvFiles.Model.Columns[1], file.DestinationFileName) }); row.SetExtraData("item", file); tvFiles.Model.Rows.Add(row); } } [EventHandler(nameof(tvPlatforms), "RowActivated")] private void tvPlatforms_RowActivated(object sender, ListViewRowActivatedEventArgs e) { if (e.Row == null) return; tsbPlatformEdit_Click(sender, e); } private void tsbPlatformAdd_Click(object sender, EventArgs e) { BootstrapScriptObjectModel setup = (ObjectModel as BootstrapScriptObjectModel); if (setup == null) return; SettingsDialog dlg = new SettingsDialog(new SettingsProvider[] { new CustomSettingsProvider(new SettingsGroup[] { new SettingsGroup("Platform", new Setting[] { new TextSetting("Name", "Platform _name") }) }) }); dlg.Text = "Platform Properties"; dlg.EnableProfiles = false; if (dlg.ShowDialog() == DialogResult.OK) { string platformName = dlg.SettingsProviders[0].SettingsGroups[0].Settings[0].GetValue()?.ToString(); BootstrapOperatingSystem os = new BootstrapOperatingSystem(); os.Name = platformName; TreeModelRow row = new TreeModelRow(new TreeModelRowColumn[] { new TreeModelRowColumn(tvPlatforms.Model.Columns[0], platformName) }); row.SetExtraData("item", os); tvPlatforms.Model.Rows.Add(row); BeginEdit(); setup.OperatingSystems.Add(os); EndEdit(); } } private void tsbPlatformEdit_Click(object sender, EventArgs e) { BootstrapScriptObjectModel setup = (ObjectModel as BootstrapScriptObjectModel); if (setup == null) return; if (tvPlatforms.SelectedRows.Count < 1) return; BootstrapOperatingSystem os = tvPlatforms.SelectedRows[0].GetExtraData("item"); if (os == null) return; SettingsDialog dlg = new SettingsDialog(new SettingsProvider[] { new CustomSettingsProvider(new SettingsGroup[] { new SettingsGroup("Platform", new Setting[] { new TextSetting("Name", "Platform _name") }) }) }); dlg.Text = "Platform Properties"; dlg.EnableProfiles = false; dlg.SettingsProviders[0].SettingsGroups[0].Settings[0].SetValue(os.Name); if (dlg.ShowDialog() == DialogResult.OK) { string platformName = dlg.SettingsProviders[0].SettingsGroups[0].Settings[0].GetValue()?.ToString(); BeginEdit(); os.Name = platformName; EndEdit(); tvPlatforms.SelectedRows[0].RowColumns[0].Value = platformName; } } private void tsbPlatformRemove_Click(object sender, EventArgs e) { BootstrapScriptObjectModel setup = (ObjectModel as BootstrapScriptObjectModel); if (setup == null) return; if (tvPlatforms.SelectedRows.Count < 1) return; BootstrapOperatingSystem os = tvPlatforms.SelectedRows[0].GetExtraData("item"); if (os == null) return; if (MessageDialog.ShowDialog("Removing the selected platform will remove all associated parameters and files. Continue?", "Remove Platform", MessageDialogButtons.YesNo, MessageDialogIcon.Warning) != DialogResult.Yes) return; BeginEdit(); setup.OperatingSystems.Remove(os); EndEdit(); tvPlatforms.Model.Rows.Remove(tvPlatforms.SelectedRows[0]); } [EventHandler(nameof(tvParameters), "RowActivated")] private void tvParameters_RowActivated(object sender, ListViewRowActivatedEventArgs e) { if (e.Row == null) return; tsbParameterEdit_Click(sender, e); } private void tsbParameterAdd_Click(object sender, EventArgs e) { BootstrapScriptObjectModel setup = (ObjectModel as BootstrapScriptObjectModel); if (setup == null) return; if (tvPlatforms.SelectedRows.Count < 1) return; BootstrapOperatingSystem os = tvPlatforms.SelectedRows[0].GetExtraData("item"); if (os == null) return; SettingsDialog dlg = new SettingsDialog(new SettingsProvider[] { new CustomSettingsProvider(new SettingsGroup[] { new SettingsGroup("Parameter", new Setting[] { new TextSetting("Name", "Parameter _name"), new TextSetting("Value", "_Value") }) }) }); dlg.Text = "Parameter Properties"; dlg.EnableProfiles = false; if (dlg.ShowDialog() == DialogResult.OK) { string name = dlg.SettingsProviders[0].SettingsGroups[0].Settings[0].GetValue()?.ToString(); string value = dlg.SettingsProviders[0].SettingsGroups[0].Settings[1].GetValue()?.ToString(); TreeModelRow row = new TreeModelRow(new TreeModelRowColumn[] { new TreeModelRowColumn(tvParameters.Model.Columns[0], name), new TreeModelRowColumn(tvParameters.Model.Columns[1], value) }); row.SetExtraData>("item", new KeyValuePair(name, value)); tvParameters.Model.Rows.Add(row); BeginEdit(); os.Parameters.Add(name, value); EndEdit(); } } private void tsbParameterEdit_Click(object sender, EventArgs e) { BootstrapScriptObjectModel setup = (ObjectModel as BootstrapScriptObjectModel); if (setup == null) return; if (tvPlatforms.SelectedRows.Count < 1) return; BootstrapOperatingSystem os = tvPlatforms.SelectedRows[0].GetExtraData("item"); if (os == null) return; string oldname = tvParameters.SelectedRows[0].GetExtraData>("item").Key; SettingsDialog dlg = new SettingsDialog(new SettingsProvider[] { new CustomSettingsProvider(new SettingsGroup[] { new SettingsGroup("Parameter", new Setting[] { new TextSetting("Name", "Parameter _name"), new TextSetting("Value", "_Value") }) }) }); dlg.Text = "Parameter Properties"; dlg.EnableProfiles = false; dlg.SettingsProviders[0].SettingsGroups[0].Settings[0].SetValue(oldname); dlg.SettingsProviders[0].SettingsGroups[0].Settings[1].SetValue(os.Parameters[oldname]); if (dlg.ShowDialog() == DialogResult.OK) { string name = dlg.SettingsProviders[0].SettingsGroups[0].Settings[0].GetValue()?.ToString(); string value = dlg.SettingsProviders[0].SettingsGroups[0].Settings[1].GetValue()?.ToString(); if (os.Parameters.ContainsKey(oldname)) { os.Parameters.Remove(oldname); } BeginEdit(); os.Parameters[name] = value; EndEdit(); tvParameters.SelectedRows[0].RowColumns[0].Value = name; tvParameters.SelectedRows[0].RowColumns[1].Value = value; } } private void tsbParameterRemove_Click(object sender, EventArgs e) { BootstrapScriptObjectModel setup = (ObjectModel as BootstrapScriptObjectModel); if (setup == null) return; if (tvPlatforms.SelectedRows.Count < 1) return; BootstrapOperatingSystem os = tvPlatforms.SelectedRows[0].GetExtraData("item"); if (os == null) return; string name = tvParameters.SelectedRows[0].GetExtraData>("item").Key; if (MessageDialog.ShowDialog(String.Format("Are you sure you want to remove the '{0}' parameter?", name), "Remove Parameter", MessageDialogButtons.YesNo, MessageDialogIcon.Warning) != DialogResult.Yes) return; BeginEdit(); os.Parameters.Remove(name); EndEdit(); tvParameters.Model.Rows.Remove(tvParameters.SelectedRows[0]); } [EventHandler(nameof(tvFiles), "RowActivated")] private void tvFiles_RowActivated(object sender, ListViewRowActivatedEventArgs e) { if (e.Row == null) return; tsbFileEdit_Click(sender, e); } private void tsbFileAdd_Click(object sender, EventArgs e) { BootstrapScriptObjectModel setup = (ObjectModel as BootstrapScriptObjectModel); if (setup == null) return; if (tvPlatforms.SelectedRows.Count < 1) return; BootstrapOperatingSystem os = tvPlatforms.SelectedRows[0].GetExtraData("item"); if (os == null) return; SettingsDialog dlg = new SettingsDialog(); dlg.Text = "File Properties"; dlg.EnableProfiles = false; dlg.SettingsProviders.Clear(); dlg.SettingsProviders.Add(new CustomSettingsProvider(new SettingsGroup[] { new SettingsGroup("File", new Setting[] { new FileSetting("SourceFileName", "_Source", null, false), new FileSetting("DestinationFileName", "_Destination", null, false) }) })); if (dlg.ShowDialog() == DialogResult.OK) { string name = dlg.SettingsProviders[0].SettingsGroups[0].Settings[0].GetValue()?.ToString(); string value = dlg.SettingsProviders[0].SettingsGroups[0].Settings[1].GetValue()?.ToString(); TreeModelRow row = new TreeModelRow(new TreeModelRowColumn[] { new TreeModelRowColumn(tvFiles.Model.Columns[0], name), new TreeModelRowColumn(tvFiles.Model.Columns[1], value) }); BootstrapFile file = new BootstrapFile(); file.SourceFileName = name; file.DestinationFileName = value; row.SetExtraData("item", file); tvFiles.Model.Rows.Add(row); BeginEdit(); os.Files.Add(file); EndEdit(); } } private void tsbFileEdit_Click(object sender, EventArgs e) { BootstrapScriptObjectModel setup = (ObjectModel as BootstrapScriptObjectModel); if (setup == null) return; if (tvPlatforms.SelectedRows.Count < 1) return; BootstrapOperatingSystem os = tvPlatforms.SelectedRows[0].GetExtraData("item"); if (os == null) return; if (tvFiles.SelectedRows.Count < 1) return; BootstrapFile file = tvFiles.SelectedRows[0].GetExtraData("item"); SettingsDialog dlg = new SettingsDialog(); dlg.Text = "File Properties"; dlg.EnableProfiles = false; dlg.SettingsProviders.Clear(); dlg.SettingsProviders.Add(new CustomSettingsProvider(new SettingsGroup[] { new SettingsGroup("File", new Setting[] { new FileSetting("SourceFileName", "_Source", file.SourceFileName, false), new FileSetting("DestinationFileName", "_Destination", file.DestinationFileName, false) }) })); if (dlg.ShowDialog() == DialogResult.OK) { string name = dlg.SettingsProviders[0].SettingsGroups[0].Settings[0].GetValue()?.ToString(); string value = dlg.SettingsProviders[0].SettingsGroups[0].Settings[1].GetValue()?.ToString(); BeginEdit(); file.SourceFileName = name; file.DestinationFileName = value; EndEdit(); tvFiles.SelectedRows[0].RowColumns[0].Value = name; tvFiles.SelectedRows[0].RowColumns[1].Value = value; } } private void tsbFileRemove_Click(object sender, EventArgs e) { BootstrapScriptObjectModel setup = (ObjectModel as BootstrapScriptObjectModel); if (setup == null) return; if (tvPlatforms.SelectedRows.Count < 1) return; BootstrapOperatingSystem os = tvPlatforms.SelectedRows[0].GetExtraData("item"); if (os == null) return; BootstrapFile file = tvFiles.SelectedRows[0].GetExtraData("item"); if (MessageDialog.ShowDialog(String.Format("Are you sure you want to remove the '{0}' file?", file.SourceFileName), "Remove File", MessageDialogButtons.YesNo, MessageDialogIcon.Warning) != DialogResult.Yes) return; BeginEdit(); os.Files.Remove(file); EndEdit(); tvFiles.Model.Rows.Remove(tvFiles.SelectedRows[0]); } protected override void OnCreated(EventArgs e) { base.OnCreated(e); (tbPlatforms.Items["tsbPlatformAdd"] as ToolbarItemButton).Click += tsbPlatformAdd_Click; (tbPlatforms.Items["tsbPlatformEdit"] as ToolbarItemButton).Click += tsbPlatformEdit_Click; (tbPlatforms.Items["tsbPlatformRemove"] as ToolbarItemButton).Click += tsbPlatformRemove_Click; (tbParameters.Items["tsbParameterAdd"] as ToolbarItemButton).Click += tsbParameterAdd_Click; (tbParameters.Items["tsbParameterEdit"] as ToolbarItemButton).Click += tsbParameterEdit_Click; (tbParameters.Items["tsbParameterRemove"] as ToolbarItemButton).Click += tsbParameterRemove_Click; (tbFiles.Items["tsbFileAdd"] as ToolbarItemButton).Click += tsbFileAdd_Click; (tbFiles.Items["tsbFileEdit"] as ToolbarItemButton).Click += tsbFileEdit_Click; (tbFiles.Items["tsbFileRemove"] as ToolbarItemButton).Click += tsbFileRemove_Click; OnObjectModelChanged(e); } protected override void OnObjectModelChanged(EventArgs e) { base.OnObjectModelChanged(e); if (!IsCreated) return; tvPlatforms.Model.Rows.Clear(); tvParameters.Model.Rows.Clear(); tvFiles.Model.Rows.Clear(); BootstrapScriptObjectModel setup = (ObjectModel as BootstrapScriptObjectModel); if (setup == null) return; foreach (BootstrapOperatingSystem os in setup.OperatingSystems) { TreeModelRow row = new TreeModelRow(new TreeModelRowColumn[] { new TreeModelRowColumn(tvPlatforms.Model.Columns[0], os.Name) }); row.SetExtraData("item", os); tvPlatforms.Model.Rows.Add(row); } } protected override Selection CreateSelectionInternal(object content) { throw new NotImplementedException(); } public override void UpdateSelections() { throw new NotImplementedException(); } } }