diff --git a/resources/icons/close/close_black.png b/resources/icons/close/close_black.png
deleted file mode 100644
index ebaeede..0000000
Binary files a/resources/icons/close/close_black.png and /dev/null differ
diff --git a/resources/icons/close/close_white.png b/resources/icons/close/close_white.png
deleted file mode 100644
index dccd2c2..0000000
Binary files a/resources/icons/close/close_white.png and /dev/null differ
diff --git a/resources/icons/close_black.png b/resources/icons/close_black.png
new file mode 100644
index 0000000..13eff33
Binary files /dev/null and b/resources/icons/close_black.png differ
diff --git a/resources/icons/close_white.png b/resources/icons/close_white.png
new file mode 100644
index 0000000..d38ca77
Binary files /dev/null and b/resources/icons/close_white.png differ
diff --git a/resources/icons/minimize/minimize_black.png b/resources/icons/minimize_black.png
similarity index 100%
rename from resources/icons/minimize/minimize_black.png
rename to resources/icons/minimize_black.png
diff --git a/resources/icons/minimize/minimize_white.png b/resources/icons/minimize_white.png
similarity index 100%
rename from resources/icons/minimize/minimize_white.png
rename to resources/icons/minimize_white.png
diff --git a/resources/icons/maximize/square_black.png b/resources/icons/square_black.png
similarity index 100%
rename from resources/icons/maximize/square_black.png
rename to resources/icons/square_black.png
diff --git a/resources/icons/maximize/square_white.png b/resources/icons/square_white.png
similarity index 100%
rename from resources/icons/maximize/square_white.png
rename to resources/icons/square_white.png
diff --git a/resources/ui.xml b/resources/ui.xml
index 3981a48..ed63f37 100644
--- a/resources/ui.xml
+++ b/resources/ui.xml
@@ -1,9 +1,10 @@
\ No newline at end of file
diff --git a/src/Main.java b/src/Main.java
index 141e96b..8592546 100644
--- a/src/Main.java
+++ b/src/Main.java
@@ -1,9 +1,15 @@
-import guiTree.Button;
+import guiTree.Components.Button;
+import guiTree.Components.TitleBar;
import guiTree.Window;
import parser.XAMLParser;
+import javax.imageio.ImageIO;
+import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
public class Main {
public static void main(String[] args) {
@@ -12,36 +18,42 @@ public class Main {
assert window != null;
window.revalidate();
Button button = (Button)window.findByName("button1");
- window.addWindowListener(new WindowAdapter() {
- @Override
- public void windowClosing(WindowEvent e) {
- window.dispose();
- }
- });
+
+ BufferedImage icon = null;
+ try {
+ icon = ImageIO.read(new File("resources\\icons\\square_white.png"));
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ TitleBar bar = new TitleBar("Working Title", icon);
+ bar.setBackgroundColor(Color.GRAY);
+ window.setTitleBar(bar);
+
+ window.revalidate();
long now;
long prev = 0;
- while(true) {
- now = System.currentTimeMillis();
- if(now - prev >= 1000) {
- int x = button.getLocationX();
- int y = button.getLocationY();
- if(x + button.getWidth() >= window.getWidth()) {
- x = 0;
- if(y + button.getHeight() >= window.getHeight()) {
- y = 0;
- }
- else {
- y += 30;
- }
- }
- else {
- x += 30;
- }
- button.setLocation(x, y);
- prev = now;
- window.revalidate();
- }
- }
+// while(true) {
+// now = System.currentTimeMillis();
+// if(now - prev >= 1000) {
+// int x = button.getLocationX();
+// int y = button.getLocationY();
+// if(x + button.getWidth() >= window.getWidth()) {
+// x = 0;
+// if(y + button.getHeight() >= window.getHeight()) {
+// y = 0;
+// }
+// else {
+// y += 30;
+// }
+// }
+// else {
+// x += 30;
+// }
+// button.setLocation(x, y);
+// prev = now;
+// window.revalidate();
+// }
+// }
}catch (Exception e){
e.printStackTrace();
}
diff --git a/src/guiTree/Button.java b/src/guiTree/Button.java
deleted file mode 100644
index d4ba04a..0000000
--- a/src/guiTree/Button.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package guiTree;
-
-import guiTree.events.MouseAdapter;
-
-import java.awt.*;
-import java.awt.event.MouseEvent;
-import java.awt.image.BufferedImage;
-
-public class Button extends Visual {
- private String label;
- private Boolean pressed;
-
- public Button() {
- this("");
- }
-
- public Button(String label) {
- super();
- this.label = label;
- pressed = false;
- this.addMouseListener(new MouseAdapter() {
- @Override
- public void mousePressed(MouseEvent mouseEvent) {
- pressed = true;
- revalidate();
- }
- @Override
- public void mouseReleased(MouseEvent mouseEvent) {
- pressed = false;
- revalidate();
- }
- });
- }
-
- @Override
- public void paint(BufferedImage imageBuffer)
- {
- //Get Graphics
- Graphics2D g = imageBuffer.createGraphics();
-
- //Set Transparency
- g.setComposite(AlphaComposite.Clear);
- g.fillRect(0, 0, getWidth(), getHeight());
- g.setComposite(AlphaComposite.Src);
-
- //Choose background
- if(pressed) {
- g.setColor(Color.GRAY);
- }
- else {
- g.setColor(this.getBackgroundColor());
- }
-
- //Draw Button
- g.fillRoundRect(0, 0, this.getWidth(), this.getHeight(), 50, 50);
- g.setColor(this.getForegroundColor());
-
- //Draw Label
- int textWidth = g.getFontMetrics().stringWidth(label);
- int textHeight = g.getFontMetrics().getHeight();
- g.drawString(this.label, this.getWidth()/2 - textWidth/2, this.getHeight()/2 + textHeight/2);
-
- g.dispose();
- }
-
- public void setLabel(String label) {
- this.label = label;
- }
-
- public String getLabel() {
- return this.label;
- }
-}
diff --git a/src/guiTree/Components/Button.java b/src/guiTree/Components/Button.java
new file mode 100644
index 0000000..e709cba
--- /dev/null
+++ b/src/guiTree/Components/Button.java
@@ -0,0 +1,146 @@
+package guiTree.Components;
+
+import guiTree.Visual;
+import guiTree.events.MouseAdapter;
+
+import javax.imageio.ImageIO;
+import java.awt.*;
+import java.awt.event.MouseEvent;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
+
+public class Button extends Visual {
+ private String label;
+ private Boolean pressed;
+ private Boolean hovered;
+ private BufferedImage icon;
+
+ public Button() {
+ this("", null);
+ }
+
+ public Button(String label) {
+ this(label, null);
+ }
+
+ public Button(BufferedImage icon) {
+ this(null, icon);
+ }
+
+ public Button(String label, BufferedImage icon) {
+ super();
+ this.label = label;
+ this.icon = icon;
+ pressed = false;
+ hovered = false;
+ this.addMouseListener(new MouseAdapter() {
+ @Override
+ public void mousePressed(MouseEvent mouseEvent) {
+ System.out.println("Pressed: " + getName());
+ pressed = true;
+ revalidate();
+ }
+ @Override
+ public void mouseReleased(MouseEvent mouseEvent) {
+ System.out.println("Released: " + getName());
+ pressed = false;
+ revalidate();
+ }
+ @Override
+ public void mouseEntered(MouseEvent mouseEvent) {
+ System.out.println("Entered: " + getName());
+ hovered = true;
+ revalidate();
+ }
+ @Override
+ public void mouseExited(MouseEvent mouseEvent) {
+ System.out.println("Exited: " + getName());
+ hovered = false;
+ revalidate();
+ }
+ @Override
+ public void mouseDragged(MouseEvent mouseEvent) {
+ System.out.println("DRAGGING: " + getName());
+ revalidate();
+ }
+ @Override
+ public void mouseMoved(MouseEvent mouseEvent) {
+ System.out.println("Moved: " + getName());
+ revalidate();
+ }
+ });
+ }
+
+ @Override
+ public void paint(BufferedImage imageBuffer)
+ {
+ //Get Graphics
+ Graphics2D g = imageBuffer.createGraphics();
+
+ //Set Transparency
+ g.setComposite(AlphaComposite.Clear);
+ g.fillRect(0, 0, getWidth(), getHeight());
+ g.setComposite(AlphaComposite.Src);
+
+ //Choose background
+ if(hovered || pressed) {
+ g.setColor(this.getForegroundColor());
+ }
+ else {
+ g.setColor(this.getBackgroundColor());
+ }
+
+ //Draw Button
+ g.fillRect(0, 0, this.getWidth(), this.getHeight());
+ g.setColor(this.getFontColor());
+
+ //Draw Label
+ int textWidth = 0;
+ int textHeight = 0;
+ if(!label.equals("")) {
+ textWidth = g.getFontMetrics().stringWidth(label);
+ textHeight = g.getFontMetrics().getHeight();
+ }
+
+ g.drawString(this.label, (this.getWidth() - textWidth)/2, (this.getHeight() + textHeight)/2);
+
+ //Draw Icon
+ if(icon != null) {
+ int iconWidth = icon.getWidth();
+ int iconHeight = icon.getHeight();
+
+ int iconX = (this.getWidth() - iconWidth - textWidth) / 2;
+ int iconY = (this.getHeight() - iconHeight - textHeight) / 2;
+ Graphics2D g2 = imageBuffer.createGraphics();
+ g2.drawImage(icon, iconX, iconY, null);
+ g2.dispose();
+ }
+
+ g.dispose();
+ }
+
+ public void setLabel(String label) {
+ this.label = label;
+ }
+
+ public String getLabel() {
+ return this.label;
+ }
+
+ public void setIcon(BufferedImage icon) {
+ this.icon = icon;
+ }
+
+ public void setIcon(String url) {
+ try{
+ icon = ImageIO.read(new File("resources\\icons\\" + url + ".png"));
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public BufferedImage getIcon() {
+ return icon;
+ }
+}
diff --git a/src/guiTree/Components/TitleBar.java b/src/guiTree/Components/TitleBar.java
new file mode 100644
index 0000000..b2011ab
--- /dev/null
+++ b/src/guiTree/Components/TitleBar.java
@@ -0,0 +1,148 @@
+package guiTree.Components;
+
+import guiTree.Helper.Point2d;
+import guiTree.Visual;
+import guiTree.events.MouseAdapter;
+
+import java.awt.*;
+import java.awt.event.MouseEvent;
+import java.awt.image.BufferedImage;
+
+public class TitleBar extends Visual {
+ public static final int MINIMIZE = 1;
+ public static final int MAXIMIZE = 2;
+ public static final int CLOSE = 3;
+
+ private BufferedImage icon;
+ private String title;
+ private Button minimize;
+ private Button maximize;
+ private Button close;
+
+
+ /*--------------------------------------------------------------------
+ Constructors
+ ---------------------------------------------------------------------*/
+ public TitleBar() {
+ this(null, null);
+ }
+
+ public TitleBar(String title) {
+ this(title, null);
+ }
+
+ public TitleBar(BufferedImage icon) {
+ this(null, icon);
+ }
+
+ public TitleBar(String title, BufferedImage icon) {
+ super();
+ this.icon = icon;
+ this.title = title;
+
+ this.close = new Button();
+ this.minimize = new Button();
+ this.maximize = new Button();
+ close.setIcon("close_white");
+ minimize.setIcon("minimize_white");
+ maximize.setIcon("square_white");
+ close.setSize(60, 30);
+ minimize.setSize(60, 30);
+ maximize.setSize(60, 30);
+ close.setBackgroundColor(Color.GRAY);
+ maximize.setBackgroundColor(Color.GRAY);
+ minimize.setBackgroundColor(Color.GRAY);
+ close.setForegroundColor(Color.RED);
+ maximize.setForegroundColor(Color.LIGHT_GRAY);
+ minimize.setForegroundColor(Color.LIGHT_GRAY);
+
+ this.setSize(1, 30);
+ this.setLocation(0, 0);
+
+ setButtonLocation();
+ close.addMouseListener(new MouseAdapter() {
+ @Override
+ public void mouseClicked(MouseEvent mouseEvent) {
+ notifyParent(3);
+ }
+ });
+ maximize.addMouseListener(new MouseAdapter() {
+ @Override
+ public void mouseClicked(MouseEvent mouseEvent) {
+ notifyParent(2);
+ }
+ });
+ minimize.addMouseListener(new MouseAdapter() {
+ @Override
+ public void mouseClicked(MouseEvent mouseEvent) {
+ notifyParent(1);
+ }
+ });
+ }
+
+
+ /*--------------------------------------------------------------------
+ Getters
+ ---------------------------------------------------------------------*/
+
+ public BufferedImage getIcon() {
+ return icon;
+ }
+
+ public String geTitle() {
+ return title;
+ }
+
+
+ /*--------------------------------------------------------------------
+ Setters
+ ---------------------------------------------------------------------*/
+
+ public void setIcon(BufferedImage icon) {
+ this.icon = icon;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ @Override
+ public void setSize(Integer width, Integer height) {
+ super.setSize(width, height);
+ setButtonLocation();
+ }
+
+ @Override
+ public void paint(BufferedImage imageBuffer) {
+ Graphics2D g = imageBuffer.createGraphics();
+ g.setColor(getBackgroundColor());
+ g.fillRect(0, 0, getWidth(), getHeight());
+
+ Graphics2D iconGraphics = imageBuffer.createGraphics();
+ iconGraphics.drawImage(icon, 5, (getHeight() - icon.getHeight())/2, null);
+ iconGraphics.dispose();
+
+ int stringOffset = icon.getWidth() + 10;
+ int textHeight = 0;
+ if(!title.equals("")) {
+ textHeight = g.getFontMetrics().getHeight();
+ g.setColor(Color.WHITE);
+ }
+ g.drawString(title, stringOffset, getHeight()/2 + textHeight/4);
+ }
+
+ private void setButtonLocation() {
+ int buttonOffset = this.getWidth() - close.getWidth();
+ close.setLocation(buttonOffset, 0);
+ close.setName("close");
+ buttonOffset -= maximize.getWidth();
+ maximize.setLocation(buttonOffset, 0);
+ maximize.setName("maximize");
+ buttonOffset -= minimize.getWidth();
+ minimize.setLocation(buttonOffset, 0);
+ minimize.setName("minimize");
+ this.addVisual(close);
+ this.addVisual(minimize);
+ this.addVisual(maximize);
+ }
+}
diff --git a/src/guiTree/CustomFrame.java b/src/guiTree/CustomFrame.java
index cf9edd0..a7a5b77 100644
--- a/src/guiTree/CustomFrame.java
+++ b/src/guiTree/CustomFrame.java
@@ -37,6 +37,6 @@ public class CustomFrame extends JFrame {
@Override
public void paint(Graphics g)
{
- g.drawImage(imageBuffer, 5, 0, this.getWidth(), this.getHeight(), null);
+ g.drawImage(imageBuffer, 0, 0, this.getWidth(), this.getHeight(), null);
}
}
diff --git a/src/guiTree/Helper/Point2d.java b/src/guiTree/Helper/Point2d.java
new file mode 100644
index 0000000..60a574d
--- /dev/null
+++ b/src/guiTree/Helper/Point2d.java
@@ -0,0 +1,11 @@
+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/MouseEventGetter.java b/src/guiTree/MouseEventGetter.java
index fa13979..9e3d082 100644
--- a/src/guiTree/MouseEventGetter.java
+++ b/src/guiTree/MouseEventGetter.java
@@ -12,41 +12,36 @@ public class MouseEventGetter implements MouseInputListener {
@Override
public void mouseDragged(MouseEvent mouseEvent) {
- callingWindow.mouseDragged(mouseEvent, 0, 0);
+ callingWindow.mouseDragged(mouseEvent);
}
@Override
public void mouseMoved(MouseEvent mouseEvent) {
callingWindow.mouseMoved(mouseEvent, 0, 0);
- System.out.println("MOVED");
}
@Override
public void mouseClicked(MouseEvent mouseEvent) {
- callingWindow.mouseClicked(mouseEvent, 0, 0);
- System.out.println("CLICKED");
+ callingWindow.mouseClicked(mouseEvent);
}
@Override
public void mousePressed(MouseEvent mouseEvent) {
- callingWindow.mousePressed(mouseEvent, 0, 0);
- System.out.println("PRESSED");
+ callingWindow.mousePressed(mouseEvent);
}
@Override
public void mouseReleased(MouseEvent mouseEvent) {
- callingWindow.mouseReleased(mouseEvent, 0, 0);
+ callingWindow.mouseReleased(mouseEvent);
}
@Override
public void mouseEntered(MouseEvent mouseEvent) {
callingWindow.mouseEntered(mouseEvent, 0, 0);
- System.out.println("ENTERED");
}
@Override
public void mouseExited(MouseEvent mouseEvent) {
- callingWindow.mouseExited(mouseEvent, 0, 0);
- System.out.println("EXITED");
+ callingWindow.mouseExited(mouseEvent);
}
}
diff --git a/src/guiTree/Visual.java b/src/guiTree/Visual.java
index 1eaaddc..9a7594d 100644
--- a/src/guiTree/Visual.java
+++ b/src/guiTree/Visual.java
@@ -16,6 +16,7 @@ public class Visual {
/*--------------------------------------------------------------------
Tree Elements
---------------------------------------------------------------------*/
+
private List children;
private Visual parent;
private BufferedImage imageBuffer;
@@ -27,33 +28,50 @@ public class Visual {
/*--------------------------------------------------------------------
Attributes
---------------------------------------------------------------------*/
+
private Integer width;
private Integer height;
private Integer locationX;
private Integer locationY;
private Color backgroundColor;
private Color foregroundColor;
+ private Color fontColor;
private Boolean active;
private Boolean dirty;
+ private static Visual entered;
+ private Boolean focused;
private Boolean pressed;
/*--------------------------------------------------------------------
Constructors
---------------------------------------------------------------------*/
+
public Visual() {
+ this(0, 0);
+ }
+
+ public Visual(int width, int height) {
this.children = new ArrayList<>();
this.mouseWheelListeners = new ArrayList<>();
this.mouseListeners = new ArrayList<>();
this.keyListeners = new ArrayList<>();
this.parent = null;
this.backgroundColor = Color.WHITE;
- this.foregroundColor = Color.BLACK;
+ this.foregroundColor = Color.BLUE;
+ this.fontColor = Color.BLACK;
this.dirty = true;
this.active = this instanceof Window;
- }
+ this.focused = false;
+ this.pressed = false;
+ this.width = width;
+ this.height = height;
+
+ this.locationX = 0;
+ this.locationY = 0;
+ }
/*--------------------------------------------------------------------
Attributes Setters
@@ -63,7 +81,7 @@ public class Visual {
this.name = name;
}
- public void setSize(Integer width, Integer height){
+ public void setSize(Integer width, Integer height) {
this.width = width;
this.height = height;
@@ -72,7 +90,7 @@ public class Visual {
this.dirty = true;
}
- public void setLocation(Integer x, Integer y){
+ public void setLocation(Integer x, Integer y) {
this.locationX = x;
this.locationY = y;
this.dirty = true;
@@ -88,21 +106,25 @@ public class Visual {
this.dirty = true;
}
+ public void setFontColor(Color fontColor) {
+ this.fontColor = fontColor;
+ }
+
private void calculateInitialSize() {
- if(this.width == null) {
- this.width = 20;
+ if(this.width <= 0) {
+ this.width = 1;
}
- if(this.height == null){
- this.height = 20;
+ if(this.height <= 0){
+ this.height = 1;
}
}
- private void calculateInitialLocation(){
- if(this.locationX == null) {
- this.locationX = 20;
+ private void calculateInitialLocation() {
+ if(this.locationX == 0) {
+ this.locationX = 1;
}
- if(this.locationY == null){
- this.locationY = 50;
+ if(this.locationY == 0){
+ this.locationY = 1;
}
}
@@ -114,21 +136,19 @@ public class Visual {
return name;
}
- public int getWidth()
- {
+ public int getWidth() {
return this.width;
}
- public int getHeight()
- {
+ public int getHeight() {
return this.height;
}
- public int getLocationX(){
+ public int getLocationX() {
return this.locationX;
}
- public int getLocationY(){
+ public int getLocationY() {
return this.locationY;
}
@@ -140,11 +160,15 @@ public class Visual {
return foregroundColor;
}
+ public Color getFontColor() {
+ return fontColor;
+ }
+
/*--------------------------------------------------------------------
Tree Methods
---------------------------------------------------------------------*/
- public Visual findByName(String name){
+ public Visual findByName(String name) {
if(this.name.equals(name)){
return this;
}
@@ -161,9 +185,15 @@ public class Visual {
}
public void addVisual(Visual child) {
+ this.addVisual(child, -1, -1);
+ }
+
+ public void addVisual(Visual child, int x, int y) {
this.children.add(child);
child.setParent(this);
- child.calculateInitialLocation();
+ if(x == -1 && y == -1) {
+ child.calculateInitialLocation();
+ }
child.calculateInitialSize();
if(this.active) {
@@ -181,18 +211,16 @@ public class Visual {
this.dirty = true;
}
- private void setParent(Visual parent)
- {
+ private void setParent(Visual parent) {
this.parent = parent;
}
- private void handleNotification() {
+ public void handleNotification(int notify) {
}
- private void notifyParent()
- {
- this.parent.handleNotification();
+ public void notifyParent(int notify) {
+ this.parent.handleNotification(notify);
}
private void repaint() {
@@ -234,94 +262,58 @@ public class Visual {
/*--------------------------------------------------------------------
Listener Methods
---------------------------------------------------------------------*/
- void addMouseListener(MouseListener mouseListener) {
+ public void addMouseListener(MouseListener mouseListener) {
this.mouseListeners.add(mouseListener);
}
- void removeMouseListener(MouseListener mouseListener) {
+ public void removeMouseListener(MouseListener mouseListener) {
this.mouseListeners.remove(mouseListener);
}
- void addMouseWheelListener(MouseWheelListener mouseWheelListener) {
+ public void addMouseWheelListener(MouseWheelListener mouseWheelListener) {
this.mouseWheelListeners.add(mouseWheelListener);
}
- void removeMouseWheelListener(MouseWheelListener mouseWheelListener) {
+ public void removeMouseWheelListener(MouseWheelListener mouseWheelListener) {
this.mouseWheelListeners.remove(mouseWheelListener);
}
- void addKeyListener(KeyListener keyListener) {
+ public void addKeyListener(KeyListener keyListener) {
this.keyListeners.add(keyListener);
}
- void removeKeyListener(KeyListener keyListener) {
+ public void removeKeyListener(KeyListener keyListener) {
this.keyListeners.remove(keyListener);
}
- void mouseClicked(MouseEvent mouseEvent, int offsetX, int offsetY) {
- boolean front = true;
- int mouseX = mouseEvent.getX() - offsetX;
- int mouseY = mouseEvent.getY() - offsetY;
- for(Visual v: children) {
- if(mouseX > v.getLocationX() &&
- mouseY > v.getLocationY() &&
- mouseX < v.getWidth() + v.getLocationX() &&
- mouseY < v.getHeight() + v.getLocationY()) {
- front = false;
- v.mouseClicked(mouseEvent, v.locationX + offsetX, v.locationY + offsetY);
- }
- }
- if(front) {
- for(MouseListener mouseListener: mouseListeners) {
- mouseListener.mouseClicked(mouseEvent);
- }
- dirty = true;
+ void mouseClicked(MouseEvent mouseEvent) {
+ for(MouseListener mouseListener: entered.mouseListeners) {
+ mouseListener.mouseClicked(mouseEvent);
}
+ dirty = true;
+ entered.focused = true;
}
- void mouseReleased(MouseEvent mouseEvent, int offsetX, int offsetY) {
- boolean front = true;
- int mouseX = mouseEvent.getX() - offsetX;
- int mouseY = mouseEvent.getY() - offsetY;
- for(Visual v: children) {
- if(mouseX > v.getLocationX() &&
- mouseY > v.getLocationY() &&
- mouseX < v.getWidth() + v.getLocationX() &&
- mouseY < v.getHeight() + v.getLocationY()) {
- front = false;
- v.mouseReleased(mouseEvent, offsetX + v.locationX, offsetY + v.locationY);
- }
- }
- if(front) {
- for(MouseListener mouseListener: mouseListeners) {
- mouseListener.mouseReleased(mouseEvent);
- }
- dirty = true;
+ void mouseReleased(MouseEvent mouseEvent) {
+ for(MouseListener mouseListener: entered.mouseListeners) {
+ mouseListener.mouseReleased(mouseEvent);
}
+ dirty = true;
+ entered.pressed = false;
}
- void mousePressed(MouseEvent mouseEvent, int offsetX, int offsetY) {
- boolean front = true;
- int mouseX = mouseEvent.getX() - offsetX;
- int mouseY = mouseEvent.getY() - offsetY;
- for(Visual v: children) {
- if(mouseX > v.getLocationX() &&
- mouseY > v.getLocationY() &&
- mouseX < v.getWidth() + v.getLocationX() &&
- mouseY < v.getHeight() + v.getLocationY()) {
- front = false;
- v.mousePressed(mouseEvent, offsetX + v.locationX, offsetY + v.locationY);
- }
- }
- if(front) {
- for(MouseListener mouseListener: mouseListeners) {
- mouseListener.mousePressed(mouseEvent);
- }
- dirty = true;
+ void mousePressed(MouseEvent mouseEvent) {
+ for(MouseListener mouseListener: entered.mouseListeners) {
+ mouseListener.mousePressed(mouseEvent);
}
+ dirty = true;
+ entered.pressed = true;
}
void mouseEntered(MouseEvent mouseEvent, int offsetX, int offsetY) {
+ if(entered != null && entered.pressed){
+ return;
+ }
boolean front = true;
int mouseX = mouseEvent.getX() - offsetX;
int mouseY = mouseEvent.getY() - offsetY;
@@ -335,6 +327,7 @@ public class Visual {
}
}
if(front) {
+ entered = this;
for(MouseListener mouseListener: mouseListeners) {
mouseListener.mouseEntered(mouseEvent);
}
@@ -342,87 +335,74 @@ public class Visual {
}
}
- void mouseExited(MouseEvent mouseEvent, int offsetX, int offsetY) {
- boolean front = true;
- int mouseX = mouseEvent.getX() - offsetX;
- int mouseY = mouseEvent.getY() - offsetY;
- for(Visual v: children) {
- if(mouseX > v.getLocationX() &&
- mouseY > v.getLocationY() &&
- mouseX < v.getWidth() + v.getLocationX() &&
- mouseY < v.getHeight() + v.getLocationY()) {
- front = false;
- v.mouseExited(mouseEvent, offsetX + v.locationX, offsetY + v.locationY);
- }
+ void mouseExited(MouseEvent mouseEvent) {
+ if(entered == null) {
+ return;
}
- if(front) {
- for(MouseListener mouseListener: mouseListeners) {
- mouseListener.mouseExited(mouseEvent);
- }
- dirty = true;
+ if(entered.pressed) {
+ return;
}
+ for (MouseListener mouseListener : entered.mouseListeners) {
+ mouseListener.mouseExited(mouseEvent);
+ }
+ entered = null;
+ dirty = true;
}
- void mouseDragged(MouseEvent mouseEvent, int offsetX, int offsetY) {
- boolean front = true;
- int mouseX = mouseEvent.getX() - offsetX;
- int mouseY = mouseEvent.getY() - offsetY;
- for(Visual v: children) {
- if(mouseX > v.getLocationX() &&
- mouseY > v.getLocationY() &&
- mouseX < v.getWidth() + v.getLocationX() &&
- mouseY < v.getHeight() + v.getLocationY()) {
- front = false;
- v.mouseDragged(mouseEvent, offsetX + v.locationX, offsetY + v.locationY);
- }
- }
- if(front) {
- for(MouseListener mouseListener: mouseListeners) {
- mouseListener.mouseDragged(mouseEvent);
- }
- dirty = true;
+ void mouseDragged(MouseEvent mouseEvent) {
+ for (MouseListener mouseListener : entered.mouseListeners) {
+ mouseListener.mouseDragged(mouseEvent);
}
+ entered.dirty = true;
}
void mouseMoved(MouseEvent mouseEvent, int offsetX, int offsetY) {
+ if(entered != null && entered.pressed){
+ return;
+ }
boolean front = true;
int mouseX = mouseEvent.getX() - offsetX;
int mouseY = mouseEvent.getY() - offsetY;
+ if(entered != null) {
+ if (!entered.isInside(mouseEvent.getX(), mouseEvent.getY())) {
+ for (MouseListener mouseListener : entered.mouseListeners) {
+ mouseListener.mouseExited(mouseEvent);
+ }
+ entered = this;
+ }
+ }
for(Visual v: children) {
- if(mouseX > v.getLocationX() &&
- mouseY > v.getLocationY() &&
- mouseX < v.getWidth() + v.getLocationX() &&
- mouseY < v.getHeight() + v.getLocationY()) {
+ if(v.isInside(mouseX, mouseY)) {
front = false;
v.mouseMoved(mouseEvent, offsetX + v.locationX, offsetY + v.locationY);
}
}
if(front) {
- for(MouseListener mouseListener: mouseListeners) {
- mouseListener.mouseMoved(mouseEvent);
+ if(this.isInside(mouseEvent.getX(), mouseEvent.getY())) {
+ if (this != entered && entered != null) {
+ for (MouseListener mouseListener : entered.mouseListeners) {
+ mouseListener.mouseExited(mouseEvent);
+ }
+ entered = this;
+ for (MouseListener mouseListener : mouseListeners) {
+ mouseListener.mouseEntered(mouseEvent);
+ }
+ }
+ else {
+ for (MouseListener mouseListener : mouseListeners) {
+ mouseListener.mouseMoved(mouseEvent);
+ }
+ }
}
dirty = true;
}
}
void mouseWheelMoved(MouseWheelEvent mouseWheelEvent, int offsetX, int offsetY) {
- boolean front = true;
- int mouseX = mouseWheelEvent.getX() - offsetX;
- int mouseY = mouseWheelEvent.getY() - offsetY;
- for(Visual v: children) {
- if(mouseX > v.getLocationX() &&
- mouseY > v.getLocationY() &&
- mouseX < v.getWidth() + v.getLocationX() &&
- mouseY < v.getHeight() + v.getLocationY()) {
- front = false;
- v.mouseWheelMoved(mouseWheelEvent, offsetX + v.locationX, offsetY + v.locationY);
- }
- }
- if(front) {
+ if(focused) {
for(MouseWheelListener mouseWheelListener: mouseWheelListeners) {
mouseWheelListener.mouseWheelMoved(mouseWheelEvent);
}
- dirty = true;
}
}
@@ -457,4 +437,8 @@ public class Visual {
child.deactivate();
}
}
+
+ private boolean isInside(int x, int y) {
+ return x > locationX && x < locationX + width && y > locationY && y < locationY + height;
+ }
}
diff --git a/src/guiTree/Window.java b/src/guiTree/Window.java
index 0062848..9ab3b96 100644
--- a/src/guiTree/Window.java
+++ b/src/guiTree/Window.java
@@ -1,17 +1,25 @@
package guiTree;
+import guiTree.Components.TitleBar;
+import guiTree.Helper.Point2d;
+import guiTree.events.MouseAdapter;
+
+import javax.tools.Tool;
import java.awt.*;
+import java.awt.event.MouseEvent;
import java.awt.event.WindowListener;
import java.awt.event.WindowStateListener;
import java.awt.image.BufferedImage;
public class Window extends Visual {
public CustomFrame frame;
+ private TitleBar titleBar;
public Window()
{
super();
this.frame = new CustomFrame(this);
+ this.setUndecorated(true);
this.addWindowStateListener(e -> {
this.setSize(getWidth(), getHeight());
revalidate();
@@ -23,6 +31,10 @@ public class Window extends Visual {
{
this.frame.setSize(width, height);
super.setSize(width, height);
+ if(this.titleBar != null) {
+ this.titleBar.setSize(this.getWidth(), titleBar.getHeight());
+ }
+ revalidate();
}
public void setFrameImageBuffer(BufferedImage imageBuffer){
@@ -62,6 +74,22 @@ public class Window extends Visual {
frame.repaint(tm);
}
+ public void setTitleBar(TitleBar titleBar) {
+ titleBar.setSize(this.getWidth(), titleBar.getHeight());
+
+ if(this.getTitleBar() != null) {
+ this.removeVisual(this.titleBar);
+ }
+
+ this.titleBar = titleBar;
+ this.addVisual(titleBar, 0, 0);
+ this.titleBar.addMouseListener(new TitleBarMouseListener());
+ }
+
+ public TitleBar getTitleBar() {
+ return this.titleBar;
+ }
+
public void setPositionRelativeTo(Component c){
frame.setLocationRelativeTo(c);
}
@@ -71,4 +99,71 @@ public class Window extends Visual {
}
public void setUndecorated(Boolean undecorated){frame.setUndecorated(undecorated);}
+
+ public void setState(int state) {
+ frame.setState(state);
+ }
+
+ private void moveTo(int x, int y) {
+ this.frame.setLocation(x, y);
+ }
+
+ @Override
+ public void handleNotification(int notify) {
+ switch(notify) {
+ case TitleBar.CLOSE:
+ dispose();
+ break;
+ case TitleBar.MINIMIZE:
+ setState(Frame.ICONIFIED);
+ break;
+ case TitleBar.MAXIMIZE:
+ Rectangle screenBounds = frame.getGraphicsConfiguration().getBounds();
+ this.setSize(screenBounds.width, screenBounds.height);
+ this.moveTo(screenBounds.x, screenBounds.y);
+ setState(Frame.MAXIMIZED_BOTH);
+ break;
+ }
+ }
+
+ private class WindowMouseListener extends MouseAdapter{
+ private Boolean resizing;
+ private Boolean moving;
+ private Point2d initialLocation;
+
+ @Override
+ public void mousePressed(MouseEvent mouseEvent) {
+ this.initialLocation = new Point2d(mouseEvent.getX(), mouseEvent.getY());
+ }
+
+ @Override
+ public void mouseReleased(MouseEvent mouseEvent) {
+ moving = false;
+ resizing = false;
+ }
+ }
+
+
+ private class TitleBarMouseListener extends MouseAdapter {
+ private Boolean moving = false;
+ private Point2d initialLocation;
+
+ @Override
+ public void mouseDragged(MouseEvent mouseEvent) {
+ if(moving) {
+ moveTo(mouseEvent.getXOnScreen() - initialLocation.x, mouseEvent.getYOnScreen() - initialLocation.y);
+ }
+ }
+
+ @Override
+ public void mousePressed(MouseEvent mouseEvent) {
+ moving = true;
+ initialLocation = new Point2d(mouseEvent.getX(), mouseEvent.getY());
+ }
+
+ @Override
+ public void mouseReleased(MouseEvent mouseEvent) {
+ moving = false;
+ }
+ }
}
diff --git a/src/parser/XAMLParser.java b/src/parser/XAMLParser.java
index 0208c63..cc74d7c 100644
--- a/src/parser/XAMLParser.java
+++ b/src/parser/XAMLParser.java
@@ -14,7 +14,8 @@ import java.util.ArrayList;
import java.util.List;
public class XAMLParser {
- private final static String packageName = "guiTree.";
+ private final static String packageGuiTree = "guiTree.";
+ private final static String packageComponents = "guiTree.Components.";
private static Converter valueConverter = new Converter();
private static void setAttributes(Object object, NamedNodeMap attributeList){
@@ -119,7 +120,13 @@ public class XAMLParser {
}
private static Object parseNode(Node parentNode)throws Exception{
- Class> parentClass = Class.forName(packageName.concat(parentNode.getNodeName()));
+ Class> parentClass;
+ try {
+ parentClass = Class.forName(packageComponents.concat(parentNode.getNodeName()));
+ }
+ catch (ClassNotFoundException e) {
+ parentClass = Class.forName(packageGuiTree.concat(parentNode.getNodeName()));
+ }
Object parentObject = parentClass.getDeclaredConstructor().newInstance();
setAttributes(parentObject, parentNode.getAttributes());