aboutsummaryrefslogtreecommitdiff
path: root/src/Java/binnie/craftgui/core
diff options
context:
space:
mode:
authorDraknyte1 <Draknyte1@hotmail.com>2016-01-20 14:24:34 +1000
committerDraknyte1 <Draknyte1@hotmail.com>2016-01-20 14:24:34 +1000
commit869c206c4fcc8001bd2e1d66f704290331813835 (patch)
tree96735ce8fe4665e2759c3374221d6f06f4527df2 /src/Java/binnie/craftgui/core
parentec2c72827f01dd4bb2174137f1ab162f9ddaab62 (diff)
downloadGT5-Unofficial-869c206c4fcc8001bd2e1d66f704290331813835.tar.gz
GT5-Unofficial-869c206c4fcc8001bd2e1d66f704290331813835.tar.bz2
GT5-Unofficial-869c206c4fcc8001bd2e1d66f704290331813835.zip
Initial Commit
Diffstat (limited to 'src/Java/binnie/craftgui/core')
-rw-r--r--src/Java/binnie/craftgui/core/Attribute.java9
-rw-r--r--src/Java/binnie/craftgui/core/CraftGUI.java10
-rw-r--r--src/Java/binnie/craftgui/core/ITooltip.java6
-rw-r--r--src/Java/binnie/craftgui/core/ITooltipHelp.java6
-rw-r--r--src/Java/binnie/craftgui/core/ITopLevelWidget.java29
-rw-r--r--src/Java/binnie/craftgui/core/IWidget.java138
-rw-r--r--src/Java/binnie/craftgui/core/IWidgetAttribute.java3
-rw-r--r--src/Java/binnie/craftgui/core/RenderStage.java8
-rw-r--r--src/Java/binnie/craftgui/core/Tooltip.java84
-rw-r--r--src/Java/binnie/craftgui/core/TopLevelWidget.java248
-rw-r--r--src/Java/binnie/craftgui/core/Widget.java499
-rw-r--r--src/Java/binnie/craftgui/core/geometry/CraftGUIUtil.java77
-rw-r--r--src/Java/binnie/craftgui/core/geometry/IArea.java143
-rw-r--r--src/Java/binnie/craftgui/core/geometry/IBorder.java126
-rw-r--r--src/Java/binnie/craftgui/core/geometry/IPoint.java83
-rw-r--r--src/Java/binnie/craftgui/core/geometry/Position.java41
-rw-r--r--src/Java/binnie/craftgui/core/geometry/TextJustification.java25
-rw-r--r--src/Java/binnie/craftgui/core/renderer/Renderer.java252
-rw-r--r--src/Java/binnie/craftgui/core/renderer/TextureType.java8
19 files changed, 1795 insertions, 0 deletions
diff --git a/src/Java/binnie/craftgui/core/Attribute.java b/src/Java/binnie/craftgui/core/Attribute.java
new file mode 100644
index 0000000000..5d73f58ae2
--- /dev/null
+++ b/src/Java/binnie/craftgui/core/Attribute.java
@@ -0,0 +1,9 @@
+package binnie.craftgui.core;
+
+public enum Attribute
+ implements IWidgetAttribute
+{
+ MouseOver, CanFocus, NeedsDeletion, AlwaysOnTop, BlockTooltip;
+
+ private Attribute() {}
+}
diff --git a/src/Java/binnie/craftgui/core/CraftGUI.java b/src/Java/binnie/craftgui/core/CraftGUI.java
new file mode 100644
index 0000000000..3cce3493cf
--- /dev/null
+++ b/src/Java/binnie/craftgui/core/CraftGUI.java
@@ -0,0 +1,10 @@
+package binnie.craftgui.core;
+
+import binnie.craftgui.core.renderer.Renderer;
+import binnie.craftgui.resource.minecraft.CraftGUIResourceManager;
+
+public class CraftGUI
+{
+ public static CraftGUIResourceManager ResourceManager;
+ public static Renderer Render;
+}
diff --git a/src/Java/binnie/craftgui/core/ITooltip.java b/src/Java/binnie/craftgui/core/ITooltip.java
new file mode 100644
index 0000000000..634ce476d5
--- /dev/null
+++ b/src/Java/binnie/craftgui/core/ITooltip.java
@@ -0,0 +1,6 @@
+package binnie.craftgui.core;
+
+public abstract interface ITooltip
+{
+ public abstract void getTooltip(Tooltip paramTooltip);
+}
diff --git a/src/Java/binnie/craftgui/core/ITooltipHelp.java b/src/Java/binnie/craftgui/core/ITooltipHelp.java
new file mode 100644
index 0000000000..f01744ab6f
--- /dev/null
+++ b/src/Java/binnie/craftgui/core/ITooltipHelp.java
@@ -0,0 +1,6 @@
+package binnie.craftgui.core;
+
+public abstract interface ITooltipHelp
+{
+ public abstract void getHelpTooltip(Tooltip paramTooltip);
+}
diff --git a/src/Java/binnie/craftgui/core/ITopLevelWidget.java b/src/Java/binnie/craftgui/core/ITopLevelWidget.java
new file mode 100644
index 0000000000..2e209b3ea6
--- /dev/null
+++ b/src/Java/binnie/craftgui/core/ITopLevelWidget.java
@@ -0,0 +1,29 @@
+package binnie.craftgui.core;
+
+import binnie.craftgui.core.geometry.IPoint;
+
+public abstract interface ITopLevelWidget
+ extends IWidget
+{
+ public abstract void setMousePosition(int paramInt1, int paramInt2);
+
+ public abstract IPoint getAbsoluteMousePosition();
+
+ public abstract IWidget getFocusedWidget();
+
+ public abstract IWidget getMousedOverWidget();
+
+ public abstract IWidget getDraggedWidget();
+
+ public abstract boolean isFocused(IWidget paramIWidget);
+
+ public abstract boolean isMouseOver(IWidget paramIWidget);
+
+ public abstract boolean isDragged(IWidget paramIWidget);
+
+ public abstract void updateTopLevel();
+
+ public abstract void widgetDeleted(IWidget paramIWidget);
+
+ public abstract IPoint getDragDistance();
+}
diff --git a/src/Java/binnie/craftgui/core/IWidget.java b/src/Java/binnie/craftgui/core/IWidget.java
new file mode 100644
index 0000000000..cd85fa7a40
--- /dev/null
+++ b/src/Java/binnie/craftgui/core/IWidget.java
@@ -0,0 +1,138 @@
+package binnie.craftgui.core;
+
+import binnie.craftgui.core.geometry.IArea;
+import binnie.craftgui.core.geometry.IPoint;
+import binnie.craftgui.events.Event;
+import binnie.craftgui.events.EventHandler;
+import java.util.List;
+
+public abstract interface IWidget
+{
+ public abstract IWidget getParent();
+
+ public abstract void deleteChild(IWidget paramIWidget);
+
+ public abstract void deleteAllChildren();
+
+ public abstract ITopLevelWidget getSuperParent();
+
+ public abstract boolean isTopLevel();
+
+ public abstract IPoint getPosition();
+
+ public abstract IPoint pos();
+
+ public abstract void setPosition(IPoint paramIPoint);
+
+ public abstract IPoint getSize();
+
+ public abstract IPoint size();
+
+ public abstract void setSize(IPoint paramIPoint);
+
+ public abstract IPoint getOriginalPosition();
+
+ public abstract IPoint getAbsolutePosition();
+
+ public abstract IPoint getOriginalAbsolutePosition();
+
+ public abstract IPoint getOffset();
+
+ public abstract IArea getArea();
+
+ public abstract IArea area();
+
+ public abstract void setOffset(IPoint paramIPoint);
+
+ public abstract IPoint getMousePosition();
+
+ public abstract IPoint getRelativeMousePosition();
+
+ public abstract void setColour(int paramInt);
+
+ public abstract int getColour();
+
+ public abstract void render();
+
+ public abstract void updateClient();
+
+ public abstract void enable();
+
+ public abstract void disable();
+
+ public abstract void show();
+
+ public abstract void hide();
+
+ public abstract boolean calculateIsMouseOver();
+
+ public abstract boolean isEnabled();
+
+ public abstract boolean isVisible();
+
+ public abstract boolean isFocused();
+
+ public abstract boolean isMouseOver();
+
+ public abstract boolean isDragged();
+
+ public abstract boolean isChildVisible(IWidget paramIWidget);
+
+ public abstract boolean isChildEnabled(IWidget paramIWidget);
+
+ public abstract boolean canMouseOver();
+
+ public abstract boolean canFocus();
+
+ public abstract IWidget addWidget(IWidget paramIWidget);
+
+ public abstract List<IWidget> getWidgets();
+
+ public abstract void callEvent(Event paramEvent);
+
+ public abstract void recieveEvent(Event paramEvent);
+
+ public abstract void onUpdateClient();
+
+ public abstract void delete();
+
+ public abstract void onDelete();
+
+ public abstract <T> T getWidget(Class<T> paramClass);
+
+ public abstract IArea getCroppedZone();
+
+ public abstract void setCroppedZone(IWidget paramIWidget, IArea paramIArea);
+
+ public abstract boolean isCroppedWidet();
+
+ public abstract IWidget getCropWidget();
+
+ public abstract boolean isMouseOverWidget(IPoint paramIPoint);
+
+ public abstract int getLevel();
+
+ public abstract boolean isDescendant(IWidget paramIWidget);
+
+ public abstract List<IWidgetAttribute> getAttributes();
+
+ public abstract boolean hasAttribute(IWidgetAttribute paramIWidgetAttribute);
+
+ public abstract boolean addAttribute(IWidgetAttribute paramIWidgetAttribute);
+
+ public abstract <E extends Event> void addEventHandler(EventHandler<E> paramEventHandler);
+
+ public abstract <E extends Event> void addSelfEventHandler(EventHandler<E> paramEventHandler);
+
+ public abstract boolean contains(IPoint paramIPoint);
+
+ public abstract float x();
+
+ public abstract float y();
+
+ public abstract float w();
+
+ public abstract float h();
+
+ public abstract void onRender(RenderStage paramRenderStage);
+}
diff --git a/src/Java/binnie/craftgui/core/IWidgetAttribute.java b/src/Java/binnie/craftgui/core/IWidgetAttribute.java
new file mode 100644
index 0000000000..87d994ca43
--- /dev/null
+++ b/src/Java/binnie/craftgui/core/IWidgetAttribute.java
@@ -0,0 +1,3 @@
+package binnie.craftgui.core;
+
+public abstract interface IWidgetAttribute {}
diff --git a/src/Java/binnie/craftgui/core/RenderStage.java b/src/Java/binnie/craftgui/core/RenderStage.java
new file mode 100644
index 0000000000..e710c833e6
--- /dev/null
+++ b/src/Java/binnie/craftgui/core/RenderStage.java
@@ -0,0 +1,8 @@
+package binnie.craftgui.core;
+
+public enum RenderStage
+{
+ PreChildren, PostChildren, PostSiblings;
+
+ private RenderStage() {}
+}
diff --git a/src/Java/binnie/craftgui/core/Tooltip.java b/src/Java/binnie/craftgui/core/Tooltip.java
new file mode 100644
index 0000000000..4afb7f6bc5
--- /dev/null
+++ b/src/Java/binnie/craftgui/core/Tooltip.java
@@ -0,0 +1,84 @@
+package binnie.craftgui.core;
+
+import java.util.ArrayList;
+import java.util.List;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraftforge.fluids.FluidStack;
+
+public class Tooltip
+{
+ public void add(String string)
+ {
+ this.tooltip.add(string);
+ }
+
+ public String getLine(int index)
+ {
+ String string = (String)getList().get(index);
+ return string;
+ }
+
+ public void add(List list)
+ {
+ for (Object obj : list) {
+ this.tooltip.add((String)obj);
+ }
+ }
+
+ List<String> tooltip = new ArrayList();
+
+ public List<String> getList()
+ {
+ return this.tooltip;
+ }
+
+ public boolean exists()
+ {
+ return this.tooltip.size() > 0;
+ }
+
+ public static enum Type
+ implements Tooltip.ITooltipType
+ {
+ Standard, Help, Information, User, Power;
+
+ private Type() {}
+ }
+
+ public void setType(ITooltipType type)
+ {
+ this.type = type;
+ }
+
+ ITooltipType type = Type.Standard;
+ public int maxWidth = 256;
+
+ public void setMaxWidth(int w)
+ {
+ this.maxWidth = w;
+ }
+
+ public ITooltipType getType()
+ {
+ return this.type;
+ }
+
+ public void add(ItemStack item, String string)
+ {
+ NBTTagCompound nbt = new NBTTagCompound();
+ item.writeToNBT(nbt);
+ nbt.setByte("nbt-type", (byte)105);
+ add("~~~" + nbt.toString() + "~~~" + string);
+ }
+
+ public void add(FluidStack item, String string)
+ {
+ NBTTagCompound nbt = new NBTTagCompound();
+ item.writeToNBT(nbt);
+ nbt.setByte("nbt-type", (byte)102);
+ add("~~~" + nbt.toString() + "~~~" + string);
+ }
+
+ public static abstract interface ITooltipType {}
+}
diff --git a/src/Java/binnie/craftgui/core/TopLevelWidget.java b/src/Java/binnie/craftgui/core/TopLevelWidget.java
new file mode 100644
index 0000000000..6f2cdd18a6
--- /dev/null
+++ b/src/Java/binnie/craftgui/core/TopLevelWidget.java
@@ -0,0 +1,248 @@
+package binnie.craftgui.core;
+
+import binnie.craftgui.core.geometry.IArea;
+import binnie.craftgui.core.geometry.IPoint;
+import binnie.craftgui.events.EventMouse.Down;
+import binnie.craftgui.events.EventMouse.Down.Handler;
+import binnie.craftgui.events.EventMouse.Drag;
+import binnie.craftgui.events.EventMouse.Move;
+import binnie.craftgui.events.EventMouse.Up;
+import binnie.craftgui.events.EventMouse.Up.Handler;
+import binnie.craftgui.events.EventWidget.EndDrag;
+import binnie.craftgui.events.EventWidget.EndMouseOver;
+import binnie.craftgui.events.EventWidget.GainFocus;
+import binnie.craftgui.events.EventWidget.LoseFocus;
+import binnie.craftgui.events.EventWidget.StartDrag;
+import binnie.craftgui.events.EventWidget.StartDrag.Handler;
+import binnie.craftgui.events.EventWidget.StartMouseOver;
+import java.util.ArrayDeque;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Deque;
+import java.util.List;
+import java.util.ListIterator;
+import org.lwjgl.input.Mouse;
+
+public abstract class TopLevelWidget
+ extends Widget
+ implements ITopLevelWidget
+{
+ public TopLevelWidget()
+ {
+ super(null);
+
+ addEventHandler(new EventMouse.Down.Handler()
+ {
+ public void onEvent(EventMouse.Down event)
+ {
+ TopLevelWidget.this.setDraggedWidget(TopLevelWidget.this.mousedOverWidget, event.getButton());
+ TopLevelWidget.this.setFocusedWidget(TopLevelWidget.this.mousedOverWidget);
+ }
+ });
+ addEventHandler(new EventMouse.Up.Handler()
+ {
+ public void onEvent(EventMouse.Up event)
+ {
+ TopLevelWidget.this.setDraggedWidget(null);
+ }
+ });
+ addEventHandler(new EventWidget.StartDrag.Handler()
+ {
+ public void onEvent(EventWidget.StartDrag event)
+ {
+ TopLevelWidget.this.dragStart = TopLevelWidget.this.getRelativeMousePosition();
+ }
+ });
+ }
+
+ IWidget mousedOverWidget = null;
+ IWidget draggedWidget = null;
+ IWidget focusedWidget = null;
+
+ public void setMousedOverWidget(IWidget widget)
+ {
+ if (this.mousedOverWidget == widget) {
+ return;
+ }
+ if (this.mousedOverWidget != null) {
+ callEvent(new EventWidget.EndMouseOver(this.mousedOverWidget));
+ }
+ this.mousedOverWidget = widget;
+ if (this.mousedOverWidget != null) {
+ callEvent(new EventWidget.StartMouseOver(this.mousedOverWidget));
+ }
+ }
+
+ public void setDraggedWidget(IWidget widget)
+ {
+ setDraggedWidget(widget, -1);
+ }
+
+ public void setDraggedWidget(IWidget widget, int button)
+ {
+ if (this.draggedWidget == widget) {
+ return;
+ }
+ if (this.draggedWidget != null) {
+ callEvent(new EventWidget.EndDrag(this.draggedWidget));
+ }
+ this.draggedWidget = widget;
+ if (this.draggedWidget != null) {
+ callEvent(new EventWidget.StartDrag(this.draggedWidget, button));
+ }
+ }
+
+ public void setFocusedWidget(IWidget widget)
+ {
+ IWidget newWidget = widget;
+ if (this.focusedWidget == newWidget) {
+ return;
+ }
+ if ((newWidget != null) && (!newWidget.canFocus())) {
+ newWidget = null;
+ }
+ if (this.focusedWidget != null) {
+ callEvent(new EventWidget.LoseFocus(this.focusedWidget));
+ }
+ this.focusedWidget = newWidget;
+ if (this.focusedWidget != null) {
+ callEvent(new EventWidget.GainFocus(this.focusedWidget));
+ }
+ }
+
+ public IWidget getMousedOverWidget()
+ {
+ return this.mousedOverWidget;
+ }
+
+ public IWidget getDraggedWidget()
+ {
+ return this.draggedWidget;
+ }
+
+ public IWidget getFocusedWidget()
+ {
+ return this.focusedWidget;
+ }
+
+ public boolean isMouseOver(IWidget widget)
+ {
+ return getMousedOverWidget() == widget;
+ }
+
+ public boolean isDragged(IWidget widget)
+ {
+ return getDraggedWidget() == widget;
+ }
+
+ public boolean isFocused(IWidget widget)
+ {
+ return getFocusedWidget() == widget;
+ }
+
+ public void updateTopLevel()
+ {
+ setMousedOverWidget(calculateMousedOverWidget());
+ if ((getFocusedWidget() != null) && ((!getFocusedWidget().isVisible()) || (!getFocusedWidget().isEnabled()))) {
+ setFocusedWidget(null);
+ }
+ if (!Mouse.isButtonDown(0)) {
+ if (this.draggedWidget != null) {
+ setDraggedWidget(null);
+ }
+ }
+ }
+
+ private IWidget calculateMousedOverWidget()
+ {
+ Deque<IWidget> queue = calculateMousedOverWidgets();
+ while (!queue.isEmpty())
+ {
+ IWidget widget = (IWidget)queue.removeFirst();
+ if ((widget.isEnabled()) && (widget.isVisible()) && (widget.canMouseOver())) {
+ if ((widget.isEnabled()) && (widget.isVisible()) && (widget.canMouseOver()) && (widget.calculateIsMouseOver())) {
+ return widget;
+ }
+ }
+ }
+ return null;
+ }
+
+ public Deque<IWidget> calculateMousedOverWidgets()
+ {
+ Deque<IWidget> list = new ArrayDeque();
+ for (IWidget widget : getQueuedWidgets(this)) {
+ if (widget.calculateIsMouseOver()) {
+ list.addLast(widget);
+ }
+ }
+ return list;
+ }
+
+ private Collection<IWidget> getQueuedWidgets(IWidget widget)
+ {
+ List<IWidget> widgets = new ArrayList();
+
+ boolean addChildren = true;
+ if (widget.isCroppedWidet()) {
+ addChildren = widget.getCroppedZone().contains(widget.getCropWidget().getRelativeMousePosition());
+ }
+ if (addChildren)
+ {
+ ListIterator<IWidget> li = widget.getWidgets().listIterator(widget.getWidgets().size());
+ while (li.hasPrevious())
+ {
+ IWidget child = (IWidget)li.previous();
+ widgets.addAll(getQueuedWidgets(child));
+ }
+ }
+ widgets.add(widget);
+
+ return widgets;
+ }
+
+ protected IPoint mousePosition = new IPoint(0.0F, 0.0F);
+
+ public void setMousePosition(int x, int y)
+ {
+ float dx = x - this.mousePosition.x();
+ float dy = y - this.mousePosition.y();
+ if ((dx != 0.0F) || (dy != 0.0F)) {
+ if (getDraggedWidget() != null) {
+ callEvent(new EventMouse.Drag(getDraggedWidget(), dx, dy));
+ } else {
+ callEvent(new EventMouse.Move(this, dx, dy));
+ }
+ }
+ if ((this.mousePosition.x() != x) || (this.mousePosition.y() != y))
+ {
+ this.mousePosition = new IPoint(x, y);
+ setMousedOverWidget(calculateMousedOverWidget());
+ }
+ }
+
+ public IPoint getAbsoluteMousePosition()
+ {
+ return this.mousePosition;
+ }
+
+ public void widgetDeleted(IWidget widget)
+ {
+ if (isMouseOver(widget)) {
+ setMousedOverWidget(null);
+ }
+ if (isDragged(widget)) {
+ setDraggedWidget(null);
+ }
+ if (isFocused(widget)) {
+ setFocusedWidget(null);
+ }
+ }
+
+ IPoint dragStart = IPoint.ZERO;
+
+ public IPoint getDragDistance()
+ {
+ return getRelativeMousePosition().sub(this.dragStart);
+ }
+}
diff --git a/src/Java/binnie/craftgui/core/Widget.java b/src/Java/binnie/craftgui/core/Widget.java
new file mode 100644
index 0000000000..448bcbaed6
--- /dev/null
+++ b/src/Java/binnie/craftgui/core/Widget.java
@@ -0,0 +1,499 @@
+package binnie.craftgui.core;
+
+import binnie.craftgui.core.geometry.IArea;
+import binnie.craftgui.core.geometry.IPoint;
+import binnie.craftgui.core.renderer.Renderer;
+import binnie.craftgui.events.Event;
+import binnie.craftgui.events.EventHandler;
+import binnie.craftgui.events.EventHandler.Origin;
+import binnie.craftgui.events.EventWidget.ChangeColour;
+import binnie.craftgui.events.EventWidget.ChangeOffset;
+import binnie.craftgui.events.EventWidget.ChangePosition;
+import binnie.craftgui.events.EventWidget.ChangeSize;
+import binnie.craftgui.events.EventWidget.Disable;
+import binnie.craftgui.events.EventWidget.Enable;
+import binnie.craftgui.events.EventWidget.Hide;
+import binnie.craftgui.events.EventWidget.Show;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.ConcurrentModificationException;
+import java.util.List;
+
+public class Widget
+ implements IWidget
+{
+ public Widget(IWidget parent)
+ {
+ this.parent = parent;
+ if (parent != null) {
+ parent.addWidget(this);
+ }
+ }
+
+ private IWidget parent = null;
+ private List<IWidget> subWidgets = new ArrayList();
+ private List<IWidgetAttribute> attributes = new ArrayList();
+
+ public List<IWidgetAttribute> getAttributes()
+ {
+ return this.attributes;
+ }
+
+ public boolean hasAttribute(IWidgetAttribute attribute)
+ {
+ return this.attributes.contains(attribute);
+ }
+
+ public boolean addAttribute(IWidgetAttribute attribute)
+ {
+ return this.attributes.add(attribute);
+ }
+
+ public final void deleteChild(IWidget child)
+ {
+ if (child == null) {
+ return;
+ }
+ child.delete();
+ this.subWidgets.remove(child);
+ }
+
+ public final void deleteAllChildren()
+ {
+ while (!this.subWidgets.isEmpty()) {
+ deleteChild((IWidget)this.subWidgets.get(0));
+ }
+ }
+
+ public final IWidget getParent()
+ {
+ return this.parent;
+ }
+
+ public final ITopLevelWidget getSuperParent()
+ {
+ return isTopLevel() ? (ITopLevelWidget)this : this.parent.getSuperParent();
+ }
+
+ public final IWidget addWidget(IWidget widget)
+ {
+ if ((this.subWidgets.size() != 0) && (((IWidget)this.subWidgets.get(this.subWidgets.size() - 1)).hasAttribute(Attribute.AlwaysOnTop))) {
+ this.subWidgets.add(this.subWidgets.size() - 1, widget);
+ } else {
+ this.subWidgets.add(widget);
+ }
+ onAddChild(widget);
+ return widget;
+ }
+
+ protected void onAddChild(IWidget widget) {}
+
+ public final List<IWidget> getWidgets()
+ {
+ return this.subWidgets;
+ }
+
+ public final boolean isTopLevel()
+ {
+ return this instanceof ITopLevelWidget;
+ }
+
+ private IPoint position = new IPoint(0.0F, 0.0F);
+ private IPoint size = new IPoint(0.0F, 0.0F);
+ private IPoint offset = new IPoint(0.0F, 0.0F);
+ IArea cropArea;
+ IWidget cropWidget;
+
+ public final IPoint pos()
+ {
+ return this.position.add(this.offset);
+ }
+
+ public final IPoint size()
+ {
+ return this.size;
+ }
+
+ public final IArea area()
+ {
+ return getArea();
+ }
+
+ public final IPoint getPosition()
+ {
+ return pos();
+ }
+
+ public final IArea getArea()
+ {
+ return new IArea(IPoint.ZERO, size());
+ }
+
+ public final IPoint getOriginalPosition()
+ {
+ return this.position;
+ }
+
+ boolean cropped = false;
+
+ public IArea getCroppedZone()
+ {
+ return this.cropArea;
+ }
+
+ public void setCroppedZone(IWidget relative, IArea area)
+ {
+ this.cropArea = area;
+ this.cropped = true;
+ this.cropWidget = relative;
+ }
+
+ public final IPoint getAbsolutePosition()
+ {
+ return isTopLevel() ? getPosition() : getParent().getAbsolutePosition().add(getPosition());
+ }
+
+ public final IPoint getOriginalAbsolutePosition()
+ {
+ return isTopLevel() ? getOriginalPosition() : getParent().getOriginalPosition().sub(getOriginalPosition());
+ }
+
+ public final IPoint getSize()
+ {
+ return size();
+ }
+
+ public final IPoint getOffset()
+ {
+ return this.offset;
+ }
+
+ public final void setPosition(IPoint vector)
+ {
+ if (!vector.equals(this.position))
+ {
+ this.position = new IPoint(vector);
+ callEvent(new EventWidget.ChangePosition(this));
+ }
+ }
+
+ public final void setSize(IPoint vector)
+ {
+ if (!vector.equals(this.size))
+ {
+ this.size = new IPoint(vector);
+ callEvent(new EventWidget.ChangeSize(this));
+ }
+ }
+
+ public final void setOffset(IPoint vector)
+ {
+ if (vector != this.offset)
+ {
+ this.offset = new IPoint(vector);
+ callEvent(new EventWidget.ChangeOffset(this));
+ }
+ }
+
+ int colour = 16777215;
+
+ public final void setColour(int colour)
+ {
+ if (this.colour != colour)
+ {
+ this.colour = colour;
+ callEvent(new EventWidget.ChangeColour(this));
+ }
+ }
+
+ public final int getColour()
+ {
+ return this.colour;
+ }
+
+ public boolean canMouseOver()
+ {
+ return hasAttribute(Attribute.MouseOver);
+ }
+
+ public boolean canFocus()
+ {
+ return hasAttribute(Attribute.CanFocus);
+ }
+
+ private Collection<EventHandler> globalEventHandlers = new ArrayList();
+
+ public void addEventHandler(EventHandler handler)
+ {
+ this.globalEventHandlers.add(handler);
+ }
+
+ public void addSelfEventHandler(EventHandler handler)
+ {
+ addEventHandler(handler.setOrigin(EventHandler.Origin.Self, this));
+ }
+
+ public final void callEvent(Event event)
+ {
+ getSuperParent().recieveEvent(event);
+ }
+
+ public final void recieveEvent(Event event)
+ {
+ for (EventHandler handler : this.globalEventHandlers) {
+ if (handler.handles(event)) {
+ handler.onEvent(event);
+ }
+ }
+ try
+ {
+ for (IWidget child : getWidgets()) {
+ child.recieveEvent(event);
+ }
+ }
+ catch (ConcurrentModificationException e) {}
+ }
+
+ public final IPoint getMousePosition()
+ {
+ return getSuperParent().getAbsoluteMousePosition();
+ }
+
+ public final IPoint getRelativeMousePosition()
+ {
+ return isTopLevel() ? getMousePosition() : getParent().getRelativeMousePosition().sub(getPosition());
+ }
+
+ public boolean isCroppedWidet()
+ {
+ return this.cropped;
+ }
+
+ public final IWidget getCropWidget()
+ {
+ return this.cropWidget == null ? this : this.cropWidget;
+ }
+
+ public final void render()
+ {
+ if (isVisible())
+ {
+ CraftGUI.Render.preRender(this);
+ onRender(RenderStage.PreChildren);
+ for (IWidget widget : getWidgets()) {
+ widget.render();
+ }
+ for (IWidget widget : getWidgets())
+ {
+ CraftGUI.Render.preRender(widget);
+ widget.onRender(RenderStage.PostSiblings);
+ CraftGUI.Render.postRender(widget);
+ }
+ onRender(RenderStage.PostChildren);
+ CraftGUI.Render.postRender(this);
+ }
+ }
+
+ public final void updateClient()
+ {
+ if (!isVisible()) {
+ return;
+ }
+ if (getSuperParent() == this) {
+ ((ITopLevelWidget)this).updateTopLevel();
+ }
+ onUpdateClient();
+
+ List<IWidget> deletedWidgets = new ArrayList();
+ for (IWidget widget : getWidgets()) {
+ if (widget.hasAttribute(Attribute.NeedsDeletion)) {
+ deletedWidgets.add(widget);
+ } else {
+ widget.updateClient();
+ }
+ }
+ for (IWidget widget : deletedWidgets) {
+ deleteChild(widget);
+ }
+ }
+
+ public final boolean calculateIsMouseOver()
+ {
+ IPoint mouse = getRelativeMousePosition();
+ if (!this.cropped) {
+ return isMouseOverWidget(mouse);
+ }
+ IWidget cropRelative = this.cropWidget != null ? this.cropWidget : this;
+ IPoint pos = IPoint.sub(cropRelative.getAbsolutePosition(), getAbsolutePosition());
+ IPoint size = new IPoint(this.cropArea.size().x(), this.cropArea.size().y());
+ boolean inCrop = (mouse.x() > pos.x()) && (mouse.y() > pos.y()) && (mouse.x() < pos.x() + size.x()) && (mouse.y() < pos.y() + size.y());
+
+ return (inCrop) && (isMouseOverWidget(mouse));
+ }
+
+ public boolean isMouseOverWidget(IPoint relativeMouse)
+ {
+ return getArea().contains(relativeMouse);
+ }
+
+ private boolean enabled = true;
+ private boolean visible = true;
+
+ public final void enable()
+ {
+ this.enabled = true;
+ callEvent(new EventWidget.Enable(this));
+ }
+
+ public final void disable()
+ {
+ this.enabled = false;
+ callEvent(new EventWidget.Disable(this));
+ }
+
+ public final void show()
+ {
+ this.visible = true;
+ callEvent(new EventWidget.Show(this));
+ }
+
+ public final void hide()
+ {
+ this.visible = false;
+ callEvent(new EventWidget.Hide(this));
+ }
+
+ public boolean isEnabled()
+ {
+ return (this.enabled) && ((isTopLevel()) || ((getParent().isEnabled()) && (getParent().isChildEnabled(this))));
+ }
+
+ public final boolean isVisible()
+ {
+ return (this.visible) && ((isTopLevel()) || ((getParent().isVisible()) && (getParent().isChildVisible(this))));
+ }
+
+ public final boolean isFocused()
+ {
+ return getSuperParent().isFocused(this);
+ }
+
+ public final boolean isDragged()
+ {
+ return getSuperParent().isDragged(this);
+ }
+
+ public final boolean isMouseOver()
+ {
+ return getSuperParent().isMouseOver(this);
+ }
+
+ public boolean isChildVisible(IWidget child)
+ {
+ return true;
+ }
+
+ public bo