コード例 #1
0
ファイル: TeamPin.cs プロジェクト: zukoj/SOEN490-ETD
        //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());
            }
        }