package haven;
import haven.event.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MaidUI extends UI {
private static final Pattern progress = Pattern.compile("gfx/hud/prog/(\\d+)");
private static final Pattern cursorName = Pattern.compile("gfx/hud/curs/(.+)");
private int progressWdgId;
public MaidUI(Maid maid, Coord c, Session ses) {
super(maid, c, ses);
}
@Override
public void setreceiver(final Receiver rcvr) {
this.rcvr = new Receiver() {
public void rcvmsg(int id, String msg, Object... args) {
System.out.print("rcvmsg\tid: " + id + "\tmsg:" + msg);
for (int i = 0; i < args.length; i++) {
System.out.print(" " + args[i]);
}
System.out.println();
rcvr.rcvmsg(id, msg, args);
}
};
}
@Override
public void newwidget(int id, String type, Coord c, int parent, Object... args) throws InterruptedException {
System.out.print("newwidget\tid: " + id + "\ttype:" + type + "\tcoord: " + c + "\tparent:" + parent + "\targs:");
for (int i = 0; i < args.length; i++) {
System.out.print(" " + args[i]);
}
System.out.println();
WidgetFactory f;
if (type.indexOf('/') >= 0) {
int ver = -1, p;
if ((p = type.indexOf(':')) > 0) {
ver = Integer.parseInt(type.substring(p + 1));
type = type.substring(0, p);
}
Resource res = Resource.load(type, ver);
res.loadwaitint();
f = res.layer(Resource.CodeEntry.class).get(WidgetFactory.class);
} else {
f = Widget.gettype(type);
}
synchronized (this) {
Widget pwdg = widgets.get(parent);
if (pwdg == null)
throw (new UIException("Null parent widget " + parent + " for " + id, type, args));
Widget wdg;
if (type.equals("chr")) {
int studyid = -1;
if (args.length > 0)
studyid = (Integer) args[0];
wdg = new CharWnd(c, pwdg, studyid);
MaidFrame.getCurrentSession().charWnd = (CharWnd) wdg;
((CharWnd) wdg).fmw = new FoodMeterWidget(Coord.z, pwdg);
} else if (type.equals("buddy")) {
wdg = new BuddyWnd(c, pwdg);
MaidFrame.getCurrentSession().buddyWnd = (BuddyWnd) wdg;
} else if (type.equals("av")) {
wdg = f.create(c, pwdg, args);
if (MaidFrame.getCurrentSession().getAvatar() == null)
MaidFrame.getCurrentSession().setAvatar((Avaview) wdg);
} else if (type.equals("charlist")) {
wdg = f.create(c, pwdg, args);
MaidFrame.getCurrentSession().sb = new SessionBar(SessionBar.initPos, pwdg);
if (MaidFrame.getSessionCount() == 1)
MaidFrame.getCurrentSession().sb.visible = false;
} else {
wdg = f.create(c, pwdg, args);
}
bind(wdg, id);
wdg.binded();
if (wdg instanceof MapView) {
mainview = (MapView) wdg;
MaidFrame.getCurrentSession().sb = new SessionBar(SessionBar.initPos, pwdg);
if (MaidFrame.getSessionCount() == 1)
MaidFrame.getCurrentSession().sb.visible = false;
}
}
if ("scm".equals(type)) {
maid.setMenuGridId(id);
} else {
try {
if (maid.getTaskListener() != null && "img".equals(type)) {
onImgChange(maid.getTaskListener(), id, (String) args[0]);
} else if (maid.getItemListener() != null && "item".equals(type)) {
onItemDisplay(maid.getItemListener(), (Item) widgets.get(id));
} else if (maid.getWidgetListener() != null && "sm".equals(type)) {
onWidgetCreate(maid.getWidgetListener(), (FlowerMenu) widgets.get(id));
} else if (maid.getWidgetListener() != null && "inv".equals(type)) {
onWidgetCreate(maid.getWidgetListener(), (Inventory) widgets.get(id));
} else if (maid.getWidgetListener() != null && "make".equals(type)) {
onWidgetCreate(maid.getWidgetListener(), (Makewindow) widgets.get(id));
} else if (maid.getWidgetListener() != null && "wnd".equals(type)) {
onWidgetCreate(maid.getWidgetListener(), (Window) widgets.get(id));
}
} catch (Throwable t) {
errorInEventProcessing(t);
}
}
}
@Override
public void uimsg(int id, String msg, Object... args) {
Widget wdg;
synchronized (this) {
wdg = widgets.get(id);
}
if (wdg != null)
wdg.uimsg(msg.intern(), args);
else
throw (new UIException("Uimsg to non-existent widget " + id, msg, args));
System.out.print("uimsg\tid: " + id + "\tmsg:" + msg);
for (int i = 0; i < args.length; i++) {
System.out.print(" " + args[i]);
}
System.out.println();
try {
wdg = widgets.get(id);
if (maid.getMeterListener() != null && wdg instanceof IMeter && "set".equals(msg)) {
onIMeterChange(maid.getMeterListener(), (IMeter) wdg, args);
} else if (maid.getTaskListener() != null && wdg instanceof Img && "ch".equals(msg)) {
onImgChange(maid.getTaskListener(), id, (String) args[0]);
} else if (maid.getCursorListener() != null && "curs".equals(msg)) {
onCursChange(maid.getCursorListener(), (String) args[0]);
} else if (wdg instanceof IMeter && "set".equals(msg)) { // update
// Maid.meter*
String name = ((IMeter) wdg).bg.name;
if ("gfx/hud/meter/hp".equals(name)) {
// TODO
} else if ("gfx/hud/meter/nrj".equals(name)) {
maid.meterStamina = (MeterEventObjectStamina) new MeterEvent(MeterEvent.Type.STAMINA, args).getEventObject();
} else if ("gfx/hud/meter/hngr".equals(name)) {
maid.meterHunger = (MeterEventObjectHunger) new MeterEvent(MeterEvent.Type.HUNGER, args).getEventObject();
} else if ("gfx/hud/meter/happy".equals(name)) {
// TODO
} else if ("gfx/hud/meter/auth".equals(name)) {
// TODO
}
} else if (maid.getPackListener() != null && "pack".equals(msg)) {
maid.getPackListener().onPackExecute(new PackEvent());
}
} catch (Throwable t) {
errorInEventProcessing(t);
}
}
@Override
public void destroy(int id) {
Widget wdg = widgets.get(id);
System.out.println("destroy\tid: " + id);
try {
if (maid.getTaskListener() != null && wdg instanceof Img) {
onImgDestroy(maid.getTaskListener(), id);
} else if (maid.getItemListener() != null && wdg instanceof Item) {
onItemDestroy(maid.getItemListener(), (Item) wdg);
}
} catch (Throwable t) {
errorInEventProcessing(t);
}
synchronized (this) {
if (widgets.containsKey(id)) {
wdg = widgets.get(id);
destroy(wdg);
}
}
}
private void errorInEventProcessing(Throwable t) {
t.printStackTrace();
maid.doErr("Error processing events, canceling everything");
maid.clearListeners();
maid.stopTask();
}
private void onItemDisplay(ItemListener l, Item item) {
if (item.parent instanceof RootWidget) {
l.onItemGrab(new ItemEvent(ItemEvent.Type.GRAB, item));
} else {
l.onItemCreate(new ItemEvent(ItemEvent.Type.CREATE, item));
}
}
private void onItemDestroy(ItemListener l, Item item) {
if (item.parent instanceof RootWidget) {
l.onItemRelease(new ItemEvent(ItemEvent.Type.RELEASE, item));
} else {
l.onItemDestroy(new ItemEvent(ItemEvent.Type.DESTROY, item));
}
}
private void onIMeterChange(MeterListener l, IMeter im, Object[] args) {
String name = im.bg.name;
if ("gfx/hud/meter/hp".equals(name)) {
l.onHealChange(new MeterEvent(MeterEvent.Type.HP, args));
} else if ("gfx/hud/meter/nrj".equals(name)) {
l.onStaminaChange(new MeterEvent(MeterEvent.Type.STAMINA, args));
} else if ("gfx/hud/meter/hngr".equals(name)) {
l.onHungerChange(new MeterEvent(MeterEvent.Type.HUNGER, args));
} else if ("gfx/hud/meter/happy".equals(name)) {
l.onHappinessChange(new MeterEvent(MeterEvent.Type.HAPINESS, args));
} else if ("gfx/hud/meter/auth".equals(name)) {
l.onAuthorityChange(new MeterEvent(MeterEvent.Type.AUTHORITY, args));
}
}
private void onImgChange(TaskListener l, int id, String res) {
Matcher m;
if ((m = progress.matcher(res)).matches()) {
int value = Math.round(Float.parseFloat(m.group(1)) / 20 * 100);
progressWdgId = id;
l.onTaskProgress(new TaskEvent(value));
}
}
private void onImgDestroy(TaskListener l, int id) {
if (id == progressWdgId) {
TaskEvent e = new TaskEvent(100);
l.onTaskProgress(e);
l.onTaskComplete(e);
}
}
private void onCursChange(CursorListener l, String res) {
Matcher m;
if ((m = cursorName.matcher(res)).matches()) {
res = m.group(1);
}
l.onCursorChange(new CursorEvent(res));
}
private void onWidgetCreate(WidgetListener<?> l, Widget wdg) {
Class<?> c = l.getInterest();
if (c.isInstance(wdg)) {
l.onCreate(new WidgetEvent(WidgetEvent.Type.CREATE, wdg));
}
}
}