corrade-vassal – Rev 16

Subversion Repositories:
Rev:
///////////////////////////////////////////////////////////////////////////
//  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
                                        <KeyValuePair<string, Vector3>>(
                                        File.ReadAllLines(file)
                                            .AsParallel()
                                            .Select(o => new List<string>(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<ListViewItem>()
                                                    .Select(o => (KeyValuePair<string, Vector3>) 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<KeyValuePair<string, Vector3>>(
                    File.ReadAllLines(Vassal.VASSAL_CONSTANTS.VASSAL_REGIONS)
                        .Select(o => new List<string>(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<string, Vector3>(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<string, Vector3>(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<string, Vector3>) 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);
                    }
                }));
        }
    }
}

Generated by GNU Enscript 1.6.5.90.