kopia lustrzana https://github.com/dl2alf/AirScout
V1.3.1.0
rodzic
14eeaf8ffe
commit
c1b5b7b82e
|
@ -3,6 +3,12 @@
|
|||
##
|
||||
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
|
||||
|
||||
# Exclude internal projects
|
||||
|
||||
AirScoutDatabaseManager/
|
||||
ElevationTileGenerator/
|
||||
HorizonGenerator/
|
||||
|
||||
# User-specific files
|
||||
*.suo
|
||||
*.user
|
||||
|
|
|
@ -0,0 +1,83 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<Import Project="..\packages\ILMerge.3.0.29\build\ILMerge.props" Condition="Exists('..\packages\ILMerge.3.0.29\build\ILMerge.props')" />
|
||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProjectGuid>{23F584DB-EB5E-452D-B49F-7C1CABB713FF}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>AirScout.PlaneFeeds.Plugin.OpenSky</RootNamespace>
|
||||
<AssemblyName>AirScout.PlaneFeeds.Plugin.OpenSky</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<Deterministic>true</Deterministic>
|
||||
<NuGetPackageImportStamp>
|
||||
</NuGetPackageImportStamp>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.ComponentModel.Composition" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.Web.Extensions" />
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
<Reference Include="System.Data.DataSetExtensions" />
|
||||
<Reference Include="Microsoft.CSharp" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="OpenSky.cs" />
|
||||
<Compile Include="Properties\Settings.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
||||
<DependentUpon>Settings.settings</DependentUpon>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\AirScout.PlaneFeeds.Plugin\AirScout.PlaneFeeds.Plugin.csproj">
|
||||
<Project>{36945dbd-96c8-41e7-9168-f83c42e67af3}</Project>
|
||||
<Name>AirScout.PlaneFeeds.Plugin</Name>
|
||||
<Private>False</Private>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="app.config" />
|
||||
<None Include="packages.config" />
|
||||
<None Include="Properties\Settings.settings">
|
||||
<Generator>SettingsSingleFileGenerator</Generator>
|
||||
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
||||
<PropertyGroup>
|
||||
<ErrorText>Dieses Projekt verweist auf mindestens ein NuGet-Paket, das auf diesem Computer fehlt. Verwenden Sie die Wiederherstellung von NuGet-Paketen, um die fehlenden Dateien herunterzuladen. Weitere Informationen finden Sie unter "http://go.microsoft.com/fwlink/?LinkID=322105". Die fehlende Datei ist "{0}".</ErrorText>
|
||||
</PropertyGroup>
|
||||
<Error Condition="!Exists('..\packages\ILMerge.3.0.29\build\ILMerge.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\ILMerge.3.0.29\build\ILMerge.props'))" />
|
||||
<Error Condition="!Exists('..\packages\ILMerge.MSBuild.Task.1.0.7\build\ILMerge.MSBuild.Task.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\ILMerge.MSBuild.Task.1.0.7\build\ILMerge.MSBuild.Task.targets'))" />
|
||||
</Target>
|
||||
<Import Project="..\packages\ILMerge.MSBuild.Task.1.0.7\build\ILMerge.MSBuild.Task.targets" Condition="Exists('..\packages\ILMerge.MSBuild.Task.1.0.7\build\ILMerge.MSBuild.Task.targets')" />
|
||||
<PropertyGroup>
|
||||
<PostBuildEvent>copy Z:\CSharp\AirScout\AirScout\AirScout.PlaneFeeds.Plugin.OpenSky\bin\Debug\ILMerge\*.dll Z:\CSharp\AirScout\AirScout\AirScout\bin\Debug\ /Y</PostBuildEvent>
|
||||
</PropertyGroup>
|
||||
</Project>
|
|
@ -0,0 +1,648 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Reflection;
|
||||
using System.ComponentModel.Composition;
|
||||
using System.ComponentModel;
|
||||
using System.Globalization;
|
||||
using AirScout.PlaneFeeds.Plugin.MEFContract;
|
||||
using System.Diagnostics;
|
||||
using System.Net;
|
||||
using System.IO;
|
||||
using System.Web.Script.Serialization;
|
||||
using System.Xml.Linq;
|
||||
using System.Xml.Serialization;
|
||||
using System.Collections;
|
||||
|
||||
//TODO: Rename namespace to a name of your choice
|
||||
namespace AirScout.PlaneFeeds.Plugin.OpenSky
|
||||
{
|
||||
|
||||
//TODO: Rename settings class to a name of your choice
|
||||
// Add any persistant setting here
|
||||
// Use [Browsable(true/false)] to present the setting to the user and allow changes or not
|
||||
// Use [CategoryAttribute("<description")] to group settings to categories
|
||||
// Use [DescriptionAttribute("<description")] to add a description to this setting
|
||||
// Use [DefaultValue(<value>)] to set a default value for this setting
|
||||
// Use [XmlIgnore] if you don't want this setting to be ex-/imported, but stiil stored in settings file
|
||||
// Example:
|
||||
// [CategoryAttribute("Web Feed")]
|
||||
// [DescriptionAttribute("Timeout for loading the site.")]
|
||||
// [DefaultValue(30)]
|
||||
// [XmlIgnore]
|
||||
// public int Timeout { get; set; }
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Keeps all persistant settings of plugin
|
||||
/// </summary>
|
||||
public class OpenSkySettings
|
||||
{
|
||||
[Browsable(false)]
|
||||
[DefaultValue("")]
|
||||
[XmlIgnore]
|
||||
public string DisclaimerAccepted { get; set; }
|
||||
|
||||
[Browsable(true)]
|
||||
[CategoryAttribute("Web Feed")]
|
||||
[DescriptionAttribute("Save downloaded JSON to file")]
|
||||
[DefaultValue(false)]
|
||||
[XmlIgnore]
|
||||
public bool SaveToFile { get; set; }
|
||||
|
||||
[Browsable(true)]
|
||||
[CategoryAttribute("Web Feed")]
|
||||
[DescriptionAttribute("Base URL for website.")]
|
||||
[DefaultValue("http://opensky-network.org/api/states/all?lamin=%MINLAT%&lomin=%MINLON%&lamax=%MAXLAT%&lomax=%MAXLON%")]
|
||||
public string URL { get; set; }
|
||||
|
||||
[Browsable(true)]
|
||||
[CategoryAttribute("Web Feed")]
|
||||
[DescriptionAttribute("Timeout for loading the site.")]
|
||||
[DefaultValue(60)]
|
||||
[XmlIgnore]
|
||||
public int Timeout { get; set; }
|
||||
|
||||
|
||||
public OpenSkySettings()
|
||||
{
|
||||
Default();
|
||||
Load(true);
|
||||
// TODO:
|
||||
}
|
||||
|
||||
// Methods für Load/Dave/Default, don't change!
|
||||
|
||||
#region Load/Save/Default
|
||||
|
||||
/// <summary>
|
||||
/// Sets all properties to their default value according to the [DefaultValue=] attribute
|
||||
/// </summary>
|
||||
public void Default()
|
||||
{
|
||||
// set all properties to their default values according to definition in [DeafultValue=]
|
||||
foreach (var p in this.GetType().GetProperties())
|
||||
{
|
||||
try
|
||||
{
|
||||
// initialize all properties with default value if set
|
||||
if (Attribute.IsDefined(p, typeof(DefaultValueAttribute)))
|
||||
{
|
||||
p.SetValue(this, ((DefaultValueAttribute)Attribute.GetCustomAttribute(
|
||||
p, typeof(DefaultValueAttribute)))?.Value, null);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine("[" + this.GetType().Name + "]: Cannot set default value of: " + p.Name + ", " + ex.Message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Loads settings from a XML-formatted configuration file into settings.
|
||||
/// </summary>
|
||||
/// <param name="loadall">If true, ignore the [XmlIgnore] attribute, e.g. load all settings available in the file.<br>If false, load only settings without [XmlIgore] attrbute.</br></param>
|
||||
/// <param name="filename">The filename of the settings file.</param>
|
||||
public void Load(bool loadall, string filename = "")
|
||||
{
|
||||
// use standard filename if empty
|
||||
// be careful because Linux file system is case sensitive
|
||||
if (String.IsNullOrEmpty(filename))
|
||||
filename = new Uri(Assembly.GetExecutingAssembly().GetName().CodeBase.Replace(".dll", ".cfg").Replace(".DLL", ".CFG")).LocalPath;
|
||||
// do nothing if file not exists
|
||||
if (!File.Exists(filename))
|
||||
return;
|
||||
try
|
||||
{
|
||||
string xml = "";
|
||||
using (StreamReader sr = new StreamReader(File.OpenRead(filename)))
|
||||
{
|
||||
xml = sr.ReadToEnd();
|
||||
}
|
||||
XDocument xdoc = XDocument.Parse(xml);
|
||||
PropertyInfo[] properties = this.GetType().GetProperties();
|
||||
foreach (PropertyInfo p in properties)
|
||||
{
|
||||
if (!loadall)
|
||||
{
|
||||
// check on XmlIgnore attribute, skip if set
|
||||
object[] attr = p.GetCustomAttributes(typeof(XmlIgnoreAttribute), false);
|
||||
if (attr.Length > 0)
|
||||
continue;
|
||||
}
|
||||
try
|
||||
{
|
||||
// get matching element
|
||||
XElement typenode = xdoc.Element(this.GetType().Name);
|
||||
if (typenode != null)
|
||||
{
|
||||
XElement element = typenode.Element(p.Name);
|
||||
if (element != null)
|
||||
p.SetValue(this, Convert.ChangeType(element.Value, p.PropertyType), null);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine("[" + this.GetType().Name + "]: Error while loading property[" + p.Name + " from " + filename + ", " + ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine("[" + this.GetType().Name + "]: Cannot load settings from " + filename + ", " + ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Saves settings from settings into a XML-formatted configuration file
|
||||
/// </summary>
|
||||
/// <param name="saveall">If true, ignore the [XmlIgnore] attribute, e.g. save all settings.<br>If false, save only settings without [XmlIgore] attrbute.</param>
|
||||
/// <param name="filename">The filename of the settings file.</param>
|
||||
public void Save(bool saveall, string filename = "")
|
||||
{
|
||||
// use standard filename if empty
|
||||
// be careful because Linux file system is case sensitive
|
||||
if (String.IsNullOrEmpty(filename))
|
||||
filename = new Uri(Assembly.GetExecutingAssembly().GetName().CodeBase.Replace(".dll", ".cfg").Replace(".DLL", ".CFG")).LocalPath;
|
||||
XmlAttributeOverrides overrides = new XmlAttributeOverrides();
|
||||
if (saveall)
|
||||
{
|
||||
// ovverride the XmlIgnore attributes to get all serialized
|
||||
PropertyInfo[] properties = this.GetType().GetProperties();
|
||||
foreach (PropertyInfo p in properties)
|
||||
{
|
||||
XmlAttributes attribs = new XmlAttributes { XmlIgnore = false };
|
||||
overrides.Add(this.GetType(), p.Name, attribs);
|
||||
}
|
||||
}
|
||||
try
|
||||
{
|
||||
using (StreamWriter sw = new StreamWriter(File.Create(filename)))
|
||||
{
|
||||
XmlSerializer s = new XmlSerializer(this.GetType(), overrides);
|
||||
s.Serialize(sw, this);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new InvalidOperationException("[" + this.GetType().Name + "]: Cannot save settings to " + filename + ", " + ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
//TODO: Rename plugin class to a name of yout choice
|
||||
|
||||
/// <summary>
|
||||
/// Holds the plane feed plugin class
|
||||
/// </summary>
|
||||
[Export(typeof(IPlaneFeedPlugin))]
|
||||
[ExportMetadata("Name", "PlaneFeedPlugin")]
|
||||
public class OpenSkyPlugin : IPlaneFeedPlugin
|
||||
{
|
||||
private OpenSkySettings Settings = new OpenSkySettings();
|
||||
|
||||
// start of interface
|
||||
|
||||
//TODO: Change return values so that they represent plugin's functionality
|
||||
#region Interface
|
||||
|
||||
public string Name
|
||||
{
|
||||
get
|
||||
{
|
||||
return "[WebFeed] OpenSky";
|
||||
}
|
||||
}
|
||||
public string Version
|
||||
{
|
||||
get
|
||||
{
|
||||
return Assembly.GetExecutingAssembly().GetName().Version.ToString();
|
||||
}
|
||||
}
|
||||
|
||||
public string Info
|
||||
{
|
||||
get
|
||||
{
|
||||
return "Web feed from the OpenSky Network.\n" +
|
||||
"For details see https://opensky-network.org.\n\n" +
|
||||
"As this is a community network, please consider to run a personal ADSB-receiver and to contribute your data to this network.\n\n" +
|
||||
"This webfeed forces TLS1.2 transport layer security. Though this plugin is compiled for .NET4.0 it needs .NET4.5 or higher installed on this machine to work.\n\n" +
|
||||
"This webfeed will probably not work on early Windows XP and Linux/Mono systems";
|
||||
}
|
||||
}
|
||||
public bool HasSettings
|
||||
{
|
||||
get
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
public bool CanImport
|
||||
{
|
||||
get
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public bool CanExport
|
||||
{
|
||||
get
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public string Disclaimer
|
||||
{
|
||||
get
|
||||
{
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
public string DisclaimerAccepted
|
||||
{
|
||||
get
|
||||
{
|
||||
return Settings.DisclaimerAccepted;
|
||||
}
|
||||
set
|
||||
{
|
||||
Settings.DisclaimerAccepted = value;
|
||||
}
|
||||
}
|
||||
|
||||
public void ResetSettings()
|
||||
{
|
||||
Settings.Default();
|
||||
}
|
||||
|
||||
public void LoadSettings()
|
||||
{
|
||||
Settings.Load(true);
|
||||
}
|
||||
|
||||
public void SaveSettings()
|
||||
{
|
||||
Settings.Save(true);
|
||||
}
|
||||
|
||||
public object GetSettings()
|
||||
{
|
||||
return this.Settings;
|
||||
}
|
||||
|
||||
public void ImportSettings()
|
||||
{
|
||||
// nothing to do
|
||||
}
|
||||
|
||||
public void ExportSettings()
|
||||
{
|
||||
// nothing to do
|
||||
}
|
||||
|
||||
public void Start(PlaneFeedPluginArgs args)
|
||||
{
|
||||
// add code for startup here
|
||||
}
|
||||
|
||||
public PlaneFeedPluginPlaneInfoList GetPlanes(PlaneFeedPluginArgs args)
|
||||
{
|
||||
// intialize variables
|
||||
VarConverter VC = new VarConverter();
|
||||
VC.AddVar("APPDIR", args.AppDirectory);
|
||||
VC.AddVar("DATADIR", args.AppDataDirectory);
|
||||
VC.AddVar("LOGDIR", args.LogDirectory);
|
||||
VC.AddVar("DATABASEDIR", args.DatabaseDirectory);
|
||||
VC.AddVar("MINLAT", args.MinLat);
|
||||
VC.AddVar("MAXLAT", args.MaxLat);
|
||||
VC.AddVar("MINLON", args.MinLon);
|
||||
VC.AddVar("MAXLON", args.MaxLon);
|
||||
VC.AddVar("MINALTM", args.MinAlt);
|
||||
VC.AddVar("MAXALTM", args.MaxAlt);
|
||||
VC.AddVar("MINALTFT", (int)UnitConverter.m_ft((double)args.MinAlt));
|
||||
VC.AddVar("MAXALTFT", (int)UnitConverter.m_ft((double)args.MaxAlt));
|
||||
// initialize plane info list
|
||||
PlaneFeedPluginPlaneInfoList planes = new PlaneFeedPluginPlaneInfoList();
|
||||
string json = "";
|
||||
// calculate url and get json
|
||||
String url = VC.ReplaceAllVars(Settings.URL);
|
||||
Console.WriteLine("[" + this.GetType().Name + "]: Creating web request: " + url);
|
||||
// this will only run on .NET 4.0 if you have installed .NET 4.5 or later frameworks on your machine!
|
||||
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
|
||||
HttpWebRequest webrequest = (HttpWebRequest)HttpWebRequest.Create(url);
|
||||
webrequest.Timeout = Settings.Timeout * 1000;
|
||||
webrequest.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:73.0) Gecko/20100101 Firefox/73.0";
|
||||
webrequest.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";
|
||||
Console.WriteLine("[" + this.GetType().Name + "]: Getting web response");
|
||||
HttpWebResponse webresponse = (HttpWebResponse)webrequest.GetResponse();
|
||||
Console.WriteLine("[" + this.GetType().Name + "]: Reading stream");
|
||||
using (StreamReader sr = new StreamReader(webresponse.GetResponseStream()))
|
||||
{
|
||||
json = sr.ReadToEnd();
|
||||
}
|
||||
// save raw data to file if enabled
|
||||
if (Settings.SaveToFile)
|
||||
{
|
||||
using (StreamWriter sw = new StreamWriter(args.TmpDirectory + Path.DirectorySeparatorChar + this.GetType().Name + "_" + DateTime.UtcNow.ToString("yyyy-MM-dd HH_mm_ss") + ".json"))
|
||||
{
|
||||
sw.WriteLine(json);
|
||||
}
|
||||
}
|
||||
Console.WriteLine("[" + this.GetType().Name + "]: Analyzing data");
|
||||
JavaScriptSerializer js = new JavaScriptSerializer();
|
||||
dynamic root = js.Deserialize<dynamic>(json);
|
||||
try
|
||||
{
|
||||
// analyze json string for planes data
|
||||
// get the planes position list
|
||||
var aclist = root["states"];
|
||||
foreach (var ac in aclist)
|
||||
{
|
||||
try
|
||||
{
|
||||
// different handling of reading JSON between Windows (Array) & Linux (ArrayList)
|
||||
// access to data values itself is the same
|
||||
int len = 0;
|
||||
if (ac.GetType() == typeof(ArrayList))
|
||||
{
|
||||
len = ac.Count;
|
||||
}
|
||||
else if (ac.GetType() == typeof(Object[]))
|
||||
{
|
||||
len = ac.Length;
|
||||
}
|
||||
// skip if too few fields in record
|
||||
if (len < 17)
|
||||
continue;
|
||||
PlaneFeedPluginPlaneInfo plane = new PlaneFeedPluginPlaneInfo();
|
||||
// get hex first
|
||||
plane.Hex = ReadPropertyString(ac, 0).ToUpper();
|
||||
// get callsign
|
||||
plane.Call = ReadPropertyString(ac, 1);
|
||||
// get position
|
||||
plane.Lon = ReadPropertyDouble(ac, 5);
|
||||
plane.Lat = ReadPropertyDouble(ac, 6);
|
||||
// get altitude (provided in m --> convert to ft)
|
||||
plane.Alt = UnitConverter.m_ft(ReadPropertyDouble(ac, 13));
|
||||
// get track
|
||||
plane.Track = ReadPropertyDouble(ac, 10);
|
||||
// get speed (provided in m/s --> convert to kts)
|
||||
plane.Speed = UnitConverter.ms_kts(ReadPropertyDouble(ac, 9));
|
||||
// registration is not provided
|
||||
plane.Reg = "";
|
||||
// get position timestamp in sec
|
||||
int l = ReadPropertyInt(ac, 3);
|
||||
if (l != int.MinValue)
|
||||
{
|
||||
DateTime timestamp = new System.DateTime(1970, 1, 1, 0, 0, 0, 0);
|
||||
timestamp = timestamp.AddSeconds(l);
|
||||
plane.Time = timestamp;
|
||||
}
|
||||
else
|
||||
{
|
||||
// skip plane if no valid timestamp found
|
||||
continue;
|
||||
}
|
||||
// get type info
|
||||
plane.Type = ReadPropertyString(ac, 5);
|
||||
planes.Add(plane);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine("[" + System.Reflection.MethodBase.GetCurrentMethod().Name + "]" + ex.Message);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// do nothing if property is not found
|
||||
}
|
||||
Console.WriteLine("[" + this.GetType().Name + "]: Returning " + planes.Count + " planes");
|
||||
return planes;
|
||||
}
|
||||
|
||||
public void Stop(PlaneFeedPluginArgs args)
|
||||
{
|
||||
// add code for stopping here
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
// End of interface
|
||||
|
||||
|
||||
// ************************************* Helpers ****************************************************
|
||||
|
||||
[System.Diagnostics.DebuggerNonUserCode]
|
||||
private string ReadPropertyString(dynamic o, int propertyindex)
|
||||
{
|
||||
string s = null;
|
||||
try
|
||||
{
|
||||
s = o[propertyindex];
|
||||
}
|
||||
catch
|
||||
{
|
||||
// do nothing if something went wrong
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
[System.Diagnostics.DebuggerNonUserCode]
|
||||
private int ReadPropertyInt(dynamic o, int propertyindex)
|
||||
{
|
||||
int i = int.MinValue;
|
||||
double d = ReadPropertyDouble(o, propertyindex);
|
||||
if ((d != double.MinValue) && (d >= int.MinValue) && (d <= int.MaxValue))
|
||||
i = (int)d;
|
||||
return i;
|
||||
}
|
||||
|
||||
[System.Diagnostics.DebuggerNonUserCode]
|
||||
private double ReadPropertyDouble(dynamic o, int propertyindex)
|
||||
{
|
||||
double d = double.MinValue;
|
||||
try
|
||||
{
|
||||
string s = o[propertyindex].ToString(CultureInfo.InvariantCulture);
|
||||
d = double.Parse(s, CultureInfo.InvariantCulture);
|
||||
}
|
||||
catch
|
||||
{
|
||||
// do nothing if something went wrong
|
||||
}
|
||||
return d;
|
||||
}
|
||||
|
||||
[System.Diagnostics.DebuggerNonUserCode]
|
||||
private long ReadPropertyLong(dynamic o, int propertyindex)
|
||||
{
|
||||
long l = long.MinValue;
|
||||
try
|
||||
{
|
||||
l = long.Parse(o[propertyindex].ToString());
|
||||
}
|
||||
catch
|
||||
{
|
||||
// do nothing if something went wrong
|
||||
}
|
||||
return l;
|
||||
}
|
||||
|
||||
[System.Diagnostics.DebuggerNonUserCode]
|
||||
private bool ReadPropertyBool(dynamic o, int propertyindex)
|
||||
{
|
||||
bool b = false;
|
||||
try
|
||||
{
|
||||
string s = o[propertyindex].ToString();
|
||||
b = s.ToLower() == "true";
|
||||
}
|
||||
catch
|
||||
{
|
||||
// do nothing if something went wrong
|
||||
}
|
||||
return b;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static class UnitConverter
|
||||
{
|
||||
public static double ft_m(double feet)
|
||||
{
|
||||
return feet / 3.28084;
|
||||
}
|
||||
|
||||
public static double m_ft(double m)
|
||||
{
|
||||
return m * 3.28084;
|
||||
}
|
||||
|
||||
public static double kts_kmh(double kts)
|
||||
{
|
||||
return kts * 1.852;
|
||||
}
|
||||
|
||||
public static double kmh_kts(double kmh)
|
||||
{
|
||||
return kmh / 1.852;
|
||||
}
|
||||
|
||||
public static double ms_kts(double ms)
|
||||
{
|
||||
return ms * 3.6 / 1.852;
|
||||
}
|
||||
|
||||
public static double km_mi(double km)
|
||||
{
|
||||
return km * 1.609;
|
||||
}
|
||||
|
||||
public static double mi_km(double mi)
|
||||
{
|
||||
return mi / 1.609;
|
||||
}
|
||||
}
|
||||
|
||||
public class VarConverter : Dictionary<string, object>
|
||||
{
|
||||
public readonly char VarSeparator = '%';
|
||||
|
||||
public void AddVar(string var, object value)
|
||||
{
|
||||
// adds a new var<>value pair to dictionary
|
||||
object o;
|
||||
if (this.TryGetValue(var, out o))
|
||||
{
|
||||
// item found --> update value
|
||||
o = value;
|
||||
}
|
||||
else
|
||||
{
|
||||
// item not found --> add new
|
||||
this.Add(var, value);
|
||||
}
|
||||
}
|
||||
|
||||
public object GetValue(string var)
|
||||
{
|
||||
// finds a var in dictionary and returns its value
|
||||
object o;
|
||||
if (this.TryGetValue(var, out o))
|
||||
{
|
||||
// item found --> return value
|
||||
return o;
|
||||
}
|
||||
// item not found --> return null
|
||||
return null;
|
||||
}
|
||||
|
||||
public string ReplaceAllVars(string s)
|
||||
{
|
||||
// check for var separotors first
|
||||
if (s.Contains(VarSeparator))
|
||||
{
|
||||
// OK, string is containing vars --> crack the string first and replace vars
|
||||
try
|
||||
{
|
||||
string[] a = s.Split(VarSeparator);
|
||||
// as we are always using a pair of separators the length of a[] must be odd
|
||||
if (a.Length % 2 == 0)
|
||||
throw new ArgumentException("Number of separators is not an even number.");
|
||||
// create new string and replace all vars (on odd indices)
|
||||
s = "";
|
||||
for (int i = 0; i < a.Length; i++)
|
||||
{
|
||||
if (i % 2 == 0)
|
||||
{
|
||||
// cannot be not a var on that position
|
||||
s = s + a[i];
|
||||
}
|
||||
else
|
||||
{
|
||||
// var identifier: upper the string and try to convert
|
||||
a[i] = a[i].ToUpper();
|
||||
object o;
|
||||
if (this.TryGetValue(a[i], out o))
|
||||
{
|
||||
// convert floating points with invariant culture info
|
||||
if (o.GetType() == typeof(double))
|
||||
s = s + ((double)o).ToString(CultureInfo.InvariantCulture);
|
||||
else if (o.GetType() == typeof(float))
|
||||
s = s + ((float)o).ToString(CultureInfo.InvariantCulture);
|
||||
else
|
||||
s = s + o.ToString();
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new ArgumentException("Var identifier not found: " + a[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// throw an excecption
|
||||
throw new ArgumentException("Error while parsing string for variables [" + ex.Message + "]: " + s);
|
||||
}
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,36 @@
|
|||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
// Allgemeine Informationen über eine Assembly werden über die folgenden
|
||||
// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern,
|
||||
// die einer Assembly zugeordnet sind.
|
||||
[assembly: AssemblyTitle("AirScout.PlaneFeeds.Plugin.OpenSky")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("AirScout.PlaneFeeds.Plugin.OpenSky")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2020")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
// Durch Festlegen von ComVisible auf FALSE werden die Typen in dieser Assembly
|
||||
// für COM-Komponenten unsichtbar. Wenn Sie auf einen Typ in dieser Assembly von
|
||||
// COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen.
|
||||
[assembly: ComVisible(false)]
|
||||
|
||||
// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird
|
||||
[assembly: Guid("db85e98a-e209-49d0-b6cf-6cdd5b8e20e3")]
|
||||
|
||||
// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten:
|
||||
//
|
||||
// Hauptversion
|
||||
// Nebenversion
|
||||
// Buildnummer
|
||||
// Revision
|
||||
//
|
||||
// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden,
|
||||
// indem Sie "*" wie unten gezeigt eingeben:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("1.3.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.3.0.0")]
|
|
@ -0,0 +1,26 @@
|
|||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// Dieser Code wurde von einem Tool generiert.
|
||||
// Laufzeitversion:4.0.30319.42000
|
||||
//
|
||||
// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn
|
||||
// der Code erneut generiert wird.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace AirScout.PlaneFeeds.Plugin.OpenSky.Properties {
|
||||
|
||||
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.4.0.0")]
|
||||
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
|
||||
|
||||
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
|
||||
|
||||
public static Settings Default {
|
||||
get {
|
||||
return defaultInstance;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
|
||||
<Profiles />
|
||||
<Settings />
|
||||
</SettingsFile>
|
|
@ -0,0 +1,61 @@
|
|||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<configuration>
|
||||
<configSections>
|
||||
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
|
||||
<section name="AirScout.PlaneFeeds.Plugin.PlaneFinder.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
|
||||
</sectionGroup>
|
||||
</configSections>
|
||||
<userSettings>
|
||||
<AirScout.PlaneFeeds.Plugin.PlaneFinder.Properties.Settings>
|
||||
<setting name="Info" serializeAs="String">
|
||||
<value>Web feed from www.planefinder.net
|
||||
See https://planefinder.net/
|
||||
|
||||
(c) AirScout (www.airscout.eu)
|
||||
|
||||
This feed does not require a login or API key.
|
||||
</value>
|
||||
</setting>
|
||||
<setting name="Name" serializeAs="String">
|
||||
<value>[WebFeed] www.planefinder.net</value>
|
||||
</setting>
|
||||
<setting name="Disclaimer" serializeAs="String">
|
||||
<value>This plane feed is being fetched from an Internet server via Deep Link
|
||||
technology (see http://en.wikipedia.org/wiki/Deep_link).
|
||||
|
||||
The use is not intended by the website owners and could be changed in URL and data format frequently and without further notice.
|
||||
Furthermore, it might cause legal issues in some countries.
|
||||
|
||||
By clicking on "Accept" you understand that you are
|
||||
|
||||
DOING THAT ON YOUR OWN RISK
|
||||
|
||||
The auhor of this software will not be responsible in any case.</value>
|
||||
</setting>
|
||||
<setting name="Disclaimer_Accepted" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="URL" serializeAs="String">
|
||||
<value>http://droidapp.pinkfroot.com/APPAPIDROID/v7/planeUpdateFAA.php?routetype=IATA&amp;FAA=1&amp;bounds=%MAXLAT%,%MINLAT%,%MINLON%,%MAXLON%</value>
|
||||
</setting>
|
||||
<setting name="SaveToFile" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="Version" serializeAs="String">
|
||||
<value />
|
||||
</setting>
|
||||
<setting name="HasSettings" serializeAs="String">
|
||||
<value>True</value>
|
||||
</setting>
|
||||
<setting name="CanImport" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="CanExport" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="Timeout" serializeAs="String">
|
||||
<value>30</value>
|
||||
</setting>
|
||||
</AirScout.PlaneFeeds.Plugin.PlaneFinder.Properties.Settings>
|
||||
</userSettings>
|
||||
</configuration>
|
|
@ -0,0 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="ILMerge" version="3.0.29" targetFramework="net40" />
|
||||
<package id="ILMerge.MSBuild.Task" version="1.0.7" targetFramework="net40" />
|
||||
</packages>
|
|
@ -1,4 +1,4 @@
|
|||
using System;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
@ -35,7 +35,7 @@ namespace AirScout.PlaneFeeds.Plugin.PlaneFinder
|
|||
[Browsable(true)]
|
||||
[CategoryAttribute("Web Feed")]
|
||||
[DescriptionAttribute("Base URL for website.")]
|
||||
[DefaultValue("http://droidapp.pinkfroot.com/APPAPIDROID/v7/planeUpdateFAA.php?routetype=IATA&FAA=1&bounds=%MAXLAT%,%MINLAT%,%MINLON%,%MAXLON%")]
|
||||
[DefaultValue("http://droidapp.pinkfroot.com/APPAPIDROID/v7/planeUpdateFAA.php?routetype=IATA&FAA=1&bounds=%MAXLAT%,%MINLAT%,%MINLON%,%MAXLON%")]
|
||||
public string URL { get; set; }
|
||||
|
||||
[Browsable(true)]
|
||||
|
@ -310,9 +310,8 @@ namespace AirScout.PlaneFeeds.Plugin.PlaneFinder
|
|||
String url = VC.ReplaceAllVars(Settings.URL);
|
||||
Console.WriteLine("[" + this.GetType().Name + "]: Creating web request: " + url);
|
||||
HttpWebRequest webrequest = (HttpWebRequest)HttpWebRequest.Create(url);
|
||||
webrequest.Referer = "http://planefinder.net/";
|
||||
webrequest.Timeout = Settings.Timeout * 1000;
|
||||
webrequest.UserAgent = "Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130807 Firefox/17.0";
|
||||
webrequest.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:73.0) Gecko/20100101 Firefox/73.0";
|
||||
Console.WriteLine("[" + this.GetType().Name + "]: Getting web response");
|
||||
HttpWebResponse webresponse = (HttpWebResponse)webrequest.GetResponse();
|
||||
Console.WriteLine("[" + this.GetType().Name + "]: Reading stream");
|
||||
|
|
|
@ -5,11 +5,11 @@ using System.Runtime.InteropServices;
|
|||
// Allgemeine Informationen über eine Assembly werden über die folgenden
|
||||
// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern,
|
||||
// die einer Assembly zugeordnet sind.
|
||||
[assembly: AssemblyTitle("AirScout.PlaneFeeds.Plugin.PlaneFinder")]
|
||||
[assembly: AssemblyTitle("AirScout.PlaneFeeds.Plugin.Template")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("AirScout.PlaneFeeds.Plugin.PlaneFinder")]
|
||||
[assembly: AssemblyProduct("AirScout.PlaneFeeds.Plugin.Template")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2020")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
|
|
@ -77,7 +77,7 @@
|
|||
<Error Condition="!Exists('..\packages\ILMerge.MSBuild.Task.1.0.7\build\ILMerge.MSBuild.Task.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\ILMerge.MSBuild.Task.1.0.7\build\ILMerge.MSBuild.Task.targets'))" />
|
||||
</Target>
|
||||
<PropertyGroup>
|
||||
<PostBuildEvent>copy $(OutDir)\ILMerge\*.$(TargetExt) $(OutDir) /Y</PostBuildEvent>
|
||||
<PostBuildEvent>copy $(ProjectDir)\$(OutDir)\ILMerge\*$(TargetExt) $(SolutionDir)\Airscout\$(OutDir) /y</PostBuildEvent>
|
||||
</PropertyGroup>
|
||||
<Import Project="..\packages\ILMerge.MSBuild.Task.1.0.7\build\ILMerge.MSBuild.Task.targets" Condition="Exists('..\packages\ILMerge.MSBuild.Task.1.0.7\build\ILMerge.MSBuild.Task.targets')" />
|
||||
</Project>
|
41
AirScout.sln
41
AirScout.sln
|
@ -73,8 +73,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AirScout.PlaneFeeds.Plugin.
|
|||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AirScout.PlaneFeeds", "AirScout.PlaneFeeds\AirScout.PlaneFeeds.csproj", "{EA78AD40-1505-406F-8049-744E58D93F54}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AirScout.PlaneFeeds.Plugin.PlaneFinder", "AirScout.PlaneFeeds.Plugin.PlaneFinder\AirScout.PlaneFeeds.Plugin.PlaneFinder.csproj", "{DB85E98A-E209-49D0-B6CF-6CDD5B8E20E3}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AirScout.PlaneFeeds.Plugin.RTL1090", "AirScout.PlaneFeeds.Plugin.RTL1090\AirScout.PlaneFeeds.Plugin.RTL1090.csproj", "{4225D870-2CCB-4E6A-965C-AA005CB1C36C}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AirScout.PlaneFeeds.Plugin.FlexJSON", "AirScout.PlaneFeeds.Plugin.FlexJSON\AirScout.PlaneFeeds.Plugin.FlexJSON.csproj", "{F1689770-0F8F-4716-B0FF-817D1319827E}"
|
||||
|
@ -85,6 +83,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AirScout.PlaneFeeds.Plugin.
|
|||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AirScout_Cleanup", "AirScout_Cleanup\AirScout_Cleanup.csproj", "{4DDDB65C-0E40-4A69-8775-5B4152C3196D}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AirScout.PlaneFeeds.Plugin.OpenSky", "AirScout.PlaneFeeds.Plugin.OpenSky\AirScout.PlaneFeeds.Plugin.OpenSky.csproj", "{23F584DB-EB5E-452D-B49F-7C1CABB713FF}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AirScout.PlaneFeeds.Plugin.PlaneFinder", "AirScout.PlaneFeeds.Plugin.PlaneFinder\AirScout.PlaneFeeds.Plugin.PlaneFinder.csproj", "{DB85E98A-E209-49D0-B6CF-6CDD5B8E20E3}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
|
@ -491,17 +493,6 @@ Global
|
|||
{EA78AD40-1505-406F-8049-744E58D93F54}.Release|Mixed Platforms.Build.0 = Release|x86
|
||||
{EA78AD40-1505-406F-8049-744E58D93F54}.Release|x86.ActiveCfg = Release|x86
|
||||
{EA78AD40-1505-406F-8049-744E58D93F54}.Release|x86.Build.0 = Release|x86
|
||||
{DB85E98A-E209-49D0-B6CF-6CDD5B8E20E3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{DB85E98A-E209-49D0-B6CF-6CDD5B8E20E3}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{DB85E98A-E209-49D0-B6CF-6CDD5B8E20E3}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||
{DB85E98A-E209-49D0-B6CF-6CDD5B8E20E3}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
||||
{DB85E98A-E209-49D0-B6CF-6CDD5B8E20E3}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{DB85E98A-E209-49D0-B6CF-6CDD5B8E20E3}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{DB85E98A-E209-49D0-B6CF-6CDD5B8E20E3}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{DB85E98A-E209-49D0-B6CF-6CDD5B8E20E3}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||
{DB85E98A-E209-49D0-B6CF-6CDD5B8E20E3}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||
{DB85E98A-E209-49D0-B6CF-6CDD5B8E20E3}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{DB85E98A-E209-49D0-B6CF-6CDD5B8E20E3}.Release|x86.Build.0 = Release|Any CPU
|
||||
{4225D870-2CCB-4E6A-965C-AA005CB1C36C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{4225D870-2CCB-4E6A-965C-AA005CB1C36C}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{4225D870-2CCB-4E6A-965C-AA005CB1C36C}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||
|
@ -558,6 +549,30 @@ Global
|
|||
{4DDDB65C-0E40-4A69-8775-5B4152C3196D}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||
{4DDDB65C-0E40-4A69-8775-5B4152C3196D}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{4DDDB65C-0E40-4A69-8775-5B4152C3196D}.Release|x86.Build.0 = Release|Any CPU
|
||||
{23F584DB-EB5E-452D-B49F-7C1CABB713FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{23F584DB-EB5E-452D-B49F-7C1CABB713FF}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{23F584DB-EB5E-452D-B49F-7C1CABB713FF}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||
{23F584DB-EB5E-452D-B49F-7C1CABB713FF}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
||||
{23F584DB-EB5E-452D-B49F-7C1CABB713FF}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{23F584DB-EB5E-452D-B49F-7C1CABB713FF}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{23F584DB-EB5E-452D-B49F-7C1CABB713FF}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{23F584DB-EB5E-452D-B49F-7C1CABB713FF}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{23F584DB-EB5E-452D-B49F-7C1CABB713FF}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||
{23F584DB-EB5E-452D-B49F-7C1CABB713FF}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||
{23F584DB-EB5E-452D-B49F-7C1CABB713FF}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{23F584DB-EB5E-452D-B49F-7C1CABB713FF}.Release|x86.Build.0 = Release|Any CPU
|
||||
{DB85E98A-E209-49D0-B6CF-6CDD5B8E20E3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{DB85E98A-E209-49D0-B6CF-6CDD5B8E20E3}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{DB85E98A-E209-49D0-B6CF-6CDD5B8E20E3}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||
{DB85E98A-E209-49D0-B6CF-6CDD5B8E20E3}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
||||
{DB85E98A-E209-49D0-B6CF-6CDD5B8E20E3}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{DB85E98A-E209-49D0-B6CF-6CDD5B8E20E3}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{DB85E98A-E209-49D0-B6CF-6CDD5B8E20E3}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{DB85E98A-E209-49D0-B6CF-6CDD5B8E20E3}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{DB85E98A-E209-49D0-B6CF-6CDD5B8E20E3}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||
{DB85E98A-E209-49D0-B6CF-6CDD5B8E20E3}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||
{DB85E98A-E209-49D0-B6CF-6CDD5B8E20E3}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{DB85E98A-E209-49D0-B6CF-6CDD5B8E20E3}.Release|x86.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
|
|
@ -277,6 +277,7 @@
|
|||
<Compile Include="Splash.Designer.cs">
|
||||
<DependentUpon>Splash.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="TooltipDataPoint.cs" />
|
||||
<Compile Include="TrafficDlg.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
|
|
|
@ -49,6 +49,7 @@ namespace AirScout
|
|||
|
||||
private void FirstRunWizard_Load(object sender, EventArgs e)
|
||||
{
|
||||
this.Text = "Welcome to AirScout - Aircraft Scatter Prediction V" + Application.ProductVersion + " (c) 2013-2020 DL2ALF";
|
||||
Log.WriteMessage("Loading.");
|
||||
// set initial settings for CoverageMap
|
||||
GMap.NET.MapProviders.GMapProvider.UserAgent = "AirScout";
|
||||
|
@ -341,16 +342,19 @@ namespace AirScout
|
|||
// estimate disk space needed = tilecount * tilesize * 150%
|
||||
long spaceneeded = (long)tilecount * (long)(250 * 3 / 2);
|
||||
string rootdrive = Path.GetPathRoot(ElevationData.Database.DefaultDatabaseDirectory(ELEVATIONMODEL.GLOBE));
|
||||
if (SupportFunctions.GetDriveAvailableFreeSpace(rootdrive) < spaceneeded)
|
||||
long spaceavailable = SupportFunctions.GetDriveAvailableFreeSpace(rootdrive);
|
||||
// check for available disk space, skip on zero (cannot determine)
|
||||
if ((spaceavailable > 0) && (spaceavailable < spaceneeded))
|
||||
{
|
||||
// show message box
|
||||
MessageBox.Show("Not enough disk space for elevation database.\n\nAvailable: " + SupportFunctions.GetDriveAvailableFreeSpace(rootdrive) + " bytes.\nNeeded: " + spaceneeded + "bytes.\n\nUncheck this option or try to enlarge free space on disk.", "Not enough disk space");
|
||||
MessageBox.Show("Not enough disk space for elevation database.\n\nAvailable: " + spaceavailable + " bytes.\nNeeded: " + spaceneeded + "bytes.\n\nUncheck this option or try to enlarge free space on disk.", "Not enough disk space");
|
||||
wp_GLOBE.AllowNext = false;
|
||||
}
|
||||
if (SupportFunctions.GetDriveMaxFileSize(rootdrive) < spaceneeded)
|
||||
long maxfilesize = SupportFunctions.GetDriveMaxFileSize(rootdrive);
|
||||
if ((maxfilesize > 0) && (maxfilesize < spaceneeded))
|
||||
{
|
||||
// show message box
|
||||
MessageBox.Show("The elevation database will exceed maximum allowed filesize for this file system.\n\nAllowed: " + SupportFunctions.GetDriveMaxFileSize(rootdrive) + " bytes.\nNeeded: " + spaceneeded + "bytes.\n\nUncheck this option or change file system on disk.", "File size exceeded");
|
||||
MessageBox.Show("The elevation database will exceed maximum allowed filesize for this file system.\n\nAllowed: " + maxfilesize + " bytes.\nNeeded: " + spaceneeded + "bytes.\n\nUncheck this option or change file system on disk.", "File size exceeded");
|
||||
wp_GLOBE.AllowNext = false;
|
||||
}
|
||||
}
|
||||
|
@ -491,16 +495,19 @@ namespace AirScout
|
|||
// estimate disk space needed = tilecount * tilesize * 150%
|
||||
long spaceneeded = (long)tilecount * (long)(10000 * 3 / 2);
|
||||
string rootdrive = Path.GetPathRoot(ElevationData.Database.DefaultDatabaseDirectory(ELEVATIONMODEL.SRTM3));
|
||||
if (SupportFunctions.GetDriveAvailableFreeSpace(rootdrive) < spaceneeded)
|
||||
long spaceavailable = SupportFunctions.GetDriveAvailableFreeSpace(rootdrive);
|
||||
// check for available disk space, skip on zero (cannot determine)
|
||||
if ((spaceavailable > 0) && (spaceavailable < spaceneeded))
|
||||
{
|
||||
// show message box
|
||||
MessageBox.Show("Not enough disk space for elevation database.\n\nAvailable: " + SupportFunctions.GetDriveAvailableFreeSpace(rootdrive) + " bytes.\nNeeded: " + spaceneeded + "bytes.\n\nUncheck this option or try to enlarge free space on disk.", "Not enough disk space");
|
||||
MessageBox.Show("Not enough disk space for elevation database.\n\nAvailable: " + spaceavailable + " bytes.\nNeeded: " + spaceneeded + "bytes.\n\nUncheck this option or try to enlarge free space on disk.", "Not enough disk space");
|
||||
wp_SRTM3.AllowNext = false;
|
||||
}
|
||||
if (SupportFunctions.GetDriveMaxFileSize(rootdrive) < spaceneeded)
|
||||
long maxfilesize = SupportFunctions.GetDriveMaxFileSize(rootdrive);
|
||||
if ((maxfilesize > 0) && (maxfilesize < spaceneeded))
|
||||
{
|
||||
// show message box
|
||||
MessageBox.Show("The elevation database will exceed maximum allowed filesize for this file system.\n\nAllowed: " + SupportFunctions.GetDriveMaxFileSize(rootdrive) + " bytes.\nNeeded: " + spaceneeded + "bytes.\n\nUncheck this option or change file system on disk.", "File size exceeded");
|
||||
MessageBox.Show("The elevation database will exceed maximum allowed filesize for this file system.\n\nAllowed: " + maxfilesize + " bytes.\nNeeded: " + spaceneeded + "bytes.\n\nUncheck this option or change file system on disk.", "File size exceeded");
|
||||
wp_SRTM3.AllowNext = false;
|
||||
}
|
||||
}
|
||||
|
@ -636,16 +643,19 @@ namespace AirScout
|
|||
// estimate disk space needed = tilecount * tilesize * 150%
|
||||
long spaceneeded = (long)tilecount * (long)(100000 * 3 / 2);
|
||||
string rootdrive = Path.GetPathRoot(ElevationData.Database.DefaultDatabaseDirectory(ELEVATIONMODEL.SRTM1));
|
||||
if (SupportFunctions.GetDriveAvailableFreeSpace(rootdrive) < spaceneeded)
|
||||
long spaceavailable = SupportFunctions.GetDriveAvailableFreeSpace(rootdrive);
|
||||
// check for available disk space, skip on zero (cannot determine)
|
||||
if ((spaceavailable > 0) && (spaceavailable < spaceneeded))
|
||||
{
|
||||
// show message box
|
||||
MessageBox.Show("Not enough disk space for elevation database.\n\nAvailable: " + SupportFunctions.GetDriveAvailableFreeSpace(rootdrive) + " bytes.\nNeeded: " + spaceneeded + "bytes.\n\nUncheck this option or try to enlarge free space on disk.", "Not enough disk space");
|
||||
MessageBox.Show("Not enough disk space for elevation database.\n\nAvailable: " + spaceavailable + " bytes.\nNeeded: " + spaceneeded + "bytes.\n\nUncheck this option or try to enlarge free space on disk.", "Not enough disk space");
|
||||
wp_SRTM1.AllowNext = false;
|
||||
}
|
||||
if (SupportFunctions.GetDriveMaxFileSize(rootdrive) < spaceneeded)
|
||||
long maxfilesize = SupportFunctions.GetDriveMaxFileSize(rootdrive);
|
||||
if ((maxfilesize > 0) && (maxfilesize < spaceneeded))
|
||||
{
|
||||
// show message box
|
||||
MessageBox.Show("The elevation database will exceed maximum allowed filesize for this file system.\n\nAllowed: " + SupportFunctions.GetDriveMaxFileSize(rootdrive) + " bytes.\nNeeded: " + spaceneeded + "bytes.\n\nUncheck this option or change file system on disk.", "File size exceeded");
|
||||
MessageBox.Show("The elevation database will exceed maximum allowed filesize for this file system.\n\nAllowed: " + maxfilesize + " bytes.\nNeeded: " + spaceneeded + "bytes.\n\nUncheck this option or change file system on disk.", "File size exceeded");
|
||||
wp_SRTM1.AllowNext = false;
|
||||
}
|
||||
}
|
||||
|
@ -770,7 +780,7 @@ namespace AirScout
|
|||
}
|
||||
if (GeographicalPoint.Check(tb_Latitude.Value, tb_Longitude.Value))
|
||||
{
|
||||
// update locator text if not focusd
|
||||
// update locator text if not focused
|
||||
if (!tb_Locator.Focused)
|
||||
{
|
||||
tb_Locator.SilentText = MaidenheadLocator.LocFromLatLon(tb_Latitude.Value, tb_Longitude.Value, Properties.Settings.Default.Locator_SmallLettersForSubsquares, (int)Properties.Settings.Default.Locator_MaxLength / 2, true);
|
||||
|
@ -813,12 +823,15 @@ namespace AirScout
|
|||
}
|
||||
}
|
||||
// check all values and enable/disable next button
|
||||
if (Callsign.Check(tb_Callsign.Text) && MaidenheadLocator.Check(tb_Locator.Text) && !double.IsNaN(tb_Latitude.Value) && !double.IsNaN(tb_Longitude.Value))
|
||||
{
|
||||
// save settings
|
||||
// save settings
|
||||
if (Callsign.Check(tb_Callsign.Text))
|
||||
Properties.Settings.Default.MyCall = tb_Callsign.Text;
|
||||
if (!double.IsNaN(tb_Latitude.Value))
|
||||
Properties.Settings.Default.MyLat = tb_Latitude.Value;
|
||||
if (!double.IsNaN(tb_Longitude.Value))
|
||||
Properties.Settings.Default.MyLon = tb_Longitude.Value;
|
||||
if (Callsign.Check(tb_Callsign.Text) && MaidenheadLocator.Check(tb_Locator.Text) && !double.IsNaN(tb_Longitude.Value) && !double.IsNaN(tb_Longitude.Value))
|
||||
{
|
||||
// StationData.Database.LocationInsertOrUpdateIfNewer(new LocationDesignator(tb_Callsign.Text, tb_Latitude.Value, tb_Longitude.Value, (MaidenheadLocator.IsPrecise(tb_Latitude.Value, tb_Longitude.Value, 3) ? GEOSOURCE.FROMUSER : GEOSOURCE.FROMLOC)));
|
||||
wp_UserDetails.AllowNext = true;
|
||||
return true;
|
||||
|
@ -844,6 +857,10 @@ namespace AirScout
|
|||
}
|
||||
else
|
||||
{
|
||||
// clear properties
|
||||
Properties.Settings.Default.MyLat = double.NaN;
|
||||
Properties.Settings.Default.MyLon = double.NaN;
|
||||
|
||||
tb_Latitude.SilentValue = double.NaN;
|
||||
tb_Longitude.SilentValue = double.NaN;
|
||||
tb_Locator.SilentText = "";
|
||||
|
|
|
@ -260,6 +260,7 @@
|
|||
this.tc_Map.SelectedIndex = 0;
|
||||
this.tc_Map.Size = new System.Drawing.Size(852, 341);
|
||||
this.tc_Map.TabIndex = 14;
|
||||
this.tc_Map.Selecting += new System.Windows.Forms.TabControlCancelEventHandler(this.tc_Map_Selecting);
|
||||
//
|
||||
// tp_Map
|
||||
//
|
||||
|
@ -375,6 +376,7 @@
|
|||
this.tc_Main.TabIndex = 0;
|
||||
this.tc_Main.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.tc_Main_DrawItem);
|
||||
this.tc_Main.SelectedIndexChanged += new System.EventHandler(this.tc_Main_SelectedIndexChanged);
|
||||
this.tc_Main.Selecting += new System.Windows.Forms.TabControlCancelEventHandler(this.tc_Main_Selecting);
|
||||
//
|
||||
// tp_Elevation
|
||||
//
|
||||
|
@ -1408,11 +1410,6 @@
|
|||
this.cb_Planes_Filter_Min_Cat.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
||||
this.cb_Planes_Filter_Min_Cat.Font = new System.Drawing.Font("Courier New", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.cb_Planes_Filter_Min_Cat.FormattingEnabled = true;
|
||||
this.cb_Planes_Filter_Min_Cat.Items.AddRange(new object[] {
|
||||
"Light",
|
||||
"Medium",
|
||||
"Heavy",
|
||||
"Super"});
|
||||
this.cb_Planes_Filter_Min_Cat.Location = new System.Drawing.Point(59, 60);
|
||||
this.cb_Planes_Filter_Min_Cat.Name = "cb_Planes_Filter_Min_Cat";
|
||||
this.cb_Planes_Filter_Min_Cat.Size = new System.Drawing.Size(77, 24);
|
||||
|
@ -1519,6 +1516,7 @@
|
|||
this.tc_Control.Size = new System.Drawing.Size(152, 404);
|
||||
this.tc_Control.TabIndex = 60;
|
||||
this.tc_Control.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.tc_Control_DrawItem);
|
||||
this.tc_Control.Selecting += new System.Windows.Forms.TabControlCancelEventHandler(this.tc_Control_Selecting);
|
||||
//
|
||||
// tp_Control_Single
|
||||
//
|
||||
|
@ -1738,8 +1736,10 @@
|
|||
this.lv_Control_Watchlist.DrawColumnHeader += new System.Windows.Forms.DrawListViewColumnHeaderEventHandler(this.lv_Control_Watchlist_DrawColumnHeader);
|
||||
this.lv_Control_Watchlist.DrawItem += new System.Windows.Forms.DrawListViewItemEventHandler(this.lv_Control_Watchlist_DrawItem);
|
||||
this.lv_Control_Watchlist.DrawSubItem += new System.Windows.Forms.DrawListViewSubItemEventHandler(this.lv_Control_Watchlist_DrawSubItem);
|
||||
this.lv_Control_Watchlist.ItemCheck += new System.Windows.Forms.ItemCheckEventHandler(this.lv_Control_Watchlist_ItemCheck);
|
||||
this.lv_Control_Watchlist.ItemChecked += new System.Windows.Forms.ItemCheckedEventHandler(this.lv_Control_Watchlist_ItemChecked);
|
||||
this.lv_Control_Watchlist.ItemMouseHover += new System.Windows.Forms.ListViewItemMouseHoverEventHandler(this.lv_Control_Watchlist_ItemMouseHover);
|
||||
this.lv_Control_Watchlist.SelectedIndexChanged += new System.EventHandler(this.lv_Control_Watchlist_SelectedIndexChanged);
|
||||
this.lv_Control_Watchlist.MouseMove += new System.Windows.Forms.MouseEventHandler(this.lv_Control_Watchlist_MouseMove);
|
||||
this.lv_Control_Watchlist.Resize += new System.EventHandler(this.lv_Control_Watchlist_Resize);
|
||||
//
|
||||
|
|
|
@ -71,6 +71,7 @@ using OxyPlot.Series;
|
|||
using OxyPlot.Axes;
|
||||
using System.Data.SQLite;
|
||||
using DeviceId;
|
||||
using AirScout.Properties;
|
||||
using AirScout.Core;
|
||||
using AirScout.Aircrafts;
|
||||
using AirScout.PlaneFeeds;
|
||||
|
@ -276,6 +277,7 @@ namespace AirScout
|
|||
sc_Main.SplitterDistance = value;
|
||||
else
|
||||
sc_Main.SplitterDistance = this.Width - gb_Map_Info_DefaultWidth;
|
||||
Console.WriteLine("Setting MainSplitterDistance: " + this.Width + "--->" + sc_Main.SplitterDistance);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -294,6 +296,7 @@ namespace AirScout
|
|||
sc_Map.SplitterDistance = value;
|
||||
else
|
||||
sc_Map.SplitterDistance = this.Height - tc_Main_DefaultHeight;
|
||||
Console.WriteLine("Setting MapSplitterDistance: " + this.Height + "--->" + sc_Map.SplitterDistance);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -310,9 +313,6 @@ namespace AirScout
|
|||
|
||||
DateTime CurrentTime = DateTime.UtcNow;
|
||||
|
||||
public bool ForceClose = false;
|
||||
|
||||
|
||||
// FlightRadar
|
||||
PlaneInfoCache Planes = new PlaneInfoCache();
|
||||
SortedList<string, PlaneInfo> ActivePlanes = new SortedList<string, PlaneInfo>();
|
||||
|
@ -993,7 +993,13 @@ namespace AirScout
|
|||
SplashDlg.Show();
|
||||
// bring window to front
|
||||
SplashDlg.BringToFront();
|
||||
Application.DoEvents();
|
||||
// wait for splash window is fully visible
|
||||
while (SplashDlg.Opacity < 1)
|
||||
{
|
||||
Application.DoEvents();
|
||||
}
|
||||
// show AirScout main window
|
||||
this.BringToFront();
|
||||
// Check directories, complete it and create, if not exist
|
||||
SplashDlg.Status("Checking directories...");
|
||||
CheckDirectories();
|
||||
|
@ -1322,15 +1328,6 @@ namespace AirScout
|
|||
MessageBox.Show("An error occured during startup: " + ex.ToString() + "\n\nPress >OK< to close the application.", "AirScout", MessageBoxButtons.OK);
|
||||
this.Close();
|
||||
}
|
||||
}
|
||||
|
||||
private void FinishStartup()
|
||||
{
|
||||
// finish startup
|
||||
// close splash window
|
||||
// set window layout
|
||||
if (SplashDlg != null)
|
||||
SplashDlg.Close();
|
||||
// restore window size, state and location
|
||||
try
|
||||
{
|
||||
|
@ -1356,6 +1353,15 @@ namespace AirScout
|
|||
Properties.Settings.Default.MainSplitter_Distance = -1;
|
||||
Properties.Settings.Default.MapSplitter_Distance = -1;
|
||||
}
|
||||
}
|
||||
|
||||
private void FinishStartup()
|
||||
{
|
||||
// finish startup
|
||||
// close splash window
|
||||
// set window layout
|
||||
if (SplashDlg != null)
|
||||
SplashDlg.Close();
|
||||
// restore splitter positions
|
||||
try
|
||||
{
|
||||
|
@ -1367,8 +1373,8 @@ namespace AirScout
|
|||
else
|
||||
{
|
||||
// ignore window settings under Linux/Mono and always use default values
|
||||
sc_Map.SplitterDistance = -1;
|
||||
sc_Main.SplitterDistance = -1;
|
||||
MapSplitterDistance = -1;
|
||||
MainSplitterDistance = -1;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
|
@ -1990,7 +1996,6 @@ namespace AirScout
|
|||
|
||||
private void UpdateAirports()
|
||||
{
|
||||
/*
|
||||
if (!Properties.Settings.Default.Airports_Activate)
|
||||
return;
|
||||
if ((Airports == null) || (Airports.Count == 0))
|
||||
|
@ -2011,8 +2016,7 @@ namespace AirScout
|
|||
Log.WriteMessage(ex.ToString(), LogLevel.Error);
|
||||
}
|
||||
}
|
||||
// gm_Main.Refresh();
|
||||
*/
|
||||
gm_Main.Refresh();
|
||||
}
|
||||
|
||||
private void ti_Startup_Tick(object sender, EventArgs e)
|
||||
|
@ -2193,11 +2197,6 @@ namespace AirScout
|
|||
|
||||
private void OnIdle(object sender, EventArgs args)
|
||||
{
|
||||
// close window if disagreed
|
||||
if (ForceClose)
|
||||
{
|
||||
Application.Exit();
|
||||
}
|
||||
// enable/disable watchlist button
|
||||
if (btn_Control_Manage_Watchlist.Enabled == Properties.Settings.Default.Watchlist_SyncWithKST)
|
||||
btn_Control_Manage_Watchlist.Enabled = !Properties.Settings.Default.Watchlist_SyncWithKST;
|
||||
|
@ -2900,7 +2899,7 @@ namespace AirScout
|
|||
#region Play & Pause
|
||||
|
||||
private void Play()
|
||||
{
|
||||
{
|
||||
PlayMode = AIRSCOUTPLAYMODE.FORWARD;
|
||||
// switch tab control according to path mode
|
||||
if (PathMode == AIRSCOUTPATHMODE.SINGLE)
|
||||
|
@ -2909,6 +2908,8 @@ namespace AirScout
|
|||
tc_Control.SelectedTab = tp_Control_Multi;
|
||||
// update tab control
|
||||
tc_Control.Refresh();
|
||||
// refresh watch list
|
||||
RefreshWatchlistView();
|
||||
// update all current paths
|
||||
UpdatePaths();
|
||||
// clear spectrum
|
||||
|
@ -2932,13 +2933,11 @@ namespace AirScout
|
|||
cb_MyLoc.Enabled = false;
|
||||
cb_DXCall.Enabled = false;
|
||||
cb_DXLoc.Enabled = false;
|
||||
tc_Control.Enabled = false;
|
||||
// tc_Control.Enabled = false;
|
||||
pa_Planes_Filter.Enabled = false;
|
||||
gb_Analysis_Controls.Enabled = false;
|
||||
gb_Analysis_Database.Enabled = false;
|
||||
gb_Analysis_Player.Enabled = false;
|
||||
tc_Main.Enabled = false;
|
||||
// tc_Map.Enabled = false;
|
||||
//referesh main window
|
||||
this.Refresh();
|
||||
}
|
||||
|
@ -3686,6 +3685,8 @@ namespace AirScout
|
|||
if ((ActivePlanes == null) || (ActivePlanes.Count == 0))
|
||||
return;
|
||||
bool anyselected = false;
|
||||
List<TooltipDataPoint> planes_hi = new List<TooltipDataPoint>();
|
||||
List<TooltipDataPoint> planes_lo = new List<TooltipDataPoint>();
|
||||
// draw all planes
|
||||
foreach (PlaneInfo plane in ActivePlanes.Values)
|
||||
{
|
||||
|
@ -3725,8 +3726,10 @@ namespace AirScout
|
|||
break;
|
||||
}
|
||||
|
||||
// count the planes drawed and update caption
|
||||
tp_Map.Text = "Map [" + gmo_Planes.Markers.Count.ToString() + " plane(s)]";
|
||||
// count the planes drawed and update caption, if not under Linux
|
||||
// Linux/Mono is drawing the whole control again --> performance issue!
|
||||
if (!SupportFunctions.IsMono)
|
||||
tp_Map.Text = "Map [" + gmo_Planes.Markers.Count.ToString() + " plane(s)]";
|
||||
// if selected: draw the thin path to crossing point if one
|
||||
if (isselected)
|
||||
{
|
||||
|
@ -3767,6 +3770,7 @@ namespace AirScout
|
|||
// calculate distance from mylat/mylon
|
||||
double dist = LatLon.Distance(Properties.Settings.Default.MyLat, Properties.Settings.Default.MyLon, plane.IntPoint.Lat, plane.IntPoint.Lon);
|
||||
// add new data points
|
||||
/*
|
||||
if (plane.AltDiff > 0)
|
||||
{
|
||||
Planes_Hi.Points.Add(new DataPoint(dist, plane.Alt_m));
|
||||
|
@ -3775,10 +3779,29 @@ namespace AirScout
|
|||
{
|
||||
Planes_Lo.Points.Add(new DataPoint(dist, plane.Alt_m));
|
||||
}
|
||||
*/
|
||||
|
||||
TooltipDataPoint p = new TooltipDataPoint(dist, plane.Alt_m,plane.Call);
|
||||
if (plane.AltDiff > 0)
|
||||
{
|
||||
planes_hi.Add(p);
|
||||
}
|
||||
else
|
||||
{
|
||||
planes_lo.Add(p);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// add planes to chart
|
||||
Planes_Hi.ItemsSource = planes_hi;
|
||||
Planes_Lo.ItemsSource = planes_lo;
|
||||
|
||||
// change tracker display
|
||||
Planes_Hi.TrackerFormatString = "{Tooltip}";
|
||||
Planes_Lo.TrackerFormatString = "{Tooltip}";
|
||||
|
||||
// invalidate chart
|
||||
pm_Path.InvalidatePlot(true);
|
||||
|
||||
|
@ -3919,6 +3942,7 @@ namespace AirScout
|
|||
// clear data points in chart
|
||||
Planes_Hi.Points.Clear();
|
||||
Planes_Lo.Points.Clear();
|
||||
pm_Path.Annotations.Clear();
|
||||
|
||||
// draw planes
|
||||
DrawPlanes();
|
||||
|
@ -3994,7 +4018,10 @@ namespace AirScout
|
|||
int topItemIndex = 0;
|
||||
try
|
||||
{
|
||||
topItemIndex = lv_Control_Watchlist.TopItem.Index;
|
||||
if (PlayMode != AIRSCOUTPLAYMODE.FORWARD)
|
||||
{
|
||||
topItemIndex = lv_Control_Watchlist.TopItem.Index;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
@ -4049,6 +4076,9 @@ namespace AirScout
|
|||
|
||||
private void ti_Progress_Tick(object sender, EventArgs e)
|
||||
{
|
||||
// prevent timer tick from overflow when heavy loaded
|
||||
// stop timer --> do update procedure --> start timer again
|
||||
ti_Progress.Stop();
|
||||
if (LifeMode == AIRSCOUTLIFEMODE.LIFE)
|
||||
{
|
||||
if (PlayMode == AIRSCOUTPLAYMODE.FORWARD)
|
||||
|
@ -4078,6 +4108,8 @@ namespace AirScout
|
|||
UpdatePlanes();
|
||||
}
|
||||
}
|
||||
// restart timer
|
||||
ti_Progress.Start();
|
||||
}
|
||||
|
||||
private void sc_Main_SplitterMoved(object sender, SplitterEventArgs e)
|
||||
|
@ -4321,6 +4353,8 @@ namespace AirScout
|
|||
PathMode = AIRSCOUTPATHMODE.SINGLE;
|
||||
tc_Map.SelectedTab = tp_Map;
|
||||
}
|
||||
// update all info
|
||||
UpdateStatus();
|
||||
}
|
||||
|
||||
private void gb_Map_Info_MouseClick(object sender, MouseEventArgs e)
|
||||
|
@ -4606,13 +4640,21 @@ namespace AirScout
|
|||
PathMode = AIRSCOUTPATHMODE.MULTI;
|
||||
tc_Map.SelectedTab = tp_Map;
|
||||
}
|
||||
tp_Control_Multi.Refresh();
|
||||
}
|
||||
|
||||
private void lv_Control_Watchlist_Resize(object sender, EventArgs e)
|
||||
{
|
||||
// list view resized
|
||||
// resize locator column to fit the client size
|
||||
lv_Control_Watchlist.Columns[1].Width = lv_Control_Watchlist.ClientSize.Width - lv_Control_Watchlist.Columns[0].Width;
|
||||
try
|
||||
{
|
||||
lv_Control_Watchlist.Columns[1].Width = lv_Control_Watchlist.ClientSize.Width - lv_Control_Watchlist.Columns[0].Width;
|
||||
}
|
||||
catch
|
||||
{
|
||||
// do nothing, if resize fails
|
||||
}
|
||||
}
|
||||
|
||||
private void lv_Control_Watchlist_ColumnWidthChanged(object sender, ColumnWidthChangedEventArgs e)
|
||||
|
@ -4622,10 +4664,24 @@ namespace AirScout
|
|||
{
|
||||
// call sign column changed
|
||||
// resize locator column to fit the client size
|
||||
lv_Control_Watchlist.Columns[1].Width = lv_Control_Watchlist.ClientSize.Width - lv_Control_Watchlist.Columns[0].Width;
|
||||
try
|
||||
{
|
||||
lv_Control_Watchlist.Columns[1].Width = lv_Control_Watchlist.ClientSize.Width - lv_Control_Watchlist.Columns[0].Width;
|
||||
}
|
||||
catch
|
||||
{
|
||||
// do nothing, if resize fails
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void lv_Control_Watchlist_ItemCheck(object sender, ItemCheckEventArgs e)
|
||||
{
|
||||
// ignore when in PLAY mode
|
||||
if (!WatchlistUpdating && (PlayMode == AIRSCOUTPLAYMODE.FORWARD))
|
||||
e.NewValue = e.CurrentValue;
|
||||
}
|
||||
|
||||
private void lv_Control_Watchlist_ItemChecked(object sender, ItemCheckedEventArgs e)
|
||||
{
|
||||
// ignore event while populating list view
|
||||
|
@ -4659,6 +4715,9 @@ namespace AirScout
|
|||
|
||||
private void lv_Control_Watchlist_ColumnClick(object sender, ColumnClickEventArgs e)
|
||||
{
|
||||
// ignore when in PLAY mode
|
||||
if (PlayMode == AIRSCOUTPLAYMODE.FORWARD)
|
||||
return;
|
||||
WatchlistAllCheckedChanging = true;
|
||||
if (!WatchlistAllChecked)
|
||||
{
|
||||
|
@ -4720,14 +4779,13 @@ namespace AirScout
|
|||
{
|
||||
e.Item.BackColor = bkcolor;
|
||||
}
|
||||
e.DrawBackground();
|
||||
}
|
||||
else
|
||||
{
|
||||
e.Item.BackColor = Color.White;
|
||||
e.DrawDefault = true;
|
||||
}
|
||||
}
|
||||
e.DrawDefault = true;
|
||||
}
|
||||
|
||||
|
||||
|
@ -4736,40 +4794,73 @@ namespace AirScout
|
|||
e.DrawDefault = true;
|
||||
}
|
||||
|
||||
private void btn_Control_Manage_Watchlist_Click(object sender, EventArgs e)
|
||||
private void lv_Control_Watchlist_SelectedIndexChanged(object sender, EventArgs e)
|
||||
{
|
||||
// synchronize station in SINGLE mode when selection changed in MULTI mode
|
||||
try
|
||||
{
|
||||
if ((lv_Control_Watchlist.SelectedItems != null) && (lv_Control_Watchlist.SelectedItems.Count == 1))
|
||||
{
|
||||
string call = lv_Control_Watchlist.SelectedItems[0].Text;
|
||||
string loc = lv_Control_Watchlist.SelectedItems[0].SubItems[1].Text;
|
||||
double lat = MaidenheadLocator.LatFromLoc(loc);
|
||||
double lon = MaidenheadLocator.LonFromLoc(loc);
|
||||
LocationDesignator ld = StationData.Database.LocationFind(call, loc);
|
||||
if (ld != null)
|
||||
{
|
||||
// update lat/lon from database if found
|
||||
lat = ld.Lat;
|
||||
lon = ld.Lon;
|
||||
}
|
||||
Properties.Settings.Default.DXCall = call;
|
||||
Properties.Settings.Default.DXLat = lat;
|
||||
Properties.Settings.Default.DXLon = lon;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Log.WriteMessage(ex.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
private void btn_Control_Manage_Watchlist_Click(object sender, EventArgs e)
|
||||
{
|
||||
// sync watchlist, try to keep previously checked calls
|
||||
// you can have a call only once in the watch list
|
||||
List<string> checkedcalls = new List<string>();
|
||||
foreach (WatchlistItem item in Properties.Settings.Default.Watchlist)
|
||||
{
|
||||
if (item.Checked)
|
||||
checkedcalls.Add(item.Call);
|
||||
}
|
||||
WatchlistDlg Dlg = new WatchlistDlg();
|
||||
if (Dlg.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
// sync watchlist
|
||||
foreach (WatchlistItem item in Properties.Settings.Default.Watchlist)
|
||||
// clear watch list
|
||||
Properties.Settings.Default.Watchlist.Clear();
|
||||
foreach (DataGridViewRow row in Dlg.dgv_Watchlist_Selected.Rows)
|
||||
{
|
||||
// nasty!! Should never be null!
|
||||
if (item == null)
|
||||
continue;
|
||||
item.Remove = true;
|
||||
}
|
||||
foreach (ListViewItem lvi in Dlg.lv_Watchlist_Selected.Items)
|
||||
{
|
||||
// search item in watchlist
|
||||
int index = Properties.Settings.Default.Watchlist.IndexOf(lvi.Text);
|
||||
// reset remove flag if found, create and add new entry if not
|
||||
if (index >= 0)
|
||||
Properties.Settings.Default.Watchlist[index].Remove = false;
|
||||
else
|
||||
string call = row.Cells[0].Value.ToString();
|
||||
string loc = row.Cells[1].Value.ToString();
|
||||
bool oor = true;
|
||||
// try to get the location from database
|
||||
LocationDesignator dxloc = StationData.Database.LocationFind(call, loc);
|
||||
if (dxloc != null)
|
||||
{
|
||||
// try to find last recent locator from database and add to watchlist
|
||||
LocationDesignator dxcall = StationData.Database.LocationFindLastRecent(lvi.Text);
|
||||
if (dxcall != null)
|
||||
{
|
||||
double qrb = LatLon.Distance(Properties.Settings.Default.MyLat, Properties.Settings.Default.MyLon, dxcall.Lat, dxcall.Lon);
|
||||
Properties.Settings.Default.Watchlist.Add(new WatchlistItem(dxcall.Call, dxcall.Loc, qrb > Properties.Settings.Default.Path_MaxLength));
|
||||
}
|
||||
oor = LatLon.Distance(Properties.Settings.Default.MyLat, Properties.Settings.Default.MyLon, dxloc.Lat, dxloc.Lon) > Properties.Settings.Default.Path_MaxLength;
|
||||
}
|
||||
// add call to watch list
|
||||
WatchlistItem item = new WatchlistItem(call, loc, oor);
|
||||
Properties.Settings.Default.Watchlist.Add(item);
|
||||
}
|
||||
// remove the rest of items
|
||||
Properties.Settings.Default.Watchlist.RemoveAll(item => item.Remove);
|
||||
// refersh watchlist view
|
||||
// reselect previously selected
|
||||
foreach (string checkedcall in checkedcalls)
|
||||
{
|
||||
int index = Properties.Settings.Default.Watchlist.IndexOf(checkedcall);
|
||||
if (index >= 0)
|
||||
Properties.Settings.Default.Watchlist[index].Checked = true;
|
||||
}
|
||||
// refresh watchlist view
|
||||
RefreshWatchlistView();
|
||||
}
|
||||
}
|
||||
|
@ -5749,7 +5840,7 @@ namespace AirScout
|
|||
int mins = 0;
|
||||
if (planeinfo.Speed > 0)
|
||||
mins = (int)(planeinfo.IntQRB / (double)planeinfo.Speed / 1.852 * 60.0);
|
||||
planes = planes + planeinfo.Call + "," + planeinfo.Category + "," + ((int)planeinfo.IntQRB).ToString() + "," + planeinfo.Potential.ToString() + "," + mins.ToString() + ",";
|
||||
planes = planes + planeinfo.Call + "," + PlaneCategories.GetShortStringValue(planeinfo.Category) + "," + ((int)planeinfo.IntQRB).ToString() + "," + planeinfo.Potential.ToString() + "," + mins.ToString() + ",";
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
@ -6557,6 +6648,8 @@ namespace AirScout
|
|||
}
|
||||
else
|
||||
{
|
||||
// stop background thread
|
||||
bw_NewsFeed.CancelAsync();
|
||||
// report website changes
|
||||
DateTime dt = (DateTime)e.UserState;
|
||||
if (!SupportFunctions.IsMono)
|
||||
|
@ -6568,31 +6661,24 @@ namespace AirScout
|
|||
if (wb_News != null)
|
||||
wb_News.Refresh();
|
||||
tc_Map.SelectedTab = tp_News;
|
||||
// save time to settings
|
||||
Properties.Settings.Default.News_LastUpdate = dt;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// do nothing if wb_News fails to refresh
|
||||
}
|
||||
}
|
||||
// save time to settings
|
||||
Properties.Settings.Default.News_LastUpdate = dt;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (MessageBox.Show("There are news on the website. Latest update: " + dt.ToString() + "\n Do you want to read it now?\n\n Under Linux/Mono open web browser of your choice and goto: \n" + Properties.Settings.Default.News_URL + "\n\n", "Website News", MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.Yes)
|
||||
{
|
||||
try
|
||||
{
|
||||
// save time to settings
|
||||
Properties.Settings.Default.News_LastUpdate = dt;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// do nothing if wb_News fails to refresh
|
||||
}
|
||||
}
|
||||
MessageBox.Show("There are news on the website. Latest update: " + dt.ToString() + "\n Do you want to read it now?\n\n Under Linux/Mono open web browser of your choice and goto: \n" + Properties.Settings.Default.News_URL + "\n\n", "Website News", MessageBoxButtons.YesNo);
|
||||
// save time to settings
|
||||
Properties.Settings.Default.News_LastUpdate = dt;
|
||||
|
||||
}
|
||||
// restart background thread
|
||||
bw_NewsFeed.RunWorkerAsync();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -7540,6 +7626,28 @@ namespace AirScout
|
|||
{
|
||||
|
||||
}
|
||||
|
||||
private void tc_Main_Selecting(object sender, TabControlCancelEventArgs e)
|
||||
{
|
||||
// cancel tab change when in PLAY mode
|
||||
if (PlayMode == AIRSCOUTPLAYMODE.FORWARD)
|
||||
e.Cancel = true;
|
||||
}
|
||||
|
||||
private void tc_Map_Selecting(object sender, TabControlCancelEventArgs e)
|
||||
{
|
||||
// cancel tab change when in PLAY mode
|
||||
if (PlayMode == AIRSCOUTPLAYMODE.FORWARD)
|
||||
e.Cancel = true;
|
||||
}
|
||||
|
||||
private void tc_Control_Selecting(object sender, TabControlCancelEventArgs e)
|
||||
{
|
||||
// cancel tab change when in PLAY mode
|
||||
if (PlayMode == AIRSCOUTPLAYMODE.FORWARD)
|
||||
e.Cancel = true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -125,7 +125,7 @@
|
|||
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
|
||||
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
|
||||
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAACc
|
||||
DQAAAk1TRnQBSQFMAgEBAwEAATgBCwE4AQsBIAEAASABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
|
||||
DQAAAk1TRnQBSQFMAgEBAwEAAWgBCwFoAQsBIAEAASABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
|
||||
AwABgAMAASADAAEBAQABCAYAARAYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
|
||||
AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
|
||||
AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
|
||||
|
@ -340,7 +340,7 @@
|
|||
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
|
||||
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
|
||||
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAACM
|
||||
DAAAAk1TRnQBSQFMAwEBAAGgAQkBoAEJASABAAEgAQAE/wEJAQAI/wFCAU0BNgEEBgABNgEEAgABKAMA
|
||||
DAAAAk1TRnQBSQFMAwEBAAHQAQkB0AEJASABAAEgAQAE/wEJAQAI/wFCAU0BNgEEBgABNgEEAgABKAMA
|
||||
AYADAAEgAwABAQEAAQgGAAEQGAABgAIAAYADAAKAAQABgAMAAYABAAGAAQACgAIAA8ABAAHAAdwBwAEA
|
||||
AfABygGmAQABMwUAATMBAAEzAQABMwEAAjMCAAMWAQADHAEAAyIBAAMpAQADVQEAA00BAANCAQADOQEA
|
||||
AYABfAH/AQACUAH/AQABkwEAAdYBAAH/AewBzAEAAcYB1gHvAQAB1gLnAQABkAGpAa0CAAH/ATMDAAFm
|
||||
|
|
Plik diff jest za duży
Load Diff
|
@ -235,32 +235,41 @@ namespace AirScout
|
|||
|
||||
private void btn_Options_Watchlist_Manage_Click(object sender, EventArgs e)
|
||||
{
|
||||
// sync watchlist, try to keep previously checked calls
|
||||
// you can have a call only once in the watch list
|
||||
List<string> checkedcalls = new List<string>();
|
||||
foreach (WatchlistItem item in Properties.Settings.Default.Watchlist)
|
||||
{
|
||||
if (item.Checked)
|
||||
checkedcalls.Add(item.Call);
|
||||
}
|
||||
WatchlistDlg Dlg = new WatchlistDlg();
|
||||
if (Dlg.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
// sync watchlist
|
||||
foreach (WatchlistItem item in Properties.Settings.Default.Watchlist)
|
||||
item.Remove = true;
|
||||
foreach (ListViewItem lvi in Dlg.lv_Watchlist_Selected.Items)
|
||||
// clear watch list
|
||||
Properties.Settings.Default.Watchlist.Clear();
|
||||
foreach (DataGridViewRow row in Dlg.dgv_Watchlist_Selected.Rows)
|
||||
{
|
||||
// search item in watchlist
|
||||
int index = Properties.Settings.Default.Watchlist.IndexOf(lvi.Text);
|
||||
// reset remove flag if found, create and add new entry if not
|
||||
if (index >= 0)
|
||||
Properties.Settings.Default.Watchlist[index].Remove = false;
|
||||
else
|
||||
string call = row.Cells[0].Value.ToString();
|
||||
string loc = row.Cells[1].Value.ToString();
|
||||
bool oor = true;
|
||||
// try to get the location from database
|
||||
LocationDesignator dxloc = StationData.Database.LocationFind(call, loc);
|
||||
if (dxloc != null)
|
||||
{
|
||||
// try to find last recent locator from database and add to watchlist
|
||||
LocationDesignator dxcall = StationData.Database.LocationFindLastRecent(lvi.Text);
|
||||
if (dxcall != null)
|
||||
{
|
||||
double qrb = LatLon.Distance(Properties.Settings.Default.MyLat, Properties.Settings.Default.MyLon, dxcall.Lat, dxcall.Lon);
|
||||
Properties.Settings.Default.Watchlist.Add(new WatchlistItem(dxcall.Call, dxcall.Loc, qrb > Properties.Settings.Default.Path_MaxLength));
|
||||
}
|
||||
oor = LatLon.Distance(Properties.Settings.Default.MyLat, Properties.Settings.Default.MyLon, dxloc.Lat, dxloc.Lon) > Properties.Settings.Default.Path_MaxLength;
|
||||
}
|
||||
// add call to watch list
|
||||
WatchlistItem item = new WatchlistItem(call, loc, oor);
|
||||
Properties.Settings.Default.Watchlist.Add(item);
|
||||
}
|
||||
// reselect previously selected
|
||||
foreach (string checkedcall in checkedcalls)
|
||||
{
|
||||
int index = Properties.Settings.Default.Watchlist.IndexOf(checkedcall);
|
||||
if (index >= 0)
|
||||
Properties.Settings.Default.Watchlist[index].Checked = true;
|
||||
}
|
||||
// remove the rest of items
|
||||
Properties.Settings.Default.Watchlist.RemoveAll(item => item.Remove);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2058,19 +2067,32 @@ namespace AirScout
|
|||
|
||||
private void tab_Options_Info_Enter(object sender, EventArgs e)
|
||||
{
|
||||
// populate link labels
|
||||
lbl_Options_Version.Text = "Version: " + Application.ProductVersion;
|
||||
lbl_Options_Map.Text = "GMap.NET Copyright (c) 2008 - 2011 Universe";
|
||||
lbl_Options_Map.Links.Add(0, 8, "http://greatmaps.codeplex.com/");
|
||||
lbl_Options_Spherical.Text = "http://www.movable-type.co.uk/scripts/latlong.html";
|
||||
lbl_Options_Spherical.Links.Add(0, lbl_Options_Spherical.Text.Length - 1, "http://www.movable-type.co.uk/scripts/latlong.html");
|
||||
lbl_Options_Elevation_GLOBE.Text = "1km based Elevation Data from GLOBE - Project";
|
||||
lbl_Options_Elevation_GLOBE.Links.Add(30, 5, "http://www.ngdc.noaa.gov/mgg/topo/globe.html");
|
||||
lbl_Options_Elevation_SRTM3.Text = "3arsec (90m x 90m) Elevation Data from SRTM - Project";
|
||||
lbl_Options_Elevation_SRTM3.Links.Add(40, 14, "http://srtm.usgs.gov/");
|
||||
lbl_Options_Elevation_SRTM1.Text = "1arsec (30m x 30m) Elevation Data from SRTM - Project and ASTER";
|
||||
lbl_Options_Elevation_SRTM1.Links.Add(40, 14, "http://srtm.usgs.gov");
|
||||
lbl_Options_Elevation_SRTM1.Links.Add(58, 6, "http://asterweb.jpl.nasa.gov/index.asp");
|
||||
try
|
||||
{
|
||||
// clear links first
|
||||
lbl_Options_Map.Links.Clear();
|
||||
lbl_Options_Spherical.Links.Clear();
|
||||
lbl_Options_Elevation_GLOBE.Links.Clear();
|
||||
lbl_Options_Elevation_SRTM3.Links.Clear();
|
||||
lbl_Options_Elevation_SRTM1.Links.Clear();
|
||||
// populate link labels
|
||||
lbl_Options_Version.Text = "Version: " + Application.ProductVersion;
|
||||
lbl_Options_Map.Text = "GMap.NET Copyright (c) 2008 - 2011 Universe";
|
||||
lbl_Options_Map.Links.Add(0, 8, "http://greatmaps.codeplex.com/");
|
||||
lbl_Options_Spherical.Text = "http://www.movable-type.co.uk/scripts/latlong.html";
|
||||
lbl_Options_Spherical.Links.Add(0, lbl_Options_Spherical.Text.Length - 1, "http://www.movable-type.co.uk/scripts/latlong.html");
|
||||
lbl_Options_Elevation_GLOBE.Text = "1km based Elevation Data from GLOBE - Project";
|
||||
lbl_Options_Elevation_GLOBE.Links.Add(30, 5, "http://www.ngdc.noaa.gov/mgg/topo/globe.html");
|
||||
lbl_Options_Elevation_SRTM3.Text = "3arsec (90m x 90m) Elevation Data from SRTM - Project";
|
||||
lbl_Options_Elevation_SRTM3.Links.Add(40, 14, "http://srtm.usgs.gov/");
|
||||
lbl_Options_Elevation_SRTM1.Text = "1arsec (30m x 30m) Elevation Data from SRTM - Project and ASTER";
|
||||
lbl_Options_Elevation_SRTM1.Links.Add(40, 14, "http://srtm.usgs.gov");
|
||||
lbl_Options_Elevation_SRTM1.Links.Add(58, 6, "http://asterweb.jpl.nasa.gov/index.asp");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Log.WriteMessage(ex.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
|
|||
// Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern
|
||||
// übernehmen, indem Sie "*" eingeben:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("1.3.0.7")]
|
||||
[assembly: AssemblyFileVersion("1.3.0.7")]
|
||||
[assembly: AssemblyVersion("1.3.1.0")]
|
||||
[assembly: AssemblyFileVersion("1.3.1.0")]
|
||||
|
|
|
@ -41,6 +41,8 @@ To get ist running on your system, please follow the steps below
|
|||
- Settings upgrade from previous versions do not work, always use default settings when upgrading
|
||||
- database view for maintenance does not work --> SQLite-DataAdapter issues
|
||||
- Program sometimes does not close properly, stops working while saving settings to disk
|
||||
- dropdowns for callsigns and locators disappear on startup on some configurations (seems to be a graphics issue) --> try to resize window to get them back
|
||||
- filling the watch list ith calsigns is taking ages.
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -28,8 +28,11 @@
|
|||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.components = new System.ComponentModel.Container();
|
||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Splash));
|
||||
this.pb_Main = new System.Windows.Forms.PictureBox();
|
||||
this.ti_Close = new System.Windows.Forms.Timer(this.components);
|
||||
this.ti_Animation = new System.Windows.Forms.Timer(this.components);
|
||||
((System.ComponentModel.ISupportInitialize)(this.pb_Main)).BeginInit();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
|
@ -43,6 +46,19 @@
|
|||
this.pb_Main.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
|
||||
this.pb_Main.TabIndex = 0;
|
||||
this.pb_Main.TabStop = false;
|
||||
this.pb_Main.Paint += new System.Windows.Forms.PaintEventHandler(this.pb_Main_Paint);
|
||||
//
|
||||
// ti_Close
|
||||
//
|
||||
this.ti_Close.Enabled = true;
|
||||
this.ti_Close.Interval = 60000;
|
||||
this.ti_Close.Tick += new System.EventHandler(this.ti_Close_Tick);
|
||||
//
|
||||
// ti_Animation
|
||||
//
|
||||
this.ti_Animation.Enabled = true;
|
||||
this.ti_Animation.Interval = 20;
|
||||
this.ti_Animation.Tick += new System.EventHandler(this.ti_Animation_Tick);
|
||||
//
|
||||
// Splash
|
||||
//
|
||||
|
@ -59,6 +75,7 @@
|
|||
this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;
|
||||
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
|
||||
this.Text = "Splash";
|
||||
this.TopMost = true;
|
||||
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Splash_FormClosing);
|
||||
this.Load += new System.EventHandler(this.Splash_Load);
|
||||
((System.ComponentModel.ISupportInitialize)(this.pb_Main)).EndInit();
|
||||
|
@ -69,5 +86,7 @@
|
|||
#endregion
|
||||
|
||||
private System.Windows.Forms.PictureBox pb_Main;
|
||||
private System.Windows.Forms.Timer ti_Close;
|
||||
private System.Windows.Forms.Timer ti_Animation;
|
||||
}
|
||||
}
|
|
@ -13,6 +13,7 @@ namespace AirScout
|
|||
{
|
||||
public partial class Splash : Form
|
||||
{
|
||||
Label version;
|
||||
Label status;
|
||||
|
||||
// Define the CS_DROPSHADOW constant
|
||||
|
@ -26,8 +27,10 @@ namespace AirScout
|
|||
CreateParams cp = base.CreateParams;
|
||||
// change window style to dropshadow
|
||||
// does not work under Linux/Mono
|
||||
/*
|
||||
if (!SupportFunctions.IsMono)
|
||||
cp.ClassStyle |= CS_DROPSHADOW;
|
||||
*/
|
||||
return cp;
|
||||
}
|
||||
}
|
||||
|
@ -41,6 +44,7 @@ namespace AirScout
|
|||
FormBorderStyle = FormBorderStyle.None;
|
||||
else
|
||||
FormBorderStyle = FormBorderStyle.FixedSingle;
|
||||
// initialize status label
|
||||
status = new Label();
|
||||
status.Parent = pb_Main;
|
||||
status.BackColor = Color.Transparent;
|
||||
|
@ -50,6 +54,8 @@ namespace AirScout
|
|||
status.Width = 350;
|
||||
status.Font = new System.Drawing.Font(this.Font, FontStyle.Italic);
|
||||
status.TextAlign = ContentAlignment.MiddleCenter;
|
||||
// set to full transparent view at first;
|
||||
Opacity = 0;
|
||||
}
|
||||
|
||||
public void Status(string s)
|
||||
|
@ -67,10 +73,43 @@ namespace AirScout
|
|||
|
||||
private void Splash_Load(object sender, EventArgs e)
|
||||
{
|
||||
// start close timer
|
||||
ti_Close.Start();
|
||||
// start animation timer
|
||||
ti_Animation.Start();
|
||||
}
|
||||
|
||||
private void Splash_FormClosing(object sender, FormClosingEventArgs e)
|
||||
{
|
||||
// stop timers
|
||||
ti_Animation.Stop();
|
||||
ti_Close.Stop();
|
||||
}
|
||||
|
||||
private void ti_Close_Tick(object sender, EventArgs e)
|
||||
{
|
||||
// close form immediately if not closed by main form
|
||||
this.Close();
|
||||
}
|
||||
|
||||
private void ti_Animation_Tick(object sender, EventArgs e)
|
||||
{
|
||||
if (this.Opacity < 1)
|
||||
{
|
||||
this.Opacity += 0.01;
|
||||
ti_Animation.Start();
|
||||
}
|
||||
}
|
||||
|
||||
private void pb_Main_Paint(object sender, PaintEventArgs e)
|
||||
{
|
||||
// show Version
|
||||
string text = "Version " + Application.ProductVersion;
|
||||
using (Font myFont = new System.Drawing.Font(this.Font.FontFamily, 24, FontStyle.Bold | FontStyle.Italic))
|
||||
{
|
||||
e.Graphics.DrawString(text, myFont, Brushes.DimGray, new Point(140, 10));
|
||||
e.Graphics.DrawString(text, myFont, Brushes.White, new Point(140-2, 10-2));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -117,6 +117,12 @@
|
|||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<metadata name="ti_Close.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>17, 17</value>
|
||||
</metadata>
|
||||
<metadata name="ti_Animation.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>110, 17</value>
|
||||
</metadata>
|
||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
|
|
|
@ -0,0 +1,23 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using OxyPlot;
|
||||
|
||||
namespace AirScout
|
||||
{
|
||||
public class TooltipDataPoint : IDataPointProvider
|
||||
{
|
||||
public double X { get; set; }
|
||||
public double Y { get; set; }
|
||||
public string Tooltip { get; set; }
|
||||
public DataPoint GetDataPoint() => new DataPoint(X, Y);
|
||||
|
||||
public TooltipDataPoint(double x, double y, string tooltip)
|
||||
{
|
||||
X = x;
|
||||
Y = y;
|
||||
Tooltip = tooltip;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -170,7 +170,7 @@ Initial Version
|
|||
- Bugfix: Users cannot click on a single plane to show info permanently when in PLAY mode, also no tracking of a single plane is possible --> fixed (tnx IN3UPQ)
|
||||
- Bugfix: Calculation of elevation angle is wrong, always showing abt. 0°, tracking not working --> fixed (tnx IN3UPQ)
|
||||
|
||||
2020-xx-xx: V1.3.0.7
|
||||
2020-02-12: V1.3.0.7
|
||||
====================
|
||||
|
||||
- Bugfix: The AirScout_clean.cmd does not work properly when trying to cleanup files (database files are locked) --> fixed
|
||||
|
@ -178,11 +178,34 @@ Initial Version
|
|||
- Bugfix: Watchlist in multi-path mode always scrolls back to top position after watchlist is updated, watchlist is getting inoperable on large amounts of calls --> fixed
|
||||
- Bugfix: Sometimes a MemoryCounter could not created by the system, Exception will occur and AirScout will not start --> fixed
|
||||
- Feature: Create a progress indicator while creating elevation tile catalogue --> number of tiles processed is displayed now (tnx DL8AAU)
|
||||
- Feature: colour checked items in watch list according to their AS potential (tnx DF9IC)
|
||||
- Feature: colour checked items in watch list according to their AS potential (tnx DF5HS)
|
||||
- Feature: Sort selected items to the top of watch list to better view all selected items at once
|
||||
- Feature: label checked items from watch list in map premantently when in Multi-Path Mode (call sign only) (tnx DF9IC)
|
||||
- Feature: label checked items from watch list in map premantently when in Multi-Path Mode (call sign only) (tnx DF5HS)
|
||||
- Bugfix: several minor bugs when managing watch list (calls not sorted, multiple adding adding possible) --> fixed (tnx DL8AAU)
|
||||
|
||||
2020-xx-xx: V1.3.0.8 (not published)
|
||||
====================
|
||||
|
||||
- Bugfix: The calculation of free disk space does not work on some Linux configurations, unable to load elevation tiles --> fixed with workaround (tnx G8JVM)
|
||||
- Bugfix: Somtimes unable to set own callsign in First Run Wizard on Linux (when own callsign is not in database) --> fixed (tnx (G8JVM)
|
||||
- Bugfix: Window splitter position not set properly when starting up after First Run Wizard or when starting on Linux
|
||||
- Feature: Manage watch list dialog is slow, filling the list boxes is taking ages (especially on Linux/Mono)--> create a background worker and show progress while loading (tnx G8JVM)
|
||||
- Feature: Watch list is now sorted on selected calls first when in Play mode, coloured checkboxes are showing AS potential (tnx DH5FS)
|
||||
- Bugfix: Multiple dialog boxes "There are news on the website..." are showing if no user reaaction happend after some minutes --> fixed
|
||||
- Bugfix: Planes Minimal Category Filter Boxes are showing all categories twice --> fixed (tnx S51ML)
|
||||
- Bugfix: UDP-Server (for wtKST or similar) delivers full plane category string (e.g. "MEDIUM") in ASNEAREST message instead of one character (e.g. "M") --> fixed (tnx S51ML)
|
||||
|
||||
2020-03-01: V1.3.1.0
|
||||
====================
|
||||
|
||||
- Bugfix: AirportMapper does not work, Airports were not shown on the map anymore --> fixed (tnx OZ9GE)
|
||||
- Feature: complete rework of watchlist dialog, now changed from ListView to DataGridView (which is much faster), additionally show locator (tnx G8JVM, DH5FS, OZ9GE)
|
||||
- Bugfix: Aircraft labels were not shown on the elevation tab anymore (tab was disabled while in PLAY mode) --> fixed, now showing again on Left+Click (tnx OZ9GE)
|
||||
- Bugfix: ProgressTimer overflow under heavy load (especially when too many planes or paths are to display on slow systems) --> fixed (timer is stopped now and restarted not until update is performed)
|
||||
- Bugfix: do not disable whole tab controls while in PLAY mode, allow some user action and display changes --> fixed (change of tabs in tab control is now blocked by other means)
|
||||
- Feature: Rework of watch list in main window, showing potential now in full color, last selected call in MULTI mode is automatically transferred as selected call for SINGLE mode (tnx GM3SEK)
|
||||
- Feature: rework of splash window at startup, showing software version now
|
||||
- Bugfix: Planefinder web feed stopped working --> fixed (tnx F8AIH)
|
||||
- Feature: New web feed from OpenSky Network implenented (a free community)
|
||||
- Bugfix: AirScout crashed when the "Info" tab in the "Options" dialog box is opened twice after doing some other stuff --> fixed (tnx G0LGS)
|
||||
|
||||
|
|
|
@ -28,7 +28,7 @@ namespace AirScout
|
|||
}
|
||||
|
||||
public WatchlistItem(string call, string loc, bool oor) : this(call, loc, oor, false, false) { }
|
||||
public WatchlistItem(string call, string loc, bool check, bool oor, bool selected )
|
||||
public WatchlistItem(string call, string loc, bool oor, bool check, bool selected )
|
||||
{
|
||||
Call = call;
|
||||
Loc = loc;
|
||||
|
|
|
@ -29,10 +29,8 @@
|
|||
private void InitializeComponent()
|
||||
{
|
||||
this.components = new System.ComponentModel.Container();
|
||||
this.lv_Watchlist_Callsigns = new System.Windows.Forms.ListView();
|
||||
this.ch_Watchlist_Callsgings_Call = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||
this.lv_Watchlist_Selected = new System.Windows.Forms.ListView();
|
||||
this.ch_Watchlist_Selected_Calls = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle3 = new System.Windows.Forms.DataGridViewCellStyle();
|
||||
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle4 = new System.Windows.Forms.DataGridViewCellStyle();
|
||||
this.ss_Watchlist_Main = new System.Windows.Forms.StatusStrip();
|
||||
this.tsl_Watchlist_Main = new System.Windows.Forms.ToolStripStatusLabel();
|
||||
this.btn_Watchlist_Add = new System.Windows.Forms.Button();
|
||||
|
@ -42,57 +40,25 @@
|
|||
this.btn_Watchlist_Cancel = new System.Windows.Forms.Button();
|
||||
this.btn_Watchlist_OK = new System.Windows.Forms.Button();
|
||||
this.label1 = new System.Windows.Forms.Label();
|
||||
this.tb_Watchlist_Callsigns = new System.Windows.Forms.TextBox();
|
||||
this.tb_Watchlist_Selected = new System.Windows.Forms.TextBox();
|
||||
this.bw_Watchlist_Fill = new System.ComponentModel.BackgroundWorker();
|
||||
this.dgv_Watchlist_Callsigns = new System.Windows.Forms.DataGridView();
|
||||
this.dgv_Watchlist_Selected = new System.Windows.Forms.DataGridView();
|
||||
this.label2 = new System.Windows.Forms.Label();
|
||||
this.label3 = new System.Windows.Forms.Label();
|
||||
this.ss_Watchlist_Main.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.dgv_Watchlist_Callsigns)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.dgv_Watchlist_Selected)).BeginInit();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// lv_Watchlist_Callsigns
|
||||
//
|
||||
this.lv_Watchlist_Callsigns.AutoArrange = false;
|
||||
this.lv_Watchlist_Callsigns.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
|
||||
this.ch_Watchlist_Callsgings_Call});
|
||||
this.lv_Watchlist_Callsigns.FullRowSelect = true;
|
||||
this.lv_Watchlist_Callsigns.Location = new System.Drawing.Point(12, 50);
|
||||
this.lv_Watchlist_Callsigns.Name = "lv_Watchlist_Callsigns";
|
||||
this.lv_Watchlist_Callsigns.ShowGroups = false;
|
||||
this.lv_Watchlist_Callsigns.Size = new System.Drawing.Size(140, 300);
|
||||
this.lv_Watchlist_Callsigns.TabIndex = 2;
|
||||
this.lv_Watchlist_Callsigns.UseCompatibleStateImageBehavior = false;
|
||||
this.lv_Watchlist_Callsigns.View = System.Windows.Forms.View.Details;
|
||||
this.lv_Watchlist_Callsigns.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.lv_Watchlist_Callsigns_MouseDoubleClick);
|
||||
//
|
||||
// ch_Watchlist_Callsgings_Call
|
||||
//
|
||||
this.ch_Watchlist_Callsgings_Call.Text = "Available Callsigns";
|
||||
this.ch_Watchlist_Callsgings_Call.Width = 118;
|
||||
//
|
||||
// lv_Watchlist_Selected
|
||||
//
|
||||
this.lv_Watchlist_Selected.AutoArrange = false;
|
||||
this.lv_Watchlist_Selected.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
|
||||
this.ch_Watchlist_Selected_Calls});
|
||||
this.lv_Watchlist_Selected.FullRowSelect = true;
|
||||
this.lv_Watchlist_Selected.Location = new System.Drawing.Point(318, 50);
|
||||
this.lv_Watchlist_Selected.Name = "lv_Watchlist_Selected";
|
||||
this.lv_Watchlist_Selected.ShowGroups = false;
|
||||
this.lv_Watchlist_Selected.Size = new System.Drawing.Size(140, 300);
|
||||
this.lv_Watchlist_Selected.Sorting = System.Windows.Forms.SortOrder.Ascending;
|
||||
this.lv_Watchlist_Selected.TabIndex = 3;
|
||||
this.lv_Watchlist_Selected.UseCompatibleStateImageBehavior = false;
|
||||
this.lv_Watchlist_Selected.View = System.Windows.Forms.View.Details;
|
||||
this.lv_Watchlist_Selected.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.lv_Watchlist_Selected_MouseDoubleClick);
|
||||
//
|
||||
// ch_Watchlist_Selected_Calls
|
||||
//
|
||||
this.ch_Watchlist_Selected_Calls.Text = "Selected Callsigns";
|
||||
this.ch_Watchlist_Selected_Calls.Width = 118;
|
||||
//
|
||||
// ss_Watchlist_Main
|
||||
//
|
||||
this.ss_Watchlist_Main.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||
this.tsl_Watchlist_Main});
|
||||
this.ss_Watchlist_Main.Location = new System.Drawing.Point(0, 400);
|
||||
this.ss_Watchlist_Main.Location = new System.Drawing.Point(0, 435);
|
||||
this.ss_Watchlist_Main.Name = "ss_Watchlist_Main";
|
||||
this.ss_Watchlist_Main.Size = new System.Drawing.Size(487, 22);
|
||||
this.ss_Watchlist_Main.Size = new System.Drawing.Size(484, 22);
|
||||
this.ss_Watchlist_Main.TabIndex = 4;
|
||||
//
|
||||
// tsl_Watchlist_Main
|
||||
|
@ -103,10 +69,11 @@
|
|||
//
|
||||
// btn_Watchlist_Add
|
||||
//
|
||||
this.btn_Watchlist_Add.Enabled = false;
|
||||
this.btn_Watchlist_Add.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.btn_Watchlist_Add.Location = new System.Drawing.Point(201, 131);
|
||||
this.btn_Watchlist_Add.Location = new System.Drawing.Point(207, 176);
|
||||
this.btn_Watchlist_Add.Name = "btn_Watchlist_Add";
|
||||
this.btn_Watchlist_Add.Size = new System.Drawing.Size(69, 29);
|
||||
this.btn_Watchlist_Add.Size = new System.Drawing.Size(70, 30);
|
||||
this.btn_Watchlist_Add.TabIndex = 5;
|
||||
this.btn_Watchlist_Add.Text = ">";
|
||||
this.tt_Watchlist_Main.SetToolTip(this.btn_Watchlist_Add, "Add selected call to watchlist.");
|
||||
|
@ -115,10 +82,11 @@
|
|||
//
|
||||
// btn_Watchlist_Remove
|
||||
//
|
||||
this.btn_Watchlist_Remove.Enabled = false;
|
||||
this.btn_Watchlist_Remove.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.btn_Watchlist_Remove.Location = new System.Drawing.Point(201, 181);
|
||||
this.btn_Watchlist_Remove.Location = new System.Drawing.Point(207, 226);
|
||||
this.btn_Watchlist_Remove.Name = "btn_Watchlist_Remove";
|
||||
this.btn_Watchlist_Remove.Size = new System.Drawing.Size(69, 29);
|
||||
this.btn_Watchlist_Remove.Size = new System.Drawing.Size(70, 30);
|
||||
this.btn_Watchlist_Remove.TabIndex = 6;
|
||||
this.btn_Watchlist_Remove.Text = "<";
|
||||
this.tt_Watchlist_Main.SetToolTip(this.btn_Watchlist_Remove, "Remove selected call from watchlist.");
|
||||
|
@ -127,10 +95,11 @@
|
|||
//
|
||||
// btn_Watchlist_RemoveAll
|
||||
//
|
||||
this.btn_Watchlist_RemoveAll.Enabled = false;
|
||||
this.btn_Watchlist_RemoveAll.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.btn_Watchlist_RemoveAll.Location = new System.Drawing.Point(201, 229);
|
||||
this.btn_Watchlist_RemoveAll.Location = new System.Drawing.Point(207, 274);
|
||||
this.btn_Watchlist_RemoveAll.Name = "btn_Watchlist_RemoveAll";
|
||||
this.btn_Watchlist_RemoveAll.Size = new System.Drawing.Size(69, 29);
|
||||
this.btn_Watchlist_RemoveAll.Size = new System.Drawing.Size(70, 30);
|
||||
this.btn_Watchlist_RemoveAll.TabIndex = 7;
|
||||
this.btn_Watchlist_RemoveAll.Text = "<<";
|
||||
this.tt_Watchlist_Main.SetToolTip(this.btn_Watchlist_RemoveAll, "Remove all calls from watchlist.");
|
||||
|
@ -140,7 +109,7 @@
|
|||
// btn_Watchlist_Cancel
|
||||
//
|
||||
this.btn_Watchlist_Cancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
|
||||
this.btn_Watchlist_Cancel.Location = new System.Drawing.Point(161, 365);
|
||||
this.btn_Watchlist_Cancel.Location = new System.Drawing.Point(147, 402);
|
||||
this.btn_Watchlist_Cancel.Name = "btn_Watchlist_Cancel";
|
||||
this.btn_Watchlist_Cancel.Size = new System.Drawing.Size(75, 23);
|
||||
this.btn_Watchlist_Cancel.TabIndex = 8;
|
||||
|
@ -150,7 +119,8 @@
|
|||
// btn_Watchlist_OK
|
||||
//
|
||||
this.btn_Watchlist_OK.DialogResult = System.Windows.Forms.DialogResult.OK;
|
||||
this.btn_Watchlist_OK.Location = new System.Drawing.Point(242, 365);
|
||||
this.btn_Watchlist_OK.Enabled = false;
|
||||
this.btn_Watchlist_OK.Location = new System.Drawing.Point(237, 402);
|
||||
this.btn_Watchlist_OK.Name = "btn_Watchlist_OK";
|
||||
this.btn_Watchlist_OK.Size = new System.Drawing.Size(75, 23);
|
||||
this.btn_Watchlist_OK.TabIndex = 9;
|
||||
|
@ -161,19 +131,129 @@
|
|||
//
|
||||
this.label1.AutoSize = true;
|
||||
this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.label1.Location = new System.Drawing.Point(43, 20);
|
||||
this.label1.Location = new System.Drawing.Point(43, 13);
|
||||
this.label1.Name = "label1";
|
||||
this.label1.Size = new System.Drawing.Size(406, 16);
|
||||
this.label1.TabIndex = 10;
|
||||
this.label1.Text = "You can select callsigns from database and set them on a watchlist.";
|
||||
//
|
||||
// tb_Watchlist_Callsigns
|
||||
//
|
||||
this.tb_Watchlist_Callsigns.CharacterCasing = System.Windows.Forms.CharacterCasing.Upper;
|
||||
this.tb_Watchlist_Callsigns.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.tb_Watchlist_Callsigns.Location = new System.Drawing.Point(15, 75);
|
||||
this.tb_Watchlist_Callsigns.Name = "tb_Watchlist_Callsigns";
|
||||
this.tb_Watchlist_Callsigns.Size = new System.Drawing.Size(180, 20);
|
||||
this.tb_Watchlist_Callsigns.TabIndex = 11;
|
||||
this.tb_Watchlist_Callsigns.TextChanged += new System.EventHandler(this.tb_Watchlist_Callsigns_TextChanged);
|
||||
//
|
||||
// tb_Watchlist_Selected
|
||||
//
|
||||
this.tb_Watchlist_Selected.CharacterCasing = System.Windows.Forms.CharacterCasing.Upper;
|
||||
this.tb_Watchlist_Selected.Font = new System.Drawing.Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.tb_Watchlist_Selected.Location = new System.Drawing.Point(288, 75);
|
||||
this.tb_Watchlist_Selected.Name = "tb_Watchlist_Selected";
|
||||
this.tb_Watchlist_Selected.Size = new System.Drawing.Size(180, 20);
|
||||
this.tb_Watchlist_Selected.TabIndex = 12;
|
||||
this.tb_Watchlist_Selected.TextChanged += new System.EventHandler(this.tb_Watchlist_Selected_TextChanged);
|
||||
//
|
||||
// bw_Watchlist_Fill
|
||||
//
|
||||
this.bw_Watchlist_Fill.WorkerReportsProgress = true;
|
||||
this.bw_Watchlist_Fill.WorkerSupportsCancellation = true;
|
||||
this.bw_Watchlist_Fill.DoWork += new System.ComponentModel.DoWorkEventHandler(this.bw_Watchlist_Fill_DoWork);
|
||||
this.bw_Watchlist_Fill.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.bw_Watchlist_Fill_ProgressChanged);
|
||||
this.bw_Watchlist_Fill.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.bw_Watchlist_Fill_RunWorkerCompleted);
|
||||
//
|
||||
// dgv_Watchlist_Callsigns
|
||||
//
|
||||
this.dgv_Watchlist_Callsigns.AllowUserToAddRows = false;
|
||||
this.dgv_Watchlist_Callsigns.AllowUserToDeleteRows = false;
|
||||
this.dgv_Watchlist_Callsigns.AllowUserToResizeColumns = false;
|
||||
this.dgv_Watchlist_Callsigns.AllowUserToResizeRows = false;
|
||||
this.dgv_Watchlist_Callsigns.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill;
|
||||
this.dgv_Watchlist_Callsigns.CellBorderStyle = System.Windows.Forms.DataGridViewCellBorderStyle.None;
|
||||
this.dgv_Watchlist_Callsigns.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
|
||||
dataGridViewCellStyle3.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
|
||||
dataGridViewCellStyle3.BackColor = System.Drawing.SystemColors.Window;
|
||||
dataGridViewCellStyle3.Font = new System.Drawing.Font("Courier New", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
dataGridViewCellStyle3.ForeColor = System.Drawing.SystemColors.ControlText;
|
||||
dataGridViewCellStyle3.SelectionBackColor = System.Drawing.SystemColors.Highlight;
|
||||
dataGridViewCellStyle3.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
|
||||
dataGridViewCellStyle3.WrapMode = System.Windows.Forms.DataGridViewTriState.False;
|
||||
this.dgv_Watchlist_Callsigns.DefaultCellStyle = dataGridViewCellStyle3;
|
||||
this.dgv_Watchlist_Callsigns.EditMode = System.Windows.Forms.DataGridViewEditMode.EditProgrammatically;
|
||||
this.dgv_Watchlist_Callsigns.Location = new System.Drawing.Point(15, 101);
|
||||
this.dgv_Watchlist_Callsigns.Name = "dgv_Watchlist_Callsigns";
|
||||
this.dgv_Watchlist_Callsigns.RowHeadersVisible = false;
|
||||
this.dgv_Watchlist_Callsigns.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
|
||||
this.dgv_Watchlist_Callsigns.Size = new System.Drawing.Size(180, 280);
|
||||
this.dgv_Watchlist_Callsigns.TabIndex = 13;
|
||||
this.dgv_Watchlist_Callsigns.CellContentDoubleClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dgv_Watchlist_Callsigns_CellContentDoubleClick);
|
||||
this.dgv_Watchlist_Callsigns.CellPainting += new System.Windows.Forms.DataGridViewCellPaintingEventHandler(this.dgv_Watchlist_Callsigns_CellPainting);
|
||||
//
|
||||
// dgv_Watchlist_Selected
|
||||
//
|
||||
this.dgv_Watchlist_Selected.AllowUserToAddRows = false;
|
||||
this.dgv_Watchlist_Selected.AllowUserToDeleteRows = false;
|
||||
this.dgv_Watchlist_Selected.AllowUserToResizeColumns = false;
|
||||
this.dgv_Watchlist_Selected.AllowUserToResizeRows = false;
|
||||
this.dgv_Watchlist_Selected.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill;
|
||||
this.dgv_Watchlist_Selected.CellBorderStyle = System.Windows.Forms.DataGridViewCellBorderStyle.None;
|
||||
this.dgv_Watchlist_Selected.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
|
||||
dataGridViewCellStyle4.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
|
||||
dataGridViewCellStyle4.BackColor = System.Drawing.SystemColors.Window;
|
||||
dataGridViewCellStyle4.Font = new System.Drawing.Font("Courier New", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
dataGridViewCellStyle4.ForeColor = System.Drawing.SystemColors.ControlText;
|
||||
dataGridViewCellStyle4.SelectionBackColor = System.Drawing.SystemColors.Highlight;
|
||||
dataGridViewCellStyle4.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
|
||||
dataGridViewCellStyle4.WrapMode = System.Windows.Forms.DataGridViewTriState.False;
|
||||
this.dgv_Watchlist_Selected.DefaultCellStyle = dataGridViewCellStyle4;
|
||||
this.dgv_Watchlist_Selected.EditMode = System.Windows.Forms.DataGridViewEditMode.EditProgrammatically;
|
||||
this.dgv_Watchlist_Selected.Location = new System.Drawing.Point(288, 101);
|
||||
this.dgv_Watchlist_Selected.Name = "dgv_Watchlist_Selected";
|
||||
this.dgv_Watchlist_Selected.RowHeadersVisible = false;
|
||||
this.dgv_Watchlist_Selected.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
|
||||
this.dgv_Watchlist_Selected.Size = new System.Drawing.Size(180, 280);
|
||||
this.dgv_Watchlist_Selected.TabIndex = 14;
|
||||
this.dgv_Watchlist_Selected.CellContentDoubleClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dgv_Watchlist_Selected_CellContentDoubleClick);
|
||||
this.dgv_Watchlist_Selected.CellPainting += new System.Windows.Forms.DataGridViewCellPaintingEventHandler(this.dgv_Watchlist_Selected_CellPainting);
|
||||
//
|
||||
// label2
|
||||
//
|
||||
this.label2.BackColor = System.Drawing.Color.Khaki;
|
||||
this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.label2.Location = new System.Drawing.Point(15, 42);
|
||||
this.label2.Name = "label2";
|
||||
this.label2.Size = new System.Drawing.Size(180, 25);
|
||||
this.label2.TabIndex = 15;
|
||||
this.label2.Text = "Availbale Callsigns";
|
||||
this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// label3
|
||||
//
|
||||
this.label3.BackColor = System.Drawing.Color.PaleGreen;
|
||||
this.label3.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.label3.Location = new System.Drawing.Point(288, 42);
|
||||
this.label3.Name = "label3";
|
||||
this.label3.Size = new System.Drawing.Size(180, 25);
|
||||
this.label3.TabIndex = 16;
|
||||
this.label3.Text = "Selected Callsigns";
|
||||
this.label3.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// WatchlistDlg
|
||||
//
|
||||
this.AcceptButton = this.btn_Watchlist_OK;
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.CancelButton = this.btn_Watchlist_Cancel;
|
||||
this.ClientSize = new System.Drawing.Size(487, 422);
|
||||
this.ClientSize = new System.Drawing.Size(484, 457);
|
||||
this.Controls.Add(this.label3);
|
||||
this.Controls.Add(this.label2);
|
||||
this.Controls.Add(this.dgv_Watchlist_Selected);
|
||||
this.Controls.Add(this.dgv_Watchlist_Callsigns);
|
||||
this.Controls.Add(this.tb_Watchlist_Selected);
|
||||
this.Controls.Add(this.tb_Watchlist_Callsigns);
|
||||
this.Controls.Add(this.label1);
|
||||
this.Controls.Add(this.btn_Watchlist_OK);
|
||||
this.Controls.Add(this.btn_Watchlist_Cancel);
|
||||
|
@ -181,24 +261,20 @@
|
|||
this.Controls.Add(this.btn_Watchlist_Remove);
|
||||
this.Controls.Add(this.btn_Watchlist_Add);
|
||||
this.Controls.Add(this.ss_Watchlist_Main);
|
||||
this.Controls.Add(this.lv_Watchlist_Selected);
|
||||
this.Controls.Add(this.lv_Watchlist_Callsigns);
|
||||
this.Name = "WatchlistDlg";
|
||||
this.Text = "Manage Watchlist";
|
||||
this.Load += new System.EventHandler(this.WatchlistDlg_Load);
|
||||
this.Shown += new System.EventHandler(this.WatchlistDlg_Shown);
|
||||
this.ss_Watchlist_Main.ResumeLayout(false);
|
||||
this.ss_Watchlist_Main.PerformLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.dgv_Watchlist_Callsigns)).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.dgv_Watchlist_Selected)).EndInit();
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
private System.Windows.Forms.ColumnHeader ch_Watchlist_Callsgings_Call;
|
||||
private System.Windows.Forms.ColumnHeader ch_Watchlist_Selected_Calls;
|
||||
public System.Windows.Forms.ListView lv_Watchlist_Callsigns;
|
||||
public System.Windows.Forms.ListView lv_Watchlist_Selected;
|
||||
private System.Windows.Forms.StatusStrip ss_Watchlist_Main;
|
||||
private System.Windows.Forms.ToolStripStatusLabel tsl_Watchlist_Main;
|
||||
private System.Windows.Forms.Button btn_Watchlist_Add;
|
||||
|
@ -208,5 +284,12 @@
|
|||
private System.Windows.Forms.Button btn_Watchlist_Cancel;
|
||||
private System.Windows.Forms.Button btn_Watchlist_OK;
|
||||
private System.Windows.Forms.Label label1;
|
||||
private System.Windows.Forms.TextBox tb_Watchlist_Callsigns;
|
||||
private System.Windows.Forms.TextBox tb_Watchlist_Selected;
|
||||
private System.ComponentModel.BackgroundWorker bw_Watchlist_Fill;
|
||||
private System.Windows.Forms.DataGridView dgv_Watchlist_Callsigns;
|
||||
public System.Windows.Forms.DataGridView dgv_Watchlist_Selected;
|
||||
private System.Windows.Forms.Label label2;
|
||||
private System.Windows.Forms.Label label3;
|
||||
}
|
||||
}
|
|
@ -13,9 +13,20 @@ namespace AirScout
|
|||
{
|
||||
public partial class WatchlistDlg : Form
|
||||
{
|
||||
List<LocationDesignator> AllLocations = new List<LocationDesignator>();
|
||||
|
||||
DataTable AllCallsigns = new DataTable();
|
||||
DataTable SelectedCallsigns = new DataTable();
|
||||
|
||||
public WatchlistDlg()
|
||||
{
|
||||
InitializeComponent();
|
||||
AllCallsigns.Columns.Add("Call");
|
||||
AllCallsigns.Columns.Add("Locator");
|
||||
AllCallsigns.DefaultView.Sort = "Call ASC";
|
||||
SelectedCallsigns.Columns.Add("Call");
|
||||
SelectedCallsigns.Columns.Add("Locator");
|
||||
SelectedCallsigns.DefaultView.Sort = "Call ASC";
|
||||
}
|
||||
|
||||
private void WatchlistDlg_Load(object sender, EventArgs e)
|
||||
|
@ -25,76 +36,209 @@ namespace AirScout
|
|||
|
||||
private void WatchlistDlg_Shown(object sender, EventArgs e)
|
||||
{
|
||||
tsl_Watchlist_Main.Text = "Please wait while lists are being populated...";
|
||||
ss_Watchlist_Main.Refresh();
|
||||
List<LocationDesignator> l = StationData.Database.LocationGetAll();
|
||||
lv_Watchlist_Callsigns.BeginUpdate();
|
||||
foreach (LocationDesignator ld in l)
|
||||
// initially fill tables
|
||||
bw_Watchlist_Fill.RunWorkerAsync();
|
||||
}
|
||||
|
||||
private void FillCallsigns (string filter)
|
||||
{
|
||||
try
|
||||
{
|
||||
ListViewItem item = new ListViewItem(ld.Call);
|
||||
item.Name = ld.Call;
|
||||
lv_Watchlist_Callsigns.Items.Add(item);
|
||||
AllCallsigns.Rows.Clear();
|
||||
dgv_Watchlist_Callsigns.DataSource = null;
|
||||
foreach (LocationDesignator ld in AllLocations)
|
||||
{
|
||||
DataRow row = AllCallsigns.NewRow();
|
||||
row[0] = ld.Call;
|
||||
row[1] = ld.Loc;
|
||||
AllCallsigns.Rows.Add(row);
|
||||
}
|
||||
dgv_Watchlist_Callsigns.DataSource = AllCallsigns;
|
||||
}
|
||||
lv_Watchlist_Callsigns.EndUpdate();
|
||||
lv_Watchlist_Selected.BeginUpdate();
|
||||
lv_Watchlist_Selected.Items.Clear();
|
||||
foreach (WatchlistItem item in Properties.Settings.Default.Watchlist)
|
||||
catch (Exception ex)
|
||||
{
|
||||
ListViewItem lvi = new ListViewItem(item.Call);
|
||||
lvi.SubItems.Add(new ListViewItem.ListViewSubItem(lvi, item.Loc));
|
||||
if (item.Checked)
|
||||
lvi.Checked = true;
|
||||
if (item.Selected)
|
||||
lvi.Selected = true;
|
||||
lv_Watchlist_Selected.Items.Add(lvi);
|
||||
lv_Watchlist_Selected.Sort();
|
||||
Console.WriteLine("Watchlist.FillItems: " + ex.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
private void FillSelected(string filter)
|
||||
{
|
||||
try
|
||||
{
|
||||
SelectedCallsigns.Rows.Clear();
|
||||
dgv_Watchlist_Selected.DataSource = null;
|
||||
foreach (WatchlistItem item in Properties.Settings.Default.Watchlist)
|
||||
{
|
||||
DataRow row = SelectedCallsigns.NewRow();
|
||||
row[0] = item.Call;
|
||||
row[1] = item.Loc;
|
||||
SelectedCallsigns.Rows.Add(row);
|
||||
}
|
||||
dgv_Watchlist_Selected.DataSource = SelectedCallsigns;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine("Watchlist.FillItems: " + ex.ToString());
|
||||
}
|
||||
lv_Watchlist_Selected.EndUpdate();
|
||||
tsl_Watchlist_Main.Text = "";
|
||||
}
|
||||
|
||||
private void btn_Watchlist_Add_Click(object sender, EventArgs e)
|
||||
{
|
||||
if(lv_Watchlist_Callsigns.SelectedItems.Count > 0)
|
||||
try
|
||||
{
|
||||
foreach (ListViewItem item in lv_Watchlist_Callsigns.SelectedItems)
|
||||
if (dgv_Watchlist_Callsigns.SelectedRows != null)
|
||||
{
|
||||
ListViewItem newitem = new ListViewItem(item.Name);
|
||||
newitem.Name = item.Name;
|
||||
lv_Watchlist_Selected.Items.Add(newitem);
|
||||
foreach (DataGridViewRow selectedrow in dgv_Watchlist_Callsigns.SelectedRows)
|
||||
{
|
||||
// search row content in selected calls first
|
||||
string sql = "Call = '" + selectedrow.Cells[0].Value.ToString() + "' AND Locator = '" + selectedrow.Cells[1].Value.ToString() + "'";
|
||||
DataRow[] result = SelectedCallsigns.Select(sql);
|
||||
if ((result == null) || (result.Length == 0))
|
||||
{
|
||||
DataRow row = SelectedCallsigns.NewRow();
|
||||
row[0] = selectedrow.Cells[0].Value;
|
||||
row[1] = selectedrow.Cells[1].Value;
|
||||
SelectedCallsigns.Rows.Add(row);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// do nothing
|
||||
}
|
||||
}
|
||||
|
||||
private void btn_Watchlist_Remove_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (lv_Watchlist_Selected.SelectedItems.Count > 0)
|
||||
try
|
||||
{
|
||||
foreach (ListViewItem item in lv_Watchlist_Selected.SelectedItems)
|
||||
if (dgv_Watchlist_Selected.SelectedRows != null)
|
||||
{
|
||||
try
|
||||
// keep the selected rows in a separate List as the selection changes dynamically when deleting rows from table
|
||||
List<DataRow> SelectedRows = new List<DataRow>();
|
||||
foreach (DataGridViewRow selectedrow in dgv_Watchlist_Selected.SelectedRows)
|
||||
{
|
||||
lv_Watchlist_Selected.Items.RemoveByKey(item.Name);
|
||||
DataRow row = SelectedCallsigns.NewRow();
|
||||
row[0] = selectedrow.Cells[0].Value.ToString();
|
||||
row[1] = selectedrow.Cells[1].Value.ToString();
|
||||
SelectedRows.Add(row);
|
||||
}
|
||||
catch
|
||||
SelectedCallsigns.AcceptChanges();
|
||||
foreach (DataRow selectedrow in SelectedRows)
|
||||
{
|
||||
|
||||
foreach (DataRow row in SelectedCallsigns.Rows)
|
||||
{
|
||||
if ((row[0].ToString() == selectedrow[0].ToString()) && (row[1].ToString() == selectedrow[1].ToString()))
|
||||
{
|
||||
// row found --> delete row in table, commit changes immediately and exit iteration
|
||||
row.Delete();
|
||||
SelectedCallsigns.AcceptChanges();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// do nothing
|
||||
}
|
||||
}
|
||||
|
||||
private void btn_Watchlist_RemoveAll_Click(object sender, EventArgs e)
|
||||
{
|
||||
lv_Watchlist_Selected.Items.Clear();
|
||||
SelectedCallsigns.Rows.Clear();
|
||||
}
|
||||
|
||||
private void lv_Watchlist_Callsigns_MouseDoubleClick(object sender, MouseEventArgs e)
|
||||
private void tb_Watchlist_Callsigns_TextChanged(object sender, EventArgs e)
|
||||
{
|
||||
try
|
||||
{
|
||||
AllCallsigns.DefaultView.RowFilter = "[Call] LIKE '" + tb_Watchlist_Callsigns.Text + "%'";
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// do nothing
|
||||
}
|
||||
}
|
||||
|
||||
private void tb_Watchlist_Selected_TextChanged(object sender, EventArgs e)
|
||||
{
|
||||
SelectedCallsigns.DefaultView.RowFilter = "[Call] LIKE '" + tb_Watchlist_Selected.Text + "%'";
|
||||
}
|
||||
|
||||
private void bw_Watchlist_Fill_DoWork(object sender, DoWorkEventArgs e)
|
||||
{
|
||||
bw_Watchlist_Fill.ReportProgress(0, "Lists are being populated. Please wait...");
|
||||
// get all available callsigns from database
|
||||
lock (AllLocations)
|
||||
{
|
||||
AllLocations = StationData.Database.LocationGetAll(bw_Watchlist_Fill, Properties.Settings.Default.MinLat, Properties.Settings.Default.MinLon, Properties.Settings.Default.MaxLat, Properties.Settings.Default.MaxLon);
|
||||
}
|
||||
}
|
||||
|
||||
private void bw_Watchlist_Fill_ProgressChanged(object sender, ProgressChangedEventArgs e)
|
||||
{
|
||||
// report message
|
||||
if (e.ProgressPercentage <= 0)
|
||||
{
|
||||
tsl_Watchlist_Main.Text = (string)e.UserState;
|
||||
ss_Watchlist_Main.Refresh();
|
||||
}
|
||||
}
|
||||
|
||||
private void bw_Watchlist_Fill_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
|
||||
{
|
||||
tsl_Watchlist_Main.Text = "Adding callsigns to list. Please wait...";
|
||||
ss_Watchlist_Main.Refresh();
|
||||
FillCallsigns(tb_Watchlist_Callsigns.Text);
|
||||
FillSelected(tb_Watchlist_Selected.Text);
|
||||
tsl_Watchlist_Main.Text = "";
|
||||
btn_Watchlist_Add.Enabled = true;
|
||||
btn_Watchlist_Remove.Enabled = true;
|
||||
btn_Watchlist_RemoveAll.Enabled = true;
|
||||
btn_Watchlist_OK.Enabled = true;
|
||||
tsl_Watchlist_Main.Text = "Ready.";
|
||||
ss_Watchlist_Main.Refresh();
|
||||
}
|
||||
|
||||
private void dgv_Watchlist_Callsigns_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
|
||||
{
|
||||
if (e.ColumnIndex < 0)
|
||||
return;
|
||||
if (e.RowIndex < 0)
|
||||
return;
|
||||
e.Paint(e.CellBounds, DataGridViewPaintParts.All);
|
||||
var r = e.CellBounds;
|
||||
e.Graphics.DrawLine(Pens.LightGray, r.Left, r.Top, r.Right, r.Top);
|
||||
e.Graphics.DrawLine(Pens.LightGray, r.Left, r.Top, r.Left, r.Bottom);
|
||||
e.Graphics.DrawLine(Pens.LightGray, r.Left, r.Bottom, r.Right, r.Bottom);
|
||||
e.Graphics.DrawLine(Pens.LightGray, r.Right, r.Top, r.Right, r.Bottom);
|
||||
e.Handled = true;
|
||||
}
|
||||
|
||||
private void dgv_Watchlist_Selected_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
|
||||
{
|
||||
if (e.ColumnIndex < 0)
|
||||
return;
|
||||
if (e.RowIndex < 0)
|
||||
return;
|
||||
e.Paint(e.CellBounds, DataGridViewPaintParts.All);
|
||||
var r = e.CellBounds;
|
||||
e.Graphics.DrawLine(Pens.LightGray, r.Left, r.Top, r.Right, r.Top);
|
||||
e.Graphics.DrawLine(Pens.LightGray, r.Left, r.Top, r.Left, r.Bottom);
|
||||
e.Graphics.DrawLine(Pens.LightGray, r.Left, r.Bottom, r.Right, r.Bottom);
|
||||
e.Graphics.DrawLine(Pens.LightGray, r.Right, r.Top, r.Right, r.Bottom);
|
||||
e.Handled = true;
|
||||
}
|
||||
|
||||
private void dgv_Watchlist_Callsigns_CellContentDoubleClick(object sender, DataGridViewCellEventArgs e)
|
||||
{
|
||||
btn_Watchlist_Add_Click(this, null);
|
||||
}
|
||||
|
||||
private void lv_Watchlist_Selected_MouseDoubleClick(object sender, MouseEventArgs e)
|
||||
private void dgv_Watchlist_Selected_CellContentDoubleClick(object sender, DataGridViewCellEventArgs e)
|
||||
{
|
||||
btn_Watchlist_Remove_Click(this, null);
|
||||
}
|
||||
|
|
|
@ -123,4 +123,10 @@
|
|||
<metadata name="tt_Watchlist_Main.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>167, 17</value>
|
||||
</metadata>
|
||||
<metadata name="tt_Watchlist_Main.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>167, 17</value>
|
||||
</metadata>
|
||||
<metadata name="bw_Watchlist_Fill.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>315, 17</value>
|
||||
</metadata>
|
||||
</root>
|
|
@ -300,7 +300,14 @@ namespace ScoutBase.Core
|
|||
string[] files = Directory.GetFiles(dir, filter);
|
||||
foreach (string file in files)
|
||||
{
|
||||
File.Delete(file);
|
||||
try
|
||||
{
|
||||
File.Delete(file);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine("DeleteFilesFromDirectory: " + ex.ToString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -315,7 +322,14 @@ namespace ScoutBase.Core
|
|||
string[] files = filters.SelectMany(f => Directory.GetFiles(dir, f)).ToArray();
|
||||
foreach (string file in files)
|
||||
{
|
||||
File.Delete(file);
|
||||
try
|
||||
{
|
||||
File.Delete(file);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine("DeleteFilesFromDirectory: " + ex.ToString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -288,6 +288,7 @@ namespace ScoutBase.Elevation
|
|||
try
|
||||
{
|
||||
SupportFunctions.DeleteFilesFromDirectory(TmpDirectory, new string[] { "*.tmp", "*.PendingOverwrite" });
|
||||
SupportFunctions.DeleteFilesFromDirectory(ElevationData.Database.DefaultDatabaseDirectory(StartOptions.Model), new string[] { "*.tmp", "*.PendingOverwrite" });
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
|
|
@ -559,7 +559,7 @@ namespace ScoutBase.Stations
|
|||
if (caller.WorkerSupportsCancellation && caller.CancellationPending)
|
||||
return new List<LocationDesignator>();
|
||||
if (caller.WorkerReportsProgress && (i % 1000 == 0))
|
||||
caller.ReportProgress(0, "Getting location " + i.ToString() + " of");
|
||||
caller.ReportProgress(0, "Getting location " + i.ToString());
|
||||
}
|
||||
}
|
||||
reader.Close();
|
||||
|
@ -612,7 +612,7 @@ namespace ScoutBase.Stations
|
|||
if (caller.WorkerSupportsCancellation && caller.CancellationPending)
|
||||
return new List<LocationDesignator>();
|
||||
if (caller.WorkerReportsProgress && (i % 1000 == 0))
|
||||
caller.ReportProgress(0, "Getting location " + i.ToString() + " of");
|
||||
caller.ReportProgress(0, "Getting location " + i.ToString());
|
||||
}
|
||||
}
|
||||
reader.Close();
|
||||
|
|
Ładowanie…
Reference in New Issue