/* (non-Javadoc)
  * @see de.artcom.timeline.controller.TimeRangeController#mouseDragged(java.awt.event.MouseEvent)
  */
 @Override
 public void mouseDragged(MouseEvent e) {
   super.mouseDragged(e);
   boolean _myPressedShift =
       (e.getModifiersEx() & MouseEvent.SHIFT_DOWN_MASK) == MouseEvent.SHIFT_DOWN_MASK;
   if (_myPressedShift) {
     switch (_myLoopAction) {
       case MOVE_END:
         _myTrackDataController
             .trackData()
             .scaleRange(_myLoopStart, _myLoopEnd, _myNewLoopStart, _myNewLoopEnd);
         break;
       case MOVE_BOTH:
         if (_myMoveList == null) break;
         for (ControlPoint myPoint : _myMoveList) {
           _myTrackDataController
               .trackData()
               .move(
                   myPoint,
                   new ControlPoint(
                       myPoint.time() + (_myNewLoopStart - _myLoopStart), myPoint.value()));
         }
         break;
       default:
         break;
     }
   }
 }
 public void assignTrackData(TrackController theController) {
   if (_myTrackDataController != null) {
     _myTrackDataController.clearSelection();
   }
   _myTrackDataController = theController;
   _myTransportView = _myTrackDataController;
   _myTrackDataController.selection(_mySelection);
 }
  public void replace() {
    if (_myLastSelection.size() == 0) {
      return;
    }
    TrackData myModel = _myTrackDataController.trackData();

    double myRange = _myLastUpperBound - _myLastLowerBound;
    ArrayList<ControlPoint> myInsertion = prepareInsertion(_myTimeRange.start(), myRange, myModel);

    myModel.replaceAll(_myTimeRange.start(), myRange, myInsertion);
    _myTrackDataController.view().render();
  }
  public void insert() {
    if (_myLastSelection.size() == 0) {
      return;
    }

    TrackData myModel = _myTrackDataController.trackData();

    ArrayList<ControlPoint> myInsertion = prepareInsertion(_myTimeRange.start(), 0, myModel);

    // insert last selection at lower bound of current selection
    myModel.insertAll(_myTimeRange.start(), _myTimeRange.range(), myInsertion);
    _myTrackDataController.view().render();
  }
  public void cut() {
    copy();

    TrackData myTrackData = _myTrackDataController.trackData();

    ArrayList<ControlPoint> myRange =
        myTrackData.copyRange(_myTimeRange.start(), _myTimeRange.end());
    myTrackData.removeAll(_myTimeRange.start(), _myTimeRange.end());

    UndoHistory.instance()
        .apply(new CutAction(_myTrackDataController, myRange, _myTimeRange.clone()));
    _myTrackDataController.view().render();
  }
  public void mouseMoved(MouseEvent e) {
    double myCurveX = _myTransportView.viewXToTime(e.getX());

    int myLoopStart = _myTransportView.timeToViewX(_myTimeRange.start());
    int myLoopEnd = _myTransportView.timeToViewX(_myTimeRange.end());

    if (CCMath.abs(myLoopStart - e.getX()) < 5) {
      _myTrackDataController.trackDataView().moveRangeCursor();
    } else if (CCMath.abs(myLoopEnd - e.getX()) < 5) {
      _myTrackDataController.trackDataView().moveRangeCursor();
    } else if (myCurveX > _myTimeRange.start() && myCurveX < _myTimeRange.end()) {
      _myTrackDataController.trackDataView().moveCursor();
    } else {
      _myTrackDataController.trackDataView().defaultCursour();
    }
  }
  public void handleMoveSegmentTo(ActionEvent actionEvent) {
    try {
      FXMLLoader loader = new FXMLLoader(getClass().getResource("/com/view/moveSegmentPopup.fxml"));
      AnchorPane pane = (AnchorPane) loader.load();
      Stage dialogStage = new Stage();
      dialogStage.setTitle("Move selected segment to track");
      dialogStage.initModality(Modality.WINDOW_MODAL);
      dialogStage.initOwner(Main.primaryStage);
      Scene scene = new Scene(pane);
      dialogStage.setScene(scene);

      MoveSegmentPopupController controller = loader.getController();
      controller.setDialogStage(dialogStage);

      dialogStage.showAndWait();

      if (controller.isOkClicked()) {
        int beat = controller.getBeat();
        String trackName = controller.getTrack();
        ObservableList<Node> tracksList = Controller.getComposeAreaVBox().getChildren();
        for (int i = 0; i < tracksList.size(); i++) {
          TrackController track = (TrackController) tracksList.get(i);
          if (track.nameProperty().getValue().equals(trackName)) {
            Rectangle rectangle = (Rectangle) track.getTrackBeats().getChildren().get(beat - 1);
            MusicSegmentController newSegment =
                new MusicSegmentController(this.name, this.length, this.width, this.audioPath);
            newSegment.setLayoutX(rectangle.getLayoutX());
            newSegment.setLayoutY(i * 55 + 6);
            Controller.anchorPaneComposition.getChildren().add(newSegment);
          }
        }
      }
    } catch (IOException ex) {
      ex.printStackTrace();
    }
  }
  public void copy() {
    TrackData myTrackData = _myTrackDataController.trackData();

    //		double myLowValue = myTrackData.getValue(_myTimeRange.start());
    //		double myHighValue = myTrackData.getValue(_myTimeRange.end());

    ArrayList<ControlPoint> myRange =
        myTrackData.copyRange(_myTimeRange.start(), _myTimeRange.end());
    _myLastSelection = new ArrayList<ControlPoint>();
    _myLastLowerBound = _myTimeRange.start();
    _myLastUpperBound = _myTimeRange.end();
    //		_myLastSelection.add(new ControlPoint(_myTimeRange.start(), myLowValue));
    _myLastSelection.addAll(myRange);
    //		_myLastSelection.add(new ControlPoint(_myTimeRange.end(), myHighValue));
  }
  /* (non-Javadoc)
   * @see de.artcom.timeline.controller.TimeRangeController#mousePressed(java.awt.event.MouseEvent)
   */
  @Override
  public void mousePressed(MouseEvent e) {
    super.mousePressed(e);

    _myMoveList = null;

    boolean _myPressedShift =
        (e.getModifiersEx() & MouseEvent.SHIFT_DOWN_MASK) == MouseEvent.SHIFT_DOWN_MASK;
    if (_myPressedShift) {
      switch (_myLoopAction) {
        case MOVE_BOTH:
          _myMoveList = _myTrackDataController.trackData().rangeList(_myLoopStart, _myLoopEnd);
          break;
        default:
          break;
      }
    }
  }
 /* (non-Javadoc)
  * @see de.artcom.timeline.controller.TimeRangeController#mouseReleased(java.awt.event.MouseEvent)
  */
 @Override
 public void mouseReleased(MouseEvent theE) {
   super.mouseReleased(theE);
   _myTrackDataController.view().render();
 }
 public void cutTime(TrackView theTimelinePanel) {
   TrackData myModel = _myTrackDataController.trackData();
   _myLastSelection = myModel.copyRange(_myTimeRange.start(), _myTimeRange.end());
   myModel.cutRange(_myTimeRange.start(), _myTimeRange.end());
   _myTrackDataController.view().render();
 }