protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      Graphics gg = g.create();
      if (trainNumber < 0) return;

      TrainModel tm = (TrainModel) w.get(KEY.TRAINS, trainNumber, modelRoot.getPlayerPrincipal());

      trainModelViewer.setTrainModel(tm);
      int waterRemaining = trainModelViewer.getWaterRemaining();

      int maxWater =
          ((EngineType) w.get(KEY.ENGINE_TYPES, tm.getEngineType(), Player.AUTHORITATIVE))
              .getWaterCapacity();

      // draw a dark-blue rectangle and a light blue rectangle
      gg.setColor(Color.BLUE);
      gg.fillRect(0, 0, getWidth() * waterRemaining / maxWater, getHeight());
    }
        /**
         * Cycle through train status in the following order: Priority express, standard, slow,
         * stopped
         */
        public void actionPerformed(ActionEvent e) {
          if (trainNumber == -1) return;

          TrainModel tm =
              (TrainModel) w.get(KEY.TRAINS, trainNumber, modelRoot.getPlayerPrincipal());

          int priority = tm.getPriority();
          int state = tm.getState();

          if (state == TrainModel.STATE_STOPPED) {
            state = TrainModel.STATE_RUNNABLE;
            priority = TrainModel.PRIORITY_EXPRESS;
          } else {
            switch (priority) {
              case TrainModel.PRIORITY_EXPRESS:
                priority = TrainModel.PRIORITY_NORMAL;
                break;
              case TrainModel.PRIORITY_NORMAL:
                priority = TrainModel.PRIORITY_SLOW;
                break;
              case TrainModel.PRIORITY_SLOW:
                state = TrainModel.STATE_STOPPED;
                break;
              default:
                throw new IllegalStateException();
            }
          }
          Move m;
          GameTime now = (GameTime) w.get(ITEM.TIME, Player.AUTHORITATIVE);
          if (tm.getState() != state) {
            m =
                ChangeTrainMove.generateMove(
                    trainNumber, modelRoot.getPlayerPrincipal(), tm, state, now);
            modelRoot.getReceiver().processMove(m);
            tm = (TrainModel) w.get(KEY.TRAINS, trainNumber, modelRoot.getPlayerPrincipal());
          }
          if (tm.getPriority() != priority) {
            m =
                ChangeTrainMove.generatePriorityMove(
                    trainNumber, modelRoot.getPlayerPrincipal(), tm, priority);
            modelRoot.getReceiver().processMove(m);
          }
        }
  public void displayTrain(int trainNumber) {
    this.trainNumber = trainNumber;

    trainViewJPanel1.display(trainNumber);
    String s;
    String destination = "";
    int priority = TrainModel.PRIORITY_NORMAL;
    int state = TrainModel.STATE_STOPPED;
    if (trainNumber >= 0) {
      TrainModel train =
          (TrainModel) w.get(KEY.TRAINS, trainNumber, modelRoot.getPlayerPrincipal());

      trainCargoBundleKey = train.getCargoBundle();
      CargoBundle cb = (CargoBundle) w.get(train.getCargoBundle());
      s = "Train #" + trainNumber + ": ";
      ScheduleIterator si = train.getScheduleIterator();
      TrainOrdersModel tom = si.getCurrentOrder(w);
      if (tom != null) {
        ObjectKey2 ok = tom.getStation();
        StationModel station = (StationModel) w.get(ok);
        destination = station.getStationName();
      }
      priority = train.getPriority();
      state = train.getState();
      setStatusLabel(train);
    } else {
      s = "No trains to display";
      setStatusLabel(null);
    }
    setStatusButton(priority, state);
    nameJLabel.setText(s);
    destinationJLabel.setText(destination);
  }
  private void setStatusLabel(TrainModel trainModel) {
    if (trainModel == null) {
      statusJLabel.setIcon((Icon) null);
      statusJLabel.setToolTipText("");
      return;
    }

    switch (trainModel.getState()) {
      case TrainModel.STATE_RUNNABLE:
        if (trainModel.isBlocked()) {
          statusJLabel.setIcon(blockedIcon);
          statusJLabel.setToolTipText(Resources.get("Track blocked"));
        } else if (trainModel.getTrainMotionModel().isLost()) {
          statusJLabel.setIcon(noRouteIcon);
          statusJLabel.setToolTipText(Resources.get("No route to destination"));
        } else if (trainModel.getTrainMotionModel().isOutOfWater()) {
          statusJLabel.setIcon(outOfWaterIcon);
          statusJLabel.setToolTipText(Resources.get("No water"));
        } else {
          statusJLabel.setIcon((Icon) null);
          statusJLabel.setToolTipText("");
        }
        break;
      case TrainModel.STATE_LOADING:
        statusJLabel.setIcon(loadingIcon);
        statusJLabel.setToolTipText(Resources.get("Loading"));
        break;
      case TrainModel.STATE_UNLOADING:
        statusJLabel.setIcon(unloadingIcon);
        statusJLabel.setToolTipText(Resources.get("Unloading"));
        break;
      default:
        statusJLabel.setIcon((Icon) null);
        statusJLabel.setToolTipText("");
        break;
    }
  }