Enable programmatically referencing Component's components
This commit is contained in:
@@ -1,14 +1,17 @@
|
|||||||
package com.bartlomiejpluta.base.lib.gui;
|
package com.bartlomiejpluta.base.lib.gui;
|
||||||
|
|
||||||
import com.bartlomiejpluta.base.api.context.Context;
|
import com.bartlomiejpluta.base.api.context.Context;
|
||||||
|
import com.bartlomiejpluta.base.api.gui.Component;
|
||||||
import com.bartlomiejpluta.base.api.gui.GUI;
|
import com.bartlomiejpluta.base.api.gui.GUI;
|
||||||
import com.bartlomiejpluta.base.api.gui.SizeMode;
|
import com.bartlomiejpluta.base.api.gui.SizeMode;
|
||||||
import com.bartlomiejpluta.base.api.screen.Screen;
|
import com.bartlomiejpluta.base.api.screen.Screen;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
public class AbsoluteLayout extends BaseContainer {
|
public class AbsoluteLayout extends BaseContainer {
|
||||||
|
|
||||||
public AbsoluteLayout(Context context, GUI gui) {
|
public AbsoluteLayout(Context context, GUI gui, Map<String, Component> refs) {
|
||||||
super(context, gui);
|
super(context, gui, refs);
|
||||||
super.setSizeMode(SizeMode.ABSOLUTE, SizeMode.ABSOLUTE);
|
super.setSizeMode(SizeMode.ABSOLUTE, SizeMode.ABSOLUTE);
|
||||||
super.setSize(0f, 0f);
|
super.setSize(0f, 0f);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,17 +5,20 @@ import com.bartlomiejpluta.base.api.gui.Component;
|
|||||||
import com.bartlomiejpluta.base.api.gui.GUI;
|
import com.bartlomiejpluta.base.api.gui.GUI;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
import static java.util.Collections.emptyList;
|
import static java.util.Collections.emptyList;
|
||||||
|
|
||||||
public abstract class BaseComponent extends BaseWidget implements Component {
|
public abstract class BaseComponent extends BaseWidget implements Component {
|
||||||
protected boolean focused;
|
|
||||||
protected final Context context;
|
protected final Context context;
|
||||||
protected final GUI gui;
|
protected final GUI gui;
|
||||||
|
protected final Map<String, Component> refs;
|
||||||
|
protected boolean focused;
|
||||||
|
|
||||||
protected BaseComponent(Context context, GUI gui) {
|
protected BaseComponent(Context context, GUI gui, Map<String, Component> refs) {
|
||||||
this.context = context;
|
this.context = context;
|
||||||
this.gui = gui;
|
this.gui = gui;
|
||||||
|
this.refs = refs;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import com.bartlomiejpluta.base.api.gui.GUI;
|
|||||||
|
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
import static java.util.Collections.unmodifiableList;
|
import static java.util.Collections.unmodifiableList;
|
||||||
import static java.util.Objects.requireNonNull;
|
import static java.util.Objects.requireNonNull;
|
||||||
@@ -15,8 +16,8 @@ public abstract class BaseContainer extends BaseComponent {
|
|||||||
protected final List<Component> children = new LinkedList<>();
|
protected final List<Component> children = new LinkedList<>();
|
||||||
private final List<Component> readOnlyChildren = unmodifiableList(children);
|
private final List<Component> readOnlyChildren = unmodifiableList(children);
|
||||||
|
|
||||||
public BaseContainer(Context context, GUI gui) {
|
public BaseContainer(Context context, GUI gui, Map<String, Component> refs) {
|
||||||
super(context, gui);
|
super(context, gui, refs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -11,6 +11,8 @@ import java.util.Locale;
|
|||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
public abstract class BaseWidget implements Widget {
|
public abstract class BaseWidget implements Widget {
|
||||||
|
protected final EventHandler eventHandler = new EventHandler();
|
||||||
|
|
||||||
protected Widget parent;
|
protected Widget parent;
|
||||||
|
|
||||||
protected SizeMode widthMode = SizeMode.AUTO;
|
protected SizeMode widthMode = SizeMode.AUTO;
|
||||||
@@ -32,7 +34,6 @@ public abstract class BaseWidget implements Widget {
|
|||||||
protected float paddingBottom;
|
protected float paddingBottom;
|
||||||
protected float paddingLeft;
|
protected float paddingLeft;
|
||||||
|
|
||||||
protected final EventHandler eventHandler = new EventHandler();
|
|
||||||
|
|
||||||
protected abstract float getContentWidth();
|
protected abstract float getContentWidth();
|
||||||
|
|
||||||
@@ -45,6 +46,26 @@ public abstract class BaseWidget implements Widget {
|
|||||||
: getActualWidth();
|
: getActualWidth();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setWidth(Float width) {
|
||||||
|
this.width = width;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Attribute("width")
|
||||||
|
public void setWidth(String width) {
|
||||||
|
var widthLowerCased = width.toLowerCase(Locale.ROOT);
|
||||||
|
|
||||||
|
if (widthLowerCased.equals("auto")) {
|
||||||
|
this.widthMode = SizeMode.AUTO;
|
||||||
|
} else if (widthLowerCased.equals("relative")) {
|
||||||
|
this.widthMode = SizeMode.RELATIVE;
|
||||||
|
this.width = 1f;
|
||||||
|
} else {
|
||||||
|
this.widthMode = SizeMode.ABSOLUTE;
|
||||||
|
this.width = Float.parseFloat(width);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public float getActualWidth() {
|
public float getActualWidth() {
|
||||||
return paddingLeft + (widthMode == SizeMode.ABSOLUTE ? width : getContentWidth()) + paddingRight;
|
return paddingLeft + (widthMode == SizeMode.ABSOLUTE ? width : getContentWidth()) + paddingRight;
|
||||||
@@ -57,16 +78,6 @@ public abstract class BaseWidget implements Widget {
|
|||||||
: getActualHeight();
|
: getActualHeight();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public float getActualHeight() {
|
|
||||||
return paddingTop + (heightMode == SizeMode.ABSOLUTE ? height : getContentHeight()) + paddingBottom;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setWidth(Float width) {
|
|
||||||
this.width = width;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setHeight(Float height) {
|
public void setHeight(Float height) {
|
||||||
this.height = height;
|
this.height = height;
|
||||||
@@ -87,19 +98,9 @@ public abstract class BaseWidget implements Widget {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Attribute("width")
|
@Override
|
||||||
public void setWidth(String width) {
|
public float getActualHeight() {
|
||||||
var widthLowerCased = width.toLowerCase(Locale.ROOT);
|
return paddingTop + (heightMode == SizeMode.ABSOLUTE ? height : getContentHeight()) + paddingBottom;
|
||||||
|
|
||||||
if (widthLowerCased.equals("auto")) {
|
|
||||||
this.widthMode = SizeMode.AUTO;
|
|
||||||
} else if (widthLowerCased.equals("relative")) {
|
|
||||||
this.widthMode = SizeMode.RELATIVE;
|
|
||||||
this.width = 1f;
|
|
||||||
} else {
|
|
||||||
this.widthMode = SizeMode.ABSOLUTE;
|
|
||||||
this.width = Float.parseFloat(width);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -152,13 +153,13 @@ public abstract class BaseWidget implements Widget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public float getY() {
|
public void setX(Float x) {
|
||||||
return y;
|
this.x = x;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setX(Float x) {
|
public float getY() {
|
||||||
this.x = x;
|
return y;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -204,46 +205,46 @@ public abstract class BaseWidget implements Widget {
|
|||||||
this.marginLeft = all;
|
this.marginLeft = all;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setMarginTop(Float margin) {
|
|
||||||
this.marginTop = margin;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setMarginRight(Float margin) {
|
|
||||||
this.marginRight = margin;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setMarginBottom(Float margin) {
|
|
||||||
this.marginBottom = margin;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setMarginLeft(Float margin) {
|
|
||||||
this.marginLeft = margin;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public float getMarginTop() {
|
public float getMarginTop() {
|
||||||
return marginTop;
|
return marginTop;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setMarginTop(Float margin) {
|
||||||
|
this.marginTop = margin;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public float getMarginRight() {
|
public float getMarginRight() {
|
||||||
return marginRight;
|
return marginRight;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setMarginRight(Float margin) {
|
||||||
|
this.marginRight = margin;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public float getMarginBottom() {
|
public float getMarginBottom() {
|
||||||
return marginBottom;
|
return marginBottom;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setMarginBottom(Float margin) {
|
||||||
|
this.marginBottom = margin;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public float getMarginLeft() {
|
public float getMarginLeft() {
|
||||||
return marginLeft;
|
return marginLeft;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setMarginLeft(Float margin) {
|
||||||
|
this.marginLeft = margin;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setPadding(Float top, Float right, Float bottom, Float left) {
|
public void setPadding(Float top, Float right, Float bottom, Float left) {
|
||||||
this.paddingTop = top;
|
this.paddingTop = top;
|
||||||
@@ -276,46 +277,46 @@ public abstract class BaseWidget implements Widget {
|
|||||||
this.paddingLeft = all;
|
this.paddingLeft = all;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setPaddingTop(Float padding) {
|
|
||||||
this.paddingTop = padding;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setPaddingRight(Float padding) {
|
|
||||||
this.paddingRight = padding;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setPaddingBottom(Float padding) {
|
|
||||||
this.paddingBottom = padding;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setPaddingLeft(Float padding) {
|
|
||||||
this.paddingLeft = padding;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public float getPaddingTop() {
|
public float getPaddingTop() {
|
||||||
return paddingTop;
|
return paddingTop;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setPaddingTop(Float padding) {
|
||||||
|
this.paddingTop = padding;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public float getPaddingRight() {
|
public float getPaddingRight() {
|
||||||
return paddingRight;
|
return paddingRight;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setPaddingRight(Float padding) {
|
||||||
|
this.paddingRight = padding;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public float getPaddingBottom() {
|
public float getPaddingBottom() {
|
||||||
return paddingBottom;
|
return paddingBottom;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setPaddingBottom(Float padding) {
|
||||||
|
this.paddingBottom = padding;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public float getPaddingLeft() {
|
public float getPaddingLeft() {
|
||||||
return paddingLeft;
|
return paddingLeft;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setPaddingLeft(Float padding) {
|
||||||
|
this.paddingLeft = padding;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public <E extends Event> void handleEvent(E event) {
|
public <E extends Event> void handleEvent(E event) {
|
||||||
eventHandler.handleEvent(event);
|
eventHandler.handleEvent(event);
|
||||||
|
|||||||
@@ -13,14 +13,12 @@ import static java.lang.String.format;
|
|||||||
import static java.util.Objects.requireNonNull;
|
import static java.util.Objects.requireNonNull;
|
||||||
|
|
||||||
public abstract class BaseWindow extends BaseWidget implements Window {
|
public abstract class BaseWindow extends BaseWidget implements Window {
|
||||||
|
@Getter
|
||||||
|
private final Map<String, Component> refs;
|
||||||
protected Context context;
|
protected Context context;
|
||||||
protected GUI gui;
|
protected GUI gui;
|
||||||
protected WindowManager manager;
|
protected WindowManager manager;
|
||||||
protected Component content;
|
protected Component content;
|
||||||
|
|
||||||
@Getter
|
|
||||||
private final Map<String, Component> refs;
|
|
||||||
|
|
||||||
protected WindowPosition windowPosition = WindowPosition.CENTER;
|
protected WindowPosition windowPosition = WindowPosition.CENTER;
|
||||||
|
|
||||||
protected BaseWindow(Context context, GUI gui, Map<String, Component> refs) {
|
protected BaseWindow(Context context, GUI gui, Map<String, Component> refs) {
|
||||||
|
|||||||
@@ -6,10 +6,12 @@ import com.bartlomiejpluta.base.api.gui.GUI;
|
|||||||
import com.bartlomiejpluta.base.api.gui.SizeMode;
|
import com.bartlomiejpluta.base.api.gui.SizeMode;
|
||||||
import com.bartlomiejpluta.base.api.screen.Screen;
|
import com.bartlomiejpluta.base.api.screen.Screen;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
public class BorderLayout extends BaseContainer {
|
public class BorderLayout extends BaseContainer {
|
||||||
|
|
||||||
public BorderLayout(Context context, GUI gui) {
|
public BorderLayout(Context context, GUI gui, Map<String, Component> refs) {
|
||||||
super(context, gui);
|
super(context, gui, refs);
|
||||||
super.setSizeMode(SizeMode.RELATIVE, SizeMode.RELATIVE);
|
super.setSizeMode(SizeMode.RELATIVE, SizeMode.RELATIVE);
|
||||||
super.setSize(1f, 1f);
|
super.setSize(1f, 1f);
|
||||||
}
|
}
|
||||||
@@ -69,8 +71,8 @@ public class BorderLayout extends BaseContainer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static abstract class Slot extends ComponentWrapper {
|
public static abstract class Slot extends ComponentWrapper {
|
||||||
protected Slot(Context context, GUI gui) {
|
protected Slot(Context context, GUI gui, Map<String, Component> refs) {
|
||||||
super(context, gui);
|
super(context, gui, refs);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected abstract void setPosition(BorderLayout layout);
|
protected abstract void setPosition(BorderLayout layout);
|
||||||
@@ -78,8 +80,8 @@ public class BorderLayout extends BaseContainer {
|
|||||||
|
|
||||||
public static class Top extends Slot {
|
public static class Top extends Slot {
|
||||||
|
|
||||||
public Top(Context context, GUI gui) {
|
public Top(Context context, GUI gui, Map<String, Component> refs) {
|
||||||
super(context, gui);
|
super(context, gui, refs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -90,8 +92,8 @@ public class BorderLayout extends BaseContainer {
|
|||||||
|
|
||||||
public static class TopRight extends Slot {
|
public static class TopRight extends Slot {
|
||||||
|
|
||||||
public TopRight(Context context, GUI gui) {
|
public TopRight(Context context, GUI gui, Map<String, Component> refs) {
|
||||||
super(context, gui);
|
super(context, gui, refs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -102,8 +104,8 @@ public class BorderLayout extends BaseContainer {
|
|||||||
|
|
||||||
public static class Right extends Slot {
|
public static class Right extends Slot {
|
||||||
|
|
||||||
public Right(Context context, GUI gui) {
|
public Right(Context context, GUI gui, Map<String, Component> refs) {
|
||||||
super(context, gui);
|
super(context, gui, refs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -114,8 +116,8 @@ public class BorderLayout extends BaseContainer {
|
|||||||
|
|
||||||
public static class BottomRight extends Slot {
|
public static class BottomRight extends Slot {
|
||||||
|
|
||||||
public BottomRight(Context context, GUI gui) {
|
public BottomRight(Context context, GUI gui, Map<String, Component> refs) {
|
||||||
super(context, gui);
|
super(context, gui, refs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -126,8 +128,8 @@ public class BorderLayout extends BaseContainer {
|
|||||||
|
|
||||||
public static class Bottom extends Slot {
|
public static class Bottom extends Slot {
|
||||||
|
|
||||||
public Bottom(Context context, GUI gui) {
|
public Bottom(Context context, GUI gui, Map<String, Component> refs) {
|
||||||
super(context, gui);
|
super(context, gui, refs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -138,8 +140,8 @@ public class BorderLayout extends BaseContainer {
|
|||||||
|
|
||||||
public static class BottomLeft extends Slot {
|
public static class BottomLeft extends Slot {
|
||||||
|
|
||||||
public BottomLeft(Context context, GUI gui) {
|
public BottomLeft(Context context, GUI gui, Map<String, Component> refs) {
|
||||||
super(context, gui);
|
super(context, gui, refs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -150,8 +152,8 @@ public class BorderLayout extends BaseContainer {
|
|||||||
|
|
||||||
public static class Left extends Slot {
|
public static class Left extends Slot {
|
||||||
|
|
||||||
public Left(Context context, GUI gui) {
|
public Left(Context context, GUI gui, Map<String, Component> refs) {
|
||||||
super(context, gui);
|
super(context, gui, refs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -162,8 +164,8 @@ public class BorderLayout extends BaseContainer {
|
|||||||
|
|
||||||
public static class TopLeft extends Slot {
|
public static class TopLeft extends Slot {
|
||||||
|
|
||||||
public TopLeft(Context context, GUI gui) {
|
public TopLeft(Context context, GUI gui, Map<String, Component> refs) {
|
||||||
super(context, gui);
|
super(context, gui, refs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -174,8 +176,8 @@ public class BorderLayout extends BaseContainer {
|
|||||||
|
|
||||||
public static class Center extends Slot {
|
public static class Center extends Slot {
|
||||||
|
|
||||||
public Center(Context context, GUI gui) {
|
public Center(Context context, GUI gui, Map<String, Component> refs) {
|
||||||
super(context, gui);
|
super(context, gui, refs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -5,13 +5,15 @@ import com.bartlomiejpluta.base.api.gui.Component;
|
|||||||
import com.bartlomiejpluta.base.api.gui.GUI;
|
import com.bartlomiejpluta.base.api.gui.GUI;
|
||||||
import com.bartlomiejpluta.base.api.screen.Screen;
|
import com.bartlomiejpluta.base.api.screen.Screen;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
import static java.util.Objects.requireNonNull;
|
import static java.util.Objects.requireNonNull;
|
||||||
|
|
||||||
public abstract class ComponentWrapper extends BaseComponent {
|
public abstract class ComponentWrapper extends BaseComponent {
|
||||||
protected Component component;
|
protected Component component;
|
||||||
|
|
||||||
protected ComponentWrapper(Context context, GUI gui) {
|
protected ComponentWrapper(Context context, GUI gui, Map<String, Component> refs) {
|
||||||
super(context, gui);
|
super(context, gui, refs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -1,18 +1,21 @@
|
|||||||
package com.bartlomiejpluta.base.lib.gui;
|
package com.bartlomiejpluta.base.lib.gui;
|
||||||
|
|
||||||
import com.bartlomiejpluta.base.api.context.Context;
|
import com.bartlomiejpluta.base.api.context.Context;
|
||||||
|
import com.bartlomiejpluta.base.api.gui.Component;
|
||||||
import com.bartlomiejpluta.base.api.gui.GUI;
|
import com.bartlomiejpluta.base.api.gui.GUI;
|
||||||
import com.bartlomiejpluta.base.api.screen.Screen;
|
import com.bartlomiejpluta.base.api.screen.Screen;
|
||||||
import lombok.NonNull;
|
import lombok.NonNull;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
public class HGridLayout extends BaseContainer {
|
public class HGridLayout extends BaseContainer {
|
||||||
protected float offsetX = 0.0f;
|
protected float offsetX = 0.0f;
|
||||||
protected float offsetY = 0.0f;
|
protected float offsetY = 0.0f;
|
||||||
protected int rows = 2;
|
protected int rows = 2;
|
||||||
private float[] heights = new float[rows];
|
private float[] heights = new float[rows];
|
||||||
|
|
||||||
public HGridLayout(Context context, GUI gui) {
|
public HGridLayout(Context context, GUI gui, Map<String, Component> refs) {
|
||||||
super(context, gui);
|
super(context, gui, refs);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setRows(@NonNull Integer rows) {
|
public void setRows(@NonNull Integer rows) {
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import lombok.Getter;
|
|||||||
import lombok.NonNull;
|
import lombok.NonNull;
|
||||||
|
|
||||||
import java.util.EnumSet;
|
import java.util.EnumSet;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
public class HGridOptionChoice extends HGridLayout {
|
public class HGridOptionChoice extends HGridLayout {
|
||||||
private static final EnumSet<KeyAction> ACTIONS = EnumSet.of(KeyAction.PRESS, KeyAction.REPEAT);
|
private static final EnumSet<KeyAction> ACTIONS = EnumSet.of(KeyAction.PRESS, KeyAction.REPEAT);
|
||||||
@@ -26,8 +27,8 @@ public class HGridOptionChoice extends HGridLayout {
|
|||||||
@Getter
|
@Getter
|
||||||
private Component selectedComponent = null;
|
private Component selectedComponent = null;
|
||||||
|
|
||||||
public HGridOptionChoice(Context context, GUI gui) {
|
public HGridOptionChoice(Context context, GUI gui, Map<String, Component> refs) {
|
||||||
super(context, gui);
|
super(context, gui, refs);
|
||||||
addEventListener(KeyEvent.TYPE, this::switchOption);
|
addEventListener(KeyEvent.TYPE, this::switchOption);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,15 +1,18 @@
|
|||||||
package com.bartlomiejpluta.base.lib.gui;
|
package com.bartlomiejpluta.base.lib.gui;
|
||||||
|
|
||||||
import com.bartlomiejpluta.base.api.context.Context;
|
import com.bartlomiejpluta.base.api.context.Context;
|
||||||
|
import com.bartlomiejpluta.base.api.gui.Component;
|
||||||
import com.bartlomiejpluta.base.api.gui.GUI;
|
import com.bartlomiejpluta.base.api.gui.GUI;
|
||||||
import com.bartlomiejpluta.base.api.screen.Screen;
|
import com.bartlomiejpluta.base.api.screen.Screen;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
public class HLayout extends BaseContainer {
|
public class HLayout extends BaseContainer {
|
||||||
protected float offsetX = 0.0f;
|
protected float offsetX = 0.0f;
|
||||||
protected float offsetY = 0.0f;
|
protected float offsetY = 0.0f;
|
||||||
|
|
||||||
public HLayout(Context context, GUI gui) {
|
public HLayout(Context context, GUI gui, Map<String, Component> refs) {
|
||||||
super(context, gui);
|
super(context, gui, refs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import lombok.Getter;
|
|||||||
import lombok.NonNull;
|
import lombok.NonNull;
|
||||||
|
|
||||||
import java.util.EnumSet;
|
import java.util.EnumSet;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
public class HOptionChoice extends HLayout {
|
public class HOptionChoice extends HLayout {
|
||||||
private static final EnumSet<KeyAction> ACTIONS = EnumSet.of(KeyAction.PRESS, KeyAction.REPEAT);
|
private static final EnumSet<KeyAction> ACTIONS = EnumSet.of(KeyAction.PRESS, KeyAction.REPEAT);
|
||||||
@@ -23,8 +24,8 @@ public class HOptionChoice extends HLayout {
|
|||||||
@Getter
|
@Getter
|
||||||
private Component selectedComponent = null;
|
private Component selectedComponent = null;
|
||||||
|
|
||||||
public HOptionChoice(Context context, GUI gui) {
|
public HOptionChoice(Context context, GUI gui, Map<String, Component> refs) {
|
||||||
super(context, gui);
|
super(context, gui, refs);
|
||||||
addEventListener(KeyEvent.TYPE, this::switchOption);
|
addEventListener(KeyEvent.TYPE, this::switchOption);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package com.bartlomiejpluta.base.lib.gui;
|
package com.bartlomiejpluta.base.lib.gui;
|
||||||
|
|
||||||
import com.bartlomiejpluta.base.api.context.Context;
|
import com.bartlomiejpluta.base.api.context.Context;
|
||||||
|
import com.bartlomiejpluta.base.api.gui.Component;
|
||||||
import com.bartlomiejpluta.base.api.gui.GUI;
|
import com.bartlomiejpluta.base.api.gui.GUI;
|
||||||
import com.bartlomiejpluta.base.api.gui.SizeMode;
|
import com.bartlomiejpluta.base.api.gui.SizeMode;
|
||||||
import com.bartlomiejpluta.base.api.input.Key;
|
import com.bartlomiejpluta.base.api.input.Key;
|
||||||
@@ -8,6 +9,8 @@ import com.bartlomiejpluta.base.api.input.KeyAction;
|
|||||||
import com.bartlomiejpluta.base.api.input.KeyEvent;
|
import com.bartlomiejpluta.base.api.input.KeyEvent;
|
||||||
import com.bartlomiejpluta.base.api.screen.Screen;
|
import com.bartlomiejpluta.base.api.screen.Screen;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
import static com.bartlomiejpluta.base.util.math.MathUtil.clamp;
|
import static com.bartlomiejpluta.base.util.math.MathUtil.clamp;
|
||||||
import static java.lang.Math.*;
|
import static java.lang.Math.*;
|
||||||
|
|
||||||
@@ -16,8 +19,8 @@ public class HScrollableLayout extends HLayout {
|
|||||||
private float scrollStep = 0.25f;
|
private float scrollStep = 0.25f;
|
||||||
private float scrollSpeed = 0.1f;
|
private float scrollSpeed = 0.1f;
|
||||||
|
|
||||||
public HScrollableLayout(Context context, GUI gui) {
|
public HScrollableLayout(Context context, GUI gui, Map<String, Component> refs) {
|
||||||
super(context, gui);
|
super(context, gui, refs);
|
||||||
addEventListener(KeyEvent.TYPE, this::handleKeyEvent);
|
addEventListener(KeyEvent.TYPE, this::handleKeyEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package com.bartlomiejpluta.base.lib.gui;
|
package com.bartlomiejpluta.base.lib.gui;
|
||||||
|
|
||||||
import com.bartlomiejpluta.base.api.context.Context;
|
import com.bartlomiejpluta.base.api.context.Context;
|
||||||
|
import com.bartlomiejpluta.base.api.gui.Component;
|
||||||
import com.bartlomiejpluta.base.api.gui.GUI;
|
import com.bartlomiejpluta.base.api.gui.GUI;
|
||||||
import com.bartlomiejpluta.base.api.gui.IconSet;
|
import com.bartlomiejpluta.base.api.gui.IconSet;
|
||||||
import com.bartlomiejpluta.base.api.gui.Paint;
|
import com.bartlomiejpluta.base.api.gui.Paint;
|
||||||
@@ -9,6 +10,8 @@ import com.bartlomiejpluta.base.api.screen.Screen;
|
|||||||
import lombok.NonNull;
|
import lombok.NonNull;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
public class IconView extends BaseComponent {
|
public class IconView extends BaseComponent {
|
||||||
private final GUI gui;
|
private final GUI gui;
|
||||||
private final Paint paint;
|
private final Paint paint;
|
||||||
@@ -40,8 +43,8 @@ public class IconView extends BaseComponent {
|
|||||||
private Integer iconSetColumn = 0;
|
private Integer iconSetColumn = 0;
|
||||||
|
|
||||||
|
|
||||||
public IconView(Context context, GUI gui) {
|
public IconView(Context context, GUI gui, Map<String, Component> refs) {
|
||||||
super(context, gui);
|
super(context, gui, refs);
|
||||||
this.gui = gui;
|
this.gui = gui;
|
||||||
this.paint = gui.createPaint();
|
this.paint = gui.createPaint();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,14 @@
|
|||||||
package com.bartlomiejpluta.base.lib.gui;
|
package com.bartlomiejpluta.base.lib.gui;
|
||||||
|
|
||||||
import com.bartlomiejpluta.base.api.context.Context;
|
import com.bartlomiejpluta.base.api.context.Context;
|
||||||
|
import com.bartlomiejpluta.base.api.gui.Component;
|
||||||
import com.bartlomiejpluta.base.api.gui.GUI;
|
import com.bartlomiejpluta.base.api.gui.GUI;
|
||||||
import com.bartlomiejpluta.base.api.gui.Image;
|
import com.bartlomiejpluta.base.api.gui.Image;
|
||||||
import com.bartlomiejpluta.base.api.gui.Paint;
|
import com.bartlomiejpluta.base.api.gui.Paint;
|
||||||
import com.bartlomiejpluta.base.api.screen.Screen;
|
import com.bartlomiejpluta.base.api.screen.Screen;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
public class ImageView extends BaseComponent {
|
public class ImageView extends BaseComponent {
|
||||||
private final Paint paint;
|
private final Paint paint;
|
||||||
|
|
||||||
@@ -15,31 +18,11 @@ public class ImageView extends BaseComponent {
|
|||||||
private float scaleX = 1;
|
private float scaleX = 1;
|
||||||
private float scaleY = 1;
|
private float scaleY = 1;
|
||||||
|
|
||||||
public ImageView(Context context, GUI gui) {
|
public ImageView(Context context, GUI gui, Map<String, Component> refs) {
|
||||||
super(context, gui);
|
super(context, gui, refs);
|
||||||
this.paint = gui.createPaint();
|
this.paint = gui.createPaint();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setImage(String imageUid) {
|
|
||||||
this.image = gui.getImage(imageUid);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setAngle(float angle) {
|
|
||||||
this.angle = angle;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setOpacity(float opacity) {
|
|
||||||
this.opacity = opacity;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setScaleX(float scaleX) {
|
|
||||||
this.scaleX = scaleX;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setScaleY(float scaleY) {
|
|
||||||
this.scaleY = scaleY;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setScale(float scaleX, float scaleY) {
|
public void setScale(float scaleX, float scaleY) {
|
||||||
this.scaleX = scaleX;
|
this.scaleX = scaleX;
|
||||||
this.scaleY = scaleY;
|
this.scaleY = scaleY;
|
||||||
@@ -54,22 +37,42 @@ public class ImageView extends BaseComponent {
|
|||||||
return image;
|
return image;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setImage(String imageUid) {
|
||||||
|
this.image = gui.getImage(imageUid);
|
||||||
|
}
|
||||||
|
|
||||||
public float getAngle() {
|
public float getAngle() {
|
||||||
return angle;
|
return angle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setAngle(float angle) {
|
||||||
|
this.angle = angle;
|
||||||
|
}
|
||||||
|
|
||||||
public float getOpacity() {
|
public float getOpacity() {
|
||||||
return opacity;
|
return opacity;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setOpacity(float opacity) {
|
||||||
|
this.opacity = opacity;
|
||||||
|
}
|
||||||
|
|
||||||
public float getScaleX() {
|
public float getScaleX() {
|
||||||
return scaleX;
|
return scaleX;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setScaleX(float scaleX) {
|
||||||
|
this.scaleX = scaleX;
|
||||||
|
}
|
||||||
|
|
||||||
public float getScaleY() {
|
public float getScaleY() {
|
||||||
return scaleY;
|
return scaleY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setScaleY(float scaleY) {
|
||||||
|
this.scaleY = scaleY;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected float getContentWidth() {
|
protected float getContentWidth() {
|
||||||
return image.getWidth() * scaleX;
|
return image.getWidth() * scaleX;
|
||||||
|
|||||||
@@ -3,22 +3,24 @@ package com.bartlomiejpluta.base.lib.gui;
|
|||||||
import com.bartlomiejpluta.base.api.context.Context;
|
import com.bartlomiejpluta.base.api.context.Context;
|
||||||
import com.bartlomiejpluta.base.api.gui.Attribute;
|
import com.bartlomiejpluta.base.api.gui.Attribute;
|
||||||
import com.bartlomiejpluta.base.api.gui.Color;
|
import com.bartlomiejpluta.base.api.gui.Color;
|
||||||
|
import com.bartlomiejpluta.base.api.gui.Component;
|
||||||
import com.bartlomiejpluta.base.api.gui.GUI;
|
import com.bartlomiejpluta.base.api.gui.GUI;
|
||||||
import com.bartlomiejpluta.base.api.screen.Screen;
|
import com.bartlomiejpluta.base.api.screen.Screen;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
import static java.util.Objects.requireNonNull;
|
import static java.util.Objects.requireNonNull;
|
||||||
|
|
||||||
public class Label extends BaseComponent {
|
public class Label extends BaseComponent {
|
||||||
|
private final float[] bounds = new float[4];
|
||||||
private String text = "";
|
private String text = "";
|
||||||
private String font;
|
private String font;
|
||||||
private float fontSize;
|
private float fontSize;
|
||||||
private int alignment = GUI.ALIGN_LEFT;
|
private int alignment = GUI.ALIGN_LEFT;
|
||||||
private Color color;
|
private final Color color;
|
||||||
|
|
||||||
private final float[] bounds = new float[4];
|
public Label(Context context, GUI gui, Map<String, Component> refs) {
|
||||||
|
super(context, gui, refs);
|
||||||
public Label(Context context, GUI gui) {
|
|
||||||
super(context, gui);
|
|
||||||
this.color = gui.createColor();
|
this.color = gui.createColor();
|
||||||
this.color.setRGBA(0xFFFFFFFF);
|
this.color.setRGBA(0xFFFFFFFF);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,19 +1,21 @@
|
|||||||
package com.bartlomiejpluta.base.lib.gui;
|
package com.bartlomiejpluta.base.lib.gui;
|
||||||
|
|
||||||
import com.bartlomiejpluta.base.api.context.Context;
|
import com.bartlomiejpluta.base.api.context.Context;
|
||||||
|
import com.bartlomiejpluta.base.api.gui.Component;
|
||||||
import com.bartlomiejpluta.base.api.gui.GUI;
|
import com.bartlomiejpluta.base.api.gui.GUI;
|
||||||
import com.bartlomiejpluta.base.api.screen.Screen;
|
import com.bartlomiejpluta.base.api.screen.Screen;
|
||||||
import lombok.Getter;
|
|
||||||
import lombok.NonNull;
|
import lombok.NonNull;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
public class VGridLayout extends BaseContainer {
|
public class VGridLayout extends BaseContainer {
|
||||||
protected float offsetX = 0.0f;
|
protected float offsetX = 0.0f;
|
||||||
protected float offsetY = 0.0f;
|
protected float offsetY = 0.0f;
|
||||||
protected int columns = 2;
|
protected int columns = 2;
|
||||||
private float[] widths = new float[columns];
|
private float[] widths = new float[columns];
|
||||||
|
|
||||||
public VGridLayout(Context context, GUI gui) {
|
public VGridLayout(Context context, GUI gui, Map<String, Component> refs) {
|
||||||
super(context, gui);
|
super(context, gui, refs);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setColumns(@NonNull Integer columns) {
|
public void setColumns(@NonNull Integer columns) {
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import lombok.Getter;
|
|||||||
import lombok.NonNull;
|
import lombok.NonNull;
|
||||||
|
|
||||||
import java.util.EnumSet;
|
import java.util.EnumSet;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
public class VGridOptionChoice extends VGridLayout {
|
public class VGridOptionChoice extends VGridLayout {
|
||||||
private static final EnumSet<KeyAction> ACTIONS = EnumSet.of(KeyAction.PRESS, KeyAction.REPEAT);
|
private static final EnumSet<KeyAction> ACTIONS = EnumSet.of(KeyAction.PRESS, KeyAction.REPEAT);
|
||||||
@@ -26,8 +27,8 @@ public class VGridOptionChoice extends VGridLayout {
|
|||||||
@Getter
|
@Getter
|
||||||
private Component selectedComponent = null;
|
private Component selectedComponent = null;
|
||||||
|
|
||||||
public VGridOptionChoice(Context context, GUI gui) {
|
public VGridOptionChoice(Context context, GUI gui, Map<String, Component> refs) {
|
||||||
super(context, gui);
|
super(context, gui, refs);
|
||||||
addEventListener(KeyEvent.TYPE, this::switchOption);
|
addEventListener(KeyEvent.TYPE, this::switchOption);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,15 +1,18 @@
|
|||||||
package com.bartlomiejpluta.base.lib.gui;
|
package com.bartlomiejpluta.base.lib.gui;
|
||||||
|
|
||||||
import com.bartlomiejpluta.base.api.context.Context;
|
import com.bartlomiejpluta.base.api.context.Context;
|
||||||
|
import com.bartlomiejpluta.base.api.gui.Component;
|
||||||
import com.bartlomiejpluta.base.api.gui.GUI;
|
import com.bartlomiejpluta.base.api.gui.GUI;
|
||||||
import com.bartlomiejpluta.base.api.screen.Screen;
|
import com.bartlomiejpluta.base.api.screen.Screen;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
public class VLayout extends BaseContainer {
|
public class VLayout extends BaseContainer {
|
||||||
protected float offsetX = 0.0f;
|
protected float offsetX = 0.0f;
|
||||||
protected float offsetY = 0.0f;
|
protected float offsetY = 0.0f;
|
||||||
|
|
||||||
public VLayout(Context context, GUI gui) {
|
public VLayout(Context context, GUI gui, Map<String, Component> refs) {
|
||||||
super(context, gui);
|
super(context, gui, refs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import lombok.Getter;
|
|||||||
import lombok.NonNull;
|
import lombok.NonNull;
|
||||||
|
|
||||||
import java.util.EnumSet;
|
import java.util.EnumSet;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
public class VOptionChoice extends VLayout {
|
public class VOptionChoice extends VLayout {
|
||||||
private static final EnumSet<KeyAction> ACTIONS = EnumSet.of(KeyAction.PRESS, KeyAction.REPEAT);
|
private static final EnumSet<KeyAction> ACTIONS = EnumSet.of(KeyAction.PRESS, KeyAction.REPEAT);
|
||||||
@@ -23,8 +24,8 @@ public class VOptionChoice extends VLayout {
|
|||||||
@Getter
|
@Getter
|
||||||
private Component selectedComponent = null;
|
private Component selectedComponent = null;
|
||||||
|
|
||||||
public VOptionChoice(Context context, GUI gui) {
|
public VOptionChoice(Context context, GUI gui, Map<String, Component> refs) {
|
||||||
super(context, gui);
|
super(context, gui, refs);
|
||||||
addEventListener(KeyEvent.TYPE, this::switchOption);
|
addEventListener(KeyEvent.TYPE, this::switchOption);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package com.bartlomiejpluta.base.lib.gui;
|
package com.bartlomiejpluta.base.lib.gui;
|
||||||
|
|
||||||
import com.bartlomiejpluta.base.api.context.Context;
|
import com.bartlomiejpluta.base.api.context.Context;
|
||||||
|
import com.bartlomiejpluta.base.api.gui.Component;
|
||||||
import com.bartlomiejpluta.base.api.gui.GUI;
|
import com.bartlomiejpluta.base.api.gui.GUI;
|
||||||
import com.bartlomiejpluta.base.api.gui.SizeMode;
|
import com.bartlomiejpluta.base.api.gui.SizeMode;
|
||||||
import com.bartlomiejpluta.base.api.input.Key;
|
import com.bartlomiejpluta.base.api.input.Key;
|
||||||
@@ -8,6 +9,8 @@ import com.bartlomiejpluta.base.api.input.KeyAction;
|
|||||||
import com.bartlomiejpluta.base.api.input.KeyEvent;
|
import com.bartlomiejpluta.base.api.input.KeyEvent;
|
||||||
import com.bartlomiejpluta.base.api.screen.Screen;
|
import com.bartlomiejpluta.base.api.screen.Screen;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
import static com.bartlomiejpluta.base.util.math.MathUtil.clamp;
|
import static com.bartlomiejpluta.base.util.math.MathUtil.clamp;
|
||||||
import static java.lang.Math.*;
|
import static java.lang.Math.*;
|
||||||
|
|
||||||
@@ -16,8 +19,8 @@ public class VScrollableLayout extends VLayout {
|
|||||||
private float scrollStep = 0.25f;
|
private float scrollStep = 0.25f;
|
||||||
private float scrollSpeed = 0.1f;
|
private float scrollSpeed = 0.1f;
|
||||||
|
|
||||||
public VScrollableLayout(Context context, GUI gui) {
|
public VScrollableLayout(Context context, GUI gui, Map<String, Component> refs) {
|
||||||
super(context, gui);
|
super(context, gui, refs);
|
||||||
addEventListener(KeyEvent.TYPE, this::scroll);
|
addEventListener(KeyEvent.TYPE, this::scroll);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -233,7 +233,7 @@ public class DefaultInflater implements Inflater {
|
|||||||
|
|
||||||
@SneakyThrows
|
@SneakyThrows
|
||||||
private Component createComponent(Class<? extends Widget> componentClass, NamedNodeMap attributes, Map<String, Component> refs, Context context, GUI gui) {
|
private Component createComponent(Class<? extends Widget> componentClass, NamedNodeMap attributes, Map<String, Component> refs, Context context, GUI gui) {
|
||||||
var component = (Component) componentClass.getConstructor(Context.class, GUI.class).newInstance(context, gui);
|
var component = (Component) componentClass.getConstructor(Context.class, GUI.class, Map.class).newInstance(context, gui, refs);
|
||||||
|
|
||||||
// Set attributes via setter methods
|
// Set attributes via setter methods
|
||||||
for (int i = 0; i < attributes.getLength(); ++i) {
|
for (int i = 0; i < attributes.getLength(); ++i) {
|
||||||
|
|||||||
Reference in New Issue
Block a user