Beispiel #1
0
        //Override the default DragStop method to add functionality to it
        public override void DragStop(Canvas Canvas_map, MouseButtonEventArgs e)
        {
            //Merging teams
            if (parentPin != null && SufficientOverlap(parentPin)) //Want to merge
            {
                Team.removeSplitTeam(team);                        //Delete the fragment
                if (gpsLocation != null)
                {
                    gpsLocation.setTeamSplit(false);                     //Reactivationg gps
                }

                //Removing rogue arrows that might appear by movement of the teams or interventions while teams where split
                RemoveArrow();
                parentPin.RemoveArrow();
                if (interventionPin != null)
                {
                    interventionPin.RemoveArrow();
                }

                mapSection.Update();
            }

            //Identifying whether the user wants to split the team
            Intervention splitIntervention = null;

            if (team.getStatus().ToString().Equals("intervening"))
            {
                foreach (Pin pin in pinList)
                {
                    if (SufficientOverlap(pin) && pin.IsOfType("InterventionPin") && pin != interventionPin)
                    {
                        splitIntervention = ((InterventionPin)pin).getIntervention();
                        break;
                    }
                }
            }

            bool accidentalDrag = false;

            if (splitIntervention != null)
            {
                //Disabling GPS because of its unreliability when the team is split
                if (gpsLocation != null)
                {
                    gpsLocation.setTeamSplit(true);
                }

                //Creating team as a duplicate of the initial team, name it using the number of the intervention it is assigned to
                Team team2 = new Team(team);
                team2.setName(team.getName() + splitIntervention.getInterventionNumber());
                splitIntervention.AddInterveningTeam(team2); //Assigning split team onto the second intervention
                mapSection.Update();                         //Redrawing map so that the split team pin gets recreated with a pointer to the interventionPin it is assigned to
                return;
            }
            else if (interventionPin != null && interventionPin.getInterventionContainer() != null) //Handling the case when the team was in an intervention, choose between keeping it on the intervention (for an accidental drag-and-drop) or removing it from the intervention
            {
                if (SufficientOverlap(interventionPin.getInterventionContainer()))                  //Considered accidental drag-and-drop
                {
                    accidentalDrag = true;
                    interventionPin.getInterventionContainer().PlaceAll();
                }
                else //Remove team from intervention
                {
                    interventionPin.getIntervention().RemoveInterveningTeam(team);
                    interventionPin.SelectGPSLocation();
                    team.setStatus("unavailable");

                    //If it was the last team on that intervention and it has been removed, force redrawing of the map so that the InterventionContainer is removed
                    if (interventionPin.getInterveningTeamsPin().Count == 0)
                    {
                        mapSection.Update();
                        return;
                    }

                    interventionPin = null;
                }
            }
            else if (team.getStatus().ToString().Equals("available"))            //If the team was available and has been moved, set the team as moving
            {
                team.setStatus("moving");
            }

            base.DragStop(Canvas_map, e);

            //Handle situation when the TeamPin is tracked by GPS and the user moves it
            if (gpsLocation != null && GPSLocation.gpsConfigured == true && !accidentalDrag)
            {
                //Create and draw the arrow to the destination point and replace pin at current GPS position
                GPSPinDrop(GPSServices.connectedToServer && gpsLocation.PhoneOnline());
            }
        }
        //Places all the pins appropriately relatively to the InterventionPin
        public void PlaceAll()
        {
            //Determine the number of rows that the border is going to have with the interventionPin on top and then 2 teams per row
            int    teamRows = 0;
            double height   = ((double)interventionPin.getInterveningTeamsPin().Count) / 2;

            teamRows   += (int)Math.Ceiling(height);
            this.Height = interventionPin.Height + (teamRows * TeamPin.size);

            //Determine the number of columns that the border is going to have, if more than one team than there will be two columns
            int columns = 1;

            if (interventionPin.getInterveningTeamsPin().Count() > 1)
            {
                columns = 2;
            }
            this.Width = columns * TeamPin.size;

            //Places a border around the intervention pin
            setBorderPosition(interventionPin.getX(), interventionPin.getY());

            double Y = interventionPin.getY() + (InterventionPin.size / 2) + (TeamPin.size / 2);

            for (int i = 0; i < interventionPin.getInterveningTeamsPin().Count; i++)
            {
                TeamPin teamPin = interventionPin.getInterveningTeamsPin()[i];
                if ((i % 2) == 0)                                                  //First item on line
                {
                    if ((i + 1) == interventionPin.getInterveningTeamsPin().Count) //Single on the line
                    {
                        if (teamPin.gpsLocation != null && !teamPin.getTeam().getStatus().ToString().Equals("intervening") && destinationArrowDictionnary.ContainsKey(teamPin.getTeam()) && GPSLocation.gpsConfigured == true && GPSServices.connectedToServer && teamPin.gpsLocation.PhoneOnline())
                        {
                            if (destinationArrowDictionnary[teamPin.getTeam()] != null)
                            {
                                destinationArrowDictionnary[teamPin.getTeam()].ChangeEnd(interventionPin.getX(), Y);
                            }
                        }
                        else
                        {
                            teamPin.setPinPosition(interventionPin.getX(), Y);
                        }
                    }
                    else                     //There's another item on the line
                    {
                        if (teamPin.gpsLocation != null && !teamPin.getTeam().getStatus().ToString().Equals("intervening") && destinationArrowDictionnary.ContainsKey(teamPin.getTeam()) && GPSLocation.gpsConfigured == true && GPSServices.connectedToServer && teamPin.gpsLocation.PhoneOnline())
                        {
                            if (destinationArrowDictionnary[teamPin.getTeam()] != null)
                            {
                                destinationArrowDictionnary[teamPin.getTeam()].ChangeEnd(interventionPin.getX() - (TeamPin.size / 2), Y);
                            }
                        }
                        else
                        {
                            teamPin.setPinPosition(interventionPin.getX() - (TeamPin.size / 2), Y);
                        }
                    }
                }
                else                 //Second item on the line
                {
                    if (teamPin.gpsLocation != null && !teamPin.getTeam().getStatus().ToString().Equals("intervening") && destinationArrowDictionnary.ContainsKey(teamPin.getTeam()) && GPSLocation.gpsConfigured == true && GPSServices.connectedToServer && teamPin.gpsLocation.PhoneOnline())
                    {
                        if (destinationArrowDictionnary[teamPin.getTeam()] != null)
                        {
                            destinationArrowDictionnary[teamPin.getTeam()].ChangeEnd(interventionPin.getX() + (TeamPin.size / 2), Y);
                        }
                    }
                    else
                    {
                        teamPin.setPinPosition(interventionPin.getX() + (TeamPin.size / 2), Y);
                    }
                    Y += TeamPin.size;
                }
            }
        }