package com.baselet.element.old.activity;
import java.awt.Graphics2D;
import java.awt.Point;
import java.util.ArrayList;
import java.util.concurrent.atomic.AtomicBoolean;
import com.baselet.control.enums.Direction;
import com.baselet.diagram.DiagramHandler;
public class Container extends Element {
private final ArrayList<Column> columns;
private StartElement start;
private StopElement stop;
private final Container parent;
private final ArrayList<Row> rows;
private int max_row;
private int current_row;
private int init_row;
private final AtomicBoolean autoInsertIF;
public Container(AtomicBoolean autoInsertIF, DiagramHandler handler, Graphics2D g, Container parent, ArrayList<Row> rows, int row) {
super(handler, g, 0, null);
columns = new ArrayList<Column>();
columns.add(new Column(g));
this.rows = rows;
init_row = row;
max_row = row;
current_row = row;
this.parent = parent;
this.autoInsertIF = autoInsertIF;
if (autoInsertIF.get() && this.parent != null) {
setStartElement(new If(handler, g, null));
}
else if (this.parent != null) {
setStartElement(new StartElement(handler, g, 0, null));
}
}
public Container addNewContainer() {
Container c = new Container(autoInsertIF, getHandler(), getGraphics(), this, rows, current_row);
columns.get(columns.size() - 1).addElement(c);
return c;
}
public Container addNewWhile(String condition) {
Container c = new While(autoInsertIF, getHandler(), getGraphics(), this, rows, current_row, condition);
columns.get(columns.size() - 1).addElement(c);
return c;
}
protected ArrayList<Column> getColumns() {
return columns;
}
protected Column getLastColumn() {
return columns.get(columns.size() - 1);
}
public boolean isRoot() {
if (parent == null) {
return true;
}
return false;
}
public Container close() {
if (autoInsertIF.get() && parent != null) {
setStopElement(new EndIf(getHandler(), getGraphics(), null));
}
else if (parent != null) {
setStopElement(new StopElement(getHandler(), getGraphics(), 0, null));
}
return parent;
}
private Row getNextRow() {
while (rows.size() <= current_row) {
rows.add(new Row());
}
return rows.get(current_row);
}
private Row getFirstRow() {
int init_row = this.init_row;
if (start != null) {
init_row--;
}
while (rows.size() <= init_row) {
rows.add(new Row());
}
return rows.get(init_row);
}
private Row getLastRow() {
int max_row = this.max_row;
if (stop != null) {
max_row--;
}
while (rows.size() <= max_row) {
rows.add(new Row());
}
return rows.get(max_row);
}
private void inc_row() {
current_row++;
if (current_row > max_row) {
max_row++;
if (parent != null) {
parent.inc_row();
}
}
}
public void setStartElement(StartElement e) {
getFirstRow().exchangeElementOrInsert(start, e);
if (start == null) {
current_row++;
init_row++;
max_row++;
if (parent != null) {
parent.inc_row();
}
}
start = e;
}
public void setStopElement(StopElement e) {
getLastRow().exchangeElementOrInsert(stop, e);
if (stop == null) {
max_row++;
if (parent != null) {
parent.inc_row();
}
}
stop = e;
}
public void addColumn() {
columns.add(new Column(getGraphics()));
current_row = init_row;
}
public void addElement(Element e) {
columns.get(columns.size() - 1).addElement(e);
getNextRow().addElement(e);
inc_row();
}
@Override
public boolean arrowIn() {
if (start == null) {
return false;
}
else {
return start.arrowIn();
}
}
@Override
public boolean connectIn() {
for (Column c : columns) {
if (c.getFirstElement().connectIn()) {
return true;
}
}
return false;
}
@Override
public boolean connectOut_overrideable() {
for (Column c : columns) {
if (c.getLastElement().connectOut()) {
return true;
}
}
return false;
}
@Override
protected Point getConnect(Direction dir) {
if (dir.equals(Direction.UP)) {
if (start != null) {
return start.getConnect(dir);
}
}
if (dir.equals(Direction.DOWN)) {
if (stop != null) {
return stop.getConnect(dir);
}
}
return super.getConnect(dir);
}
@Override
protected int getHeight() {
int height = 0;
for (Column c : columns) {
int h = c.getHeight();
if (h > height) {
height = h;
}
}
if (start != null) {
height += start.getHeight();
}
if (stop != null) {
height += stop.getHeight();
}
return height;
}
@Override
public int getLeftWidth() {
int width = 0, i = 0;
for (i = 0; i < columns.size() / 2; i++) {
width += columns.get(i).getWidth();
}
if (columns.size() % 2 == 1) {
width += columns.get(i).getLeftWidth();
}
width += (columns.size() - 1) / 2.0 * (Const.COLUMN_PAD * getZoom());
if (start != null) {
if (start.getLeftWidth() > width) {
width = start.getLeftWidth();
}
}
if (stop != null) {
if (stop.getLeftWidth() > width) {
width = stop.getLeftWidth();
}
}
return width;
}
@Override
protected int getRightWidth() {
int width = 0, i = columns.size() / 2;
if (columns.size() % 2 == 1) {
width += columns.get(i).getRightWidth();
i++;
}
for (; i < columns.size(); i++) {
width += columns.get(i).getWidth();
}
width += (columns.size() - 1) / 2.0 * (Const.COLUMN_PAD * getZoom());
if (start != null) {
if (start.getRightWidth() > width) {
width = start.getRightWidth();
}
}
if (stop != null) {
if (stop.getRightWidth() > width) {
width = stop.getRightWidth();
}
}
return width;
}
@Override
public int getWidth() {
int width = 0, i = 0;
for (i = 0; i < columns.size(); i++) {
width += columns.get(i).getWidth();
}
width += (columns.size() - 1) * (Const.COLUMN_PAD * getZoom());
if (start != null) {
if (start.getWidth() > width) {
width = start.getWidth();
}
}
if (stop != null) {
if (stop.getWidth() > width) {
width = stop.getWidth();
}
}
return width;
}
@Override
public void setX(int x) {
if (start != null) {
start.setX(x);
}
if (stop != null) {
stop.setX(x);
}
if (columns.size() == 1) {
columns.get(0).setX(x);
}
else {
x -= getLeftWidth();
int i = 1;
for (Column c : columns) {
x += c.getLeftWidth();
c.setX(x);
x += c.getRightWidth();
if (i < columns.size()) {
x += Const.COLUMN_PAD * getZoom();
}
i++;
}
}
}
protected StartElement getStartElement() {
return start;
}
protected StopElement getStopElement() {
return stop;
}
public void removeEmptyColumns() {
// remove empty columns first (may be possible because of goto element
for (int i = 0; i < columns.size();) {
if (columns.get(i).isEmpty()) {
columns.remove(i);
}
else {
i++;
}
}
}
@Override
public void paint() {
boolean paintstart = connectIn();
boolean paintstop = connectOut();
if (start == null) {
paintstart = false;
}
if (stop == null) {
paintstop = false;
}
if (paintstart) {
start.paint();
}
if (paintstop) {
stop.paint();
}
for (Column c : columns) {
if (paintstart) {
start.connectTo(c.getFirstElement());
}
c.paint();
if (paintstop) {
stop.connectTo(c.getLastElement());
}
}
}
@Override
public void printData(String prefix) {
prefix += " ";
for (Column c : columns) {
c.printData(prefix + "\n");
}
}
}