Package view

Source Code of view.StationButton

package view;

import java.awt.Choice;
import java.awt.Color;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.LinkedList;

import javax.swing.JButton;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;

import model.Line;
import model.Station;
import model.Timetable;
import controller.Controller;

/**
* La classe <b>StationButton</b> permet de créer des boutons représentant
* des stations sur la carte
*
* @version 1.0
* @author Pierre Facq
* @author Alan Grente-Lequertier
* @author Alexandre Paris-Vergne
* @author Thomas Sileghem
*
*/
public class StationButton {
  Controller controller;
 
  Station station;
  Point initialPosition;
 
  /**
   * Initialise un StationButton avec un panel et une Station
   *
   * @param parent le panel dans lequel sera implémenté le bouton
   * @param station la station qui sera représentée par le bouton
   */
  public StationButton(final PersonnalPanel parent, final Station station)
  {
    this.controller = parent.controller;
    this.station = station;
   
    int x = parent.getWidth();
    int y = parent.getHeight();
   
    //Taille du bouton adaptée en fonction de la taille de la fenêtre
    int taille = Math.min(x, y)/100;
   
    //Crée un bouton et le place en fonction de la longitude et latitude de la
    //station
    Button button = new Button(station.getName(),
        (int) (parent.xMid - (parent.longMid - station.getLongitude())*parent.scalingX),
        (int) (parent.yMid + (parent.latMid - station.getLatitude())*parent.scalingY),
        taille,
        taille,
        new Color(0x20, 0x70, 0xA0),
        parent.controller);
    button.addMouseListener(new MouseListener() {
     
      //Change la longitude et la latitude de la station après le drop d'un drag and drop
      @Override
      public void mouseReleased(MouseEvent e) {
       
        if(e.isShiftDown() && initialPosition != null)
        {
          station.setLongitude(station.getLongitude() + (e.getX() - initialPosition.x) / parent.scalingX);
          station.setLatitude(station.getLatitude() - (e.getY() - initialPosition.y) / parent.scalingY );
         
          ((Button)e.getSource()).updateUI();
        }
       
        initialPosition = null;
      }
     
      //En cas de clic sur la souris
      @Override
      public void mousePressed(MouseEvent e) {
       
        //Si clic gauche simple
        if(e.getButton() == MouseEvent.BUTTON1)
        {
          //Si la touche shift est enfoncée
          if(e.isShiftDown())
          {
            //Début du drag and drop
            initialPosition = e.getPoint();
          }
          else
          {
            selectLines();
          }
        }
        //Si clic droit simple
        else if(e.getButton() == MouseEvent.BUTTON3)
        {
          //Nouveau menu permettant de lancer la modification ou
          //la suppression de la station
          JPopupMenu popUp = new JPopupMenu();
         
          JMenuItem update = new JMenuItem("modifier");
          JMenuItem delete = new JMenuItem("supprimer");
         
          update.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
             
              AlterStations alterStation = new AlterStations(controller);
              alterStation.setStation(StationButton.this.station);
              alterStation.alterPopup();
                           
              parent.requestFocus();
            }
          });
         
          delete.addActionListener(new ActionListener() {
           
            @Override
            public void actionPerformed(ActionEvent arg0) {
             
              DeleteStation deleteStation = new DeleteStation(controller);
              deleteStation.setStation(StationButton.this.station);
              deleteStation.confirmPopup();
             
              parent.requestFocus();
            }
          });
         
          popUp.add(update);
          popUp.add(delete);
         
          popUp.show(e.getComponent(), e.getX(), e.getY());
        }
      }
     
      @Override
      public void mouseExited(MouseEvent e) {}
     
      @Override
      public void mouseEntered(MouseEvent e) {}
     
      @Override
      public void mouseClicked(MouseEvent arg0) {}
    });
   
   
    parent.add(button);
  }
 
  /**
   * Lance une pop-up permettant de choisir une des lignes reliées
   * à la station si la station est reliée à une ou des lignes
   */
  public void selectLines(){
    Station toShow = this.station;

    String contenu = new String();
    contenu = "Sélectionner la ligne à afficher.\n";

    LinkedList<Line> lines = controller.getMap().searchLineOnStations(
        toShow);
    int size = lines.size();

    //Si la station est reliée à au moins une ligne
    if (size > 0) {
      Object objLines[] = new Object[size];

      for (int i = 0; i < size; i++)
        objLines[i] = lines.get(i).getName().toString();

      //Crée la pop-up contenant les boutons des lignes et une chaîne de caractères
      int option = JOptionPane.showOptionDialog(null, contenu,
          toShow.getName(), JOptionPane.PLAIN_MESSAGE,
          JOptionPane.CANCEL_OPTION, null, objLines, objLines[0]);

      //Si l'utilisateur a choisi une des lignes
      if (option >= 0) {
        Line converted = this.controller.getMap().convertToLine(
            objLines[option]);
       
        this.choosePeriod(toShow, converted);
      }
    }
  }

  /**
   * Lance une pop-up qui permet de choisir la période sur laquelle
   * on veut avoir des informations
   *
   * @param toShow la station reliée au StationButton
   * @param converted La ligne sélectionnée
   */
  private void choosePeriod(Station toShow, Line converted) {
   
    //Liste déroulante contenant "semaine" ou "week-end"
    Choice period = new Choice();
    period.addItem("Semaine");
    period.addItem("Week-end");

    //Message contenant une chaîne de caractères avec l'horaire du prochain passage
    //et la période dans laquelle est situé cet horaire
    Object[] message = new Object[] {
        "Prochain passage : "
            + this.controller.getMap().getNextArrival(
                converted, toShow) + "\nPériode : ",
        period };

    //Crée la pop-up contenant le message
    int r = JOptionPane.showConfirmDialog(null, message,
        "Choisissez votre période",
        JOptionPane.OK_CANCEL_OPTION);

    String label = new String();

    //Si l'utilisateur a cliqué sur le bouton "OK"
    if (r == JOptionPane.OK_OPTION) {
      label = period.getSelectedItem();
      this.displaySchedule(label, toShow, converted);
    }
  }

  /**
   * Affiche les horaires liés à la station, pour la ligne sélectionnée et la période
   * choisie
   *
   * @param label une chaîne de caractères identifiant la période
   * @param toShow la station reliée au StationButton
   * @param converted la ligne sélectionnée
   */
  private void displaySchedule(String label, Station toShow, Line converted) {

    String contenu;
    int size;

    LinkedList<Timetable> schedule = this.controller.getMap()
        .searchSchedule(converted, toShow);

    contenu = "";
    size = schedule.size();

    for (int i = 0; i < size; i++) {
      contenu += schedule.get(i).periodsToString(label) + "\n";
    }

    if (contenu.equals("\n") || contenu.equals(""))
      contenu = "Aucun horaire disponible !";

    //Affiche un message contenant les horaires
    JOptionPane.showMessageDialog(null, contenu,
        converted.getName() + " - " + toShow.getName()
            + " - " + label, JOptionPane.PLAIN_MESSAGE);
  }
}
TOP

Related Classes of view.StationButton

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.