diff --git a/resources/icons/arrow_down_black.png b/resources/icons/arrow_down_black.png
new file mode 100644
index 0000000..87d0d6c
Binary files /dev/null and b/resources/icons/arrow_down_black.png differ
diff --git a/resources/icons/arrow_down_white.png b/resources/icons/arrow_down_white.png
new file mode 100644
index 0000000..c8b0ddb
Binary files /dev/null and b/resources/icons/arrow_down_white.png differ
diff --git a/resources/icons/arrow_left_black.png b/resources/icons/arrow_left_black.png
new file mode 100644
index 0000000..1ca54ff
Binary files /dev/null and b/resources/icons/arrow_left_black.png differ
diff --git a/resources/icons/arrow_left_white.png b/resources/icons/arrow_left_white.png
new file mode 100644
index 0000000..4130cce
Binary files /dev/null and b/resources/icons/arrow_left_white.png differ
diff --git a/resources/icons/arrow_right_black.png b/resources/icons/arrow_right_black.png
new file mode 100644
index 0000000..35d43f5
Binary files /dev/null and b/resources/icons/arrow_right_black.png differ
diff --git a/resources/icons/arrow_right_white.png b/resources/icons/arrow_right_white.png
new file mode 100644
index 0000000..98b57bd
Binary files /dev/null and b/resources/icons/arrow_right_white.png differ
diff --git a/resources/icons/arrow_up_black.png b/resources/icons/arrow_up_black.png
new file mode 100644
index 0000000..9e79a39
Binary files /dev/null and b/resources/icons/arrow_up_black.png differ
diff --git a/resources/icons/arrow_up_white.png b/resources/icons/arrow_up_white.png
new file mode 100644
index 0000000..e029ca4
Binary files /dev/null and b/resources/icons/arrow_up_white.png differ
diff --git a/resources/ui.xml b/resources/ui.xml
index 3cc50e8..8af6e27 100644
--- a/resources/ui.xml
+++ b/resources/ui.xml
@@ -9,55 +9,58 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Main.java b/src/Main.java
index 35549f9..8e33176 100644
--- a/src/Main.java
+++ b/src/Main.java
@@ -1,43 +1,53 @@
-import guiTree.Components.Button;
-import guiTree.Components.CheckBox;
-import guiTree.Components.ToggleButton;
+import guiTree.Animations.ColorAnimation;
+import guiTree.Animations.LocationAnimation;
+import guiTree.Components.Slider;
+import guiTree.Helper.Point2;
+import guiTree.Visual;
import guiTree.Window;
import guiTree.events.MouseAdapter;
import parser.XAMLParser;
+import java.awt.*;
import java.awt.event.MouseEvent;
+
public class Main {
public static void main(String[] args) {
try{
Window window = XAMLParser.parse("ui.xml");
assert window != null;
-
-// Button button1 = (Button)window.findByName("button1");
-// button1.addMouseListener(new MouseAdapter() {
-// @Override
-// public void mouseClicked(MouseEvent mouseEvent) {
-// System.out.println("Button x: " + button1.getLocationX() + " y: " + button1.getLocationY());
-// }
-// });
-//
-// ToggleButton button2 = (ToggleButton)window.findByName("button2");
-// button2.addMouseListener(new MouseAdapter() {
-// @Override
-// public void mouseClicked(MouseEvent mouseEvent) {
-// System.out.println("Button x: " + button2.getLocationX() + " y: " + button2.getLocationY());
-// }
-// });
-//
-// Button button4 = (Button)window.findByName("button4");
-// button4.addMouseListener(new MouseAdapter() {
-// @Override
-// public void mouseClicked(MouseEvent mouseEvent) {
-// System.out.println("Button x: " + button4.getLocationX() + " y: " + button4.getLocationY());
-// }
-// });
- CheckBox checkBox = (CheckBox)window.findByName("checkbox");
+ Slider hslider = (Slider)window.findByName("hslider");
+ Slider slider = (Slider)window.findByName("slider");
window.repaint();
+ ColorAnimation sliderColor = new ColorAnimation(hslider, slider.getBackgroundColor(), Color.RED, 1000);
+ window.addMouseListener(new MouseAdapter() {
+ private boolean out = false;
+ private LocationAnimation outAnimation;
+ private LocationAnimation inAnimation;
+ @Override
+ public void mouseMoved(MouseEvent mouseEvent) {
+ if(mouseEvent.getX() < 20 && mouseEvent.getY() > 0 && mouseEvent.getY() < 100) {
+ if(!out) {
+ outAnimation = new LocationAnimation(slider, slider.getLocation(), new Point2<>(0, slider.getLocationY()), 500);
+ window.removeAnimation(inAnimation);
+ window.addAnimation(outAnimation);
+ out = true;
+ }
+ }
+ else {
+ if(out) {
+ inAnimation = new LocationAnimation(slider, slider.getLocation(), new Point2<>(- 20, slider.getLocationY()), 500);
+ window.removeAnimation(outAnimation);
+ window.addAnimation(inAnimation);
+ out = false;
+ }
+ }
+ }
+ });
+ Thread.sleep(5000);
+ System.out.println("Started moving");
+ hslider.addAnimation(new LocationAnimation(hslider, hslider.getLocation(), new Point2<>(hslider.getLocationX(), hslider.getLocationY() + 100), 1000));
+ hslider.addAnimation(sliderColor);
}catch (Exception e){
e.printStackTrace();
}
diff --git a/src/converters/Converter.java b/src/converters/Converter.java
index 9a1fe1b..48562a8 100644
--- a/src/converters/Converter.java
+++ b/src/converters/Converter.java
@@ -1,6 +1,7 @@
package converters;
import com.sun.jdi.InvalidTypeException;
+import guiTree.Components.Slider;
import java.awt.*;
import java.util.HashMap;
@@ -20,6 +21,7 @@ public class Converter {
this.converterTable.put(Double.TYPE, new DoubleConverter());
this.converterTable.put(Boolean.TYPE, new BooleanConverter());
this.converterTable.put(Color.class, new ColorConverter());
+ this.converterTable.put(Slider.Direction.class, new DirectionConverter());
}
public Object objectCreatorFactory (Class> type, String content) throws InvalidTypeException {
diff --git a/src/converters/DirectionConverter.java b/src/converters/DirectionConverter.java
new file mode 100644
index 0000000..bc041e6
--- /dev/null
+++ b/src/converters/DirectionConverter.java
@@ -0,0 +1,18 @@
+package converters;
+
+import com.sun.jdi.InvalidTypeException;
+import guiTree.Components.Slider;
+
+public class DirectionConverter implements ConverterInterface {
+ @Override
+ public Slider.Direction convert(String content) throws InvalidTypeException {
+ content = content.toLowerCase();
+ if(content.equals("horizontal")) {
+ return Slider.Direction.Horizontal;
+ }
+ if(content.equals("vertical")) {
+ return Slider.Direction.Vertical;
+ }
+ throw new InvalidTypeException();
+ }
+}
diff --git a/src/guiTree/Animations/AnimationInterface.java b/src/guiTree/Animations/AnimationInterface.java
new file mode 100644
index 0000000..f6203b2
--- /dev/null
+++ b/src/guiTree/Animations/AnimationInterface.java
@@ -0,0 +1,6 @@
+package guiTree.Animations;
+
+public interface AnimationInterface {
+ int FPS = 60;
+ boolean step();
+}
diff --git a/src/guiTree/Animations/ColorAnimation.java b/src/guiTree/Animations/ColorAnimation.java
new file mode 100644
index 0000000..9b2a75e
--- /dev/null
+++ b/src/guiTree/Animations/ColorAnimation.java
@@ -0,0 +1,51 @@
+package guiTree.Animations;
+
+import guiTree.Helper.*;
+import guiTree.Visual;
+
+import java.awt.*;
+
+public class ColorAnimation implements AnimationInterface {
+ private Point4 from;
+ private Point4 to;
+ private Point4 offset;
+ private Visual element;
+
+ public ColorAnimation(Visual v, Color from, Color to, int ms) {
+ this.from = new Point4<>((float)from.getRed(), (float)from.getGreen(), (float)from.getBlue(), (float)from.getAlpha());
+ this.to = new Point4<>(to.getRed(), to.getGreen(), to.getBlue(), to.getAlpha());
+ this.offset = new Point4<>((this.to.a - this.from.a) * 1000 / FPS / ms,
+ (this.to.b - this.from.b) * 1000 / FPS / ms,
+ (this.to.c - this.from.c) * 1000 / FPS / ms,
+ (this.to.d - this.from.d) * 1000 / FPS / ms);
+ this.element = v;
+ Debugger.log("Created color animation for " + v.getName() +
+ " from r: " + this.from.a +
+ " g: " + this.from.b +
+ " b: " + this.from.c +
+ " a: " + this.from.d +
+ " to r: " + this.to.a +
+ " g: " + this.to.b +
+ " b: " + this.to.c +
+ " a: " + this.to.d, Debugger.Tag.ANIMATIONS);
+ }
+
+ @Override
+ public boolean step() {
+ if(from.a > to.a - 1 && from.a < to.a + 1 &&
+ from.b > to.b - 1 && from.b < to.b + 1 &&
+ from.c > to.c - 1 && from.c < to.c + 1 &&
+ from.d > to.d - 1 && from.d < to.d + 1) {
+ element.setBackgroundColor(new Color(to.a, to.b, to.c, to.d));
+ Debugger.log("Animation for " + element.getName() + " finished", Debugger.Tag.ANIMATIONS);
+ return true;
+ }
+ from.a += offset.a;
+ from.b += offset.b;
+ from.c += offset.c;
+ from.d += offset.d;
+ element.setBackgroundColor(new Color(Math.round(from.a), Math.round(from.b), Math.round(from.c), Math.round(from.d)));
+ element.update();
+ return false;
+ }
+}
diff --git a/src/guiTree/Animations/LocationAnimation.java b/src/guiTree/Animations/LocationAnimation.java
new file mode 100644
index 0000000..548772d
--- /dev/null
+++ b/src/guiTree/Animations/LocationAnimation.java
@@ -0,0 +1,34 @@
+package guiTree.Animations;
+
+import guiTree.Helper.Debugger;
+import guiTree.Helper.Point2;
+import guiTree.Visual;
+
+public class LocationAnimation implements AnimationInterface {
+ private Point2 from;
+ private Point2 to;
+ private Point2 offset;
+ private Visual element;
+
+ public LocationAnimation(Visual v, Point2 from, Point2 to, int ms) {
+ this.from = new Point2<>(from.x.floatValue(), from.y.floatValue());
+ this.to = to;
+ this.offset = new Point2<>((float)(to.x - from.x) * 1000 / FPS / ms, (float)(to.y - from.y) * 1000 / FPS / ms);
+ this.element = v;
+ Debugger.log("Created animation for " + v.getName() + " from x: " + from.x + " y: " + from.y + " to x: " + to.x + " y: " + to.y, Debugger.Tag.ANIMATIONS);
+ }
+
+ @Override
+ public boolean step() {
+ if(from.x > to.x - 1 && from.x < to.x + 1 && from.y > to.y - 1 && from.y < to.y + 1) {
+ element.setLocation(to.x, to.y);
+ Debugger.log("Animation for " + element.getName() + " finished", Debugger.Tag.ANIMATIONS);
+ return true;
+ }
+ from.x += offset.x;
+ from.y += offset.y;
+ element.setLocation(Math.round(from.x), Math.round(from.y));
+ element.update();
+ return false;
+ }
+}
diff --git a/src/guiTree/Components/Button.java b/src/guiTree/Components/Button.java
index d0f69c0..a1daf48 100644
--- a/src/guiTree/Components/Button.java
+++ b/src/guiTree/Components/Button.java
@@ -1,7 +1,6 @@
package guiTree.Components;
import guiTree.Helper.Debugger;
-import guiTree.Helper.Tag;
import guiTree.Visual;
import guiTree.events.MouseAdapter;
@@ -17,6 +16,7 @@ public class Button extends Visual {
private Boolean pressed;
private Boolean hovered;
private BufferedImage icon;
+ private int round = -1;
public Button() {
this("", null);
@@ -40,39 +40,39 @@ public class Button extends Visual {
@Override
public void mouseClicked(MouseEvent mouseEvent) {
pressed = false;
+ update();
}
@Override
public void mousePressed(MouseEvent mouseEvent) {
pressed = true;
- Debugger.log("Pressed: " + getName(), Tag.LISTENER);
- Debugger.log("Calling repaint from pressed: " + getName(), Tag.PAINTING);
- repaint();
+ update();
+ Debugger.log("Pressed: " + getName(), Debugger.Tag.LISTENER);
+ Debugger.log("Calling repaint from pressed: " + getName(), Debugger.Tag.PAINTING);
}
@Override
public void mouseReleased(MouseEvent mouseEvent) {
pressed = false;
- Debugger.log("Calling repaint from released: " + getName(), Tag.PAINTING);
- repaint();
+ update();
+ Debugger.log("Calling repaint from released: " + getName(), Debugger.Tag.PAINTING);
}
@Override
public void mouseEntered(MouseEvent mouseEvent) {
hovered = true;
- Debugger.log("Calling repaint from entered: " + getName(), Tag.PAINTING);
- repaint();
+ update();
+ Debugger.log("Calling repaint from entered: " + getName(), Debugger.Tag.PAINTING);
}
@Override
public void mouseExited(MouseEvent mouseEvent) {
hovered = false;
- Debugger.log("Calling repaint from exited: " + getName(), Tag.PAINTING);
- repaint();
+ update();
+ Debugger.log("Calling repaint from exited: " + getName(), Debugger.Tag.PAINTING);
}
@Override
public void mouseDragged(MouseEvent mouseEvent) {
}
@Override
public void mouseMoved(MouseEvent mouseEvent) {
- Debugger.log("Calling repaint from moved: " + getName(), Tag.PAINTING);
- repaint();
+ Debugger.log("Calling repaint from moved: " + getName(), Debugger.Tag.PAINTING);
}
});
}
@@ -82,11 +82,7 @@ public class Button extends Visual {
{
//Get Graphics
Graphics2D g = imageBuffer.createGraphics();
-
- //Set Transparency
- g.setComposite(AlphaComposite.Clear);
- g.fillRect(0, 0, getWidth(), getHeight());
- g.setComposite(AlphaComposite.Src);
+ g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
//Choose background
if(hovered) {
@@ -101,12 +97,12 @@ public class Button extends Visual {
//Draw Button
if(getHasBorder()) {
- g.fillRect(1, 1, this.getWidth() - 2, this.getHeight() - 2);
+ g.fillRoundRect(1, 1, getWidth() - 1, getHeight() - 1, round, round);
g.setColor(getBorderColor());
- g.drawRect(0, 0, getWidth() - 1, getHeight() - 1);
+ g.drawRoundRect(0, 0, getWidth() - 1, getHeight() - 1, round, round);
}
else {
- g.fillRect(0, 0, getWidth() - 1, getHeight() - 1);
+ g.fillRoundRect(0, 0, getWidth(), getHeight(), round, round);
}
//Draw Label
@@ -138,6 +134,10 @@ public class Button extends Visual {
g.dispose();
}
+ public void setRound(int round) {
+ this.round = round;
+ }
+
public void setLabel(String label) {
this.label = label;
}
diff --git a/src/guiTree/Components/CheckBox.java b/src/guiTree/Components/CheckBox.java
index 7e56b80..4e7965a 100644
--- a/src/guiTree/Components/CheckBox.java
+++ b/src/guiTree/Components/CheckBox.java
@@ -1,7 +1,6 @@
package guiTree.Components;
import guiTree.Helper.Debugger;
-import guiTree.Helper.Tag;
import guiTree.Visual;
import guiTree.events.MouseAdapter;
@@ -39,25 +38,24 @@ public class CheckBox extends Visual {
@Override
public void mousePressed(MouseEvent mouseEvent) {
marked = !marked;
- Debugger.log("Calling repaint from pressed: " + getName(), Tag.PAINTING);
- repaint();
+ Debugger.log("Calling repaint from pressed: " + getName(), Debugger.Tag.PAINTING);
+ update();
}
@Override
public void mouseEntered(MouseEvent mouseEvent) {
hovered = true;
- Debugger.log("Calling repaint from entered: " + getName(), Tag.PAINTING);
- repaint();
+ Debugger.log("Calling repaint from entered: " + getName(), Debugger.Tag.PAINTING);
+ update();
}
@Override
public void mouseExited(MouseEvent mouseEvent) {
hovered = false;
- Debugger.log("Calling repaint from exited: " + getName(), Tag.PAINTING);
- repaint();
+ Debugger.log("Calling repaint from exited: " + getName(), Debugger.Tag.PAINTING);
+ update();
}
@Override
public void mouseMoved(MouseEvent mouseEvent) {
- Debugger.log("Calling repaint from moved: " + getName(), Tag.PAINTING);
- repaint();
+ Debugger.log("Calling repaint from moved: " + getName(), Debugger.Tag.PAINTING);
}
});
}
diff --git a/src/guiTree/Components/CheckBoxList.java b/src/guiTree/Components/CheckBoxList.java
index 12eba83..9ae117b 100644
--- a/src/guiTree/Components/CheckBoxList.java
+++ b/src/guiTree/Components/CheckBoxList.java
@@ -1,6 +1,6 @@
package guiTree.Components;
-import guiTree.Helper.Point2d;
+import guiTree.Helper.Point2;
import guiTree.Visual;
import javax.imageio.ImageIO;
@@ -15,7 +15,7 @@ public class CheckBoxList extends Visual {
private List checkBoxList;
int spacing;
private BufferedImage icon;
- private Point2d checkBoxSize;
+ private Point2 checkBoxSize;
public CheckBoxList() {
this(20);
@@ -84,7 +84,7 @@ public class CheckBoxList extends Visual {
for(CheckBox cb: checkBoxList) {
cb.setSize(width, height);
}
- checkBoxSize = new Point2d(width, height);
+ checkBoxSize = new Point2<>(width, height);
}
@Override
diff --git a/src/guiTree/Components/Panel.java b/src/guiTree/Components/Panel.java
index 16ed607..eed332f 100644
--- a/src/guiTree/Components/Panel.java
+++ b/src/guiTree/Components/Panel.java
@@ -2,6 +2,8 @@ package guiTree.Components;
import guiTree.Visual;
+import java.awt.*;
+import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;
@@ -105,4 +107,14 @@ public class Panel extends Visual {
// reposition();
// }
}
+
+ @Override
+ public void paint(BufferedImage imageBuffer) {
+ Graphics2D g = imageBuffer.createGraphics();
+
+ g.setColor(getBackgroundColor());
+ g.fillRect(0, 0, getWidth(), getHeight());
+
+ g.dispose();
+ }
}
diff --git a/src/guiTree/Components/ScrollPanel.java b/src/guiTree/Components/ScrollPanel.java
new file mode 100644
index 0000000..7516a9f
--- /dev/null
+++ b/src/guiTree/Components/ScrollPanel.java
@@ -0,0 +1,66 @@
+package guiTree.Components;
+
+import guiTree.Helper.Debugger;
+import guiTree.Visual;
+import guiTree.events.MouseAdapter;
+
+import java.awt.*;
+import java.awt.image.BufferedImage;
+
+public class ScrollPanel extends Visual {
+
+ private float positionX;
+ private float positionY;
+ private float ratioX;
+ private float ratioY;
+ private Slider verticalScrollBar;
+ private Slider horizontalScrollBar;
+
+ public ScrollPanel() {
+ super();
+ setName("ScrollPanel");
+ horizontalScrollBar = new Slider(Slider.Direction.Horizontal);
+ verticalScrollBar = new Slider(Slider.Direction.Vertical);
+ verticalScrollBar.setHasBorder(true);
+ horizontalScrollBar.setHasBorder(true);
+ addVisual(verticalScrollBar);
+ addVisual(horizontalScrollBar);
+ verticalScrollBar.setName("vertical scroll bar");
+ horizontalScrollBar.setName("horizontal scroll bar");
+ }
+
+ @Override
+ public void setSize() {
+ super.setSize();
+ if(verticalScrollBar != null && horizontalScrollBar != null) {
+ verticalScrollBar.setSize(20, getHeight() - 20);
+ horizontalScrollBar.setSize(getWidth() - 20, 20);
+ return;
+ }
+
+ if(horizontalScrollBar != null) {
+ horizontalScrollBar.setSize(getWidth(), 20);
+ }
+
+ if(verticalScrollBar != null) {
+ verticalScrollBar.setSize(20, getHeight());
+ }
+ }
+
+ @Override
+ public void paint(BufferedImage imageBuffer) {
+ Graphics2D g = imageBuffer.createGraphics();
+ if(getHasBorder()) {
+ g.setColor(getBackgroundColor());
+ g.fillRect(1, 1, getWidth() - 2, getHeight() - 2);
+ g.setColor(getBorderColor());
+ g.drawRect(0, 0, getWidth() - 1, getHeight() - 1);
+ }
+ else {
+ g.setColor(getBackgroundColor());
+ g.fillRect(0, 0, getWidth() - 1, getHeight() - 1);
+ }
+
+ g.dispose();
+ }
+}
diff --git a/src/guiTree/Components/Slider.java b/src/guiTree/Components/Slider.java
new file mode 100644
index 0000000..4698c23
--- /dev/null
+++ b/src/guiTree/Components/Slider.java
@@ -0,0 +1,264 @@
+package guiTree.Components;
+
+import guiTree.Visual;
+import guiTree.events.MouseAdapter;
+
+import java.awt.*;
+import java.awt.event.MouseEvent;
+import java.awt.image.BufferedImage;
+
+public class Slider extends Visual {
+ public enum Direction {
+ Vertical,
+ Horizontal
+ }
+
+ private Direction direction;
+ private Button slider;
+ private Button button2;
+ private Button button1;
+ private SliderListener sliderListener;
+
+ public Slider() {
+ this(Direction.Vertical);
+ }
+
+ public Slider(Direction direction) {
+ super();
+ this.direction = direction;
+
+ button1 = new Button();
+ button2 = new Button();
+ slider = new Button();
+
+ setBackgroundColor(new Color(175, 175, 175));
+ setForegroundColor(new Color(112, 112, 112));
+ setAccentColor(new Color(50, 50, 50));
+ button1.setHasBorder(false);
+ button2.setHasBorder(false);
+
+ if(direction == Direction.Horizontal) {
+ button1.setIcon("arrow_left_black");
+ button2.setIcon("arrow_right_black");
+ button1.setLocation(0.0f, 0.15f);
+ button2.setLocation(-1.0f, 0.15f);
+ slider.setLocation(-1.0f, 0.25f);
+ slider.setSize(-1.0f, 0.5f);
+ slider.setLocation(20, 0);
+ }
+ else {
+ button1.setIcon("arrow_up_black");
+ button2.setIcon("arrow_down_black");
+ button1.setLocation(0.15f, 0.0f);
+ button2.setLocation(0.15f, -1.0f);
+ slider.setLocation(0.25f, -1.0f);
+ slider.setSize(0.5f, -1.0f);
+ slider.setLocation(0, 20);
+ }
+
+ addVisual(button1);
+ addVisual(button2);
+ addVisual(slider);
+
+ button1.setLocation(0, 0);
+ slider.setRound(10);
+ button1.setRound(10);
+ button2.setRound(10);
+
+ button1.addMouseListener(new MouseAdapter() {
+ @Override
+ public void mouseClicked(MouseEvent mouseEvent) {
+ moveSlider(-0.05f);
+ button1.update();
+ }
+ });
+ button2.addMouseListener(new MouseAdapter() {
+ @Override
+ public void mouseClicked(MouseEvent mouseEvent) {
+ moveSlider(0.05f);
+ button2.update();
+ }
+ });
+ sliderListener = new SliderListener();
+ slider.addMouseListener(sliderListener);
+ }
+
+ public float getSliderLocation() {
+ if(direction == Direction.Vertical) {
+ return (float)slider.getLocationY() / getHeight();
+ }
+ else {
+ return (float)slider.getLocationX() / getWidth();
+ }
+ }
+
+ public void setSliderSize(int width, int height) {
+ slider.setSize(width, height);
+ }
+
+ private void moveSlider(int offset) {
+ if(direction == Direction.Vertical) {
+ if(slider.getLocationY() + slider.getHeight() + offset > getHeight() - button2.getHeight()) {
+ slider.setLocationY(getHeight() - slider.getHeight() - button2.getHeight());
+ }
+ else if (slider.getLocationY() + offset < button1.getHeight()) {
+ slider.setLocationY(button1.getHeight());
+ }
+ else {
+ slider.setLocationY(Math.round(slider.getLocationY() + offset));
+ }
+ }
+ else {
+ if(slider.getLocationX() + slider.getWidth() + offset > getWidth() - button2.getWidth()) {
+ slider.setLocationX(getWidth() - slider.getWidth() - button2.getWidth());
+ }
+ else if (slider.getLocationX() + offset < button1.getWidth()) {
+ slider.setLocationX(button1.getWidth());
+ }
+ else {
+ slider.setLocationX(Math.round(slider.getLocationX() + offset));
+ }
+ }
+ }
+
+ public void setDirection(Direction direction) {
+ this.direction = direction;
+ if(direction == Direction.Horizontal) {
+ button1.setIcon("arrow_left_black");
+ button2.setIcon("arrow_right_black");
+ button1.setLocation(0.0f, 0.15f);
+ button2.setLocation(-1.0f, 0.15f);
+ slider.setLocation(-1.0f, 0.25f);
+ slider.setSize(-1.0f, 0.5f);
+ slider.setLocation(20, 0);
+ }
+ else {
+ button1.setIcon("arrow_up_black");
+ button2.setIcon("arrow_down_black");
+ button1.setLocation(0.15f, 0.0f);
+ button2.setLocation(0.15f, -1.0f);
+ slider.setLocation(0.25f, -1.0f);
+ slider.setSize(0.5f, -1.0f);
+ slider.setLocation(0, 20);
+ }
+ }
+
+ private void moveSlider(float offset) {
+ if(direction == Direction.Vertical) {
+ moveSlider(Math.round(offset * getHeight()));
+ return;
+ }
+ moveSlider(Math.round(offset * getWidth()));
+ }
+
+ @Override
+ public void setBackgroundColor(Color color) {
+ super.setBackgroundColor(color);
+ button1.setBackgroundColor(new Color(0, 0, 0, 0.0f));
+ button2.setBackgroundColor(new Color(0, 0, 0, 0.0f));
+ }
+
+ @Override
+ public void setForegroundColor(Color color) {
+ super.setForegroundColor(color);
+ slider.setBackgroundColor(color);
+ slider.setAccentColor(color);
+ button1.setAccentColor(color);
+ button2.setAccentColor(color);
+ }
+
+ @Override
+ public void setAccentColor(Color color) {
+ super.setAccentColor(color);
+ button1.setForegroundColor(color);
+ button2.setForegroundColor(color);
+ slider.setForegroundColor(color);
+ }
+
+ @Override
+ public void setBorderColor(Color color) {
+ super.setBorderColor(color);
+ button1.setBorderColor(color);
+ button2.setBorderColor(color);
+ slider.setBorderColor(color);
+ }
+
+ @Override
+ public void setName(String name) {
+ super.setName(name);
+ slider.setName(name + " slider");
+ button1.setName(name + " button 1");
+ button2.setName(name + " button 2");
+ }
+
+ @Override
+ public void setSize() {
+ super.setSize();
+ if(direction == Direction.Vertical) {
+ button1.setSize(Math.round(0.7f * getWidth()), Math.round(0.7f * getWidth()));
+ button2.setSize(button1.getWidth(), button1.getHeight());
+ button2.setLocation(0, getHeight() - button2.getHeight());
+ slider.setSize(getWidth() / 2, 40);
+ }
+ else {
+ button1.setSize(Math.round(0.7f * getHeight()), Math.round(0.7f * getHeight()));
+ button2.setSize(button1.getWidth(), button1.getHeight());
+ button2.setLocation(getWidth() - button2.getWidth(), 0);
+ slider.setSize(40, getHeight() / 2);
+ }
+ }
+
+ @Override
+ public void paint(BufferedImage imageBuffer) {
+ Graphics2D g = imageBuffer.createGraphics();
+ g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+
+ if(getHasBorder()) {
+ g.setColor(getBorderColor());
+ g.drawRect(0, 0, getWidth() - 1, getHeight() - 1);
+ }
+ g.setColor(getBackgroundColor());
+ if(direction == Direction.Vertical) {
+ int x1 = Math.round(0.15f * getWidth());
+ int y1 = button1.getHeight();
+ int x2 = Math.round(0.85f * getWidth()) - x1;
+ int y2 = getHeight() - button2.getHeight() - y1;
+ g.fillRoundRect(x1, y1, x2, y2, 10, 10);
+ }
+ else {
+ int x1 = button1.getWidth();
+ int y1 = Math.round(0.15f * getHeight());
+ int x2 = getWidth() - button2.getWidth() - x1;
+ int y2 = Math.round(0.85f * getHeight()) - y1;
+ g.fillRoundRect(x1, y1, x2, y2, 10, 10);
+ }
+ g.dispose();
+ }
+
+ private class SliderListener extends MouseAdapter {
+ private int start;
+
+ @Override
+ public void mousePressed(MouseEvent mouseEvent) {
+ if(direction == Direction.Vertical) {
+ start = mouseEvent.getY();
+ }
+ else {
+ start = mouseEvent.getX();
+ }
+ }
+
+ @Override
+ public void mouseDragged(MouseEvent mouseEvent) {
+ if(direction == Direction.Vertical) {
+ moveSlider(mouseEvent.getY() - start);
+ start = mouseEvent.getY();
+ }
+ else {
+ moveSlider(mouseEvent.getX() - start);
+ start = mouseEvent.getX();
+ }
+ slider.update();
+ }
+ }
+}
diff --git a/src/guiTree/Components/ToggleButton.java b/src/guiTree/Components/ToggleButton.java
index 2097a86..e3da673 100644
--- a/src/guiTree/Components/ToggleButton.java
+++ b/src/guiTree/Components/ToggleButton.java
@@ -1,7 +1,6 @@
package guiTree.Components;
import guiTree.Helper.Debugger;
-import guiTree.Helper.Tag;
import guiTree.Visual;
import guiTree.events.MouseAdapter;
@@ -40,26 +39,25 @@ public class ToggleButton extends Visual {
@Override
public void mousePressed(MouseEvent mouseEvent) {
pressed = !pressed;
- Debugger.log("Pressed: " + getName(), Tag.LISTENER);
- Debugger.log("Calling repaint from pressed: " + getName(), Tag.PAINTING);
- repaint();
+ Debugger.log("Pressed: " + getName(), Debugger.Tag.LISTENER);
+ Debugger.log("Calling repaint from pressed: " + getName(), Debugger.Tag.PAINTING);
+ update();
}
@Override
public void mouseEntered(MouseEvent mouseEvent) {
hovered = true;
- Debugger.log("Calling repaint from entered: " + getName(), Tag.PAINTING);
- repaint();
+ Debugger.log("Calling repaint from entered: " + getName(), Debugger.Tag.PAINTING);
+ update();
}
@Override
public void mouseExited(MouseEvent mouseEvent) {
hovered = false;
- Debugger.log("Calling repaint from exited: " + getName(), Tag.PAINTING);
- repaint();
+ Debugger.log("Calling repaint from exited: " + getName(), Debugger.Tag.PAINTING);
+ update();
}
@Override
public void mouseMoved(MouseEvent mouseEvent) {
- Debugger.log("Calling repaint from moved: " + getName(), Tag.PAINTING);
- repaint();
+ Debugger.log("Calling repaint from moved: " + getName(), Debugger.Tag.PAINTING);
}
});
}
diff --git a/src/guiTree/CustomFrame.java b/src/guiTree/CustomFrame.java
index 60f7fd5..d4c424e 100644
--- a/src/guiTree/CustomFrame.java
+++ b/src/guiTree/CustomFrame.java
@@ -1,12 +1,11 @@
package guiTree;
import guiTree.Helper.Debugger;
-import guiTree.Helper.Tag;
+import guiTree.Helper.Timer;
import guiTree.events.KeyEventGetter;
import guiTree.events.MouseWheelGetter;
import javax.swing.*;
-import javax.swing.event.MouseInputListener;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
@@ -40,7 +39,10 @@ public class CustomFrame extends JFrame {
@Override
public void paint(Graphics g) {
+ Timer timer = new Timer();
+ timer.startTiming();
g.drawImage(imageBuffer, 0, 0, this.getWidth(), this.getHeight(), null);
+ Debugger.log("AWT time: " + timer.stopTiming(), Debugger.Tag.PAINTING);
}
private class MouseResizeListener implements MouseMotionListener, MouseListener {
diff --git a/src/guiTree/Helper/Debugger.java b/src/guiTree/Helper/Debugger.java
index 68d30eb..08cb758 100644
--- a/src/guiTree/Helper/Debugger.java
+++ b/src/guiTree/Helper/Debugger.java
@@ -1,6 +1,20 @@
package guiTree.Helper;
public class Debugger {
+ public enum Tag {
+ LISTENER(false),
+ PAINTING(false),
+ FPS(false),
+ ANIMATIONS(true),
+ PARSING(false);
+
+ public boolean value;
+
+ Tag(boolean value) {
+ this.value = value;
+ }
+ }
+
private static Timer timer = new Timer();
public static void log(String message, Tag tag) {
diff --git a/src/guiTree/Helper/Point2.java b/src/guiTree/Helper/Point2.java
new file mode 100644
index 0000000..0f255c9
--- /dev/null
+++ b/src/guiTree/Helper/Point2.java
@@ -0,0 +1,15 @@
+package guiTree.Helper;
+
+public class Point2 {
+ public T x;
+ public T y;
+
+ public Point2(T x, T y) {
+ this.x = x;
+ this.y = y;
+ }
+
+ public boolean equals(Point2 point2) {
+ return x == point2.y && y == point2.y;
+ }
+}
diff --git a/src/guiTree/Helper/Point2d.java b/src/guiTree/Helper/Point2d.java
deleted file mode 100644
index 60a574d..0000000
--- a/src/guiTree/Helper/Point2d.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package guiTree.Helper;
-
-public class Point2d {
- public int x;
- public int y;
-
- public Point2d(int x,int y) {
- this.x = x;
- this.y = y;
- }
-}
diff --git a/src/guiTree/Helper/Point3.java b/src/guiTree/Helper/Point3.java
new file mode 100644
index 0000000..84af162
--- /dev/null
+++ b/src/guiTree/Helper/Point3.java
@@ -0,0 +1,17 @@
+package guiTree.Helper;
+
+public class Point3 {
+ public T x;
+ public T y;
+ public T z;
+
+ public Point3(T x, T y, T z) {
+ this.x = x;
+ this.y = y;
+ this.z = z;
+ }
+
+ public boolean equals(Point3 point3) {
+ return x == point3.x && y == point3.y && z == point3.z;
+ }
+}
diff --git a/src/guiTree/Helper/Point4.java b/src/guiTree/Helper/Point4.java
new file mode 100644
index 0000000..3fa2706
--- /dev/null
+++ b/src/guiTree/Helper/Point4.java
@@ -0,0 +1,19 @@
+package guiTree.Helper;
+
+public class Point4 {
+ public T a;
+ public T b;
+ public T c;
+ public T d;
+
+ public Point4(T a, T b, T c, T d) {
+ this.a = a;
+ this.b = b;
+ this.c = c;
+ this.d = d;
+ }
+
+ public boolean equals(Point4 point4) {
+ return a == point4.a && b == point4.b && c == point4.c && d == point4.d;
+ }
+}
diff --git a/src/guiTree/Helper/Tag.java b/src/guiTree/Helper/Tag.java
deleted file mode 100644
index 684107a..0000000
--- a/src/guiTree/Helper/Tag.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package guiTree.Helper;
-
-public enum Tag {
- LISTENER(true),
- PAINTING(false);
-
- public boolean value;
-
- Tag(boolean value) {
- this.value = value;
- }
-}
diff --git a/src/guiTree/Helper/Timer.java b/src/guiTree/Helper/Timer.java
index 4cbd91f..e2be6dc 100644
--- a/src/guiTree/Helper/Timer.java
+++ b/src/guiTree/Helper/Timer.java
@@ -12,4 +12,8 @@ public class Timer {
now = System.currentTimeMillis();
return now - prev;
}
+
+ public long getTime() {
+ return System.currentTimeMillis() - prev;
+ }
}
diff --git a/src/guiTree/Listeners/Direction.java b/src/guiTree/Listeners/Direction.java
deleted file mode 100644
index ddea0d5..0000000
--- a/src/guiTree/Listeners/Direction.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package guiTree.Listeners;
-
-public enum Direction {
- NORTH,
- SOUTH,
- WEST,
- EAST,
- ALL
-}
diff --git a/src/guiTree/Listeners/ResizeListener.java b/src/guiTree/Listeners/ResizeListener.java
deleted file mode 100644
index 56de6d8..0000000
--- a/src/guiTree/Listeners/ResizeListener.java
+++ /dev/null
@@ -1,186 +0,0 @@
-package guiTree.Listeners;
-
-import guiTree.Helper.Point2d;
-import guiTree.events.MouseAdapter;
-
-import java.awt.*;
-import java.awt.event.MouseEvent;
-
-public class ResizeListener extends MouseAdapter {
- public Point2d location;
- public Point2d size;
- public Cursor cursor;
- private Boolean moving = false;
- private Boolean resizing = false;
- private Point2d initialLocation;
- private int resizeDelta = 5;
- private Boolean NORTH;
- private Boolean SOUTH;
- private Boolean WEST;
- private Boolean EAST;
-
- public ResizeListener(Direction[] directions, Point2d size, Point2d location) {
- this.cursor = new Cursor(Cursor.DEFAULT_CURSOR);
- this.size = size;
- this.location = location;
- NORTH = false;
- SOUTH = false;
- WEST = false;
- EAST = false;
- for(Direction dir:directions) {
- if(dir == Direction.NORTH) {
- NORTH = true;
- }
- if(dir == Direction.SOUTH) {
- SOUTH = true;
- }
- if(dir == Direction.WEST) {
- WEST = true;
- }
- if(dir == Direction.EAST) {
- EAST = true;
- }
- if(dir == Direction.ALL) {
- NORTH = true;
- SOUTH = true;
- WEST = true;
- EAST = true;
- }
- }
- }
-
- public void setLocation(int x, int y) {
- location.x = x;
- location.y = y;
- }
-
- public void setSize(int x, int y) {
- size.x = x;
- size.y = y;
- }
-
- @Override
- public void mouseExited(MouseEvent mouseEvent) {
- this.cursor = new Cursor(Cursor.DEFAULT_CURSOR);
- }
-
- @Override
- public void mouseDragged(MouseEvent mouseEvent) {
- if(moving) {
- setLocation(mouseEvent.getXOnScreen() - initialLocation.x, mouseEvent.getYOnScreen() - initialLocation.y);
- }
- else if(!resizing){
- this.resizing = true;
- this.resize(mouseEvent);
- }
-
- }
-
- @Override
- public void mousePressed(MouseEvent mouseEvent) {
- if(cursor.getType() != Cursor.DEFAULT_CURSOR){
- this.moving = false;
- }
- else {
- this.moving = true;
- this.resizing = false;
- }
- initialLocation = new Point2d(mouseEvent.getX(), mouseEvent.getY());
- }
-
- @Override
- public void mouseReleased(MouseEvent mouseEvent) {
- moving = false;
- }
-
- @Override
- public void mouseMoved(MouseEvent mouseEvent) {
- if(mouseEvent.getX() < resizeDelta || mouseEvent.getX() > size.x - resizeDelta ||
- mouseEvent.getY() < resizeDelta || mouseEvent.getY() > size.y - resizeDelta) {
- this.setResizeCursor(mouseEvent);
- }
- else {
- cursor = new Cursor(Cursor.DEFAULT_CURSOR);
- }
- }
-
- private void setResizeCursor(MouseEvent e){
- if(e.getX() <= resizeDelta) {
- if(e.getY() <= resizeDelta && (NORTH && WEST)) {
- cursor = new Cursor(Cursor.NW_RESIZE_CURSOR);
- }
- else if(e.getY() >= size.y - resizeDelta && (SOUTH && WEST)){
- cursor = new Cursor(Cursor.SW_RESIZE_CURSOR);
- }
- else if(WEST){
- cursor = new Cursor(Cursor.W_RESIZE_CURSOR);
- }
- }
- else if(e.getX() >= size.x - resizeDelta){
- if(e.getY() <= resizeDelta && (NORTH && EAST)){
- cursor = new Cursor(Cursor.NE_RESIZE_CURSOR);
- }
- else if(e.getY() >= size.y - resizeDelta && (SOUTH && EAST)){
- cursor = new Cursor(Cursor.SE_RESIZE_CURSOR);
- }
- else if(EAST){
- cursor = new Cursor(Cursor.E_RESIZE_CURSOR);
- }
- }
- else{
- if(e.getY() <= resizeDelta && (NORTH)){
- cursor = new Cursor(Cursor.N_RESIZE_CURSOR);
- }
- else if(e.getY() >= size.y - resizeDelta && (SOUTH)){
- cursor = new Cursor(Cursor.S_RESIZE_CURSOR);
- }
- }
- }
-
- private void resize(MouseEvent e) {
- switch (cursor.getType()) {
- case Cursor.N_RESIZE_CURSOR:
- setSize(size.x, size.y + initialLocation.y - e.getYOnScreen());
- setLocation(location.x, e.getYOnScreen());
- initialLocation.y = e.getYOnScreen();
- break;
- case Cursor.NE_RESIZE_CURSOR:
- setSize(size.x + e.getXOnScreen() - initialLocation.x, size.y + initialLocation.y - e.getYOnScreen());
- setLocation(location.x, e.getYOnScreen());
- initialLocation.x = e.getXOnScreen();
- initialLocation.y = e.getYOnScreen();
- break;
- case Cursor.NW_RESIZE_CURSOR:
- setSize(size.x + initialLocation.x - e.getXOnScreen(), size.y + initialLocation.y - e.getYOnScreen());
- setLocation(e.getXOnScreen(), e.getYOnScreen());
- initialLocation.x = e.getXOnScreen();
- initialLocation.y = e.getYOnScreen();
- break;
- case Cursor.E_RESIZE_CURSOR:
- setSize(size.x + e.getXOnScreen() - initialLocation.x, size.y);
- initialLocation.x = e.getXOnScreen();
- break;
- case Cursor.W_RESIZE_CURSOR:
- setSize(size.x + initialLocation.x - e.getXOnScreen(), size.y);
- setLocation(e.getXOnScreen(), location.y);
- initialLocation.x = e.getXOnScreen();
- break;
- case Cursor.SE_RESIZE_CURSOR:
- setSize(size.x + e.getXOnScreen() - initialLocation.x, size.y + e.getYOnScreen() - initialLocation.y);
- initialLocation.x = e.getXOnScreen();
- initialLocation.y = e.getYOnScreen();
- break;
- case Cursor.S_RESIZE_CURSOR:
- setSize(size.x, size.y + e.getYOnScreen() - initialLocation.y);
- initialLocation.y = e.getYOnScreen();
- break;
- case Cursor.SW_RESIZE_CURSOR:
- setSize(size.x + initialLocation.x - e.getXOnScreen(), size.y + e.getYOnScreen() - initialLocation.y);
- setLocation(e.getXOnScreen(), location.y);
- initialLocation.x = e.getXOnScreen();
- initialLocation.y = e.getYOnScreen();
- break;
- }
- this.resizing = false;
- }
-}
diff --git a/src/guiTree/Visual.java b/src/guiTree/Visual.java
index 0552884..45f295f 100644
--- a/src/guiTree/Visual.java
+++ b/src/guiTree/Visual.java
@@ -1,7 +1,8 @@
package guiTree;
+import guiTree.Animations.AnimationInterface;
import guiTree.Helper.Debugger;
-import guiTree.Helper.Tag;
+import guiTree.Helper.Point2;
import guiTree.Helper.Timer;
import guiTree.events.KeyListener;
import guiTree.events.MouseListener;
@@ -21,6 +22,7 @@ public class Visual {
public static final int SIZE_CHANGED = 1;
public static final int LOCATION_CHANGED = 2;
+ private static List animations = new ArrayList<>();
/*--------------------------------------------------------------------
Tree Elements
@@ -56,12 +58,11 @@ public class Visual {
private Color fontColor;
private Color borderColor;
private Boolean active;
- public Boolean dirty;
+ private Boolean dirty;
private static Visual entered;
private Boolean focused;
private Boolean pressed;
-
/*--------------------------------------------------------------------
Constructors
---------------------------------------------------------------------*/
@@ -174,11 +175,11 @@ public class Visual {
}
public void setLocationX(Integer x) {
- this.locationX = x;
+ setLocation(x, getLocationY());
}
public void setLocationY(Integer y) {
- this.locationY = y;
+ setLocation(getLocationX(), y);
}
public void setFont(Font font) {
@@ -209,6 +210,7 @@ public class Visual {
public void setHasBorder(Boolean hasBorder) {
this.hasBorder = hasBorder;
+ propagateDirt();
}
/*--------------------------------------------------------------------
@@ -235,6 +237,10 @@ public class Visual {
return this.locationY;
}
+ public Point2 getLocation() {
+ return new Point2<>(locationX, locationY);
+ }
+
public Font getFont() {
return font;
}
@@ -316,35 +322,52 @@ public class Visual {
}
}
+ public void addAnimation(AnimationInterface animation) {
+ animations.add(animation);
+ }
+
+ public void removeAnimation(AnimationInterface animation) {
+ animations.remove(animation);
+ }
+
public void repaint() {
+ Debugger.log("Called repaint from " + name, Debugger.Tag.PAINTING);
+ for(int i = 0; i < animations.size(); i++) {
+ if(animations.get(i).step()) {
+ animations.remove(animations.get(i));
+ i--;
+ }
+ }
if(dirty && active) {
- this.revalidate();
+ revalidate();
}
}
private void revalidate() {
Timer timer = new Timer();
- Debugger.log("Revalidating " + name, Tag.PAINTING);
+ Debugger.log("Revalidating " + name, Debugger.Tag.PAINTING);
timer.startTiming();
clearImageBuffer();
this.paint(imageBuffer);
for (Visual v : children) {
- v.repaint();
- this.imageBuffer.getGraphics().drawImage(v.imageBuffer, v.locationX, v.locationY, null);
+ if(v.dirty && v.active) {
+ v.revalidate();
+ }
+ imageBuffer.getGraphics().drawImage(v.imageBuffer, v.locationX, v.locationY, null);
}
- this.dirty = false;
+ dirty = false;
if(!(this instanceof Window)){
- this.parent.revalidate();
long time = timer.stopTiming();
- Debugger.log("Finished Revalidating " + name + ": " + time, Tag.PAINTING);
+ Debugger.log("Finished Revalidating " + name + ": " + time, Debugger.Tag.PAINTING);
+ parent.revalidate();
return;
}
Window window = (Window)this;
window.setFrameImageBuffer(imageBuffer);
long time = timer.stopTiming();
- Debugger.log("Finished Revalidating " + name + ": " + time, Tag.PAINTING);
+ Debugger.log("Finished Revalidating " + name + ": " + time, Debugger.Tag.PAINTING);
window.revalidate();
}
@@ -387,17 +410,15 @@ public class Visual {
for(MouseListener mouseListener: entered.mouseListeners) {
mouseListener.mouseClicked(mouseEvent);
}
- entered.propagateDirt();
entered.focused = true;
- Debugger.log("Clicked " + entered.name, Tag.LISTENER);
+ Debugger.log("Clicked " + entered.name, Debugger.Tag.LISTENER);
}
void mouseReleased(MouseEvent mouseEvent) {
for(MouseListener mouseListener: entered.mouseListeners) {
mouseListener.mouseReleased(mouseEvent);
}
- Debugger.log("Released " + entered.name, Tag.LISTENER);
- propagateDirt();
+ Debugger.log("Released " + entered.name, Debugger.Tag.LISTENER);
entered.pressed = false;
}
@@ -405,9 +426,8 @@ public class Visual {
for(MouseListener mouseListener: entered.mouseListeners) {
mouseListener.mousePressed(mouseEvent);
}
- entered.propagateDirt();
entered.pressed = true;
- Debugger.log("Pressed " + entered.name, Tag.LISTENER);
+ Debugger.log("Pressed " + entered.name, Debugger.Tag.LISTENER);
}
void mouseEntered(MouseEvent mouseEvent) {
@@ -429,8 +449,7 @@ public class Visual {
for(MouseListener mouseListener: mouseListeners) {
mouseListener.mouseEntered(mouseEvent);
}
- Debugger.log("Entered " + entered.name, Tag.LISTENER);
- propagateDirt();
+ Debugger.log("Entered " + entered.name, Debugger.Tag.LISTENER);
}
void mouseExited(MouseEvent mouseEvent) {
@@ -443,8 +462,7 @@ public class Visual {
for (MouseListener mouseListener : entered.mouseListeners) {
mouseListener.mouseExited(mouseEvent);
}
- Debugger.log("Exited " + entered.name, Tag.LISTENER);
- entered.propagateDirt();
+ Debugger.log("Exited " + entered.name, Debugger.Tag.LISTENER);
entered = null;
}
@@ -452,8 +470,7 @@ public class Visual {
for (MouseListener mouseListener : entered.mouseListeners) {
mouseListener.mouseDragged(mouseEvent);
}
- entered.propagateDirt();
- Debugger.log("Dragged " + entered.name, Tag.LISTENER);
+ Debugger.log("Dragged " + entered.name, Debugger.Tag.LISTENER);
}
void mouseMoved(MouseEvent mouseEvent) {
@@ -467,7 +484,7 @@ public class Visual {
for (MouseListener mouseListener : entered.mouseListeners) {
mouseListener.mouseExited(mouseEvent);
}
- Debugger.log("Exited " + entered.name, Tag.LISTENER);
+ Debugger.log("Exited " + entered.name, Debugger.Tag.LISTENER);
entered = this;
}
}
@@ -491,8 +508,7 @@ public class Visual {
mouseListener.mouseMoved(mouseEvent);
}
}
- Debugger.log("Moved " + this.name, Tag.LISTENER);
- propagateDirt();
+ Debugger.log("Moved " + this.name, Debugger.Tag.LISTENER);
}
void mouseWheelMoved(MouseWheelEvent mouseWheelEvent) {
@@ -501,7 +517,7 @@ public class Visual {
mouseWheelListener.mouseWheelMoved(mouseWheelEvent);
}
}
- Debugger.log("Wheel Moved " + this.name, Tag.LISTENER);
+ Debugger.log("Wheel Moved " + this.name, Debugger.Tag.LISTENER);
}
/*--------------------------------------------------------------------
@@ -524,9 +540,7 @@ public class Visual {
g.setComposite(AlphaComposite.Clear);
g.fillRect(0, 0, getWidth(), getHeight());
- g.setComposite(AlphaComposite.Src);
- g.fillRect(0, 0, width, height);
g.dispose();
}
diff --git a/src/guiTree/Window.java b/src/guiTree/Window.java
index fed5a07..3bf1301 100644
--- a/src/guiTree/Window.java
+++ b/src/guiTree/Window.java
@@ -2,10 +2,13 @@ package guiTree;
import guiTree.Components.TitleBar;
import guiTree.Helper.Debugger;
-import guiTree.Helper.Point2d;
-import guiTree.Helper.Tag;
+import guiTree.Helper.Point2;
+import guiTree.Helper.Timer;
+import guiTree.events.KeyListener;
import guiTree.events.MouseAdapter;
import guiTree.Components.Panel;
+import guiTree.events.MouseListener;
+import guiTree.events.MouseWheelListener;
import javax.imageio.ImageIO;
import java.awt.*;
@@ -16,13 +19,14 @@ import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
-public class Window extends Visual {
+public class Window extends Visual implements Runnable{
public CustomFrame frame;
private TitleBar titleBar;
private Panel mainPanel;
private Panel contentPanel;
- private Point2d oldSize;
- private Point2d oldLocation;
+ private Point2 oldSize;
+ private Boolean close;
+ private Point2 oldLocation;
public Window() {
this("");
@@ -50,6 +54,7 @@ public class Window extends Visual {
bar.setName("TitleBar");
bar.setBackgroundColor(Color.GRAY);
this.setTitleBar(bar);
+ close = false;
}
@Override
@@ -64,7 +69,7 @@ public class Window extends Visual {
else {
contentPanel.setSize(width, height);
}
- Debugger.log("Calling repaint from window set size: ", Tag.PAINTING);
+ Debugger.log("Calling repaint from window set size: ", Debugger.Tag.PAINTING);
repaint();
}
@@ -74,7 +79,7 @@ public class Window extends Visual {
}
public void revalidate() {
- Debugger.log("Finished painting", Tag.PAINTING);
+ Debugger.log("Finished painting", Debugger.Tag.PAINTING);
this.frame.repaint();
}
@@ -192,6 +197,7 @@ public class Window extends Visual {
switch(notify) {
case TitleBar.CLOSE: {
dispose();
+ close = true;
break;
}
case TitleBar.MINIMIZE: {
@@ -200,8 +206,8 @@ public class Window extends Visual {
}
case TitleBar.MAXIMIZE: {
Rectangle screenBounds = frame.getGraphicsConfiguration().getBounds();
- oldSize = new Point2d(getWidth(), getHeight());
- oldLocation = new Point2d(frame.getX(), frame.getY());
+ oldSize = new Point2<>(getWidth(), getHeight());
+ oldLocation = new Point2<>(frame.getX(), frame.getY());
this.setSize(screenBounds.width, screenBounds.height);
this.setLocation(screenBounds.x, screenBounds.y);
setState(Frame.MAXIMIZED_BOTH);
@@ -216,8 +222,44 @@ public class Window extends Visual {
}
}
+ @Override
+ public void addMouseListener(MouseListener mouseListener) {
+ contentPanel.addMouseListener(mouseListener);
+ }
+
+ @Override
+ public void addKeyListener(KeyListener keyListener) {
+ contentPanel.addKeyListener(keyListener);
+ }
+
+ @Override
+ public void addMouseWheelListener(MouseWheelListener mouseWheelListener) {
+ contentPanel.addMouseWheelListener(mouseWheelListener);
+ }
+
@Override
public void addVisual(Visual v) {
contentPanel.addVisual(v);
}
+
+ @Override
+ public void run() {
+ Timer frameTimer = new Timer();
+ Timer secondTimer = new Timer();
+ int frames = 0;
+ frameTimer.startTiming();
+ secondTimer.startTiming();
+ while(!close) {
+ if(frameTimer.getTime() >= 1000/60) {
+ repaint();
+ frameTimer.startTiming();
+ frames ++;
+ }
+ if(secondTimer.getTime() >= 1000) {
+ Debugger.log("Frames per second: " + frames, Debugger.Tag.FPS);
+ frames = 0;
+ secondTimer.startTiming();
+ }
+ }
+ }
}
diff --git a/src/parser/XAMLParser.java b/src/parser/XAMLParser.java
index e232db4..f01529c 100644
--- a/src/parser/XAMLParser.java
+++ b/src/parser/XAMLParser.java
@@ -2,6 +2,7 @@ package parser;
import com.sun.jdi.InvalidTypeException;
import converters.Converter;
+import guiTree.Helper.Debugger;
import guiTree.Visual;
import guiTree.Window;
import org.w3c.dom.*;
@@ -24,6 +25,7 @@ public class XAMLParser {
String methodName = "set";
methodName = methodName.concat(attribute.getNodeName());
List