public Rect prepareDraw(Canvas _canvas) {
    if (isCollapsed()) {
      rect = Instruction.prepareDraw(_canvas, getCollapsedText(), this);
      return rect;
    }

    rect.top = 0;
    rect.left = 0;

    rect.right = 2 * Math.round(E_PADDING / 2);

    FontMetrics fm = _canvas.getFontMetrics(Element.font);

    rect.right = Math.round(2 * (Element.E_PADDING / 2));
    for (int i = 0; i < getText().count(); i++) {
      if (rect.right
          < getWidthOutVariables(_canvas, getText().get(i), this) + 2 * Math.round(E_PADDING / 2)) {
        rect.right =
            getWidthOutVariables(_canvas, getText().get(i), this) + 2 * Math.round(E_PADDING / 2);
      }
    }

    rect.bottom = 2 * Math.round(E_PADDING / 2) + getText().count() * fm.getHeight();

    r = q.prepareDraw(_canvas);

    rect.right = Math.max(rect.right, r.right + E_PADDING);
    rect.bottom += r.bottom + E_PADDING;
    return rect;
  }
 public Element copy() {
   Element ele = new Subqueue();
   ele.setColor(this.getColor());
   for (int i = 0; i < children.size(); i++) {
     ((Subqueue) ele).addElement(((Element) children.get(i)).copy());
   }
   return ele;
 }
  // START KGU 2015-10-11: Merged with getElementByCoord, which had to be overridden as well for
  // proper Comment popping
  //	public Element selectElementByCoord(int _x, int _y)
  //	{
  //		Element selMe = super.selectElementByCoord(_x,_y);
  //		Element sel = q.selectElementByCoord(_x,_y);
  //		if(sel!=null)
  //		{
  //			selected=false;
  //			selMe = sel;
  //		}
  //
  //		return selMe;
  //	}
  @Override
  public Element getElementByCoord(int _x, int _y, boolean _forSelection) {
    Element selMe = super.getElementByCoord(_x, _y, _forSelection);
    Element sel = q.getElementByCoord(_x, _y, _forSelection);
    if (sel != null) {
      if (_forSelection) selected = false;
      selMe = sel;
    }

    return selMe;
  }
 public Element copy() {
   // Bugfix KGU#83 (bug #32) 2015-11-14: Instead of a Forever loop, a For loop had been created!
   Forever ele = new Forever(new StringList());
   ele.setComment(this.getComment().copy());
   ele.setColor(this.getColor());
   ele.q = (Subqueue) this.q.copy();
   ele.q.parent = ele;
   // START KGU#82 (bug #31) 2015-11-14
   ele.breakpoint = this.breakpoint;
   // END KGU#82 (bug #31) 2015-11-14
   return ele;
 }
 public Forever(StringList _strings) {
   super(_strings);
   q.parent = this;
   setText(_strings);
 }
 public Forever() {
   super();
   q.parent = this;
 }
  public void draw(Canvas _canvas, Rect _top_left) {
    if (isCollapsed()) {
      Instruction.draw(_canvas, _top_left, getCollapsedText(), this);
      return;
    }

    Rect myrect = new Rect();
    // START KGU 2015-10-13: All highlighting rules now encapsulated by this new method
    // Color drawColor = getColor();
    Color drawColor = getFillColor();
    // END KGU 2015-10-13
    FontMetrics fm = _canvas.getFontMetrics(font);
    //		int p;
    //		int w;

    // START KGU 2015-10-13: Became obsolete by new method getFillColor() applied above now
    //		if (selected==true)
    //		{
    //			drawColor=Element.E_DRAWCOLOR;
    //		}
    // END KGU 2015-10-13

    Canvas canvas = _canvas;
    canvas.setBackground(drawColor);
    canvas.setColor(drawColor);

    // draw background
    myrect = _top_left.copy();
    canvas.fillRect(myrect);

    // draw shape
    rect = _top_left.copy();
    canvas.setColor(Color.BLACK);
    canvas.drawRect(_top_left);

    myrect = _top_left.copy();
    myrect.bottom =
        _top_left.top + fm.getHeight() * getText().count() + 2 * Math.round(Element.E_PADDING / 2);
    canvas.drawRect(myrect);

    myrect.bottom = _top_left.bottom;
    myrect.top = myrect.bottom - E_PADDING;
    canvas.drawRect(myrect);

    myrect = _top_left.copy();
    myrect.right = myrect.left + E_PADDING;
    canvas.drawRect(myrect);

    // fill shape
    canvas.setColor(drawColor);
    myrect.left = myrect.left + 1;
    myrect.top = myrect.top + 1;
    myrect.bottom = myrect.bottom;
    myrect.right = myrect.right - 1;
    canvas.fillRect(myrect);

    myrect = _top_left.copy();
    myrect.bottom =
        _top_left.top + fm.getHeight() * getText().count() + 2 * Math.round(E_PADDING / 2);
    myrect.left = myrect.left + 1;
    myrect.top = myrect.top + 1;
    myrect.bottom = myrect.bottom;
    myrect.right = myrect.right - 1;
    canvas.fillRect(myrect);

    myrect.bottom = _top_left.bottom;
    myrect.top = myrect.bottom - Element.E_PADDING;
    myrect.left = myrect.left + 1;
    myrect.top = myrect.top + 1;
    myrect.bottom = myrect.bottom;
    myrect.right = myrect.right;
    canvas.fillRect(myrect);

    // draw comment
    if (Element.E_SHOWCOMMENTS == true && !comment.getText().trim().equals("")) {
      // START KGU 2015-10-11: Use an inherited helper method now
      //			canvas.setBackground(E_COMMENTCOLOR);
      //			canvas.setColor(E_COMMENTCOLOR);
      //
      //			Rect someRect = _top_left.copy();
      //
      //			someRect.left+=2;
      //			someRect.top+=2;
      //			someRect.right=someRect.left+4;
      //			someRect.bottom-=1;
      //
      //			canvas.fillRect(someRect);
      this.drawCommentMark(canvas, _top_left);
      // END KGU 2015-10-11
    }
    // START KGU 2015-10-11
    // draw breakpoint bar if necessary
    this.drawBreakpointMark(canvas, _top_left);
    // END KGU 2015-10-11

    // draw text
    for (int i = 0; i < getText().count(); i++) {
      String text = this.getText().get(i);
      text = BString.replace(text, "<--", "<-");

      canvas.setColor(Color.BLACK);
      writeOutVariables(
          canvas,
          _top_left.left + Math.round(E_PADDING / 2),
          _top_left.top + Math.round(E_PADDING / 2) + (i + 1) * fm.getHeight(),
          text,
          this);
    }

    // draw children
    myrect = _top_left.copy();
    myrect.left = myrect.left + Element.E_PADDING - 1;
    myrect.top =
        _top_left.top + fm.getHeight() * getText().count() + 2 * Math.round(E_PADDING / 2) - 1;
    myrect.bottom = myrect.bottom - E_PADDING + 1;
    q.draw(_canvas, myrect);
  }