package haven;
import haven.Glob.Pagina;
import java.awt.image.BufferedImage;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
public class CraftWnd extends Window implements DTarget2{
private static final int SZ = 20;
private static final int PANEL_H = 24;
private static final Coord WND_SZ = new Coord(635, 360+PANEL_H);
private static final Coord ICON_SZ = new Coord(SZ, SZ);
private static final Coord TEXT_POS = new Coord(SZ+2, SZ/2);
private RecipeListBox box;
private Tex description;
private Widget makewnd;
private MenuGrid menu;
private Pagina CRAFT;
private Breadcrumbs breadcrumbs;
private static Pagina current = null;
private ItemData data;
private Resource resd;
private Pagina senduse = null;
public CraftWnd(Coord c, Widget parent) {
super(c, WND_SZ.add(0,5), parent, "Craft window");
ui.gui.craftwnd = this;
init();
}
@Override
public void destroy() {
box.destroy();
super.destroy();
}
private void init() {
box = new RecipeListBox(new Coord(0, PANEL_H), this, 200, (WND_SZ.y-PANEL_H)/SZ){
@Override
protected void itemclick(Pagina item, int button) {
if(button == 1){
if(item == menu.bk){
item = current;
if(getPaginaChildren(current, null).size()==0){
item = menu.getParent(item);
}
item = menu.getParent(item);
}
menu.use(item);
}
}
};
box.bgcolor = null;
CRAFT = paginafor("paginae/act/craft");
menu = ui.gui.menu;
breadcrumbs = new Breadcrumbs(new Coord(0, -2), new Coord(WND_SZ.x, SZ), this) {
@Override
public void selected(Object data) {
select((Pagina) data, false);
}
};
Pagina selected = current;
if(selected == null) {
selected = menu.cur;
if (selected == null || !menu.isCrafting(selected)) {
selected = CRAFT;
}
}
select(selected, true);
}
@Override
public void cdestroy(Widget w) {
if(w == makewnd){
makewnd = null;
}
super.cdestroy(w);
}
@Override
public void wdgmsg(Widget sender, String msg, Object... args) {
if ((sender == this) && msg.equals("close")) {
if(makewnd != null){
makewnd.wdgmsg("close");
makewnd = null;
}
ui.destroy(this);
ui.gui.craftwnd = null;
return;
}
super.wdgmsg(sender, msg, args);
}
private List<Pagina> getPaginaChildren(Pagina parent, List<Pagina> buf) {
if(buf == null){buf = new LinkedList<Pagina>();}
menu.cons(parent, buf);
return buf;
}
public void select(Resource resource, boolean senduse) {
select(paginafor(resource), senduse);
}
public void select(Pagina p, boolean senduse) {
if (!menu.isCrafting(p)){return;}
if(box != null){
List<Pagina> children = getPaginaChildren(p, null);
if(children.size() == 0){
children = getPaginaChildren(menu.getParent(p), null);
} else {
closemake();
}
Collections.sort(children, MenuGrid.sorter);
if(p != CRAFT){
children.add(0, menu.bk);
}
box.setitems(children);
box.change(p);
setCurrent(p);
}
if(senduse){
this.senduse = p;
}
}
private void closemake() {
if(makewnd != null){
makewnd.wdgmsg("close");
}
senduse = null;
}
@Override
public void cdraw(GOut g) {
super.cdraw(g);
if(senduse != null){
Pagina p = senduse;
closemake();
menu.senduse(p);
}
drawDescription(g);
}
public void drawDescription(GOut g) {
if(resd == null){return;}
if(description == null) {
if (data != null) {
try {
description = data.longtip(resd);
}catch (Resource.Loading ignored){}
} else {
description = MenuGrid.rendertt(resd, true, false);
}
}
if(description != null){
g.image(description, new Coord(215, PANEL_H));
}
}
private void setCurrent(Pagina current) {
CraftWnd.current = current;
updateBreadcrumbs(current);
updateDescription(current);
}
private void updateBreadcrumbs(Pagina p) {
List<Breadcrumbs.Crumb> crumbs = new LinkedList<Breadcrumbs.Crumb>();
List<Pagina> parents = getParents(p);
Collections.reverse(parents);
for(Pagina item : parents){
BufferedImage img = item.res().layer(Resource.imgc).img;
Resource.AButton act = item.act();
String name = "...";
if(act != null){
name = act.name;
}
crumbs.add(new Breadcrumbs.Crumb(img,name, item));
}
breadcrumbs.setCrumbs(crumbs);
}
private List<Pagina> getParents(Pagina p) {
List<Pagina> list = new LinkedList<Pagina>();
if(getPaginaChildren(p, null).size() > 0){
list.add(p);
}
Pagina parent;
while((parent = menu.getParent(p)) != null){
list.add(parent);
p = parent;
}
return list;
}
private void updateDescription(Pagina p) {
if(description != null){
description.dispose();
description = null;
}
resd = p.res();
data = ItemData.get(resd.name);
}
public void setMakewindow(Widget widget) {
makewnd = widget;
}
@Override
public boolean drop(Coord cc, Coord ul, GItem item) {
ItemData.actualize(item, box.sel);
updateDescription(current);
return true;
}
@Override
public boolean iteminteract(Coord cc, Coord ul, GItem item) {
return false;
}
private Pagina paginafor(String name){
return paginafor(Resource.load(name));
}
private Pagina paginafor(Resource res){
return ui.sess.glob.paginafor(res);
}
private static class RecipeListBox extends Listbox<Pagina> {
private List<Pagina> list;
public RecipeListBox(Coord c, Widget parent, int w, int h) {
super(c, parent, w, h, SZ);
}
@Override
protected Pagina listitem(int i) {
if(list == null){
return null;
}
return list.get(i);
}
public void setitems(List<Pagina> list){
if(list.equals(this.list)){return;}
this.list = list;
sb.max = listitems() - h;
sb.val = 0;
}
@Override
public void change(Pagina item) {
super.change(item);
int k = list.indexOf(item);
if(k>=0){
if(k < sb.val){
sb.val = k;
}
if(k >= sb.val+h){
sb.val = Math.min(sb.max, k-h+1);
}
}
}
@Override
protected int listitems() {
if(list == null){
return 0;
}
return list.size();
}
@Override
protected void drawitem(GOut g, Pagina item) {
if(item == null){
return;
}
g.image(item.img.tex(), Coord.z, ICON_SZ);
Resource.AButton act = item.act();
String name = "...";
if(act != null){
name = act.name;
} else if(item == ui.gui.menu.bk){
name = "Back";
}
g.atext(name, TEXT_POS, 0, 0.5);
}
}
}