void ProcessSatellites(IMapIcon parent, IEnumerable<CelestialObject> objects)
 {
     foreach (var body in objects.Where(o => o.ParentObject == parent.Body.CelestialObjectID)) {
         var icon = new PlanetIcon(body, parent, this);
         MapCanvas.Children.Add(icon); // add planet/moon/asteroid to canvas
         if (body.Children.Any()) MapCanvas.Children.Add(new OrbitIcon(icon, this)); // add orbits to canvas
         ProcessSatellites(icon, objects);
     }
 }
 void ProcessSatellites(IMapIcon parent, IEnumerable <CelestialObject> objects)
 {
     foreach (var body in objects.Where(o => o.ParentObject == parent.Body))
     {
         var icon = new PlanetIcon(body, parent, this);
         MapCanvas.Children.Add(icon); // add planet/moon/asteroid to canvas
         if (body.Children.Any())
         {
             MapCanvas.Children.Add(new OrbitIcon(icon, this));                      // add orbits to canvas
         }
         ProcessSatellites(icon, objects);
     }
 }
 void mapTab_MouseMove(object sender, MouseEventArgs e)
 {
     cursorPosition = e.GetPosition(mapTab.MapCanvas);
     var cursor = cursorPosition.Value;
     var planets = from planet in mapTab.MapCanvas.Children.OfType<PlanetIcon>()
                   let distance = Math.Sqrt(Math.Pow(cursor.X - planet.X, 2) + Math.Pow(cursor.Y - planet.Y, 2))
                   where distance < orderClickProximity/mapTab.ZoomControl.Zoom
                   orderby distance
                   select planet;
     cursorPlanet = planets.FirstOrDefault();
 }
 void mapTab_MouseLeftButtonDown(object sender, MouseButtonEventArgs _)
 {
     mapTab.MapCanvas.MouseLeftButtonDown -= mapTab_MouseLeftButtonDown;
     Application.Current.RootVisual.MouseMove -= mapTab_MouseMove;
     cursorPosition = null;
     if (cursorPlanet == null) return;
     var destination = cursorPlanet;
     cursorPlanet = null;
     var service = new PlanetWarsServiceClient();
     service.OrderFleetCompleted += (s, e) =>
         {
             transit.Fleets = e.Result;
             MessageBox.Show(cursorPlanet.Name + " called, they want their transit back!");
         };
     service.OrderFleetAsync(App.UserName, App.Password, transit.Fleets.FleetID, destination.Body.CelestialObjectID, 0);
 }