@SuppressWarnings("unused")
 private void drawFrameRate(int xp, int yp) {
   // draw frame rate!
   parent.textAlign(PConstants.LEFT, PConstants.TOP);
   parent.textFont(parent.font);
   parent.textSize(18);
   parent.fill(0);
   parent.text(parent.frametimer.getFrameRateAsText(), xp, yp);
   // System.out.println(frametimer.getFrameRateAsText());
 }
  void draw() {
    if (record) {
      // Note that #### will be replaced with the frame number. Fancy!
      parent.beginRecord(PConstants.PDF, "frame-####.pdf");
      parent.textMode(PConstants.SHAPE);
      parent.font = parent.createFont("Verdana", 18); // recreate as a
      // shape
      parent.textFont(parent.font);
    }
    parent.background(130, 130, 130);

    if (currentLarge == null) {
      // draw the actual timeline
      for (TwitterFilteringComponent a : timePoints) {
        a.draw();
        drawLinksTo(a);
        // moveToPosition(a);
      }

      drawTimeLine();
      fixOverlaps();
      // draw visualisations!
    } else {
      currentLarge.draw();
    }
    if (record) {
      parent.endRecord();
      parent.textMode(PConstants.MODEL);
      record = false;
    }
    // drawFrameRate(0,25);
    // controlP5.draw();
  }
  void drawLinksTo(TwitterFilteringComponent t) {
    parent.noStroke();
    parent.fill(170, 170, 255, 130);
    int targetY;

    targetY = (t.y < lineY ? (t.y + t.height) : t.y);

    // println(t.y + " and " + targetY);
    // draw links from timeline to this component
    parent.beginShape(PConstants.POLYGON);
    parent.vertex(
        PApplet.map(
            getHourOfYear(t.dateSelection.getStart()),
            getHourOfYear(timelineStartDate),
            getHourOfYear(timelineEndDate),
            lineStart,
            lineStop),
        lineY);
    parent.vertex(t.x, targetY);
    parent.vertex(t.x + t.width, targetY);
    parent.vertex(
        PApplet.map(
            getHourOfYear(t.dateSelection.getEnd()),
            getHourOfYear(timelineStartDate),
            getHourOfYear(timelineEndDate),
            lineStart,
            lineStop),
        lineY);
    parent.endShape();
  }
 public void keyPressed() {
   if (currentLarge == null) {
     if (parent.key == '(') {
       parent.saveFrame("VASTMC2-####.png");
       record = true; // disable 'cos text should come first
     } else if (parent.key == ')') {
       addNew();
     }
   } else {
     /*
      * if(e.getKeyCode()==PConstants.ENTER){ //finish annotation! }
      */
   }
   /*
    * else if (parent.key == 'S') {
    * parent.saveFrame("VASTMC2-large-####.png"); record = true; } }
    */
 }
  void drawTimeLine() {

    // draw the base timeline

    int minorTickHeight = (int) (20 * scaleFactorY);
    int majorTickHeight = (int) (40 * scaleFactorY);
    parent.strokeWeight(10);
    parent.stroke(0);
    parent.line(lineStart, lineY, lineStop, lineY);
    // draw days
    // int maxDays = Days.daysBetween(timelineStartDate,
    // timelineEndDate).getDays();
    int maxHours = Hours.hoursBetween(timelineStartDate, timelineEndDate).getHours();
    // println("Interval  is " + fullTimeInterval);
    // println("Period is " + Days.daysBetween(minDate, maxDate).getDays());
    // println("Max days is " + maxDays);

    DateTime tempdt = new DateTime(timelineStartDate);
    String previousMonth = timelineStartDate.monthOfYear().getAsText();
    int previousDay = -1; // =tempdt.dayOfYear().get();
    int monthStart = lineStart;
    parent.textAlign(PConstants.CENTER, PConstants.TOP);

    for (int a = 0; a < maxHours; a++) {
      // println(a);
      parent.textAlign(PConstants.CENTER, PConstants.TOP);
      // draw label
      parent.textFont(parent.font);
      parent.textSize(10 * fontScale);

      if (tempdt.dayOfYear().get() != previousDay) {
        int tx = (int) (PApplet.map(a, 0, maxHours, lineStart, lineStop));
        // draw tick
        parent.strokeWeight(1);
        parent.line(tx, lineY, tx, lineY + minorTickHeight);
        previousDay = tempdt.dayOfYear().get();
        parent.fill(0);
        if (tempdt.dayOfMonth().get() == 1) {
          // special case!
          parent.textSize(14 * fontScale);
          parent.text(
              tempdt.dayOfMonth().getAsString(),
              tx,
              lineY + majorTickHeight + parent.textDescent());
        } else {
          parent.text(
              tempdt.dayOfMonth().getAsString(),
              tx,
              lineY + minorTickHeight + parent.textDescent());
        }

        // check if need to draw monthName
        if (!previousMonth.equals(tempdt.monthOfYear().getAsText())) {
          // draw some visual markers!
          // line(monthStart, lineY, monthStart,
          // lineY+majorTickHeight);
          parent.line(tx, lineY, tx, lineY + majorTickHeight);
          // position halfway between monthStart and tx, draw
          // monthname
          parent.textSize(18 * fontScale);
          // check! do we overlap the next month? if so, change
          // alignment
          if (parent.textWidth(previousMonth) / 2 + monthStart > tx) {
            parent.textAlign(PConstants.RIGHT, PConstants.TOP);
          }
          parent.text(
              previousMonth,
              (tx + monthStart) / 2,
              lineY + minorTickHeight + 2 * (parent.textAscent() + parent.textDescent()));
          previousMonth = tempdt.monthOfYear().getAsText();
          monthStart = tx;
        }
      }
      tempdt = tempdt.plus(Period.hours(1));
    }
    // draw final day
    parent.line(lineStop, lineY, lineStop, lineY + minorTickHeight);
    if (tempdt.dayOfMonth().get() == 1) {
      // special case!
      parent.text(
          tempdt.dayOfMonth().getAsString(),
          lineStop,
          lineY + majorTickHeight + parent.textDescent());
    } else {
      parent.text(
          tempdt.dayOfMonth().getAsString(),
          lineStop,
          lineY + minorTickHeight + parent.textDescent());
    }
    // draw final month!
    parent.textSize(18 * fontScale);
    parent.text(
        tempdt.monthOfYear().getAsText(),
        (lineStop + monthStart) / 2,
        lineY + minorTickHeight + 2 * (parent.textAscent() + parent.textDescent()));
  }