/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package robotinterface.gui.panels.sidepanel;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.event.KeyEvent;
import java.awt.geom.RoundRectangle2D;
import java.util.ArrayList;
import java.util.Collection;
import javax.swing.UIManager;
import robotinterface.drawable.swing.WidgetContainer;
import robotinterface.drawable.GraphicObject;
import robotinterface.drawable.DrawingPanel;
import robotinterface.plugin.Pluggable;
/**
*
* @author antunes
*/
public class SidePanel extends WidgetContainer {
private int panelWidth = 100;
private int panelItensHeight = 0;
private int panelItensY = 0;
private boolean open = true;
private boolean animOpen = false;
private boolean animClose = false;
private boolean zoomDisabled = false;
private boolean dragDisabled = false;
private RoundRectangle2D.Double closeBtn;
private Color color = Color.gray;
private ArrayList<Item> itens;
public SidePanel() {
itens = new ArrayList<>();
Item.setFont(UIManager.getDefaults().getFont("TabbedPane.font"));
// itens.add(new Item("Item 1", null, new RoundRectangle2D.Double(0, 0, 20, 20, 5, 5), Color.decode("#C05480")));
// itens.add(new Item("Item 2", null, SimpleContainer.createDiamond(new Rectangle2D.Double(0, 0, 20, 20)), Color.decode("#98CB59")));
this.closeBtn = new RoundRectangle2D.Double(-15, 15, 20, 20, 10, 10);
bounds.x = 0;
}
public Color getColor() {
return color;
}
public void setColor(Color color) {
this.color = color;
}
public void setOpen (boolean b){
open = b;
}
@Override
public int getDrawableLayer() {
return GraphicObject.TOP_LAYER;
}
@Override
public void drawTopLayer(Graphics2D g, DrawingPanel.GraphicAttributes ga, DrawingPanel.InputState in) {
g.setStroke(new BasicStroke());
g.setColor(Color.white);
g.fill(closeBtn);
g.setColor(color);
if (in.mouseGeneralClick() && closeBtn.contains(in.getRelativeMouse())) {
if (!(animOpen || animClose)) {
if (open) {
animClose = true;
} else {
animOpen = true;
}
}
}
if (in.isMouseOver()) {
zoomDisabled = zoomDisabled | ga.isZoomEnabled();
dragDisabled = dragDisabled | ga.isDragEnabled();
ga.setZoomEnabled(false);
ga.setDragEnabled(false);
// panelItensY -= in.getMouseDrag().y;
panelItensY += in.getMouseWheelRotation() * 20;
panelItensY = (panelItensY < (ga.getHeight() - panelItensHeight)) ? (ga.getHeight() - panelItensHeight) : panelItensY;
panelItensY = (panelItensY > 0) ? 0 : panelItensY;
} else {
if (zoomDisabled) {
ga.setZoomEnabled(true);
zoomDisabled = false;
}
if (dragDisabled) {
ga.setDragEnabled(true);
zoomDisabled = false;
}
}
g.setFont(Item.getFont());
g.draw(closeBtn);
if (open) {
g.translate(-8, 20);
g.fillPolygon(new int[]{0, 0, 6, 0},
new int[]{0, 12, 6, 0}, 4);
g.translate(8, -20);
} else {
g.translate(-9, 20);
g.fillPolygon(new int[]{0, 6, 6, 0},
new int[]{6, 12, 0, 6}, 4);
g.translate(9, -20);
}
g.fillRect(0, 0, panelWidth, ga.getHeight());
//super.setLocation(0, x);
if (in.isKeyPressed(KeyEvent.VK_1)) {
animOpen = true;
} else if (in.isKeyPressed(KeyEvent.VK_2)) {
animClose = true;
}
int x = 10, y = 10 + panelItensY;
ArrayList<Item> itensTmp = (ArrayList<Item>) itens.clone();
for (Item i : itensTmp) {
i.setLocation(x, y);
// g.setColor(Color.GREEN);
// g.draw(i.getObjectShape());
i.draw(g, ga, in);
y += i.getObjectBouds().height + 10;
panelWidth = (int) (i.getObjectBouds().width + 2 * 10);
}
panelItensHeight = y - panelItensY + 30;
//scrollbar
if (ga.getHeight() != 0 && panelItensHeight != 0) {
//tamanho_da_barra = area_visivel/tamanho_do_conteudo*tamanho_fixo_da_barra
double barSize = ga.getHeight() / (double) panelItensHeight * ga.getHeight();
//posição_da_barra = posição_do_conteudo/tamanho_do_conteudo*area_visivel
double barMidPos = -panelItensY / (double) panelItensHeight * ga.getHeight();
g.setColor(Color.white);
g.fillRect(panelWidth - 2, (int) barMidPos, 2, (int) barSize);
}
//animação
double velocity = .2; //em segundos
velocity = ga.getClock().getDt() * panelWidth / velocity;//converte para px/s dS=dt*(S/t) => dS/dt=v=(S/t) => S=v*t
if (animOpen) {
if (bounds.x > ga.getWidth() - panelWidth) {
bounds.x -= velocity;
} else {
bounds.x = ga.getWidth() - panelWidth;
animOpen = false;
open = true;
}
} else if (animClose) {
open = false;
if (bounds.x < ga.getWidth()) {
bounds.x += velocity;
} else {
bounds.x = ga.getWidth();
animClose = false;
}
} else if (open) {
bounds.width = panelWidth;
bounds.x = ga.getWidth() - panelWidth;
bounds.y = 0;
bounds.height = ga.getHeight();
} else {
bounds.width = panelWidth;
bounds.x = ga.getWidth();
bounds.y = 0;
}
}
public void add(Item item) {
itens.add(item);
item.setPanel(this);
}
public void addAll(Collection<Item> list) {
itens.addAll(list);
for (Item i : list) {
i.setPanel(this);
}
}
public void addAllClasses(Collection<Class> list) {
for (Class c : list) {
try {
if (Classifiable.class.isAssignableFrom(c)) {
Classifiable cl = (Classifiable) c.newInstance();
Item i = cl.getItem();
if (i != null) {
itens.add(i);
i.setPanel(this);
i.setRef(c);
}
} else {
throw new Exception("ClassTypeError");
}
// tmp = SidePanel.newInstance(ref);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
protected static final <T> T newInstance(Object ref) {
if (ref instanceof Class) {
Class c = (Class) ref;
if (Pluggable.class.isAssignableFrom(c)) {
try {
// return (T) c.newInstance();
Pluggable p = (Pluggable) c.newInstance();
return (T) p.createInstance();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
return null;
}
protected void ItemSelected(Item item, Object ref) {
System.out.println(ref);
}
}