package org.openbakery.racecontrol.gui;
import java.io.IOException;
import java.util.List;
import java.util.Vector;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Panel {
private static Logger log = LoggerFactory.getLogger(Panel.class);
private static final int DEFAULT_COLUMN_WIDTH = 30;
private int x;
private int y;
private int padding = 0;
private int height = 4;
private int[] columnWidth = { DEFAULT_COLUMN_WIDTH };
private Vector<Vector<Button>>columns;
private boolean isVisible = false;
public Panel(int x, int y) {
this.x = x;
this.y = y;
columns = new Vector<Vector<Button>>();
}
public void setColumns(int... width) {
columnWidth = width;
}
public void add(Button button) {
add(button, 0);
}
public void add(Button button, int column) {
add(button, column, getRowCount(column));
}
public void add(Button button, int column, int row) {
if (column >= columns.size()) {
columns.setSize(column+1);
}
Vector<Button> buttonRow = columns.get(column);
if (buttonRow == null) {
buttonRow = new Vector<Button>();
columns.add(column, buttonRow);
}
if (buttonRow.size() <= row) {
buttonRow.setSize(row+1);
}
buttonRow.set(row, button);
int positionX = x;
int width = DEFAULT_COLUMN_WIDTH;
for(int i=0; i<=column; i++) {
if (column < columnWidth.length) {
width = columnWidth[i];
} else {
width = DEFAULT_COLUMN_WIDTH;
}
positionX += width;
}
positionX-=width;
button.setX(positionX);
button.setY(y + row * (height + padding));
button.setHeight(height);
button.setWidth(width);
if (isVisible) {
try {
button.setVisible(true);
} catch (IOException e) {
log.error("Cannot show button", e);
}
}
}
public synchronized void setVisible(boolean visible) throws IOException {
if (visible) {
for (List<Button> column : columns) {
if (column != null) {
for(Button button : column) {
if (button != null) {
button.setVisible(visible);
}
}
}
}
} else {
for (List<Button> column : columns) {
if (column != null) {
for(Button button : column) {
if (button != null) {
button.setVisible(visible);
//ButtonIdHelper.getInstance().pushId(driverId, (byte)button.getId());
}
}
}
}
}
isVisible = visible;
}
public Button getButton(int clickId) {
for (List<Button> column : columns) {
if (column != null) {
for(Button button : column) {
if (button != null && button.getId() == clickId) {
return button;
}
}
}
}
return null;
}
public int getRowCount(int column) {
if (columns.size() > column) {
List<Button> row = columns.get(column);
if (row != null) {
return row.size();
}
}
return 0;
}
public Button getButton(int row, int column) {
List<Button> buttonColumn = columns.get(column);
if (buttonColumn != null) {
return buttonColumn.get(row);
}
return null;
}
public void clear() {
try {
setVisible(false);
for (List<Button> column : columns) {
if (column != null) {
for (int i=0; i<column.size(); i++) {
Button button = column.get(i);
if (button != null) {
button.destroy();
}
}
column.clear();
}
}
} catch (IOException e) {
log.error("Error at clearing panel", e);
}
}
public Button get(int x, int y) {
if (columns.size() > x) {
List<Button> column = columns.get(x);
if (column != null && column.size() > y) {
return column.get(y);
}
}
return null;
}
public boolean isVisible() {
return isVisible;
}
public void destroy() {
for (List<Button> column : columns) {
if (column != null) {
for(Button button : column) {
if (button != null) {
button.destroy();
}
}
column.clear();
}
}
}
protected void finalize() throws Throwable
{
destroy();
super.finalize();
}
}