/////////////////////////////////////////////////////////////////////////// // Copyright (C) Wizardry and Steamworks 2015 - License: GNU GPLv3 // // Please see: http://www.gnu.org/licenses/gpl.html for legal details, // // rights of fair usage, the disclaimer and warranty conditions. // /////////////////////////////////////////////////////////////////////////// using System; using System.Collections.Generic; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Windows.Forms; using OpenMetaverse; using wasSharp; namespace Vassal { public partial class RegionEditForm : Form { private static RegionEditForm mainForm; public RegionEditForm() { InitializeComponent(); mainForm = this; } private void LoadRegionsRequested(object sender, EventArgs e) { mainForm.BeginInvoke((MethodInvoker) (() => { switch (mainForm.LoadRegionsDialog.ShowDialog()) { case DialogResult.OK: var file = mainForm.LoadRegionsDialog.FileName; new Thread(() => { mainForm.BeginInvoke((MethodInvoker) (() => { try { mainForm.StatusText.Text = @"loading regions..."; mainForm.StatusProgress.Value = 0; // import CSV regions Vector3 localPosition; var ConfiguredRegions = new List >( File.ReadAllLines(file) .AsParallel() .Select(o => new List(CSV.ToEnumerable(o))) .Where(o => o.Count == 2) .ToDictionary(o => o.First(), p => Vector3.TryParse(p.Last(), out localPosition) ? localPosition : Vector3.Zero)); Vassal.vassalForm.BeginInvoke((MethodInvoker) (() => { Vassal.vassalForm.LoadedRegionsBox.Items.Clear(); Vassal.vassalForm.LoadedRegionsBox.Items.AddRange( ConfiguredRegions.Select( o => (object) new ListViewItem {Text = o.Key, Tag = o.Value}) .ToArray()); // Update batch restart grid view. Vassal.vassalForm.BatchRestartGridView.Rows.Clear(); foreach (var data in ConfiguredRegions) { Vassal.vassalForm.BatchRestartGridView.Rows.Add(data.Key, data.Value); } // Update region state grid view. Vassal.vassalForm.RegionsStateGridView.Rows.Clear(); foreach (var data in ConfiguredRegions) { Vassal.vassalForm.RegionsStateGridView.Rows.Add(data.Key, "Check pending...", DateTime.Now.ToUniversalTime() .ToString(Vassal.LINDEN_CONSTANTS.LSL.DATE_TIME_STAMP)); } })); Regions.Items.Clear(); Regions.Items.AddRange( ConfiguredRegions.Select( o => (object) new ListViewItem { Text = o.Key + @" " + @"(" + o.Value.ToString() + @")", Tag = o }) .ToArray()); mainForm.StatusText.Text = @"regions loaded"; mainForm.StatusProgress.Value = 100; } catch (Exception ex) { mainForm.StatusText.Text = ex.Message; } })); }) {IsBackground = true, Priority = ThreadPriority.Normal}.Start(); break; } })); } private void SaveRegionsRequested(object sender, EventArgs e) { mainForm.BeginInvoke((MethodInvoker) (() => { switch (mainForm.SaveRegionsDialog.ShowDialog()) { case DialogResult.OK: var file = mainForm.SaveRegionsDialog.FileName; new Thread(() => { mainForm.BeginInvoke((MethodInvoker) (() => { try { mainForm.StatusText.Text = @"saving regions..."; mainForm.StatusProgress.Value = 0; // Save the regions to CSV. using ( var streamWriter = new StreamWriter(file, false, Encoding.UTF8)) { foreach ( var region in Regions.Items.Cast() .Select(o => (KeyValuePair) o.Tag)) { streamWriter.Write( CSV.FromEnumerable(new[] {region.Key, region.Value.ToString()})); streamWriter.Write(Environment.NewLine); } } mainForm.StatusText.Text = @"regions saved"; mainForm.StatusProgress.Value = 100; } catch (Exception ex) { mainForm.StatusText.Text = ex.Message; } })); }) {IsBackground = true, Priority = ThreadPriority.Normal}.Start(); break; } })); } private void RegionEditShown(object sender, EventArgs e) { Regions.Items.Clear(); // Get all the regions if they exist. if (File.Exists(Vassal.VASSAL_CONSTANTS.VASSAL_REGIONS)) { Vector3 localPosition; var ConfiguredRegions = new List>( File.ReadAllLines(Vassal.VASSAL_CONSTANTS.VASSAL_REGIONS) .Select(o => new List(CSV.ToEnumerable(o))) .Where(o => o.Count == 2) .ToDictionary(o => o.First(), p => Vector3.TryParse(p.Last(), out localPosition) ? localPosition : Vector3.Zero).OrderBy(o => o.Key).ToDictionary(o => o.Key, o => o.Value)); Regions.Items.AddRange( ConfiguredRegions.Select( o => (object) new ListViewItem {Text = o.Key + @" " + @"(" + o.Value.ToString() + @")", Tag = o}) .ToArray()); } } private void RequestAddRegion(object sender, EventArgs e) { mainForm.BeginInvoke((MethodInvoker) (() => { if (string.IsNullOrEmpty(RegionName.Text)) { RegionName.BackColor = Color.MistyRose; return; } Vector3 position; if (!Vector3.TryParse(RegionPosition.Text, out position)) { RegionPosition.BackColor = Color.MistyRose; return; } RegionName.BackColor = Color.Empty; RegionPosition.BackColor = Color.Empty; Regions.Items.Add(new ListViewItem { Text = RegionName.Text + @" " + @"(" + position + @")", Tag = new KeyValuePair(RegionName.Text, position) }); // Update drop down box. Vassal.vassalForm.BeginInvoke((MethodInvoker) (() => { Vassal.vassalForm.LoadedRegionsBox.Items.Add(new ListViewItem { Text = RegionName.Text, Tag = position }); // Add the row to the batch restart grid view. Vassal.vassalForm.BatchRestartGridView.Rows.Add(RegionName.Text, position.ToString()); Vassal.vassalForm.RegionsStateGridView.Rows.Add(RegionName.Text, "Check pending...", DateTime.Now.ToUniversalTime() .ToString(Vassal.LINDEN_CONSTANTS.LSL.DATE_TIME_STAMP)); })); })); } private void RequestRemoveRegion(object sender, EventArgs e) { mainForm.BeginInvoke((MethodInvoker) (() => { var listViewItem = Regions.SelectedItem as ListViewItem; if (listViewItem == null) { Regions.BackColor = Color.MistyRose; return; } var selectedItemIndex = Regions.SelectedIndex; if (selectedItemIndex == -1) return; Regions.BackColor = Color.Empty; Vassal.vassalForm.BeginInvoke((MethodInvoker) (() => { Vassal.vassalForm.LoadedRegionsBox.Items.RemoveAt(selectedItemIndex); // Update the batch restart grid view. Vassal.vassalForm.BatchRestartGridView.Rows.RemoveAt(selectedItemIndex); Vassal.vassalForm.RegionsStateGridView.Rows.RemoveAt(selectedItemIndex); })); Regions.Items.RemoveAt(Regions.SelectedIndex); })); } private void RegionSettingChanged(object sender, EventArgs e) { mainForm.BeginInvoke((MethodInvoker) (() => { var listViewItem = Regions.SelectedItem as ListViewItem; if (listViewItem == null) return; var selectedItemIndex = Regions.SelectedIndex; if (selectedItemIndex == -1) return; if (string.IsNullOrEmpty(RegionName.Text)) { RegionName.BackColor = Color.MistyRose; RegionPosition.BackColor = Color.MistyRose; return; } Vector3 position; if (!Vector3.TryParse(RegionPosition.Text, out position)) { RegionPosition.BackColor = Color.MistyRose; return; } RegionName.BackColor = Color.Empty; RegionPosition.BackColor = Color.Empty; Vassal.vassalForm.BeginInvoke((MethodInvoker) (() => { if (Vassal.vassalForm.LoadedRegionsBox.Items.Count > selectedItemIndex) { Vassal.vassalForm.LoadedRegionsBox.Items[selectedItemIndex] = new ListViewItem { Text = RegionName.Text, Tag = position }; } // Update the batch restart grid view. if (Vassal.vassalForm.BatchRestartGridView.Rows.Count > selectedItemIndex) { Vassal.vassalForm.BatchRestartGridView.Rows[selectedItemIndex].Cells["BatchRestartRegionName"] .Value = RegionName.Text; Vassal.vassalForm.BatchRestartGridView.Rows[selectedItemIndex].Cells["BatchRestartPosition"] .Value = position.ToString(); } // Update the region state grid view. if (Vassal.vassalForm.RegionsStateGridView.Rows.Count > selectedItemIndex) { Vassal.vassalForm.RegionsStateGridView.Rows[selectedItemIndex].Cells["RegionsStateRegionName"] .Value = RegionName.Text; Vassal.vassalForm.RegionsStateGridView.Rows[selectedItemIndex].Cells["RegionsStateLastState"] .Value = "Check pending..."; Vassal.vassalForm.RegionsStateGridView.Rows[selectedItemIndex].Cells["RegionsStateLastCheck"] .Value = DateTime.Now.ToUniversalTime() .ToString(Vassal.LINDEN_CONSTANTS.LSL.DATE_TIME_STAMP); } })); Regions.Items[selectedItemIndex] = new ListViewItem { Text = RegionName.Text + @" " + @"(" + position + @")", Tag = new KeyValuePair(RegionName.Text, position) }; })); } private void RegionSelected(object sender, EventArgs e) { mainForm.BeginInvoke((MethodInvoker) (() => { var listViewItem = Regions.SelectedItem as ListViewItem; if (listViewItem == null) return; var selectedItemIndex = Regions.SelectedIndex; if (selectedItemIndex == -1) return; var region = (KeyValuePair) listViewItem.Tag; RegionName.Text = region.Key; RegionPosition.Text = region.Value.ToString(); })); } private void ShowToolTip(object sender, EventArgs e) { mainForm.BeginInvoke( (Action) (() => { var pictureBox = sender as PictureBox; if (pictureBox != null) { toolTip1.Show(toolTip1.GetToolTip(pictureBox), pictureBox); } })); } } }