private void btnExportExcel_Click(object sender, EventArgs e)
 {
     if (comboBoxQualificationRound.SelectedItem != null)
     {
         ComboQRExtension item = comboBoxQualificationRound.SelectedItem as ComboQRExtension;
         SaveFileDialog   sfd  = new SaveFileDialog();
         sfd.FileName = "AirNavigationRaceStartList.xlsx";
         sfd.Title    = "Export Startlist";
         sfd.ShowDialog();
         String filename = sfd.FileName;
         ExportToExcel(item, filename);
     }
 }
        private void comboBoxQualificRound_SelectedIndexChanged(object sender, EventArgs e)
        {
            qualificRound = null;
            if (comboBoxQualificRound.SelectedItem != null)
            {
                ComboQRExtension cce = comboBoxQualificRound.SelectedItem as ComboQRExtension;
                if (cce != null)
                {
                    qualificRound = cce.q;
                    dataGridView2.Rows.Clear();
                    long             min = long.MaxValue;
                    long             max = long.MinValue;
                    List <FlightSet> CompetitionTeamList = qualificRound.FlightSet.ToList();
                    CompetitionTeamList.Sort((p, q) => p.StartID.CompareTo(q.StartID));
                    List <Point> points = new List <Point>();
                    foreach (FlightSet ct in qualificRound.FlightSet)
                    {
                        min = Math.Min(ct.TimeTakeOff, min);
                        max = Math.Max(ct.TimeEndLine, max);

                        DataGridViewRow dgvr = new DataGridViewRow();
                        dgvr.CreateCells(dataGridView2);
                        dgvr.SetValues(new string[] { ct.StartID.ToString(), "0", getTeamDsc(ct), new DateTime(ct.TimeTakeOff).ToShortTimeString(), new DateTime(ct.TimeStartLine).ToShortTimeString(), new DateTime(ct.TimeEndLine).ToShortTimeString(), getRouteText(ct.Route) });
                        dataGridView2.Rows.Add(dgvr);
                        dgvr.Tag = ct;
                    }

                    parcour = cce.q.ParcourSet;
                    MapSet       map = parcour.MapSet;
                    MemoryStream ms  = new MemoryStream(map.PictureSet.Data);
                    visualisationPictureBox1.Image = System.Drawing.Image.FromStream(ms);
                    visualisationPictureBox1.SetConverter(new Converter(map));
                    visualisationPictureBox1.SetParcour(parcour);
                    visualisationPictureBox1.Invalidate();
                    visualisationPictureBox1.Refresh();
                    this.BeginInvoke(new MethodInvoker(updatePoints));
                    dataGridView2_SelectionChanged(sender, e);
                }
                else
                {
                    dataGridView2.Rows.Clear();
                }
            }
            else
            {
                dataGridView2.Rows.Clear();
            }
        }
        private void btnSyncExcel_Click(object sender, EventArgs e)
        {
            // this has not been tested after changes in version 2.0.0
            // therefore unsupported UFN
            return;

            if (comboBoxQualificationRound.SelectedItem != null)
            {
                ComboQRExtension item = comboBoxQualificationRound.SelectedItem as ComboQRExtension;
                OpenFileDialog   sfd  = new OpenFileDialog();
                sfd.FileName = "AirNavigationRaceStartList.xlsx";
                sfd.Title    = "Sync Startlist";
                sfd.ShowDialog();
                String filename = sfd.FileName;
                ImportFromExcel(item, filename);
                ExportToExcel(item, filename);
            }
        }
        //private class QualiComboBoxItem
        //{
        //    public QualificationRoundSet q;
        //    public QualiComboBoxItem(QualificationRoundSet q)
        //    {
        //        this.q = q;
        //    }

        //    public override string ToString()
        //    {
        //        return q.Name;
        //    }
        //}

        private void btnExportGpx_Click(object sender, EventArgs e)
        {
            {
                SaveFileDialog fbd = new SaveFileDialog();
                fbd.Filter           = "all files (*.*)| *.*";
                fbd.InitialDirectory = Path.GetDirectoryName(Environment.SpecialFolder.Recent.ToString());
                fbd.FileName         = "File.gpx";
                fbd.DefaultExt       = ".gpx";
                fbd.OverwritePrompt  = true;
                fbd.RestoreDirectory = true;
                fbd.Title            = "Export Flights";

                ComboQRExtension      item = comboBoxQualificationRound.SelectedItem as ComboQRExtension;
                QualificationRoundSet q    = item.q;
                if (fbd.ShowDialog() == DialogResult.OK)
                {
                    // Invoke the SaveAsGPX method on a new thread.
                    Action <string, QualificationRoundSet> invoker = new Action <string, QualificationRoundSet>(SaveAsGPX);
                    invoker.BeginInvoke(Path.GetDirectoryName(fbd.FileName), q, OnSaveAsGPXCompleted, invoker);
                }
            }
        }
        private void ExportToExcel(ComboQRExtension item, string filename)
        {
            File.WriteAllBytes(filename, Properties.Resources.Template);
            FileInfo newFile = new FileInfo(filename);

            ExcelPackage.LicenseContext = LicenseContext.NonCommercial;

            using (var pck = new ExcelPackage(newFile))
            {
                // }
                // ExcelPackage pck = new ExcelPackage(newFile);
                ExcelWorksheet Participants = pck.Workbook.Worksheets.First(p => p.Name == "Participants");
                ExcelWorksheet Teams        = pck.Workbook.Worksheets.First(p => p.Name == "Crews");
                ExcelWorksheet StartList    = pck.Workbook.Worksheets.First(p => p.Name == "StartList");
                int            i            = 2;
                foreach (SubscriberSet sub in Client.SelectedCompetition.SubscriberSet.OrderBy(p => p.LastName))
                {
                    Participants.Cells[("A" + i)].Value = sub.LastName;
                    Participants.Cells[("B" + i)].Value = sub.FirstName;
                    i++;
                }
                i = 2;
                foreach (TeamSet t in Client.SelectedCompetition.TeamSet.OrderBy(p => int.Parse(p.CNumber)))
                {
                    Teams.Cells[("A" + i)].Value = int.Parse(t.CNumber);
                    Teams.Cells[("B" + i)].Value = t.Nationality;
                    Teams.Cells[("C" + i)].Value = t.Pilot.LastName + " " + t.Pilot.FirstName;
                    Teams.Cells[("D" + i)].Value = t.Navigator == null ? "" : t.Navigator.LastName + " " + t.Navigator.FirstName;
                    Teams.Cells[("E" + i)].Value = t.AC;
                    i++;
                }
                i = 2;
                foreach (FlightSet f in item.q.FlightSet.OrderBy(p => p.StartID))
                {
                    if (i == 2)
                    {
                        StartList.Cells[("K" + i)].Value = new DateTime(f.TimeTakeOff).ToString(C_TimeFormat, DateTimeFormatInfo.InvariantInfo);
                    }
                    StartList.Cells[("A" + i)].Value = f.StartID;
                    StartList.Cells[("B" + i)].Value = int.Parse(f.TeamSet.CNumber);
                    StartList.Cells[("C" + i)].Value = f.TeamSet.AC;
                    string pilot     = f.TeamSet.Pilot.LastName + " " + f.TeamSet.Pilot.FirstName;
                    string navigator = "";
                    if (f.TeamSet.Navigator != null)
                    {
                        navigator = " - " + f.TeamSet.Navigator.LastName + " " + f.TeamSet.Navigator.FirstName;
                    }
                    string   crew = pilot + navigator;
                    DateTime dt   = new DateTime(f.TimeTakeOff);
                    StartList.Cells[("D" + i)].Value = crew;
                    StartList.Cells[("E" + i)].Value = dt.AddMinutes(-C_Timespan_EndPlanningToTKOF).ToString(C_TimeFormat, DateTimeFormatInfo.InvariantInfo);
                    StartList.Cells[("F" + i)].Value = dt.AddMinutes(-C_Timespan_EndPlanningToTKOF).ToString(C_TimeFormat, DateTimeFormatInfo.InvariantInfo);
                    StartList.Cells[("G" + i)].Value = dt.ToString(C_TimeFormat, DateTimeFormatInfo.InvariantInfo);
                    StartList.Cells[("H" + i)].Value = new DateTime(f.TimeStartLine).ToString(C_TimeFormat, DateTimeFormatInfo.InvariantInfo);
                    StartList.Cells[("I" + i)].Value = new DateTime(f.TimeEndLine).ToString(C_TimeFormat, DateTimeFormatInfo.InvariantInfo);
                    StartList.Cells[("J" + i)].Value = ((Route)f.Route).ToString();
                    i++;
                }
                pck.Save();
            }
        }
        private void ImportFromExcel(ComboQRExtension item, string filename)
        {
            // this has not been tested after changes in version 2.0.0
            // therefore unsupported UFN
            return;

            FileInfo newFile = new FileInfo(filename);

            ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
            //ExcelPackage pck = new ExcelPackage(newFile);
            using (var pck = new ExcelPackage(newFile))
            {
                ExcelWorksheet Participants = pck.Workbook.Worksheets.First(p => p.Name == "Participants");
                ExcelWorksheet Teams        = pck.Workbook.Worksheets.First(p => p.Name == "Crews");
                ExcelWorksheet StartList    = pck.Workbook.Worksheets.First(p => p.Name == "StartList");
                int            i            = 2;
                while (i < 200)
                {
                    string LastName  = Participants.Cells[("A" + i)].Value as string;
                    string FirstName = Participants.Cells[("B" + i)].Value as string;
                    if (LastName != null && FirstName != null && LastName != "" && FirstName != "")
                    {
                        if (!Client.SelectedCompetition.SubscriberSet.Any(p => p.LastName == LastName && p.FirstName == FirstName))
                        {
                            SubscriberSet sub = new SubscriberSet();
                            sub.CompetitionSet = Client.SelectedCompetition;
                            sub.LastName       = LastName;
                            sub.FirstName      = FirstName;
                            Client.DBContext.SubscriberSet.Add(sub);
                        }
                    }
                    else
                    {
                        break;
                    }
                    i++;
                }
                Client.DBContext.SaveChanges();
                i = 2;
                while (i < 200)
                {
                    double?cNumber     = Teams.Cells[("A" + i)].Value as double?;
                    string nationality = Teams.Cells[("B" + i)].Value as string;
                    string pilot       = Teams.Cells[("C" + i)].Value as string;
                    string navigator   = Teams.Cells[("D" + i)].Value as string;
                    string ac          = Teams.Cells[("E" + i)].Value as string;
                    if (cNumber.HasValue && pilot != null && pilot != "")
                    {
                        SubscriberSet pilotS     = Client.SelectedCompetition.SubscriberSet.First(p => pilot.Contains(p.FirstName) && pilot.Contains(p.LastName));
                        SubscriberSet navigatorS = null;
                        if (navigator != null && navigator != "")
                        {
                            navigatorS = Client.SelectedCompetition.SubscriberSet.First(p => navigator.Contains(p.FirstName) && navigator.Contains(p.LastName));
                        }
                        TeamSet t = null;
                        if (Client.SelectedCompetition.TeamSet.Any(p => p.CNumber == ((int)cNumber.Value).ToString()))
                        {
                            t = Client.SelectedCompetition.TeamSet.First(p => p.CNumber == ((int)cNumber.Value).ToString());
                        }
                        else
                        {
                            t = new TeamSet();
                            t.CompetitionSet = Client.SelectedCompetition;
                            Client.DBContext.TeamSet.Add(t);
                        }
                        t.Pilot       = pilotS;
                        t.Navigator   = navigatorS;
                        t.CNumber     = ((int)cNumber.Value).ToString();
                        t.Nationality = nationality;
                        t.AC          = ac;
                    }
                    else
                    {
                        break;
                    }
                    i++;
                }
                Client.DBContext.SaveChanges();
                i = 2;
                DateTime?date = null;
                while (i < 200)
                {
                    if (i == 2)
                    {
                        date = StartList.Cells[("K" + i)].Value as DateTime?;
                    }
                    double?startId = StartList.Cells[("A" + i)].Value as double?;
                    double?cNumber = StartList.Cells[("B" + i)].Value as double?;
                    double?takeOff = StartList.Cells[("G" + i)].Value as double?;
                    double?start   = StartList.Cells[("H" + i)].Value as double?;
                    double?end     = StartList.Cells[("I" + i)].Value as double?;
                    string route   = StartList.Cells[("J" + i)].Value as string;
                    if (date != null && date.HasValue && takeOff != null && start != null && end != null && startId.HasValue && cNumber.HasValue && takeOff.HasValue && start.HasValue && end.HasValue && route != null)
                    {
                        FlightSet f = null;
                        if (item.q.FlightSet.Any(p => p.StartID == startId.Value))
                        {
                            f = item.q.FlightSet.First(p => p.StartID == startId.Value);
                        }
                        else
                        {
                            f = new FlightSet();
                            f.QualificationRoundSet = item.q;
                            f.StartID = ((int)startId.Value);
                            Client.DBContext.FlightSet.Add(f);
                        }
                        f.TeamSet = Client.SelectedCompetition.TeamSet.First(p => p.CNumber == ((int)cNumber.Value).ToString());
                        f.Route   = (int)Enum.Parse(typeof(Route), route, true);
                        DateTime d  = date.Value;
                        DateTime to = DateTime.FromOADate(takeOff.Value);
                        DateTime st = DateTime.FromOADate(start.Value);
                        DateTime en = DateTime.FromOADate(end.Value);
                        f.TimeTakeOff   = new DateTime(d.Year, d.Month, d.Day, to.Hour, to.Minute, to.Second).Ticks;
                        f.TimeStartLine = new DateTime(d.Year, d.Month, d.Day, st.Hour, st.Minute, st.Second).Ticks;
                        f.TimeEndLine   = new DateTime(d.Year, d.Month, d.Day, en.Hour, en.Minute, en.Second).Ticks;
                    }
                    else
                    {
                        break;
                    }
                    i++;
                }
                Client.DBContext.SaveChanges();
            }
        }