using bsmd.AIS2Service; using System.ComponentModel; namespace AISAdmin { public partial class Main : Form { private AIS_SQLiteStorage? _storage; private BindingList _monitorGroups = new(); private MonitorGroup? _currentGroup; private readonly Dictionary> _zoneAssignmentDict = new(); private readonly List _allTargets = new(); public Main() { InitializeComponent(); _currentGroup = null; } private void buttonZoneUp_Click(object sender, EventArgs e) { MonitorZone mz = (MonitorZone)this.listBoxZones.SelectedItem; int i = this.listBoxZones.SelectedIndex; BindingList zones = (BindingList)this.listBoxZones.DataSource; if (mz != null && (i > 0)) { MonitorZone prevZone = zones[i - 1]; mz.Sequence -= 1; prevZone.Sequence += 1; zones[i - 1] = mz; zones[i] = prevZone; this.listBoxZones.SelectedIndex = i - 1; } } private void buttonZoneDown_Click(object sender, EventArgs e) { MonitorZone mz = (MonitorZone)this.listBoxZones.SelectedItem; int i = this.listBoxZones.SelectedIndex; BindingList zones = (BindingList) this.listBoxZones.DataSource; if (mz != null && (i < (zones.Count - 1))) { MonitorZone nextZone = zones[i + 1]; mz.Sequence += 1; nextZone.Sequence -= 1; zones[i + 1] = mz; zones[i] = nextZone; this.listBoxZones.SelectedIndex = i + 1; } } private void buttonImportZone_Click(object sender, EventArgs e) { using OpenFileDialog ofd = new(); ofd.Filter = "Google Earth KML files (*.kml)|*.kml|All files (*.*)|*.*"; ofd.RestoreDirectory = true; ofd.Multiselect = false; if (ofd.ShowDialog() == DialogResult.OK) { _monitorGroups = new BindingList(MonitorGroup.LoadGroups(ofd.FileName)); this.comboBoxGroup.DataSource = _monitorGroups; if (_monitorGroups.Count > 0) this.comboBoxGroup.SelectedIndex = 0; this.buttonSaveGroup.Enabled = _monitorGroups.Count > 0; this.listBoxZones.Enabled = _monitorGroups.Count > 0; } } private void buttonEditZone_Click(object sender, EventArgs e) { } private void buttonDeleteZone_Click(object sender, EventArgs e) { } private void buttonNewGroup_Click(object sender, EventArgs e) { this.textBoxGroup.ReadOnly = false; this.buttonSaveGroup.Enabled = true; _currentGroup = new MonitorGroup(-1, ""); this.textBoxGroup.ResetText(); } private void buttonDeleteGroup_Click(object sender, EventArgs e) { } private void buttonSaveGroup_Click(object sender, EventArgs e) { // save everything foreach(MonitorGroup mg in this._monitorGroups) { this._storage?.Save(mg); foreach(MonitorZone mz in mg.Zones) { if (mz.MonitorGroupId < 1) mz.MonitorGroupId = mg.Id; this._storage?.Save(mz); foreach(GeoPoint vertex in mz.Vertices) { if(vertex.MonitorZoneId < 1) vertex.MonitorZoneId = mz.Id; this._storage?.Save(vertex); } } } } private async void Main_Load(object sender, EventArgs e) { _storage = new AIS_SQLiteStorage(Properties.Settings.Default.SQLiteDBConnectionString); _monitorGroups = new BindingList(_storage.LoadGroups()); List zones = _storage.LoadMonitorZones(); foreach(MonitorGroup mg in _monitorGroups) { foreach(MonitorZone mz in zones) { if (mz.MonitorGroupId == mg.Id) mg.Zones.Add(mz); } } this.comboBoxGroup.DataSource = _monitorGroups; this.comboBoxGroup.DisplayMember = "Name"; if (_monitorGroups.Count > 0) this.comboBoxGroup.SelectedIndex = 0; this.buttonSaveGroup.Enabled = _monitorGroups.Count > 0; this.listBoxZones.Enabled = _monitorGroups.Count > 0; Dictionary allTargets = await _storage.LoadTargets(); foreach (int mmsi in allTargets.Keys) this._allTargets.Add(allTargets[mmsi]); this._allTargets.Sort(); this.listBoxTargets.DataSource = this._allTargets; if (this._allTargets.Count > 0) this.listBoxTargets.Enabled = true; } private void comboBoxGroup_SelectedIndexChanged(object sender, EventArgs e) { _currentGroup = (MonitorGroup) this.comboBoxGroup.SelectedItem; if (_currentGroup != null) { _currentGroup.Zones.Sort(); this.listBoxZones.DataSource = new BindingList(_currentGroup.Zones); foreach(MonitorZone zone in _currentGroup.Zones) { _zoneAssignmentDict[zone] = _storage?.LoadAssignmentsForZone(zone.Id) ?? new(); } } else { this.listBoxZones.DataSource = null; this.textBoxGroup.ResetText(); this.buttonSaveGroup.Enabled = false; this.textBoxGroup.ReadOnly = true; } this.buttonZoneDown.Enabled = (this._currentGroup != null) && (this._currentGroup.Zones.Count > 1); this.buttonZoneUp.Enabled = (this._currentGroup != null) && (this._currentGroup.Zones.Count > 1); } private void checkBoxZoneActive_CheckedChanged(object sender, EventArgs e) { MonitorZone mz = (MonitorZone)this.listBoxZones.SelectedItem; if (mz != null) { mz.Active = this.checkBoxZoneActive.Checked; } } private void listBoxZones_SelectedIndexChanged(object sender, EventArgs e) { MonitorZone mz = (MonitorZone) this.listBoxZones.SelectedItem; if(mz != null) { this.checkBoxZoneActive.Checked = mz.Active; this.textBoxZone.Text = mz.Name; if (this._zoneAssignmentDict.ContainsKey(mz)) this.listBoxAssignment.DataSource = new BindingList(this._zoneAssignmentDict[mz]); else this.listBoxAssignment.DataSource = null; } } private void buttonNewAssignment_Click(object sender, EventArgs e) { MonitorAssignment ma = new(-1); using EditAssignmentDialog ead = new EditAssignmentDialog(); ead.Assignment = ma; if(ead.ShowDialog() == DialogResult.OK) { this.AddOrUpdateAssignmentForAllGroupZones(ma.MMSI, ma.MonitorType); } } private void AddOrUpdateAssignmentForAllGroupZones(int mMSI, MonitorAssignment.ZoneMonitorType monitorType) { if (this._currentGroup == null) return; foreach (MonitorZone mz in this._currentGroup.Zones) { if (!this._zoneAssignmentDict.ContainsKey(mz)) this._zoneAssignmentDict[mz] = new(); MonitorAssignment? ma = this._zoneAssignmentDict[mz].FirstOrDefault((z) => z.MMSI == mMSI); if (ma == null) { ma = new MonitorAssignment(-1); ma.MonitorZoneId = mz.Id; this._zoneAssignmentDict[mz].Add(ma); } ma.MMSI = mMSI; ma.MonitorType = monitorType; _storage?.Save(ma); } } private void buttonDeleteAssignment_Click(object sender, EventArgs e) { MonitorAssignment? ma = (MonitorAssignment)this.listBoxAssignment.SelectedItem; if(ma != null) { } } private void buttonAssignSelectedTarget_Click(object sender, EventArgs e) { foreach (AIS_Target target in this.listBoxTargets.SelectedItems) { this.AddOrUpdateAssignmentForAllGroupZones(target.MMSI, MonitorAssignment.ZoneMonitorType.ENTER); } } } }