diff --git a/.run/Demo 1 - simplest.run.xml b/.run/Demo 1 - simplest.run.xml
new file mode 100644
index 0000000..15ad201
--- /dev/null
+++ b/.run/Demo 1 - simplest.run.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.run/Demo 2 - overlay.run.xml b/.run/Demo 2 - overlay.run.xml
new file mode 100644
index 0000000..c06589a
--- /dev/null
+++ b/.run/Demo 2 - overlay.run.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.run/Demo 3 - twoPage.run.xml b/.run/Demo 3 - twoPage.run.xml
new file mode 100644
index 0000000..0f872be
--- /dev/null
+++ b/.run/Demo 3 - twoPage.run.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.run/Demo 4 - multiAdapter.run.xml b/.run/Demo 4 - multiAdapter.run.xml
new file mode 100644
index 0000000..12deae4
--- /dev/null
+++ b/.run/Demo 4 - multiAdapter.run.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.run/Demo 5 - featurePreview.run.xml b/.run/Demo 5 - featurePreview.run.xml
new file mode 100644
index 0000000..4aa23b8
--- /dev/null
+++ b/.run/Demo 5 - featurePreview.run.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.run/Sandbox.run.xml b/.run/Sandbox.run.xml
new file mode 100644
index 0000000..7dbbe98
--- /dev/null
+++ b/.run/Sandbox.run.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ReadMe.md b/ReadMe.md
index 503c782..41fdec8 100644
--- a/ReadMe.md
+++ b/ReadMe.md
@@ -9,13 +9,16 @@ Free to use and modify for whatever purposes. No copyrights apply.
## Requirements
+### For running and compiling
+
* JDK: 18
* Maven compiler: 18
-* Maven Surefire: 3.0.0-M7
-* jetbrains annotations: 23.0.0
-* [ThreadAbstraction](https://github.com/KruMF/ThreadAbstraction) : 0.4.1
+
+### Dependencies
+
+* [JetBrains Java Annotations](https://mvnrepository.com/artifact/org.jetbrains/annotations) : 23.0.0
+* [ThreadAbstraction](https://github.com/KruMF/ThreadAbstraction) : 0.4.2
* [FileHandler](https://github.com/KruMF/FileHandler) : 0.2.5
-* JUnit: Jupiter 5.9.0-M1
## Instructions
@@ -27,7 +30,7 @@ Maven support recently added. Detailed info coming...
## Standalone demo
-Check `graphicsEngine\demo` for standalone demo versions.
+Check `src\test\java\graphicsEngineDemo` for standalone demo versions.
*Launch instructions available there.*
diff --git a/jitpack.yml b/jitpack.yml
new file mode 100644
index 0000000..b2ca5cb
--- /dev/null
+++ b/jitpack.yml
@@ -0,0 +1,9 @@
+jdk:
+ - openjdk18
+before_install:
+ - sdk install java 18.0.2.1-open
+ - sdk use java 18.0.2.1-open
+ - sdk install maven
+ - mvn -v
+install:
+ - mvn install -Dmaven.javadoc.skip=true -DskipTests
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 617df38..0b01028 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,19 +6,16 @@
com.github.KruMF
GraphicsEngine
- 0.8.3
+ 0.8.15
UTF-8
18
18
- 3.0.0-M7
23.0.0
- 0.4.1
+ 0.4.2
0.2.5
-
- 5.9.0-M1
@@ -29,12 +26,6 @@
-
- org.apache.maven.plugins
- maven-surefire-plugin
- ${maven.surefire.version}
-
-
org.jetbrains
annotations
@@ -51,27 +42,5 @@
FileHandler
${fileHandler.version}
-
-
- org.junit.jupiter
- junit-jupiter-engine
- ${junit.jupiter.version}
- test
-
-
- org.junit.jupiter
- junit-jupiter-api
- ${junit.jupiter.version}
- test
-
-
-
-
-
- maven-surefire-plugin
- ${maven.surefire.version}
-
-
-
\ No newline at end of file
diff --git a/src/main/java/graphicsEngine/AbstractGraphicsAdapter.java b/src/main/java/graphicsEngine/AbstractGraphicsAdapter.java
deleted file mode 100644
index 972a6cc..0000000
--- a/src/main/java/graphicsEngine/AbstractGraphicsAdapter.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package graphicsEngine;
-
-//for allowing not to use graphics manager directly
-public class AbstractGraphicsAdapter {
- public GraphicsManager graphics;
-
- public AbstractGraphicsAdapter() {
- graphics = new GraphicsManager();
- }
-
- public final void end() {
- graphics.end();
- }
-}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngine/GraphicsAdapter.java b/src/main/java/graphicsEngine/GraphicsAdapter.java
new file mode 100644
index 0000000..dcac33c
--- /dev/null
+++ b/src/main/java/graphicsEngine/GraphicsAdapter.java
@@ -0,0 +1,57 @@
+package graphicsEngine;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import static consoleUtils.ConsoleUtils.printLine;
+
+import graphicsEngine.windows.WindowManager;
+import graphicsEngine.windows.WindowUpdater;
+
+/**
+ * A graphics adapter class.
+ * Intended for allowing not to use the GraphicsManager directly.
+ * Reference this to use the GraphicsEngine.
+ * TODO: check redundancy; originally meant for security; fix javadocs
+ */
+public class GraphicsAdapter extends WindowManager {
+ /**
+ * Starts a new blank graphics adapter.
+ */
+ public GraphicsAdapter() {
+ super();
+ }
+
+ /**
+ * Adds a new window to this graphics adapter.
+ *
+ * @param window A corresponding WindowUpdater object.
+ */
+ @Override
+ public final void newWindow(@NotNull WindowUpdater window) {
+ super.newWindow(window);
+ }
+
+ /**
+ * Gets a WindowUpdater object that contains a window with corresponding key.
+ * If multiple windows with the same key exist, returns the first one.
+ * Returns null, if provided key is null or no such window found.
+ *
+ * @param windowKey Key of the window.
+ *
+ * @return The specified WindowUpdater object.
+ */
+ @Override
+ public final @Nullable WindowUpdater getWindow(@Nullable String windowKey) {
+ return super.getWindow(windowKey);
+ }
+
+ /**
+ * Ends all windows.
+ */
+ @Override
+ public final void end() {
+ printLine("Graphics ending.");
+ super.end();
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngine/GraphicsManager.java b/src/main/java/graphicsEngine/GraphicsManager.java
deleted file mode 100644
index daab237..0000000
--- a/src/main/java/graphicsEngine/GraphicsManager.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package graphicsEngine;
-
-import graphicsEngine.windows.AbstractWindow;
-import graphicsEngine.windows.WindowManager;
-
-import DelayCalculator.DelayOptions;
-import java.util.ArrayList;
-
-import static graphicsEngine.Utilities.printLine;
-
-import org.jetbrains.annotations.Nullable;
-import org.jetbrains.annotations.NotNull;
-
-//a class for containing graphics
-//TODO: add javadocs
-public class GraphicsManager {
- public ArrayList windows;
-
- public GraphicsManager() {
- windows = new ArrayList<>();
- }
-
- @SuppressWarnings("unused")
- public final void newWindow(@NotNull WindowManager window) {
- int i = windows.size();
- windows.add(window);
- windows.get(i).start();
- }
-
- @SuppressWarnings("unused")
- public final void newWindow(@NotNull AbstractWindow window) {
- newWindow(new WindowManager(window));
- }
-
- @SuppressWarnings("unused")
- public final void newWindow(@NotNull AbstractWindow window, long delay) {
- newWindow(new WindowManager(window, delay));
- }
-
- @SuppressWarnings("unused")
- public final void newWindow(@NotNull AbstractWindow window, @Nullable DelayOptions delayOptions) {
- newWindow(new WindowManager(window, delayOptions));
- }
-
- public void end() {
- printLine("Graphics ending.");
- endAllWindows();
- }
-
- private void endAllWindows() {
- for (WindowManager window : windows) {
- window.end();
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngine/Utilities.java b/src/main/java/graphicsEngine/Utilities.java
index fd9dcb6..29051c4 100644
--- a/src/main/java/graphicsEngine/Utilities.java
+++ b/src/main/java/graphicsEngine/Utilities.java
@@ -1,44 +1,24 @@
package graphicsEngine;
-import java.awt.*;
-import javax.swing.*;
-import javax.swing.border.LineBorder;
+import javax.swing.ImageIcon;
-import java.util.Objects;
-
-import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.NotNull;
/**
* A utility class for containing generic methods.
*/
public class Utilities {
- private static final Color DEFAULT_BORDER_COLOR = Color.red;
-
- /**
- * Prints a message in console as new line.
- *
- * @param message Message to print.
- */
- public static void printLine(String message) {
- System.out.println(message);
- }
+ private static final String
+ RESOURCES_PATH = "src/main/resources/graphicsEngine/",
+ SAMPLE_ICON_RELATIVE_PATH = "images/sample_icon.png";
- //rounds a number to a specified number of decimal places
- // TODO: add javadoc
- public static String roundNumber(double value, int decimalPlaces) {
- double conversionCoefficient = Math.pow(10, decimalPlaces);
- return String.valueOf(((int) (value * conversionCoefficient))/conversionCoefficient);
+ //TODO: add javadoc
+ public static @NotNull ImageIcon getSampleIcon() {
+ return new ImageIcon(getFulResourcePath(SAMPLE_ICON_RELATIVE_PATH));
}
- // TODO: add javadoc
- public interface BorderInterface {
- static void setBorderState(@NotNull JComponent component, boolean state, @Nullable Color color) {
- if (state) {
- component.setBorder(new LineBorder(Objects.requireNonNullElse(color, DEFAULT_BORDER_COLOR)));
- } else {
- component.setBorder(null);
- }
- }
+ @SuppressWarnings("SameParameterValue")
+ private static @NotNull String getFulResourcePath(@NotNull String relative) {
+ return RESOURCES_PATH + relative;
}
}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngine/colors/AbstractColorScheme.java b/src/main/java/graphicsEngine/colors/AbstractColorScheme.java
new file mode 100644
index 0000000..08681f1
--- /dev/null
+++ b/src/main/java/graphicsEngine/colors/AbstractColorScheme.java
@@ -0,0 +1,43 @@
+package graphicsEngine.colors;
+
+import java.util.Objects;
+import java.awt.Color;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+//TODO: add javadoc
+public abstract class AbstractColorScheme {
+ private Color baseColor;
+
+ //TODO: add javadoc
+ protected AbstractColorScheme() {
+ this(ColorUtilities.DEFAULT_OPACITY);
+ }
+
+ //TODO: add javadoc
+ protected AbstractColorScheme(boolean opaque) {
+ this(ColorUtilities.defaultColorByOpacity(opaque));
+ }
+
+ //TODO: add javadoc
+ protected AbstractColorScheme(@Nullable Color base) {
+ setBaseColor(base);
+ }
+
+ //TODO: add javadoc
+ public void setBaseColor(@Nullable Color color) {
+ baseColor = nonNullBaseColor(color);
+ }
+
+ private static @NotNull Color nonNullBaseColor(@Nullable Color base) {
+ return Objects.requireNonNullElse(
+ base,
+ ColorUtilities.defaultColorForUnknownOpacity());
+ }
+
+ //TODO: add javadoc
+ public @NotNull Color getBaseColor() {
+ return baseColor;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngine/colors/ColorUtilities.java b/src/main/java/graphicsEngine/colors/ColorUtilities.java
new file mode 100644
index 0000000..49dd2fe
--- /dev/null
+++ b/src/main/java/graphicsEngine/colors/ColorUtilities.java
@@ -0,0 +1,25 @@
+package graphicsEngine.colors;
+
+import java.awt.Color;
+
+import org.jetbrains.annotations.NotNull;
+
+public class ColorUtilities {
+ public static final @NotNull Color
+ DEFAULT_COLOR_TRANSPARENT = new Color(0, 0, 0, 0),
+ DEFAULT_COLOR_OPAQUE = Color.black;
+
+ protected static final boolean DEFAULT_OPACITY = true;
+
+ public static @NotNull Color defaultColorByOpacity(boolean opaque) {
+ if (opaque) {
+ return ColorUtilities.DEFAULT_COLOR_OPAQUE;
+ } else {
+ return ColorUtilities.DEFAULT_COLOR_TRANSPARENT;
+ }
+ }
+
+ protected static @NotNull Color defaultColorForUnknownOpacity() {
+ return defaultColorByOpacity(DEFAULT_OPACITY);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngine/colors/Palette.java b/src/main/java/graphicsEngine/colors/Palette.java
new file mode 100644
index 0000000..2a7d927
--- /dev/null
+++ b/src/main/java/graphicsEngine/colors/Palette.java
@@ -0,0 +1,53 @@
+package graphicsEngine.colors;
+
+import java.util.Map;
+import java.util.HashMap;
+import java.util.Objects;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+//TODO: add javadoc
+public class Palette {
+ private static final AbstractColorScheme NON_NULL_PRIMARY = new SimpleColorScheme();
+
+ private AbstractColorScheme primary;
+ private Map schemes;
+
+ //TODO: add javadoc
+ public Palette() {
+ this(null);
+ }
+
+ //TODO: add javadoc
+ public Palette(@Nullable AbstractColorScheme primary) {
+ this(primary, null);
+ }
+
+ //TODO: add javadoc
+ public Palette(@Nullable AbstractColorScheme primary,
+ @Nullable Map schemes) {
+ setPrimary(primary);
+ setSchemes(schemes);
+ }
+
+ //TODO: add javadoc
+ public void setPrimary(@Nullable AbstractColorScheme primary) {
+ this.primary = Objects.requireNonNullElse(primary, NON_NULL_PRIMARY);
+ }
+
+ //TODO: add javadoc
+ public @NotNull AbstractColorScheme getPrimary() {
+ return primary;
+ }
+
+ //TODO: add javadoc
+ public void setSchemes(@Nullable Map schemes) {
+ this.schemes = Objects.requireNonNullElse(schemes, new HashMap<>());
+ }
+
+ //TODO: add javadoc
+ public @NotNull Map getSchemes() {
+ return schemes;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngine/colors/SimpleColorScheme.java b/src/main/java/graphicsEngine/colors/SimpleColorScheme.java
new file mode 100644
index 0000000..60ed974
--- /dev/null
+++ b/src/main/java/graphicsEngine/colors/SimpleColorScheme.java
@@ -0,0 +1,37 @@
+package graphicsEngine.colors;
+
+import java.util.Objects;
+import java.awt.Color;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+//TODO: finish this and add javadoc
+public class SimpleColorScheme extends AbstractColorScheme {
+ private static final Color DEFAULT_SECONDARY_COLOR = Color.white;
+ private Color secondaryColor;
+
+ //TODO: add javadoc
+ //default colors
+ public SimpleColorScheme() {
+ this(null, null);
+ }
+
+ //TODO: add javadoc
+ //custom colors
+ public SimpleColorScheme(@Nullable Color base,
+ @Nullable Color secondary) {
+ super(base);
+ setSecondaryColor(secondary);
+ }
+
+ //TODO: add javadoc
+ public void setSecondaryColor(@Nullable Color color) {
+ secondaryColor = Objects.requireNonNullElse(color, DEFAULT_SECONDARY_COLOR);
+ }
+
+ //TODO: add javadoc
+ public @NotNull Color getSecondaryColor() {
+ return secondaryColor;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngine/input/InputChecker.java b/src/main/java/graphicsEngine/input/InputChecker.java
index 7c16cc2..83165a1 100644
--- a/src/main/java/graphicsEngine/input/InputChecker.java
+++ b/src/main/java/graphicsEngine/input/InputChecker.java
@@ -1,10 +1,10 @@
package graphicsEngine.input;
-import graphicsEngineOld.parts.containers.ButtonContainer;
-
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.NotNull;
+import graphicsEngineOld.parts.containers.ButtonContainer;
+
/**
* A class for checking user input.
* Intended to be added to a page.
diff --git a/src/main/java/graphicsEngine/input/InputManager.java b/src/main/java/graphicsEngine/input/InputManager.java
index a2e22c9..8898b24 100644
--- a/src/main/java/graphicsEngine/input/InputManager.java
+++ b/src/main/java/graphicsEngine/input/InputManager.java
@@ -1,11 +1,14 @@
package graphicsEngine.input;
+import javax.swing.JFrame;
+
+import org.jetbrains.annotations.NotNull;
+
import graphicsEngine.input.listeners.ListenerAdder;
+
import graphicsEngineOld.engine.ExitManager;
import graphicsEngineOld.engine.data.windowParameters.WindowParameters;
-import org.jetbrains.annotations.NotNull;
-import javax.swing.*;
/**
* Input manager for managing input.
diff --git a/src/main/java/graphicsEngine/input/listeners/KeyboardListenerAdder.java b/src/main/java/graphicsEngine/input/listeners/KeyboardListenerAdder.java
index d9cb98e..b30006d 100644
--- a/src/main/java/graphicsEngine/input/listeners/KeyboardListenerAdder.java
+++ b/src/main/java/graphicsEngine/input/listeners/KeyboardListenerAdder.java
@@ -1,13 +1,13 @@
package graphicsEngine.input.listeners;
-import graphicsEngine.input.InputData;
-
-import javax.swing.*;
-import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
+import java.awt.event.KeyEvent;
+import javax.swing.JFrame;
import org.jetbrains.annotations.NotNull;
+import graphicsEngine.input.InputData;
+
/**
* Keyboard listener adder class.
*/
diff --git a/src/main/java/graphicsEngine/input/listeners/ListenerAdder.java b/src/main/java/graphicsEngine/input/listeners/ListenerAdder.java
index ab2796a..60e330b 100644
--- a/src/main/java/graphicsEngine/input/listeners/ListenerAdder.java
+++ b/src/main/java/graphicsEngine/input/listeners/ListenerAdder.java
@@ -1,13 +1,14 @@
package graphicsEngine.input.listeners;
+import javax.swing.JFrame;
+
+import org.jetbrains.annotations.NotNull;
+
import graphicsEngine.input.InputData;
+
import graphicsEngineOld.engine.ExitManager;
import graphicsEngineOld.engine.data.windowParameters.WindowParameters;
-import javax.swing.*;
-
-import org.jetbrains.annotations.NotNull;
-
/**
* Default window, keyboard and mouse listener adder for input.
* Extendable for extra listeners.
diff --git a/src/main/java/graphicsEngine/input/listeners/MouseListenerAdder.java b/src/main/java/graphicsEngine/input/listeners/MouseListenerAdder.java
index 33d5351..b966660 100644
--- a/src/main/java/graphicsEngine/input/listeners/MouseListenerAdder.java
+++ b/src/main/java/graphicsEngine/input/listeners/MouseListenerAdder.java
@@ -1,12 +1,12 @@
package graphicsEngine.input.listeners;
-import graphicsEngine.input.InputData;
-
-import javax.swing.*;
+import javax.swing.JFrame;
import java.awt.event.*;
import org.jetbrains.annotations.NotNull;
+import graphicsEngine.input.InputData;
+
/**
* Mouse listener adder class.
*/
diff --git a/src/main/java/graphicsEngine/input/listeners/WindowListenerAdder.java b/src/main/java/graphicsEngine/input/listeners/WindowListenerAdder.java
index 0032b29..5f0c410 100644
--- a/src/main/java/graphicsEngine/input/listeners/WindowListenerAdder.java
+++ b/src/main/java/graphicsEngine/input/listeners/WindowListenerAdder.java
@@ -1,10 +1,6 @@
package graphicsEngine.input.listeners;
-import graphicsEngine.input.InputData;
-import graphicsEngineOld.engine.ExitManager;
-import graphicsEngineOld.engine.data.windowParameters.WindowParameters;
-
-import javax.swing.*;
+import javax.swing.JFrame;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.WindowEvent;
@@ -12,6 +8,11 @@
import org.jetbrains.annotations.NotNull;
+import graphicsEngine.input.InputData;
+
+import graphicsEngineOld.engine.ExitManager;
+import graphicsEngineOld.engine.data.windowParameters.WindowParameters;
+
/**
* Window listener adder class.
*/
diff --git a/src/main/java/graphicsEngine/pages/AbstractPage.java b/src/main/java/graphicsEngine/pages/AbstractPage.java
new file mode 100644
index 0000000..1a2fd78
--- /dev/null
+++ b/src/main/java/graphicsEngine/pages/AbstractPage.java
@@ -0,0 +1,48 @@
+package graphicsEngine.pages;
+
+import java.util.Objects;
+import java.util.List;
+import java.util.ArrayList;
+import java.awt.Color;
+import java.awt.event.ActionListener;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import graphicsEngine.colors.SimpleColorScheme;
+import graphicsEngine.panels.DynamicPanel;
+
+//TODO: add javadoc
+public abstract class AbstractPage extends DynamicPanel {
+
+ //completely blank
+ //TODO: add javadoc
+ public AbstractPage() {
+ this(null, null);
+ }
+
+ //TODO: add javadoc
+ public AbstractPage(@Nullable List<@Nullable ActionListener> actionListenerList,
+ @Nullable Color backgroundColor) {
+ super(
+ null,
+ new SimpleColorScheme(backgroundColor, null),
+ null);
+ addListeners(actionListenerList);
+ }
+
+ //TODO: add javadoc
+ public abstract @NotNull String getPageKey();
+
+ /**
+ * Adds known listeners to this page.
+ * Override this to add custom listeners.
+ *
+ * @param list List of listeners to add.
+ *
+ * @return Remaining unknown listeners.
+ */
+ public @NotNull List<@Nullable ActionListener> addListeners(@Nullable List<@Nullable ActionListener> list) {
+ return Objects.requireNonNullElse(list, new ArrayList<>());
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngine/pages/FullyPaneledPage.java b/src/main/java/graphicsEngine/pages/FullyPaneledPage.java
new file mode 100644
index 0000000..ab74cb7
--- /dev/null
+++ b/src/main/java/graphicsEngine/pages/FullyPaneledPage.java
@@ -0,0 +1,84 @@
+package graphicsEngine.pages;
+
+import java.util.List;
+import java.awt.Color;
+import java.awt.BorderLayout;
+import java.awt.event.ActionListener;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import graphicsEngine.colors.ColorUtilities;
+import graphicsEngine.colors.SimpleColorScheme;
+import graphicsEngine.panels.BorderProperties;
+import graphicsEngine.panels.SimplePanel;
+import graphicsEngine.panels.DynamicPanel;
+import graphicsEngine.pages.panels.PanelLocation;
+import graphicsEngine.pages.panels.AbstractLeftPanel;
+import graphicsEngine.pages.panels.AbstractRightPanel;
+
+//TODO: add javadocs
+public abstract class FullyPaneledPage extends HeaderAndFooterPage implements HorizontalDivisionInterface {
+ private @Nullable AbstractLeftPanel leftPanel;
+ private @Nullable AbstractRightPanel rightPanel;
+ private @Nullable DynamicPanel centralPanel;
+
+ //
+ public FullyPaneledPage(@Nullable List actionListenerList,
+ @Nullable Color backgroundColor) {
+ super(actionListenerList, backgroundColor);
+ }
+
+ //
+ @Override
+ public final @NotNull DynamicPanel getBody(@Nullable SimpleColorScheme colors,
+ @Nullable BorderProperties borderProperties) {
+ return new DynamicPanel(new SimpleColorScheme(
+ ColorUtilities.DEFAULT_COLOR_TRANSPARENT,
+ null)) {
+ {
+ setLayout(new BorderLayout(0, 0));
+ setSidePanels(colors, borderProperties);
+ addSidePanels(this);
+ setCentralPanel(borderProperties);
+ addCentralPanel(this);
+ }
+ };
+ }
+
+ private void setSidePanels(@Nullable SimpleColorScheme colors,
+ @Nullable BorderProperties borderProperties) {
+ leftPanel = getLeftPanel(colors, borderProperties);
+ rightPanel = getRightPanel(colors, borderProperties);
+ }
+
+ private void addSidePanels(@NotNull DynamicPanel body) {
+ if (leftPanel != null) {
+ body.add(leftPanel, BorderLayout.WEST);
+ }
+ if (rightPanel != null) {
+ body.add(rightPanel, BorderLayout.EAST);
+ }
+ }
+
+ private void setCentralPanel(@Nullable BorderProperties borderProperties) {
+ centralPanel = getCentralPanel(borderProperties);
+ }
+
+ private void addCentralPanel(@NotNull DynamicPanel body) {
+ if (centralPanel != null) {
+ body.add(centralPanel, BorderLayout.CENTER);
+ }
+ }
+
+ //
+ @Override
+ public final @Nullable SimplePanel getPanelByLocation(@NotNull PanelLocation location) {
+ return switch (location) {
+ case WEST -> leftPanel;
+ case EAST -> rightPanel;
+ case CENTER -> centralPanel;
+ default -> super.getPanelByLocation(location);
+ };
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngine/pages/HeaderAndFooterPage.java b/src/main/java/graphicsEngine/pages/HeaderAndFooterPage.java
new file mode 100644
index 0000000..8495e86
--- /dev/null
+++ b/src/main/java/graphicsEngine/pages/HeaderAndFooterPage.java
@@ -0,0 +1,89 @@
+package graphicsEngine.pages;
+
+import java.util.List;
+import java.awt.Color;
+import java.awt.BorderLayout;
+import java.awt.event.ActionListener;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import graphicsEngine.colors.SimpleColorScheme;
+import graphicsEngine.panels.BorderProperties;
+import graphicsEngine.panels.SimplePanel;
+import graphicsEngine.panels.DynamicPanel;
+import graphicsEngine.pages.panels.AbstractFooter;
+import graphicsEngine.pages.panels.AbstractHeader;
+import graphicsEngine.pages.panels.PanelLocation;
+
+//TODO: add javadoc
+public abstract class HeaderAndFooterPage extends AbstractPage implements VerticalDivisionInterface {
+ private @Nullable AbstractHeader header;
+ private @Nullable AbstractFooter footer;
+ private @Nullable DynamicPanel body;
+
+ //TODO: add javadoc
+ public HeaderAndFooterPage(@Nullable List actionListenerList,
+ @Nullable Color backgroundColor) {
+ super(actionListenerList, backgroundColor);
+ }
+
+ //this has to be called manually in constructor in order to support custom parameters
+ //TODO: add javadoc
+ public final void initializePanels(@Nullable SimpleColorScheme headerAndFooterColors,
+ @Nullable SimpleColorScheme bodyColors,
+ @Nullable BorderProperties borderProperties) {
+ setLayout(new BorderLayout(0, 0));
+ setHeaderAndFooter(headerAndFooterColors, borderProperties);
+ addHeaderAndFooter();
+ setBody(bodyColors, borderProperties);
+ addBody();
+ }
+
+ private void setHeaderAndFooter(@Nullable SimpleColorScheme colors,
+ @Nullable BorderProperties borderProperties) {
+ header = getHeader(colors, borderProperties);
+ footer = getFooter(colors, borderProperties);
+ }
+
+ private void addHeaderAndFooter() {
+ if (header != null) {
+ add(header, BorderLayout.NORTH);
+ }
+ if (footer != null) {
+ add(footer, BorderLayout.SOUTH);
+ }
+ }
+
+ private void setBody(@Nullable SimpleColorScheme colors,
+ @Nullable BorderProperties borderProperties) {
+ body = getBody(colors, borderProperties);
+ }
+
+ private void addBody() {
+ if (body != null) {
+ add(body, BorderLayout.CENTER);
+ }
+ }
+
+ //TODO: add javadoc
+ public @Nullable SimplePanel getPanelByLocation(@NotNull PanelLocation location) {
+ try {
+ return switch (location) {
+ case NORTH -> header;
+ case SOUTH -> footer;
+ case CENTER -> body;
+ default -> throw new UndefinedPanelLocationException();
+ };
+ } catch (UndefinedPanelLocationException e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ private static class UndefinedPanelLocationException extends Exception {
+ protected UndefinedPanelLocationException() {
+ super("Panel in such location not defined!");
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngine/pages/HorizontalDivisionInterface.java b/src/main/java/graphicsEngine/pages/HorizontalDivisionInterface.java
new file mode 100644
index 0000000..8374b88
--- /dev/null
+++ b/src/main/java/graphicsEngine/pages/HorizontalDivisionInterface.java
@@ -0,0 +1,23 @@
+package graphicsEngine.pages;
+
+import org.jetbrains.annotations.Nullable;
+
+import graphicsEngine.colors.SimpleColorScheme;
+import graphicsEngine.panels.BorderProperties;
+import graphicsEngine.panels.DynamicPanel;
+import graphicsEngine.pages.panels.AbstractLeftPanel;
+import graphicsEngine.pages.panels.AbstractRightPanel;
+
+//TODO: add javadocs
+public interface HorizontalDivisionInterface {
+ //
+ @Nullable AbstractLeftPanel getLeftPanel(@Nullable SimpleColorScheme colors,
+ @Nullable BorderProperties borderProperties);
+
+ //
+ @Nullable AbstractRightPanel getRightPanel(@Nullable SimpleColorScheme colors,
+ @Nullable BorderProperties borderProperties);
+
+ //
+ @Nullable DynamicPanel getCentralPanel(@Nullable BorderProperties borderProperties);
+}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngine/pages/VerticalDivisionInterface.java b/src/main/java/graphicsEngine/pages/VerticalDivisionInterface.java
new file mode 100644
index 0000000..d893215
--- /dev/null
+++ b/src/main/java/graphicsEngine/pages/VerticalDivisionInterface.java
@@ -0,0 +1,24 @@
+package graphicsEngine.pages;
+
+import org.jetbrains.annotations.Nullable;
+
+import graphicsEngine.colors.SimpleColorScheme;
+import graphicsEngine.panels.BorderProperties;
+import graphicsEngine.panels.DynamicPanel;
+import graphicsEngine.pages.panels.AbstractFooter;
+import graphicsEngine.pages.panels.AbstractHeader;
+
+//TODO: add javadocs
+public interface VerticalDivisionInterface {
+ //
+ @Nullable AbstractHeader getHeader(@Nullable SimpleColorScheme colors,
+ @Nullable BorderProperties borderProperties);
+
+ //
+ @Nullable AbstractFooter getFooter(@Nullable SimpleColorScheme colors,
+ @Nullable BorderProperties borderProperties);
+
+ //
+ @Nullable DynamicPanel getBody(@Nullable SimpleColorScheme colors,
+ @Nullable BorderProperties borderProperties);
+}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngine/pages/panels/AbstractFooter.java b/src/main/java/graphicsEngine/pages/panels/AbstractFooter.java
new file mode 100644
index 0000000..f2585cc
--- /dev/null
+++ b/src/main/java/graphicsEngine/pages/panels/AbstractFooter.java
@@ -0,0 +1,17 @@
+package graphicsEngine.pages.panels;
+
+import org.jetbrains.annotations.Nullable;
+
+import graphicsEngine.colors.SimpleColorScheme;
+import graphicsEngine.panels.BorderProperties;
+import graphicsEngine.panels.HorizontalPanel;
+
+//TODO: add javadoc
+public abstract class AbstractFooter extends HorizontalPanel {
+ //TODO: add javadoc
+ public AbstractFooter(@Nullable SimpleColorScheme panelColors,
+ int height,
+ @Nullable BorderProperties borderProperties) {
+ super(panelColors, height, borderProperties);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngine/pages/panels/AbstractHeader.java b/src/main/java/graphicsEngine/pages/panels/AbstractHeader.java
new file mode 100644
index 0000000..7d6456d
--- /dev/null
+++ b/src/main/java/graphicsEngine/pages/panels/AbstractHeader.java
@@ -0,0 +1,17 @@
+package graphicsEngine.pages.panels;
+
+import org.jetbrains.annotations.Nullable;
+
+import graphicsEngine.colors.SimpleColorScheme;
+import graphicsEngine.panels.BorderProperties;
+import graphicsEngine.panels.HorizontalPanel;
+
+//TODO: add javadoc
+public abstract class AbstractHeader extends HorizontalPanel {
+ //TODO: add javadoc
+ public AbstractHeader(@Nullable SimpleColorScheme panelColors,
+ int height,
+ @Nullable BorderProperties borderProperties) {
+ super(panelColors, height, borderProperties);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngine/pages/panels/AbstractLeftPanel.java b/src/main/java/graphicsEngine/pages/panels/AbstractLeftPanel.java
new file mode 100644
index 0000000..9775c8e
--- /dev/null
+++ b/src/main/java/graphicsEngine/pages/panels/AbstractLeftPanel.java
@@ -0,0 +1,17 @@
+package graphicsEngine.pages.panels;
+
+import org.jetbrains.annotations.Nullable;
+
+import graphicsEngine.colors.SimpleColorScheme;
+import graphicsEngine.panels.BorderProperties;
+import graphicsEngine.panels.VerticalPanel;
+
+//TODO: add javadocs
+public abstract class AbstractLeftPanel extends VerticalPanel {
+ //TODO: add javadoc
+ public AbstractLeftPanel(@Nullable SimpleColorScheme colors,
+ int width,
+ @Nullable BorderProperties borderProperties) {
+ super(colors, width, borderProperties);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngine/pages/panels/AbstractRightPanel.java b/src/main/java/graphicsEngine/pages/panels/AbstractRightPanel.java
new file mode 100644
index 0000000..0cfdcfe
--- /dev/null
+++ b/src/main/java/graphicsEngine/pages/panels/AbstractRightPanel.java
@@ -0,0 +1,17 @@
+package graphicsEngine.pages.panels;
+
+import org.jetbrains.annotations.Nullable;
+
+import graphicsEngine.colors.SimpleColorScheme;
+import graphicsEngine.panels.BorderProperties;
+import graphicsEngine.panels.VerticalPanel;
+
+//TODO: add javadocs
+public abstract class AbstractRightPanel extends VerticalPanel {
+ //TODO: add javadoc
+ public AbstractRightPanel(@Nullable SimpleColorScheme colors,
+ int width,
+ @Nullable BorderProperties borderProperties) {
+ super(colors, width, borderProperties);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngine/pages/panels/PanelLocation.java b/src/main/java/graphicsEngine/pages/panels/PanelLocation.java
new file mode 100644
index 0000000..efa793b
--- /dev/null
+++ b/src/main/java/graphicsEngine/pages/panels/PanelLocation.java
@@ -0,0 +1,10 @@
+package graphicsEngine.pages.panels;
+
+//TODO: add javadoc
+public enum PanelLocation {
+ NORTH,
+ SOUTH,
+ WEST,
+ EAST,
+ CENTER
+}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngine/panels/BorderInterface.java b/src/main/java/graphicsEngine/panels/BorderInterface.java
new file mode 100644
index 0000000..ef2b94a
--- /dev/null
+++ b/src/main/java/graphicsEngine/panels/BorderInterface.java
@@ -0,0 +1,26 @@
+package graphicsEngine.panels;
+
+import java.util.Objects;
+import java.awt.Color;
+import javax.swing.JComponent;
+import javax.swing.border.LineBorder;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+public interface BorderInterface {
+ Color DEFAULT_BORDER_COLOR = Color.red;
+ boolean DEFAULT_BORDER_STATE = false;
+
+ static void setComponentBorderState(@NotNull JComponent component,
+ @Nullable Color color,
+ boolean state) {
+ if (state) {
+ component.setBorder(new LineBorder(Objects.requireNonNullElse(
+ color,
+ DEFAULT_BORDER_COLOR)));
+ } else {
+ component.setBorder(null);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngine/panels/BorderProperties.java b/src/main/java/graphicsEngine/panels/BorderProperties.java
new file mode 100644
index 0000000..12b4feb
--- /dev/null
+++ b/src/main/java/graphicsEngine/panels/BorderProperties.java
@@ -0,0 +1,43 @@
+package graphicsEngine.panels;
+
+import java.util.Objects;
+import java.awt.Color;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+//TODO: add javadocs
+public class BorderProperties implements BorderInterface {
+ private @NotNull Color borderColor = DEFAULT_BORDER_COLOR;
+ private boolean drawBorders = DEFAULT_BORDER_STATE;
+
+ public BorderProperties() {
+ this(null, DEFAULT_BORDER_STATE);
+ }
+
+ public BorderProperties(@Nullable Color color,
+ boolean drawBorders) {
+ setBorderColor(color);
+ setBorderState(drawBorders);
+ }
+
+ public void setBorderColor(@Nullable Color color) {
+ borderColor = Objects.requireNonNullElse(color, DEFAULT_BORDER_COLOR);
+ }
+
+ public @NotNull Color getBorderColor() {
+ return borderColor;
+ }
+
+ public void setBorderState(boolean drawBorders) {
+ this.drawBorders = drawBorders;
+ }
+
+ public void toggleBorderState() {
+ drawBorders = !drawBorders;
+ }
+
+ public boolean getBorderState() {
+ return drawBorders;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngine/panels/DynamicPanel.java b/src/main/java/graphicsEngine/panels/DynamicPanel.java
new file mode 100644
index 0000000..d342994
--- /dev/null
+++ b/src/main/java/graphicsEngine/panels/DynamicPanel.java
@@ -0,0 +1,40 @@
+package graphicsEngine.panels;
+
+import java.awt.Component;
+import java.awt.Dimension;
+
+import org.jetbrains.annotations.Nullable;
+
+import graphicsEngine.colors.SimpleColorScheme;
+
+//TODO: add javadocs
+public class DynamicPanel extends SimplePanel {
+
+ //auto-stretching panel
+ //TODO: add javadoc
+ public DynamicPanel(@Nullable SimpleColorScheme colors) {
+ this(null, colors, null);
+ }
+
+ //custom size and border state
+ //TODO: add javadoc
+ public DynamicPanel(@Nullable Dimension sizeLimits,
+ @Nullable SimpleColorScheme colors,
+ @Nullable BorderProperties borderProperties) {
+ super(sizeLimits, colors, borderProperties);
+ }
+
+ //repaints all children
+ //TODO: add javadoc
+ @Override
+ public void repaint() {
+ Component[] components = getComponents();
+ for (Component component : components) {
+ component.repaint();
+ }
+ super.repaint();
+ }
+
+ //TODO: add javadoc
+ public void addParts() {}
+}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngine/panels/HorizontalPanel.java b/src/main/java/graphicsEngine/panels/HorizontalPanel.java
new file mode 100644
index 0000000..0ca99f8
--- /dev/null
+++ b/src/main/java/graphicsEngine/panels/HorizontalPanel.java
@@ -0,0 +1,20 @@
+package graphicsEngine.panels;
+
+import java.awt.Dimension;
+
+import org.jetbrains.annotations.Nullable;
+
+import graphicsEngine.colors.SimpleColorScheme;
+
+//TODO: add javadoc
+public abstract class HorizontalPanel extends StaticPanel {
+ //TODO: add javadoc
+ public HorizontalPanel(@Nullable SimpleColorScheme colors,
+ int height,
+ @Nullable BorderProperties borderProperties) {
+ super(
+ new Dimension(Integer.MAX_VALUE, height),
+ colors,
+ borderProperties);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngine/panels/PanelColors.java b/src/main/java/graphicsEngine/panels/PanelColors.java
deleted file mode 100644
index 73b7f78..0000000
--- a/src/main/java/graphicsEngine/panels/PanelColors.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package graphicsEngine.panels;
-
-import java.awt.*;
-
-//TODO: add javadoc
-public class PanelColors {
- public Color background, text, border;
-
- private static final Color
- DEFAULT_COLOR_BACKGROUND = Color.lightGray,
- DEFAULT_COLOR_TEXT = Color.darkGray,
- DEFAULT_COLOR_BORDER = Color.red;
-
- public PanelColors() {
- this(DEFAULT_COLOR_BACKGROUND, DEFAULT_COLOR_TEXT, DEFAULT_COLOR_BORDER);
- }
-
- public PanelColors(Color background, Color text, Color border) {
- this.background = background;
- this.text = text;
- this.border = border;
- }
-}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngine/panels/SimplePanel.java b/src/main/java/graphicsEngine/panels/SimplePanel.java
index 9e3388f..8565660 100644
--- a/src/main/java/graphicsEngine/panels/SimplePanel.java
+++ b/src/main/java/graphicsEngine/panels/SimplePanel.java
@@ -1,38 +1,77 @@
package graphicsEngine.panels;
-import graphicsEngine.Utilities;
-
-import javax.swing.*;
import java.util.Objects;
+import java.awt.Dimension;
+import javax.swing.JPanel;
+import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import graphicsEngine.colors.SimpleColorScheme;
+
+//TODO: add javadoc
public abstract class SimplePanel extends JPanel {
- private PanelColors colors;
+ private @NotNull SimpleColorScheme colors = new SimpleColorScheme();
+ private @NotNull BorderProperties borderProperties = new BorderProperties();
- protected SimplePanel(@Nullable PanelColors panelColors, boolean border) {
+ //custom size and border state
+ //TODO: add javadoc
+ protected SimplePanel(@Nullable Dimension sizeLimits,
+ @Nullable SimpleColorScheme colors,
+ @Nullable BorderProperties borderProperties) {
super();
- setPanelColors(panelColors);
- resetBackground();
- setBorderState(border);
+ setSizeLimits(sizeLimits); // null - auto-stretching
+ setPanelColors(colors); // null - default colors
+ setBorderProperties(borderProperties); // null - default border, with default state
+ addParts();
}
- public final void setPanelColors(@Nullable PanelColors colors) {
- this.colors = Objects.requireNonNullElse(colors, new PanelColors());
+ private void setSizeLimits(@Nullable Dimension size) {
+ setPreferredSize(size);
}
- public final PanelColors getPanelColors() {
+ //TODO: add javadoc
+ public final void setPanelColors(@Nullable SimpleColorScheme colors) {
+ this.colors = Objects.requireNonNullElse(colors, new SimpleColorScheme());
+ resetBackground();
+ }
+
+ //TODO: add javadoc
+ public final @NotNull SimpleColorScheme getPanelColors() {
return colors;
}
+ //TODO: add javadoc
public void resetBackground() {
- setBackground(colors.background);
+ setBackground(colors.getBaseColor());
}
+ private void setBorderProperties(BorderProperties properties) {
+ borderProperties = Objects.requireNonNullElse(
+ properties,
+ new BorderProperties());
+ setComponentBorderState();
+ }
+
+ //TODO: add javadoc
public void setBorderState(boolean state) {
- Utilities.BorderInterface.setBorderState(
+ borderProperties.setBorderState(state);
+ setComponentBorderState();
+ }
+
+ //TODO: add javadoc
+ public void toggleBorderState() {
+ borderProperties.toggleBorderState();
+ setComponentBorderState();
+ }
+
+ private void setComponentBorderState() {
+ BorderInterface.setComponentBorderState(
this,
- state,
- getPanelColors().border);
+ borderProperties.getBorderColor(),
+ borderProperties.getBorderState());
}
+
+ //TODO: add javadoc
+ public abstract void addParts();
}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngine/panels/StaticPanel.java b/src/main/java/graphicsEngine/panels/StaticPanel.java
new file mode 100644
index 0000000..7b0a82e
--- /dev/null
+++ b/src/main/java/graphicsEngine/panels/StaticPanel.java
@@ -0,0 +1,35 @@
+package graphicsEngine.panels;
+
+import java.awt.Dimension;
+
+import org.jetbrains.annotations.Nullable;
+
+import graphicsEngine.colors.SimpleColorScheme;
+
+//TODO: add javadoc
+public class StaticPanel extends SimplePanel {
+
+ //auto-stretching panel
+ //TODO: add javadoc
+ public StaticPanel(@Nullable SimpleColorScheme colors) {
+ this(null, colors, null);
+ }
+
+ //custom size and border state
+ //TODO: add javadoc
+ public StaticPanel(@Nullable Dimension sizeLimits,
+ @Nullable SimpleColorScheme colors,
+ @Nullable BorderProperties borderProperties) {
+ super(sizeLimits, colors, borderProperties);
+ }
+
+ //doesn't repaint children
+ //TODO: add javadoc
+ @Override
+ public void repaint() {
+ super.repaint();
+ }
+
+ //TODO: add javadoc
+ public void addParts() {}
+}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngine/panels/VerticalPanel.java b/src/main/java/graphicsEngine/panels/VerticalPanel.java
new file mode 100644
index 0000000..cef2b06
--- /dev/null
+++ b/src/main/java/graphicsEngine/panels/VerticalPanel.java
@@ -0,0 +1,20 @@
+package graphicsEngine.panels;
+
+import java.awt.Dimension;
+
+import org.jetbrains.annotations.Nullable;
+
+import graphicsEngine.colors.SimpleColorScheme;
+
+//TODO: add javadoc
+public abstract class VerticalPanel extends StaticPanel {
+ //TODO: add javadoc
+ public VerticalPanel(@Nullable SimpleColorScheme colors,
+ int width,
+ @Nullable BorderProperties borderProperties) {
+ super(
+ new Dimension(width, Integer.MAX_VALUE),
+ colors,
+ borderProperties);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngine/parts/SimpleJButton.java b/src/main/java/graphicsEngine/parts/SimpleJButton.java
new file mode 100644
index 0000000..b19788f
--- /dev/null
+++ b/src/main/java/graphicsEngine/parts/SimpleJButton.java
@@ -0,0 +1,44 @@
+package graphicsEngine.parts;
+
+import java.util.Objects;
+import javax.swing.JButton;
+import java.awt.event.ActionListener;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import static consoleUtils.ConsoleUtils.printLine;
+
+/**
+ * A simple JButton with text and ActionListener.
+ */
+public class SimpleJButton extends JButton {
+ private static final String DEFAULT_TEXT = "Button";
+ private static final ActionListener
+ DEFAULT_ACTION_LISTENER = e -> printLine("A button has been pressed. ActionListener not defined.");
+
+ /**
+ * Creates a simple JButton with text and ActionListener.
+ *
+ * @param text Text to display
+ * @param actionCommand Action command
+ * @param actionListener ActionListener object
+ */
+ public SimpleJButton(@Nullable String text,
+ @NotNull String actionCommand,
+ @Nullable ActionListener actionListener) {
+ super(Objects.requireNonNullElse(text, DEFAULT_TEXT));
+ setActionCommand(actionCommand);
+ addActionListener(Objects.requireNonNullElse(actionListener, DEFAULT_ACTION_LISTENER));
+ }
+
+ /**
+ * Returns the button's text.
+ *
+ * @return The button's text.
+ */
+ @Override
+ public final @NotNull String getText() {
+ return super.getText();
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngine/parts/SimpleLabel.java b/src/main/java/graphicsEngine/parts/SimpleLabel.java
deleted file mode 100644
index ecfc7a2..0000000
--- a/src/main/java/graphicsEngine/parts/SimpleLabel.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package graphicsEngine.parts;
-
-import java.awt.*;
-import javax.swing.*;
-
-import java.util.Objects;
-
-import org.jetbrains.annotations.Nullable;
-
-//A simple JLabel with most commonly used functions
-// TODO: add javadocs
-public class SimpleLabel extends JLabel {
- private static final String DEFAULT_TEXT = "A label";
- private static final Color DEFAULT_COLOR = Color.black;
-
- public SimpleLabel(@Nullable String text, @Nullable Color textColor) {
- setAlignmentX(Component.LEFT_ALIGNMENT);
- setOpaque(false);
- setText(stringNullCheck(text));
- setForeground(colorNullCheck(textColor));
- }
-
- public static String stringNullCheck(@Nullable String text) {
- return Objects.requireNonNullElse(text, DEFAULT_TEXT);
- }
-
- private static Color colorNullCheck(@Nullable Color color) {
- return Objects.requireNonNullElse(color, DEFAULT_COLOR);
- }
-}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngine/parts/labels/DynamicLabel.java b/src/main/java/graphicsEngine/parts/labels/DynamicLabel.java
new file mode 100644
index 0000000..e9a33a8
--- /dev/null
+++ b/src/main/java/graphicsEngine/parts/labels/DynamicLabel.java
@@ -0,0 +1,26 @@
+package graphicsEngine.parts.labels;
+
+import java.awt.Color;
+import java.awt.Graphics;
+
+import org.jetbrains.annotations.Nullable;
+
+//TODO: add javadocs
+public abstract class DynamicLabel extends SimpleLabel {
+
+ //TODO: add javadoc
+ public DynamicLabel(@Nullable Color textColor,
+ @Nullable Color background) {
+ super(null, textColor, background);
+ }
+
+ //TODO: add javadoc
+ @Override
+ protected void paintComponent(Graphics g) {
+ setText(getLabelText());
+ super.paintComponent(g);
+ }
+
+ //TODO: add javadoc
+ public abstract @Nullable String getLabelText();
+}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngine/parts/labels/SimpleLabel.java b/src/main/java/graphicsEngine/parts/labels/SimpleLabel.java
new file mode 100644
index 0000000..bf9e42e
--- /dev/null
+++ b/src/main/java/graphicsEngine/parts/labels/SimpleLabel.java
@@ -0,0 +1,52 @@
+package graphicsEngine.parts.labels;
+
+import java.util.Objects;
+import java.awt.Component;
+import java.awt.Color;
+import javax.swing.JLabel;
+
+import org.jetbrains.annotations.Nullable;
+
+import graphicsEngine.colors.ColorUtilities;
+
+//A simple JLabel with most commonly used functions
+//TODO: add javadocs
+public class SimpleLabel extends JLabel {
+ private static final String DEFAULT_TEXT = "A label";
+ private static final Color DEFAULT_COLOR = ColorUtilities.DEFAULT_COLOR_OPAQUE;
+
+ //TODO: add javadoc
+ public SimpleLabel(@Nullable String text, @Nullable Color textColor) {
+ this(text, textColor, null);
+ }
+
+ //TODO: add javadoc
+ public SimpleLabel(@Nullable String text,
+ @Nullable Color textColor,
+ @Nullable Color background) {
+ setAlignmentX(Component.LEFT_ALIGNMENT);
+ setOpaque(false);
+ setText(text);
+ setTextColor(textColor);
+ setBackground(background);
+ }
+
+ //TODO: add javadoc
+ @Override
+ public void setText(@Nullable String text) {
+ super.setText(Objects.requireNonNullElse(text, DEFAULT_TEXT));
+ }
+
+ //TODO: add javadoc
+ public void setTextColor(@Nullable Color color) {
+ setForeground(Objects.requireNonNullElse(color, DEFAULT_COLOR));
+ }
+
+ //TODO: add javadoc
+ @Override
+ public void setBackground(@Nullable Color background) {
+ super.setBackground(Objects.requireNonNullElse(
+ background,
+ ColorUtilities.DEFAULT_COLOR_TRANSPARENT));
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngine/parts/sliders/ExponentialSlider.java b/src/main/java/graphicsEngine/parts/sliders/ExponentialSlider.java
new file mode 100644
index 0000000..006c277
--- /dev/null
+++ b/src/main/java/graphicsEngine/parts/sliders/ExponentialSlider.java
@@ -0,0 +1,46 @@
+package graphicsEngine.parts.sliders;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import graphicsEngine.colors.SimpleColorScheme;
+import graphicsEngine.parts.sliders.panelless.PanellessSlider_Exponential;
+
+//TODO: add javadocs
+public abstract class ExponentialSlider extends PaneledSlider {
+
+ //TODO: add javadoc
+ public ExponentialSlider(@Nullable SimpleColorScheme colors,
+ double @NotNull [] range, double initialValue,
+ int majorTickCount, int minorTickCount) {
+ this(
+ colors, SliderConstants.DEFAULT_PANEL_HEIGHT,
+ range, initialValue,
+ majorTickCount, minorTickCount,
+ SliderConstants.DEFAULT_TICK_LABEL_DECIMAL_PLACES);
+ }
+
+ //TODO: add javadoc
+ public ExponentialSlider(@Nullable SimpleColorScheme colors, int panelHeight,
+ double @NotNull [] range, double initialValue,
+ int majorTickCount, int minorTickCount,
+ int tickLabelDecimalPlaces) {
+ super(colors, panelHeight);
+ @NotNull PaneledSlider panel = this;
+ add(new PanellessSlider_Exponential(
+ getPanelColors().getBaseColor(),
+ range, initialValue,
+ majorTickCount, minorTickCount,
+ tickLabelDecimalPlaces) {
+ /**
+ * Performed upon changing the value.
+ *
+ * @param value The new value.
+ */
+ @Override
+ public void valueChanged(double value) {
+ panel.valueChanged(value);
+ }
+ });
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngine/parts/sliders/LinearSlider.java b/src/main/java/graphicsEngine/parts/sliders/LinearSlider.java
new file mode 100644
index 0000000..6b41bc0
--- /dev/null
+++ b/src/main/java/graphicsEngine/parts/sliders/LinearSlider.java
@@ -0,0 +1,45 @@
+package graphicsEngine.parts.sliders;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import graphicsEngine.colors.SimpleColorScheme;
+import graphicsEngine.parts.sliders.panelless.PanellessSlider_Linear;
+
+//TODO: add javadocs
+public abstract class LinearSlider extends PaneledSlider {
+
+ //TODO: add javadoc
+ public LinearSlider(@Nullable SimpleColorScheme colors,
+ double @NotNull [] range, double initialValue,
+ int majorTickCount, int minorTickCount) {
+ this(
+ colors, SliderConstants.DEFAULT_PANEL_HEIGHT,
+ range, initialValue,
+ majorTickCount, minorTickCount,
+ SliderConstants.DEFAULT_TICK_LABEL_DECIMAL_PLACES);
+ }
+
+ //TODO: add javadoc
+ public LinearSlider(@Nullable SimpleColorScheme colors, int panelHeight,
+ double @NotNull [] range, double initialValue,
+ int majorTickCount, int minorTickCount,
+ int tickLabelDecimalPlaces) {
+ super(colors, panelHeight);
+ @NotNull PaneledSlider panel = this;
+ add(new PanellessSlider_Linear(
+ getPanelColors().getBaseColor(),
+ range, initialValue,
+ majorTickCount, minorTickCount, tickLabelDecimalPlaces) {
+ /**
+ * Performed upon changing the value.
+ *
+ * @param value The new value.
+ */
+ @Override
+ public void valueChanged(double value) {
+ panel.valueChanged(value);
+ }
+ });
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngine/parts/sliders/PaneledSlider.java b/src/main/java/graphicsEngine/parts/sliders/PaneledSlider.java
new file mode 100644
index 0000000..ef0ba30
--- /dev/null
+++ b/src/main/java/graphicsEngine/parts/sliders/PaneledSlider.java
@@ -0,0 +1,45 @@
+package graphicsEngine.parts.sliders;
+
+import javax.swing.BoxLayout;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import graphicsEngine.colors.SimpleColorScheme;
+import graphicsEngine.panels.HorizontalPanel;
+import graphicsEngine.parts.labels.DynamicLabel;
+
+//TODO: add javadocs
+abstract class PaneledSlider extends HorizontalPanel {
+
+ //TODO: add javadoc
+ public PaneledSlider(@Nullable SimpleColorScheme colors, int height) {
+ super(colors, height, null);
+ setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
+
+ @NotNull PaneledSlider panel = this;
+ add(new DynamicLabel(
+ getPanelColors().getSecondaryColor(),
+ getPanelColors().getBaseColor()) {
+ //TODO: add javadoc
+ @Override
+ public @NotNull String getLabelText() {
+ return panel.getLabelText();
+ }
+ });
+ }
+
+ /**
+ * Gets the text of the label for paneled slider.
+ *
+ * @return The text of the label.
+ */
+ public abstract @NotNull String getLabelText();
+
+ /**
+ * Performed upon changing the value.
+ *
+ * @param value The new value.
+ */
+ public abstract void valueChanged(double value);
+}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngine/parts/sliders/SliderConstants.java b/src/main/java/graphicsEngine/parts/sliders/SliderConstants.java
new file mode 100644
index 0000000..a3705e3
--- /dev/null
+++ b/src/main/java/graphicsEngine/parts/sliders/SliderConstants.java
@@ -0,0 +1,9 @@
+package graphicsEngine.parts.sliders;
+
+//TODO: add javadocs
+abstract class SliderConstants {
+ //
+ protected static final int
+ DEFAULT_TICK_LABEL_DECIMAL_PLACES = 2,
+ DEFAULT_PANEL_HEIGHT = 65;
+}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngine/parts/sliders/panelless/PanellessSlider.java b/src/main/java/graphicsEngine/parts/sliders/panelless/PanellessSlider.java
new file mode 100644
index 0000000..3803a39
--- /dev/null
+++ b/src/main/java/graphicsEngine/parts/sliders/panelless/PanellessSlider.java
@@ -0,0 +1,58 @@
+package graphicsEngine.parts.sliders.panelless;
+
+import java.awt.Color;
+import javax.swing.JSlider;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * A ticked slider with a change listener supporting dynamic tick value-conversion.
+ */
+abstract class PanellessSlider extends TickedSlider {
+ /**
+ * Creates a new panelless slider.
+ *
+ * @param backgroundColor Background color. (prevents flickering)
+ * @param range Value range. {min, max}
+ * @param initialValue Preferred initial value. (will change to the nearest corresponding tick)
+ * @param majorTickCount Number of major ticks. (excludes start; has to be greater than 1)
+ * @param minorTickCount Number of minor ticks between major ticks. (has to be greater than 1)
+ * @param tickLabelDecimalPlaces Number of decimal places for tick labels.
+ */
+ protected PanellessSlider(@NotNull Color backgroundColor,
+ double @NotNull [] range, double initialValue,
+ int majorTickCount, int minorTickCount,
+ int tickLabelDecimalPlaces) {
+ super(
+ backgroundColor,
+ range,
+ majorTickCount, minorTickCount,
+ tickLabelDecimalPlaces);
+ setInitialValue(initialValue);
+ addChangeListener(newChangeListener());
+ }
+
+ private void setInitialValue(double value) {
+ double valueInRange = getValueInRange(value); // ensures that the value is within range
+ int tick = getTickFromValue(valueInRange); // gets the nearest tick
+ setValue(tick); // sets the initial tick
+ valueChanged(getValueFromTick(tick)); // sets the actual value to the value of the corresponding tick
+ }
+
+ private @NotNull ChangeListener newChangeListener() {
+ return new ChangeListener() {
+ /**
+ * Invoked when the target of the listener has changed its state.
+ *
+ * @param e A ChangeEvent object.
+ */
+ @Override
+ public void stateChanged(ChangeEvent e) {
+ JSlider source = (JSlider) e.getSource();
+ valueChanged(getValueFromTick(source.getValue()));
+ }
+ };
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngine/parts/sliders/panelless/PanellessSlider_Exponential.java b/src/main/java/graphicsEngine/parts/sliders/panelless/PanellessSlider_Exponential.java
new file mode 100644
index 0000000..2ba5cac
--- /dev/null
+++ b/src/main/java/graphicsEngine/parts/sliders/panelless/PanellessSlider_Exponential.java
@@ -0,0 +1,71 @@
+package graphicsEngine.parts.sliders.panelless;
+
+import java.awt.Color;
+
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * TODO:
+ * add customizable base
+ * add reversibility
+ * add javadocs
+ */
+public abstract class PanellessSlider_Exponential extends PanellessSlider {
+ private double base; //Base of exponent for tick-value conversion.
+
+ //TODO: add javadoc
+ public PanellessSlider_Exponential(@NotNull Color backgroundColor,
+ double[] bounds, double initialValue,
+ int majorTickCount, int minorTickCount,
+ int tickLabelDecimalPlaces) {
+ super(
+ backgroundColor,
+ bounds, initialValue,
+ majorTickCount, minorTickCount,
+ tickLabelDecimalPlaces);
+ }
+
+ /**
+ * Prepares variables for tick-value conversion.
+ *
+ * @param majorTickCount Number of major ticks. (excludes start; has to be greater than 1)
+ * @param minorTickCount Number of minor ticks between major ticks. (has to be greater than 1)
+ */
+ @Override
+ public final void setConversionConstants(int majorTickCount, int minorTickCount) {
+ double @NotNull [] range = getRange();
+ double tickCount = majorTickCount * minorTickCount;
+ base = Math.pow(
+ range[1] - range[0] + 1,
+ 1 / tickCount);
+ }
+
+ /**
+ * Gets the closest tick to a particular value.
+ *
+ * @param value Reference value.
+ *
+ * @return Closest tick number.
+ */
+ @Override
+ public final int getTickFromValue(double value) {
+ double @NotNull [] range = getRange();
+ double
+ dividend = Math.log(value + 1 - range[0]),
+ divisor = Math.log(base),
+ quotient = dividend / divisor;
+ return (int) quotient;
+ }
+
+ /**
+ * Gets a value corresponding to a tick.
+ *
+ * @param tick Reference tick number.
+ *
+ * @return Corresponding value.
+ */
+ @Override
+ public final double getValueFromTick(int tick) {
+ return Math.pow(base, tick) - 1 + getRange()[0];
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngine/parts/sliders/panelless/PanellessSlider_Linear.java b/src/main/java/graphicsEngine/parts/sliders/panelless/PanellessSlider_Linear.java
new file mode 100644
index 0000000..d591a4c
--- /dev/null
+++ b/src/main/java/graphicsEngine/parts/sliders/panelless/PanellessSlider_Linear.java
@@ -0,0 +1,64 @@
+package graphicsEngine.parts.sliders.panelless;
+
+import java.awt.Color;
+
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * TODO:
+ * inherit this from exponential slider with base 1
+ * add reversibility
+ * add javadocs
+ */
+public abstract class PanellessSlider_Linear extends PanellessSlider {
+ private double tickValue; //Value of a tick for tick-value conversion.
+
+ //TODO: add javadoc
+ public PanellessSlider_Linear(@NotNull Color backgroundColor,
+ double[] range, double initialValue,
+ int majorTickCount, int minorTickCount,
+ int tickLabelDecimalPlaces) {
+ super(
+ backgroundColor,
+ range, initialValue,
+ majorTickCount, minorTickCount,
+ tickLabelDecimalPlaces);
+ }
+
+ /**
+ * Prepares variables for tick-value conversion.
+ *
+ * @param majorTickCount Number of major ticks. (excludes start; has to be greater than 1)
+ * @param minorTickCount Number of minor ticks between major ticks. (has to be greater than 1)
+ */
+ @Override
+ public final void setConversionConstants(int majorTickCount, int minorTickCount) {
+ double @NotNull [] range = getRange();
+ tickValue = (range[1] - range[0])
+ / (majorTickCount * minorTickCount);
+ }
+
+ /**
+ * Gets the closest tick to a particular value.
+ *
+ * @param value Reference value.
+ *
+ * @return Closest tick number.
+ */
+ @Override
+ public final int getTickFromValue(double value) {
+ return (int) ((value - getRange()[0]) / tickValue);
+ }
+
+ /**
+ * Gets a value corresponding to a tick.
+ *
+ * @param tick Reference tick number.
+ *
+ * @return Corresponding value.
+ */
+ @Override
+ public final double getValueFromTick(int tick) {
+ return getRange()[0] + tick * tickValue;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngine/parts/sliders/panelless/SimpleSlider.java b/src/main/java/graphicsEngine/parts/sliders/panelless/SimpleSlider.java
new file mode 100644
index 0000000..59eeba4
--- /dev/null
+++ b/src/main/java/graphicsEngine/parts/sliders/panelless/SimpleSlider.java
@@ -0,0 +1,50 @@
+package graphicsEngine.parts.sliders.panelless;
+
+import java.util.Arrays;
+import java.awt.Color;
+import javax.swing.JSlider;
+
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * A simple slider with the most basic swing settings and a range.
+ */
+abstract class SimpleSlider extends JSlider {
+ private final double @NotNull [] range; //Range of the slider {min, max}
+
+ /**
+ * Creates a new SimpleSlider.
+ *
+ * @param backgroundColor Background color. (prevents flickering)
+ * @param range Value range. {min, max}
+ */
+ protected SimpleSlider(@NotNull Color backgroundColor,
+ double @NotNull [] range) {
+ super();
+ setFocusable(false);
+ setBackground(backgroundColor); //prevents flickering
+ this.range = Arrays.copyOf(range, 2);
+ }
+
+ /**
+ * Gets the value range of this slider.
+ *
+ * @return Range as double[] {min, max}.
+ */
+ protected final double @NotNull [] getRange() {
+ return range;
+ }
+
+ /**
+ * Ensures that the provided value is within the value range.
+ * TODO: add reversibility support
+ *
+ * @param value Value to check.
+ *
+ * @return Value within range.
+ */
+ protected final double getValueInRange(double value) {
+ double @NotNull [] range = getRange();
+ return Math.max(range[0], Math.min(range[1], value));
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngine/parts/sliders/panelless/TickValueConvertible.java b/src/main/java/graphicsEngine/parts/sliders/panelless/TickValueConvertible.java
new file mode 100644
index 0000000..e51fe1b
--- /dev/null
+++ b/src/main/java/graphicsEngine/parts/sliders/panelless/TickValueConvertible.java
@@ -0,0 +1,39 @@
+package graphicsEngine.parts.sliders.panelless;
+
+/**
+ * An interface containing methods needed for tick-value conversion.
+ */
+interface TickValueConvertible {
+ /**
+ * Prepares variables for tick-value conversion.
+ *
+ * @param majorTickCount Number of major ticks. (excludes start; has to be greater than 1)
+ * @param minorTickCount Number of minor ticks between major ticks. (has to be greater than 1)
+ */
+ void setConversionConstants(int majorTickCount, int minorTickCount);
+
+ /**
+ * Gets the closest tick to a particular value.
+ *
+ * @param value Reference value.
+ *
+ * @return Closest tick number.
+ */
+ int getTickFromValue(double value);
+
+ /**
+ * Gets a value corresponding to a tick.
+ *
+ * @param tick Reference tick number.
+ *
+ * @return Corresponding value.
+ */
+ double getValueFromTick(int tick);
+
+ /**
+ * Performed upon changing the value.
+ *
+ * @param value The new value.
+ */
+ void valueChanged(double value);
+}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngine/parts/sliders/panelless/TickedSlider.java b/src/main/java/graphicsEngine/parts/sliders/panelless/TickedSlider.java
new file mode 100644
index 0000000..e24ae7b
--- /dev/null
+++ b/src/main/java/graphicsEngine/parts/sliders/panelless/TickedSlider.java
@@ -0,0 +1,67 @@
+package graphicsEngine.parts.sliders.panelless;
+
+import java.util.Hashtable;
+import java.awt.Color;
+import javax.swing.JLabel;
+
+import org.jetbrains.annotations.NotNull;
+
+import consoleUtils.NumberFormatter;
+
+/**
+ * A simple slider with equidistant ticks and corresponding labels.
+ */
+abstract class TickedSlider extends SimpleSlider implements TickValueConvertible {
+ /**
+ * Creates a new TickedSlider.
+ *
+ * @param backgroundColor Background color. (prevents flickering)
+ * @param range Value range. {min, max}
+ * @param majorTickCount Number of major ticks. (excludes start; has to be greater than 1)
+ * @param minorTickCount Number of minor ticks between major ticks. (has to be greater than 1)
+ * @param tickLabelDecimalPlaces Number of decimal places for tick labels.
+ */
+ protected TickedSlider(@NotNull Color backgroundColor,
+ double @NotNull [] range,
+ int majorTickCount, int minorTickCount,
+ int tickLabelDecimalPlaces) {
+ super(backgroundColor, range);
+
+ setConversionConstants(majorTickCount, minorTickCount);
+
+ setTicks(majorTickCount, minorTickCount);
+ setLabels(majorTickCount, minorTickCount, tickLabelDecimalPlaces);
+ }
+
+ private void setTicks(int majorTickCount, int minorTickCount) {
+ setMinorTickSpacing(1);
+ setMajorTickSpacing(minorTickCount);
+ int totalTicks = majorTickCount * minorTickCount;
+ setMaximum(totalTicks);
+ setPaintTicks(true);
+ }
+
+ private void setLabels(int majorTickCount, int minorTickCount,
+ int labelDecimalPlaces) {
+ setLabelTable(prepareLabelTable(majorTickCount, minorTickCount, labelDecimalPlaces));
+ setPaintLabels(true);
+ }
+
+ private @NotNull Hashtable<@NotNull Integer, @NotNull JLabel> prepareLabelTable(
+ int majorTickCount, int minorTickCount,
+ int labelDecimalPlaces) {
+ @NotNull Hashtable<@NotNull Integer, @NotNull JLabel> labelTable = new Hashtable<>();
+ for (int i = 0; i <= majorTickCount; i++) {
+ int tickPosition = i * minorTickCount;
+ labelTable.put(
+ tickPosition,
+ newTickLabel(tickPosition, labelDecimalPlaces));
+ }
+ return labelTable;
+ }
+
+ private @NotNull JLabel newTickLabel(int tickPosition, int labelDecimalPlaces) {
+ return new JLabel(NumberFormatter.doubleToString(
+ getValueFromTick(tickPosition), labelDecimalPlaces));
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngine/presets/SimpleOverlay.java b/src/main/java/graphicsEngine/presets/SimpleOverlay.java
new file mode 100644
index 0000000..f7b3048
--- /dev/null
+++ b/src/main/java/graphicsEngine/presets/SimpleOverlay.java
@@ -0,0 +1,51 @@
+package graphicsEngine.presets;
+
+import java.util.Objects;
+import java.awt.Color;
+import java.awt.Graphics;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import graphicsEngine.colors.SimpleColorScheme;
+import graphicsEngine.panels.StaticPanel;
+
+//TODO: add javadocs
+public class SimpleOverlay extends StaticPanel {
+ private static final Color DEFAULT_COLOR = new Color(0, 0, 0, 100);
+
+ //TODO: add javadoc
+ public SimpleOverlay(@Nullable Color color) {
+ super(null, getNewPanelColors(color), null);
+ setOpaque(false);
+ }
+
+ private static SimpleColorScheme getNewPanelColors(@Nullable Color color) {
+ return new SimpleColorScheme(getNonNullBackgroundColor(color), null);
+ }
+
+ private static Color getNonNullBackgroundColor(@Nullable Color color) {
+ return Objects.requireNonNullElse(color, DEFAULT_COLOR);
+ }
+
+ /**
+ * Sets the color of the background;
+ *
+ * @param color New color.
+ */
+ public void setColor(@Nullable Color color) {
+ setPanelColors(getNewPanelColors(color));
+ }
+
+ //TODO: add javadocs
+ @Override
+ protected void paintComponent(Graphics g) {
+ super.paintComponent(g);
+ fillBackground(g);
+ }
+
+ private void fillBackground(@NotNull Graphics g) {
+ g.setColor(getPanelColors().getBaseColor());
+ g.fillRect(0, 0, this.getWidth(), this.getHeight());
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngine/windows/AbstractPage.java b/src/main/java/graphicsEngine/windows/AbstractPage.java
deleted file mode 100644
index 553bd04..0000000
--- a/src/main/java/graphicsEngine/windows/AbstractPage.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package graphicsEngine.windows;
-
-import java.awt.*;
-import javax.swing.*;
-
-import java.util.Objects;
-
-import org.jetbrains.annotations.Nullable;
-
-public abstract class AbstractPage extends JPanel {
- private static final Color DEFAULT_BACKGROUND = Color.black;
-
- public AbstractPage() {
- this(null);
- }
-
- public AbstractPage(@Nullable Color backgroundColor) {
- setBackground(Objects.requireNonNullElse(backgroundColor, DEFAULT_BACKGROUND));
- }
-
- public abstract String getPageKey();
-}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngine/windows/AbstractWindow.java b/src/main/java/graphicsEngine/windows/AbstractWindow.java
index aa20cec..286c83e 100644
--- a/src/main/java/graphicsEngine/windows/AbstractWindow.java
+++ b/src/main/java/graphicsEngine/windows/AbstractWindow.java
@@ -1,19 +1,49 @@
package graphicsEngine.windows;
-import javax.swing.*;
-
+import java.util.List;
+import java.util.ArrayList;
import java.util.Objects;
+import java.awt.event.ActionListener;
+import javax.swing.JFrame;
+import javax.swing.ImageIcon;
-import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
-//TODO: add javadocs
+/**
+ * An abstract window with required configuration and methods.
+ */
public abstract class AbstractWindow extends JFrame {
- protected static final String EMPTY_KEY = "";
- public String activePage;
+ /**
+ * Window size correction constant.
+ */
+ public static final int[] SIZE_ERROR_CORRECTION = new int[] {16, 39};
+
+ /**
+ * Corrects window size error that happens due to title bar and borders.
+ * Uses hardcoded values.
+ *
+ * @param size Initial size.
+ *
+ * @return Corrected size.
+ */
+ public static int[] correctWindowsSizeError(int[] size) {
+ return new int[] {
+ size[0] + SIZE_ERROR_CORRECTION[0],
+ size[1] + SIZE_ERROR_CORRECTION[1]};
+ }
- //creates a window with required parameters
- public AbstractWindow(@NotNull WindowConfig config) {
+ /**
+ * Creates a new AbstractWindow with specified configuration.
+ * Adds known action listeners to this window.
+ *
+ * @param windowManager A WindowManager object.
+ * @param config Window configuration.
+ * @param actionListenerList List of action listeners to add to this window.
+ */
+ public AbstractWindow(@NotNull WindowManager windowManager,
+ @NotNull WindowConfig config,
+ @Nullable List actionListenerList) {
super(config.getTitle());
setDefaultCloseOperation(config.closeOperation);
@@ -22,29 +52,54 @@ public AbstractWindow(@NotNull WindowConfig config) {
int[] location = config.getLocation();
setLocation(location[0], location[1]);
- setActivePage(EMPTY_KEY);
+ //TODO: remove window listener from here
+ addWindowListener(new CommonWindowListener(windowManager, getWindowKey(), config.closeOperation));
+ addListeners(actionListenerList);
+
addParts();
setVisible(true);
}
- //TODO: add javadoc
- public static int[] correctWindowsSizeError(int[] size) {
- int[] errorCorrection = new int[] {16, 39};
- return new int[] {
- size[0] + errorCorrection[0],
- size[1] + errorCorrection[1]};
+ /**
+ * Adds known listeners to this page.
+ * Override this to add custom listeners.
+ *
+ * @param list List of listeners to add.
+ *
+ * @return Remaining unknown listeners.
+ */
+ public @NotNull List addListeners(@Nullable List list) {
+ return Objects.requireNonNullElse(list, new ArrayList<>());
}
- //override this to add parts
- public abstract void addParts();
+ /**
+ * Gets the key of the window.
+ *
+ * @return The key of the window.
+ */
+ public @NotNull abstract String getWindowKey();
- //manually reset parts
+ /**
+ * Call this to manually reset parts.
+ */
public final void resetParts() {
getContentPane().removeAll();
addParts();
+ getContentPane().validate();
}
- public void setActivePage(@Nullable String key) {
- activePage = Objects.requireNonNullElse(key, EMPTY_KEY);
+ /**
+ * Override this to add parts.
+ * Called upon creation and part reset.
+ */
+ public abstract void addParts();
+
+ /**
+ * Sets the icon of the window.
+ *
+ * @param icon ImageIcon object.
+ */
+ public void setIcon(@NotNull ImageIcon icon) {
+ setIconImage(icon.getImage());
}
}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngine/windows/CommonWindowListener.java b/src/main/java/graphicsEngine/windows/CommonWindowListener.java
new file mode 100644
index 0000000..f52bf80
--- /dev/null
+++ b/src/main/java/graphicsEngine/windows/CommonWindowListener.java
@@ -0,0 +1,108 @@
+package graphicsEngine.windows;
+
+import java.awt.event.WindowEvent;
+import java.awt.event.WindowListener;
+import static javax.swing.WindowConstants.EXIT_ON_CLOSE;
+
+import org.jetbrains.annotations.NotNull;
+
+import static consoleUtils.ConsoleUtils.printLine;
+
+//TODO: add javadocs
+class CommonWindowListener implements WindowListener {
+ private final WindowManager windowManager;
+ private final String windowKey;
+ private final int closeOperation;
+
+ CommonWindowListener(@NotNull WindowManager windowManager,
+ @NotNull String windowKey,
+ int closeOperation) {
+ this.windowManager = windowManager;
+ this.windowKey = windowKey;
+ this.closeOperation = closeOperation;
+ }
+
+ /**
+ * Invoked the first time a window is made visible.
+ *
+ * @param e the event to be processed
+ */
+ @Override
+ public void windowOpened(WindowEvent e) {}
+
+ /**
+ * Invoked when the user attempts to close the window
+ * from the window's system menu.
+ *
+ * @param e the event to be processed
+ */
+ @Override
+ public void windowClosing(WindowEvent e) {}
+
+ /**
+ * Invoked when a window has been closed as the result
+ * of calling dispose on the window.
+ *
+ * @param e the event to be processed
+ */
+ @Override
+ public void windowClosed(WindowEvent e) {
+ if (closeOperation == EXIT_ON_CLOSE) {
+ windowManager.end();
+ }
+ }
+
+ /**
+ * Invoked when a window is changed from a normal to a
+ * minimized state. For many platforms, a minimized window
+ * is displayed as the icon specified in the window's
+ * iconImage property.
+ *
+ * @param e the event to be processed
+ */
+ @Override
+ public void windowIconified(WindowEvent e) {
+ printLine("window minimized");
+ }
+
+ /**
+ * Invoked when a window is changed from a minimized
+ * to a normal state.
+ *
+ * @param e the event to be processed
+ */
+ @Override
+ public void windowDeiconified(WindowEvent e) {
+ //
+ }
+
+ /**
+ * Invoked when the Window is set to be the active Window. Only a Frame or
+ * a Dialog can be the active Window. The native windowing system may
+ * denote the active Window or its children with special decorations, such
+ * as a highlighted title bar. The active Window is always either the
+ * focused Window, or the first Frame or Dialog that is an owner of the
+ * focused Window.
+ *
+ * @param e the event to be processed
+ */
+ @Override
+ public void windowActivated(WindowEvent e) {
+ //
+ }
+
+ /**
+ * Invoked when a Window is no longer the active Window. Only a Frame or a
+ * Dialog can be the active Window. The native windowing system may denote
+ * the active Window or its children with special decorations, such as a
+ * highlighted title bar. The active Window is always either the focused
+ * Window, or the first Frame or Dialog that is an owner of the focused
+ * Window.
+ *
+ * @param e the event to be processed
+ */
+ @Override
+ public void windowDeactivated(WindowEvent e) {
+ //
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngine/windows/MultiPageWindow.java b/src/main/java/graphicsEngine/windows/MultiPageWindow.java
deleted file mode 100644
index 5cfaa3d..0000000
--- a/src/main/java/graphicsEngine/windows/MultiPageWindow.java
+++ /dev/null
@@ -1,66 +0,0 @@
-package graphicsEngine.windows;
-
-import java.util.List;
-import java.util.Map;
-import java.util.HashMap;
-import java.util.Objects;
-
-import static graphicsEngine.Utilities.printLine;
-
-import org.jetbrains.annotations.Nullable;
-import org.jetbrains.annotations.NotNull;
-
-// TODO: finish this and add javadoc
-public abstract class MultiPageWindow extends AbstractWindow {
- private Map pages;// = new HashMap<>();
-
- @SuppressWarnings("unused")
- public MultiPageWindow(
- @NotNull WindowConfig config,
- @NotNull List pages) {
- this(config, pages, null);
- }
-
- @SuppressWarnings("unused")
- public MultiPageWindow(
- @NotNull WindowConfig config,
- @NotNull List pages,
- @Nullable String activePageKey) {
- super(config);
- addPages(pages);
- setActivePage(Objects.requireNonNullElse(activePageKey, getFirstKey()));
- }
-
- private String getFirstKey() {
- if (pages.size() > 0) {
- return pages.keySet().stream().toList().get(0);
- } else return EMPTY_KEY;
- }
-
- private void addPages(@NotNull List pages) {
- this.pages = new HashMap<>();
- for (AbstractPage page : pages) {
- addPage(page);
- }
- }
-
- private void addPage(@NotNull AbstractPage page) {
- pages.put(page.getPageKey(), page);
- }
-
- public final void setActivePage(@NotNull String key) {
- if (!key.equals(EMPTY_KEY) && pages.containsKey(key)) {
- super.setActivePage(key);
- resetParts();
- } else {
- printLine("Page not found");
- }
- }
-
- @Override
- public final void addParts() {
- if (pages != null && pages.size() > 0) {
- add(pages.get(activePage));
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngine/windows/WindowConfig.java b/src/main/java/graphicsEngine/windows/WindowConfig.java
index 36f7be5..a0a05e4 100644
--- a/src/main/java/graphicsEngine/windows/WindowConfig.java
+++ b/src/main/java/graphicsEngine/windows/WindowConfig.java
@@ -1,6 +1,6 @@
package graphicsEngine.windows;
-import javax.swing.*;
+import javax.swing.WindowConstants;
//TODO: add javadocs
public class WindowConfig {
diff --git a/src/main/java/graphicsEngine/windows/WindowManager.java b/src/main/java/graphicsEngine/windows/WindowManager.java
index dc92ab4..31ccfc5 100644
--- a/src/main/java/graphicsEngine/windows/WindowManager.java
+++ b/src/main/java/graphicsEngine/windows/WindowManager.java
@@ -1,41 +1,89 @@
package graphicsEngine.windows;
-import DelayCalculator.DelayOptions;
-import ThreadAbstraction.AbstractUpdater;
+import java.util.ArrayList;
-import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
-//TODO:add javadocs
-public class WindowManager extends AbstractUpdater {
- private AbstractWindow window;
+/**
+ * A utility class for containing windows and their updaters.
+ * Meant to be extended by GraphicsAdapter.
+ */
+public abstract class WindowManager {
+ private final ArrayList windows;
- public WindowManager(@NotNull AbstractWindow window) {
- super();
- setWindow(window);
+ /**
+ * Creates a new WindowManager, initially with no windows.
+ */
+ public WindowManager() {
+ windows = new ArrayList<>();
}
- public WindowManager(@NotNull AbstractWindow window, long delay) {
- super(delay);
- setWindow(window);
+ /**
+ * Use this to add new windows.
+ *
+ * @param window A corresponding WindowUpdater object.
+ */
+ public void newWindow(@NotNull WindowUpdater window) {
+ int i = windows.size();
+ windows.add(window);
+ windows.get(i).start();
}
- public WindowManager(@NotNull AbstractWindow window, @Nullable DelayOptions delayOptions) {
- super(delayOptions);
- setWindow(window);
+ private int getWindowIndex(@Nullable String windowKey) throws NullPointerException {
+ if (windowKey != null && !windowKey.equals("")) {
+ for (int i = 0; i < windows.size(); i++) {
+ if (windows.get(i).getWindowKey().equals(windowKey)) {
+ return i;
+ }
+ }
+ }
+ throw new NullPointerException();
}
- private void setWindow(AbstractWindow window) {
- this.window = window;
+ /**
+ * Gets a WindowUpdater object that contains a window with corresponding key.
+ * If multiple windows with the same key exist, returns the first one.
+ * Returns null, if provided key is null or no such window found.
+ *
+ * @param windowKey Key of the window.
+ *
+ * @return The specified WindowUpdater object.
+ */
+ public @Nullable WindowUpdater getWindow(@Nullable String windowKey) {
+ try {
+ int index = getWindowIndex(windowKey);
+ return windows.get(index);
+ } catch (NullPointerException e) {
+ return null; //returns null if no such window found
+ }
}
- @Override
- public void update() {
- window.repaint();
+ /**
+ * Ends a specified window.
+ *
+ * @param windowKey Key of the window.
+ */
+ @SuppressWarnings("unused")
+ public void endWindow(@Nullable String windowKey) {
+ try {
+ int index = getWindowIndex(windowKey);
+ WindowUpdater window = getWindow(windowKey);
+ if (window == null) {
+ throw new NullPointerException();
+ }
+
+ window.end();
+ windows.remove(index);
+ } catch (NullPointerException ignored) {}
}
- @Override
- public void finish() {
- window.dispose();
+ /**
+ * Ends all windows.
+ */
+ public void end() {
+ for (WindowUpdater window : windows) {
+ window.end();
+ }
}
}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngine/windows/WindowUpdater.java b/src/main/java/graphicsEngine/windows/WindowUpdater.java
new file mode 100644
index 0000000..f0eb998
--- /dev/null
+++ b/src/main/java/graphicsEngine/windows/WindowUpdater.java
@@ -0,0 +1,79 @@
+package graphicsEngine.windows;
+
+import org.jetbrains.annotations.Nullable;
+import org.jetbrains.annotations.NotNull;
+
+import DelayCalculator.DelayOptions;
+import ThreadAbstraction.AbstractUpdater;
+
+/**
+ * A class for joining window and the thread that updates it.
+ */
+public class WindowUpdater extends AbstractUpdater {
+ private AbstractWindow window;
+
+ /**
+ * Creates a window updater with default delay options.
+ *
+ * @param window A window to update.
+ */
+ public WindowUpdater(@NotNull AbstractWindow window) {
+ super();
+ setWindow(window);
+ }
+
+ /**
+ * Creates a window updater with specified delay in milliseconds.
+ *
+ * @param window A window to update.
+ * @param delay Delay in milliseconds.
+ */
+ @SuppressWarnings("unused")
+ public WindowUpdater(@NotNull AbstractWindow window,
+ long delay) {
+ super(delay);
+ setWindow(window);
+ }
+
+ /**
+ * Creates a window updater with specified delay options.
+ *
+ * @param window A window to update.
+ * @param delayOptions Delay options.
+ */
+ @SuppressWarnings("unused")
+ public WindowUpdater(@NotNull AbstractWindow window,
+ @Nullable DelayOptions delayOptions) {
+ super(delayOptions);
+ setWindow(window);
+ }
+
+ private void setWindow(@NotNull AbstractWindow window) {
+ this.window = window;
+ }
+
+ /**
+ * Gets the key of the contained window.
+ *
+ * @return The key of the window.
+ */
+ public final String getWindowKey() {
+ return window.getWindowKey();
+ }
+
+ /**
+ * Gets called when thread runs.
+ */
+ @Override
+ public final void update() {
+ window.repaint();
+ }
+
+ /**
+ * Happens upon finishing thread.
+ */
+ @Override
+ public void finish() {
+ window.dispose();
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngine/windows/windowTypes/AbstractLayeredWindow.java b/src/main/java/graphicsEngine/windows/windowTypes/AbstractLayeredWindow.java
new file mode 100644
index 0000000..22a785b
--- /dev/null
+++ b/src/main/java/graphicsEngine/windows/windowTypes/AbstractLayeredWindow.java
@@ -0,0 +1,93 @@
+package graphicsEngine.windows.windowTypes;
+
+import java.util.Objects;
+import java.util.List;
+import java.awt.Component;
+import java.awt.event.ActionListener;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import graphicsEngine.windows.WindowManager;
+import graphicsEngine.windows.WindowConfig;
+import graphicsEngine.windows.AbstractWindow;
+import graphicsEngine.presets.SimpleOverlay;
+
+/**
+ * An abstract layered window containing contents and an overlay.
+ */
+abstract class AbstractLayeredWindow extends AbstractWindow {
+
+ /**
+ * Creates a new AbstractWindow with specified configuration and overlay.
+ *
+ * @param windowManager A WindowManager object
+ * @param config Window configuration.
+ * @param overlay Overlay
+ */
+ AbstractLayeredWindow(@NotNull WindowManager windowManager,
+ @NotNull WindowConfig config,
+ @Nullable List actionListenerList,
+ @Nullable SimpleOverlay overlay) {
+ super(windowManager, config, actionListenerList);
+ setOverlay(overlay);
+ hideOverlay();
+ }
+
+ /**
+ * Sets the overlay.
+ *
+ * @param overlay A SimpleOverlay object.
+ */
+ public void setOverlay(@Nullable SimpleOverlay overlay) {
+ setGlassPane(Objects.requireNonNullElse(overlay, getDefaultOverlay()));
+ }
+
+ private static @NotNull SimpleOverlay getDefaultOverlay() {
+ return new SimpleOverlay(null);
+ }
+
+ /**
+ * Gets the overlay.
+ *
+ * @return The overlay.
+ * @throws ClassCastException if glassPane does not contain a SimpleOverlay object.
+ */
+ public @NotNull SimpleOverlay getOverlay() throws ClassCastException {
+ Component glassPane = getGlassPane();
+ if (glassPane instanceof SimpleOverlay) {
+ return (SimpleOverlay) glassPane;
+ }
+ throw new ClassCastException();
+ }
+
+ /**
+ * Shows the overlay.
+ */
+ public void showOverlay() {
+ getGlassPane().setVisible(true);
+ }
+
+ /**
+ * Hides the overlay.
+ */
+ public void hideOverlay() {
+ getGlassPane().setVisible(false);
+ }
+
+ /**
+ * Toggles visibility of the overlay.
+ */
+ public void toggleOverlay() {
+ Component pane = getGlassPane();
+ pane.setVisible(!(pane.isVisible()));
+ }
+
+ @Override
+ public void repaint() {
+ try {
+ Objects.requireNonNull(getGlassPane()).repaint();
+ } catch (NullPointerException ignored) {}
+ super.repaint();
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngine/windows/windowTypes/MultiPageWindow.java b/src/main/java/graphicsEngine/windows/windowTypes/MultiPageWindow.java
new file mode 100644
index 0000000..13990dd
--- /dev/null
+++ b/src/main/java/graphicsEngine/windows/windowTypes/MultiPageWindow.java
@@ -0,0 +1,93 @@
+package graphicsEngine.windows.windowTypes;
+
+import java.util.Objects;
+import java.util.List;
+import java.util.Map;
+import java.util.HashMap;
+import java.awt.event.ActionListener;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import graphicsEngine.windows.WindowManager;
+import graphicsEngine.windows.WindowConfig;
+import graphicsEngine.pages.AbstractPage;
+import graphicsEngine.presets.SimpleOverlay;
+
+// TODO: finish this and add javadoc
+public abstract class MultiPageWindow extends AbstractLayeredWindow {
+ private static final String EMPTY_KEY = "";
+ private final Map pages;
+ private String activePage;
+
+ //TODO: add javadoc
+ public MultiPageWindow(@NotNull WindowManager windowManager,
+ @NotNull WindowConfig config,
+ @Nullable List actionListenerList,
+ @Nullable SimpleOverlay overlay) {
+ super(windowManager, config, actionListenerList, overlay);
+ this.pages = new HashMap<>();
+ activePage = EMPTY_KEY;
+ addPages(getInitialPages());
+ }
+
+ private void addPages(@NotNull List pages) {
+ for (AbstractPage page : pages) {
+ addPage(page);
+ }
+ }
+
+ //TODO: add javadoc
+ public void addPage(@NotNull AbstractPage page) {
+ pages.put(page.getPageKey(), page);
+ }
+
+ //TODO: add javadoc
+ public @NotNull abstract List getInitialPages();
+
+ /**
+ * Get the key of the currently active page.
+ *
+ * @return String of the key.
+ */
+ public @NotNull String getActivePageKey() {
+ return Objects.requireNonNullElse(activePage, EMPTY_KEY);
+ }
+
+ //TODO: add javadoc
+ public @Nullable AbstractPage getActivePage() {
+ if (pages != null && pages.containsKey(getActivePageKey())) {
+ return pages.get(activePage);
+ }
+ return null;
+ }
+
+ /**
+ * Sets a new active page and resets parts.
+ *
+ * @param key Key of the page.
+ */
+ public void setActivePage(@Nullable String key) {
+ activePage = Objects.requireNonNullElse(key, EMPTY_KEY);
+ resetParts();
+ }
+
+ /**
+ * Adds the active page to the frame.
+ */
+ @Override
+ public final void addParts() {
+ AbstractPage activePage = getActivePage();
+ if (activePage != null) {
+ add(activePage);
+ }
+ }
+
+ @Override
+ public void repaint() {
+ try {
+ Objects.requireNonNull(getActivePage()).repaint();
+ } catch (NullPointerException ignored) {}
+ super.repaint();
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngine/windows/windowTypes/SimpleWindow.java b/src/main/java/graphicsEngine/windows/windowTypes/SimpleWindow.java
new file mode 100644
index 0000000..e73478b
--- /dev/null
+++ b/src/main/java/graphicsEngine/windows/windowTypes/SimpleWindow.java
@@ -0,0 +1,30 @@
+package graphicsEngine.windows.windowTypes;
+
+import java.util.List;
+import java.awt.event.ActionListener;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import graphicsEngine.windows.WindowManager;
+import graphicsEngine.windows.WindowConfig;
+import graphicsEngine.windows.AbstractWindow;
+
+/**
+ * A simple window; has only contents.
+ */
+public abstract class SimpleWindow extends AbstractWindow {
+ /**
+ * Creates a new SimpleWindow with specified configuration.
+ * Adds known action listeners to this window.
+ *
+ * @param windowManager A WindowManager object.
+ * @param config Window configuration.
+ * @param actionListenerList List of action listeners to add to this window.
+ */
+ public SimpleWindow(@NotNull WindowManager windowManager,
+ @NotNull WindowConfig config,
+ @Nullable List actionListenerList) {
+ super(windowManager, config, actionListenerList);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngine/windows/windowTypes/SinglePageWindow.java b/src/main/java/graphicsEngine/windows/windowTypes/SinglePageWindow.java
new file mode 100644
index 0000000..79b7625
--- /dev/null
+++ b/src/main/java/graphicsEngine/windows/windowTypes/SinglePageWindow.java
@@ -0,0 +1,41 @@
+package graphicsEngine.windows.windowTypes;
+
+import java.util.Objects;
+import java.util.List;
+import java.awt.event.ActionListener;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import graphicsEngine.windows.WindowManager;
+import graphicsEngine.windows.WindowConfig;
+import graphicsEngine.pages.AbstractPage;
+import graphicsEngine.presets.SimpleOverlay;
+
+// TODO: finish this and add javadoc
+public abstract class SinglePageWindow extends AbstractLayeredWindow {
+ //TODO: add javadoc
+ public SinglePageWindow(@NotNull WindowManager windowManager,
+ @NotNull WindowConfig config,
+ @Nullable List actionListenerList,
+ @Nullable SimpleOverlay overlay) {
+ super(windowManager, config, actionListenerList, overlay);
+ }
+
+ //TODO: add javadoc
+ @Override
+ public final void addParts() {
+ add(getPage());
+ }
+
+ //TODO: add javadoc
+ public abstract AbstractPage getPage();
+
+ @Override
+ public void repaint() {
+ try {
+ Objects.requireNonNull(getContentPane()).repaint();
+ } catch (NullPointerException ignored) {}
+ super.repaint();
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngine/windows/windowTypes/WindowClassification.md b/src/main/java/graphicsEngine/windows/windowTypes/WindowClassification.md
new file mode 100644
index 0000000..0aaf1e9
--- /dev/null
+++ b/src/main/java/graphicsEngine/windows/windowTypes/WindowClassification.md
@@ -0,0 +1,7 @@
+# Window classification
+
+| Class | Super | Features | Availability |
+|------------------|------------------------------------------------|------------------------------------------------------|---------------------------|
+| SimpleWindow | `AbstractWindow` | Only contents | Available |
+| SinglePageWindow | `AbstractLayeredWindow extends AbstractWindow` | * Contents - contains a single page
* Overlays | *Currently not available* |
+| MultiPageWindow | `AbstractLayeredWindow extends AbstractWindow` | * Contents - contains multiple pages
* Overlays | *Currently not available* |
\ No newline at end of file
diff --git a/src/main/java/graphicsEngineOld/engine/GraphicsManager.java b/src/main/java/graphicsEngineOld/engine/GraphicsManager.java
index 5ab948e..951769b 100644
--- a/src/main/java/graphicsEngineOld/engine/GraphicsManager.java
+++ b/src/main/java/graphicsEngineOld/engine/GraphicsManager.java
@@ -2,10 +2,8 @@
import graphicsEngineOld.engine.data.GraphicsData;
import graphicsEngineOld.utilities.input.InputManager;
-import graphicsEngineOld.parts.pages.Page;
import graphicsEngineOld.parts.pages.PageManager;
-import java.util.HashMap;
import java.util.Objects;
import org.jetbrains.annotations.Nullable;
@@ -41,43 +39,6 @@ private static void setGraphicsData(@Nullable GraphicsData graphicsData) {
true));
}
- /**
- * Initializes GraphicsManager.
- * Gets it ready for thread running.
- *
- * @param exitManager Extended ExitManager for ending controller upon closing graphics. (Null - default)
- * @param pages Pages to display. (Null or empty - no pages)
- * @param activePage Key of the first active page. (Null - acts as if no pages present)
- */
- public static void initialize(@Nullable ExitManager exitManager,
- @Nullable HashMap pages, @Nullable String activePage) {
- System.out.println(GRAPHICS_ENGINE_NAME + ": Initializing.");
- setupGraphics(pages, activePage);
- setupIO(exitManager);
- running = true;
- }
-
- private static void setupGraphics(@Nullable HashMap pages, @Nullable String activePage) {
- // Has to be before graphics.
- GraphicsManager.pages = new PageManager(pages, activePage);
-
- // Graphics.
- graphics = new GraphicsClass();
- graphics.initialize();
- }
-
- private static void setupIO(@Nullable ExitManager exitManager) {
- // Has to be before input.
- GraphicsManager.exitManager = Objects.requireNonNullElse(
- exitManager,
- new ExitManager());
-
- // Input.
- input = new InputManager(
- graphics.window, data.windowParameters,
- GraphicsManager.exitManager);
- }
-
/**
* Runs when GraphicsManager thread is being run.
*/
diff --git a/src/main/java/graphicsEngineOld/parts/containers/AlignmentType.java b/src/main/java/graphicsEngineOld/parts/containers/AlignmentType.java
deleted file mode 100644
index 0da106b..0000000
--- a/src/main/java/graphicsEngineOld/parts/containers/AlignmentType.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package graphicsEngineOld.parts.containers;
-
-/**
- * Alignment type enum for aligning parts of a container.
- */
-public enum AlignmentType {
- TOP,
- BOTTOM,
- LEFT,
- RIGHT
-}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngineOld/parts/containers/ContentsBox.java b/src/main/java/graphicsEngineOld/parts/containers/ContentsBox.java
index 14f86fb..2640b50 100644
--- a/src/main/java/graphicsEngineOld/parts/containers/ContentsBox.java
+++ b/src/main/java/graphicsEngineOld/parts/containers/ContentsBox.java
@@ -37,7 +37,6 @@ public ContentsBox(@Nullable int[] size, @Nullable boolean[] fixedSize,
*
* @param color New color.
*/
- @SuppressWarnings("unused")
public void setBackgroundColor(@Nullable Color color) {
((Background) parts.get(0)).setColor(color);
}
@@ -47,7 +46,6 @@ public void setBackgroundColor(@Nullable Color color) {
*
* @param color New color.
*/
- @SuppressWarnings("unused")
public void setBorderColor(@Nullable Color color) {
((Border) parts.get(1)).setColor(color);
}
diff --git a/src/main/java/graphicsEngineOld/parts/containers/Panel.java b/src/main/java/graphicsEngineOld/parts/containers/Panel.java
deleted file mode 100644
index 76790d3..0000000
--- a/src/main/java/graphicsEngineOld/parts/containers/Panel.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package graphicsEngineOld.parts.containers;
-
-import graphicsEngineOld.parts.simpleParts.DrawablePart;
-
-import java.util.ArrayList;
-import java.util.Objects;
-import java.awt.*;
-
-import org.jetbrains.annotations.Nullable;
-
-/**
- * A layer container with background and border pre-prepared.
- */
-public class Panel extends ContentsBox {
-
- /**
- * Creates a simple panel.
- *
- * @param size Size of the panel.
- * @param fixedSize Size fixation status for either direction.
- * @param background Background color.
- * @param border Border color.
- * @param panelParts ArrayList of containable parts. (Alignable)
- * @param alignment Alignment type of containable parts. (Null - align to top)
- */
- public Panel(@Nullable int[] size, @Nullable boolean[] fixedSize,
- @Nullable Color background, @Nullable Color border,
- @Nullable ArrayList panelParts, @Nullable AlignmentType alignment) {
- super(
- size, fixedSize,
- background, border,
- partContainer(panelParts, alignment));
- }
-
- private static PartContainer partContainer(@Nullable ArrayList panelParts,
- @Nullable AlignmentType alignment) {
- return new PartContainer(
- null, null,
- panelParts,
- Objects.requireNonNullElse(alignment, AlignmentType.TOP));
- }
-}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngineOld/parts/containers/PartContainer.java b/src/main/java/graphicsEngineOld/parts/containers/PartContainer.java
deleted file mode 100644
index 854afcc..0000000
--- a/src/main/java/graphicsEngineOld/parts/containers/PartContainer.java
+++ /dev/null
@@ -1,148 +0,0 @@
-package graphicsEngineOld.parts.containers;
-
-import graphicsEngineOld.parts.simpleParts.DrawablePart;
-import graphicsEngineOld.parts.simpleParts.SimplePart;
-
-import java.util.ArrayList;
-import java.util.Objects;
-import java.awt.*;
-
-import org.jetbrains.annotations.Nullable;
-import org.jetbrains.annotations.NotNull;
-
-/**
- * A part container for containing simple parts and aligning them in specified way.
- */
-public class PartContainer extends GenericContainer {
- public AlignmentType alignment;
-
- /**
- * Creates a part container with specified alignment.
- *
- * @param size Size of the container. (Accepts null)
- * @param fixedSize Size fixation by axis. (Null - non-fixed)
- * @param parts Parts to contain. (Accepts null)
- * @param alignment Alignment to use. (By default aligned to top)
- */
- public PartContainer(@Nullable int[] size, @Nullable boolean[] fixedSize,
- @Nullable ArrayList parts, @Nullable AlignmentType alignment) {
- super(size, fixedSize, parts);
- this.alignment = Objects.requireNonNullElse(alignment, AlignmentType.TOP);
- }
-
- /**
- * Draws contained parts one after another.
- *
- * @param g Graphics to use.
- */
- @Override
- public void drawParts(@NotNull Graphics g) {
- RemainderHelper remainingSize = new RemainderHelper(RemainderHelper.getInitialSize(this));
- RemainderHelper drawingLocation = new RemainderHelper(0);
-
- for (DrawablePart drawablePart : parts) {
- if (!remainingSize.checkRemaining()) {
- break;
- }
-
- SimplePart part = (SimplePart) drawablePart;
- if (part != null) {
- drawSinglePart(g, part, remainingSize, drawingLocation);
- }
- }
- }
-
- /**
- * Draws a single contained part.
- *
- * @param g Graphics to use.
- * @param part Part to draw.
- * @param remainingSize Remaining size for drawing.
- * @param drawLocation Location offset from containers location.
- */
- private void drawSinglePart(@NotNull Graphics g, @NotNull SimplePart part,
- @NotNull RemainderHelper remainingSize,
- @NotNull RemainderHelper drawLocation) {
- int[] partLocation;
- int[] partSize;
- int sizeDifference;
- switch (alignment) {
- case LEFT : {
- part.resize(new int[] {remainingSize.x, size[1]}); // stretches if possible
- partSize = part.size;
- sizeDifference = partSize[0];
-
- partLocation = new int[] {
- location[0] + drawLocation.x,
- location[1]};
- break;
- }
- case RIGHT : {
- part.resize(new int[] {remainingSize.x, size[1]}); // stretches if possible
- partSize = part.size;
- sizeDifference = partSize[0];
-
- partLocation = new int[] {
- location[0] + size[0] - drawLocation.x - sizeDifference,
- location[1]};
- break;
- }
- case BOTTOM : {
- part.resize(new int[] {size[0], remainingSize.x}); // stretches if possible
- partSize = part.size;
- sizeDifference = partSize[1];
-
- partLocation = new int[] {
- location[0],
- location[1] + size[1] - drawLocation.x - sizeDifference};
- break;
- }
- case TOP : {}
- default : { // TOP alignment by default
- part.resize(new int[] {size[0], remainingSize.x}); // stretches if possible
- partSize = part.size;
- sizeDifference = partSize[1];
-
- partLocation = new int[] {
- location[0],
- location[1] + drawLocation.x};
- }
- }
- remainingSize.modify((-1) * sizeDifference);
- drawLocation.modify(sizeDifference);
- part.draw(g, partLocation, partSize);
- }
-
- /**
- * A helper class for calculating remainders
- *
- * TODO: update javadoc
- */
- private static class RemainderHelper {
- int x;
-
- RemainderHelper(int x) {
- this.x = x;
- }
-
- void modify(int delta) {
- x += delta;
- }
-
- boolean checkRemaining() {
- return x > 0;
- }
-
- static int getInitialSize(@NotNull PartContainer container) {
- switch (container.alignment) {
- case LEFT, RIGHT : {
- return container.size[0];
- }
- case TOP, BOTTOM : {}
- default : {
- return container.size[1];
- }
- }
- }
- }
-}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngineOld/parts/pages/PageManager.java b/src/main/java/graphicsEngineOld/parts/pages/PageManager.java
index 7069043..90c0ddb 100644
--- a/src/main/java/graphicsEngineOld/parts/pages/PageManager.java
+++ b/src/main/java/graphicsEngineOld/parts/pages/PageManager.java
@@ -26,13 +26,6 @@ public PageManager(@Nullable HashMap pages, @Nullable String activ
setActivePage(initialActivePage(activePage));
}
- /**
- * Empty constructor for a blank page manager containing no pages.
- */
- public PageManager() {
- this(null, null);
- }
-
private HashMap initialPages(@Nullable HashMap pages) {
return Objects.requireNonNullElse(pages, new HashMap<>());
}
@@ -48,21 +41,6 @@ public void setActivePage(@Nullable String activePage) {
}
}
- //todo: add javadoc
- public void addPage(@Nullable String key, @Nullable Page page) {
- if (checkAddableKeyValidity(key) && checkAddablePageValidity(page)) {
- pages.put(key, page);
- }
- }
-
- private boolean checkAddableKeyValidity(@Nullable String key) {
- return !(key == null || pages.containsKey(key));
- }
-
- private boolean checkAddablePageValidity(@Nullable Page page) {
- return !(page == null);
- }
-
/**
* Draws the active page.
*
diff --git a/src/main/java/graphicsEngineOld/parts/simpleParts/SimpleLabel.java b/src/main/java/graphicsEngineOld/parts/simpleParts/SimpleLabel.java
index dbb77fc..1894df7 100644
--- a/src/main/java/graphicsEngineOld/parts/simpleParts/SimpleLabel.java
+++ b/src/main/java/graphicsEngineOld/parts/simpleParts/SimpleLabel.java
@@ -19,11 +19,6 @@ public class SimpleLabel extends ColoredSimplePart {
private String text;
private int[] textOffset;
- // TODO: add javadoc
- public SimpleLabel(@Nullable String text) {
- this(text, null, null);
- }
-
// TODO: add javadoc
public SimpleLabel(@Nullable String text, @Nullable int[] textOffset, @Nullable Color color) {
super(color);
@@ -53,16 +48,4 @@ private void drawText(Graphics g) {
location[0] + size[0] / 2 + textOffset[0],
location[1] + size[1] / 2 + textOffset[1]});
}
-
- public enum TextAlignment {
- CENTER,
- CENTER_LEFT,
- CENTER_RIGHT,
- TOP_CENTER,
- TOP_LEFT,
- TOP_RIGHT,
- BOTTOM_CENTER,
- BOTTOM_LEFT,
- BOTTOM_RIGHT
- }
}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngineOld/presets/HeaderAndFooterPage.java b/src/main/java/graphicsEngineOld/presets/HeaderAndFooterPage.java
deleted file mode 100644
index a05b1ef..0000000
--- a/src/main/java/graphicsEngineOld/presets/HeaderAndFooterPage.java
+++ /dev/null
@@ -1,95 +0,0 @@
-package graphicsEngineOld.presets;
-
-import graphicsEngineOld.engine.data.colors.Palette;
-import graphicsEngineOld.engine.data.colors.PanelColors;
-import graphicsEngineOld.utilities.input.InputChecker;
-import graphicsEngineOld.parts.simpleParts.SimplePart;
-import graphicsEngineOld.parts.containers.AlignmentType;
-import graphicsEngineOld.parts.containers.PartContainer;
-import graphicsEngineOld.parts.pages.Page;
-
-import graphicsEngineOld.presets.panels.CommonHeader;
-import graphicsEngineOld.presets.panels.CommonFooter;
-
-import java.util.ArrayList;
-import java.util.Objects;
-
-import org.jetbrains.annotations.Nullable;
-import org.jetbrains.annotations.NotNull;
-
-// TODO: add javadoc
-public abstract class HeaderAndFooterPage extends Page {
-
- /**
- * Creates a page with header, footer and center.
- *
- * @param inputChecker InputChecker to use. (Null - new InputChecker)
- * @param palette Color palette to use. (Null - default)
- * @param header Header. (null - default)
- * @param footer Footer. (Null - default)
- * @param centralParts ArrayList of central parts. (Null - empty)
- * @param centralAlignment Alignment of the central parts. (Null - aligned to top)
- */
- public HeaderAndFooterPage(@Nullable InputChecker inputChecker,
- @NotNull Palette palette,
- @Nullable CommonHeader header, @Nullable CommonFooter footer,
- @Nullable ArrayList extends SimplePart> centralParts,
- @Nullable AlignmentType centralAlignment) {
- super(inputChecker, palette, new ArrayList<>());
- this.parts.add(makeHeaderContainer(
- palette.panelColors,
- header, footer,
- centralParts, centralAlignment));
- }
-
- // TODO: add javadoc
- private PartContainer makeHeaderContainer(@NotNull PanelColors panelColors,
- @Nullable CommonHeader header, @Nullable CommonFooter footer,
- @Nullable ArrayList extends SimplePart> centralParts,
- @Nullable AlignmentType centralAlignment) {
- return new PartContainer(
- null, null,
- new ArrayList<>() {{
- add(makeCommonHeader(header, panelColors));
- add(makeFooterContainer(panelColors, footer, centralParts, centralAlignment));
- }},
- AlignmentType.TOP);
- }
-
- private static CommonHeader makeCommonHeader(@Nullable CommonHeader header,
- @NotNull PanelColors panelColors) {
- return Objects.requireNonNullElse(
- header,
- new CommonHeader(0, panelColors, null));
- }
-
- // TODO: add javadoc
- private PartContainer makeFooterContainer(@NotNull PanelColors panelColors,
- @Nullable CommonFooter footer,
- @Nullable ArrayList extends SimplePart> centralParts,
- @Nullable AlignmentType centralAlignment) {
- return new PartContainer(null, null,
- new ArrayList<>() {{
- add(makeCommonFooter(footer, panelColors));
- add(makeCentralContainer(centralParts, centralAlignment));
- }},
- AlignmentType.BOTTOM);
- }
-
- private static CommonFooter makeCommonFooter(@Nullable CommonFooter footer,
- @NotNull PanelColors panelColors) {
- return Objects.requireNonNullElse(
- footer,
- new CommonFooter(0, panelColors, null));
- }
-
- // TODO: add javadoc
- private PartContainer makeCentralContainer(@Nullable ArrayList extends SimplePart> centralParts,
- @Nullable AlignmentType centralAlignment) {
- return new PartContainer(null,null,
- new ArrayList<>() {{
- addAll(Objects.requireNonNullElse(centralParts, new ArrayList<>()));
- }},
- Objects.requireNonNullElse(centralAlignment, AlignmentType.TOP));
- }
-}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngineOld/presets/panels/CommonFooter.java b/src/main/java/graphicsEngineOld/presets/panels/CommonFooter.java
deleted file mode 100644
index ff150bb..0000000
--- a/src/main/java/graphicsEngineOld/presets/panels/CommonFooter.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package graphicsEngineOld.presets.panels;
-
-import graphicsEngineOld.engine.data.colors.PanelColors;
-import graphicsEngineOld.parts.simpleParts.DrawablePart;
-import graphicsEngineOld.parts.containers.AlignmentType;
-import graphicsEngineOld.parts.containers.Panel;
-
-import java.util.ArrayList;
-
-import org.jetbrains.annotations.Nullable;
-import org.jetbrains.annotations.NotNull;
-
-// TODO: add javadoc
-public class CommonFooter extends Panel {
- public static final int MINIMUM_HEIGHT = 10;
-
- // TODO: add javadoc
- public CommonFooter(int height, @NotNull PanelColors panelColors,
- @Nullable ArrayList parts) {
- super(new int[] {0, getHeight(height)}, new boolean[] {false, true},
- panelColors.light, panelColors.dark,
- parts, AlignmentType.LEFT);
- }
-
- private static int getHeight(int preferred) {
- return Math.max(MINIMUM_HEIGHT, preferred);
- }
-}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngineOld/presets/panels/CommonHeader.java b/src/main/java/graphicsEngineOld/presets/panels/CommonHeader.java
deleted file mode 100644
index d9fb834..0000000
--- a/src/main/java/graphicsEngineOld/presets/panels/CommonHeader.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package graphicsEngineOld.presets.panels;
-
-import graphicsEngineOld.engine.data.colors.PanelColors;
-import graphicsEngineOld.parts.simpleParts.DrawablePart;
-import graphicsEngineOld.parts.containers.AlignmentType;
-import graphicsEngineOld.parts.containers.Panel;
-
-import java.util.ArrayList;
-
-import org.jetbrains.annotations.Nullable;
-import org.jetbrains.annotations.NotNull;
-
-// TODO: add javadoc
-public class CommonHeader extends Panel {
- public static final int MINIMUM_HEIGHT = 20;
-
- // TODO: add javadoc
- public CommonHeader(int height, @NotNull PanelColors panelColors,
- @Nullable ArrayList parts) {
- super(new int[] {0, getHeight(height)}, new boolean[] {false, true},
- panelColors.light, panelColors.dark,
- parts, AlignmentType.LEFT);
- }
-
- public static int getHeight(int preferred) {
- return Math.max(MINIMUM_HEIGHT, preferred);
- }
-}
\ No newline at end of file
diff --git a/src/main/java/graphicsEngineOld/presets/panels/SidePanel.java b/src/main/java/graphicsEngineOld/presets/panels/SidePanel.java
deleted file mode 100644
index 4266156..0000000
--- a/src/main/java/graphicsEngineOld/presets/panels/SidePanel.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package graphicsEngineOld.presets.panels;
-
-import graphicsEngineOld.engine.data.colors.PanelColors;
-import graphicsEngineOld.parts.containers.AlignmentType;
-import graphicsEngineOld.parts.simpleParts.DrawablePart;
-import graphicsEngineOld.parts.containers.Panel;
-
-import java.util.ArrayList;
-
-import org.jetbrains.annotations.Nullable;
-import org.jetbrains.annotations.NotNull;
-
-public class SidePanel extends Panel {
- /**
- * Creates a simple panel.
- *
- * @param width Width of the panel.
- * @param panelColors panel colors TODO: fix this
- * @param parts ArrayList of containable parts. (Aligned to top)
- */
- public SidePanel(int width, @NotNull PanelColors panelColors,
- @Nullable ArrayList parts) {
- super(new int[] {width, 0}, new boolean[] {true, false},
- panelColors.light, panelColors.dark,
- parts, AlignmentType.TOP);
- }
-}
\ No newline at end of file
diff --git a/src/main/resources/graphicsEngine/images/sample_icon.png b/src/main/resources/graphicsEngine/images/sample_icon.png
new file mode 100644
index 0000000..be2037f
Binary files /dev/null and b/src/main/resources/graphicsEngine/images/sample_icon.png differ
diff --git a/src/main/resources/graphicsEngine/sample.png b/src/main/resources/graphicsEngine/images/sample_image.png
similarity index 100%
rename from src/main/resources/graphicsEngine/sample.png
rename to src/main/resources/graphicsEngine/images/sample_image.png
diff --git a/src/main/resources/graphicsEngine/manual/windowStructure.png b/src/main/resources/graphicsEngine/manual/windowStructure.png
new file mode 100644
index 0000000..ecfafe6
Binary files /dev/null and b/src/main/resources/graphicsEngine/manual/windowStructure.png differ
diff --git a/src/main/resources/graphicsEngine/manual/window_inheritance.png b/src/main/resources/graphicsEngine/manual/window_inheritance.png
new file mode 100644
index 0000000..3ed2b8e
Binary files /dev/null and b/src/main/resources/graphicsEngine/manual/window_inheritance.png differ
diff --git a/src/test/java/graphicsEngineDemo/ReadMe.md b/src/test/java/graphicsEngineDemo/ReadMe.md
index 066e470..ff5a18a 100644
--- a/src/test/java/graphicsEngineDemo/ReadMe.md
+++ b/src/test/java/graphicsEngineDemo/ReadMe.md
@@ -1,7 +1,12 @@
-Graphics engine demos
+# Graphics engine demos
-Currently available:
-* Simplest - everything in just one class.
-* Paged - with multiple pages (currently not available)
+Various demos for demonstrating various capabilities of the Graphics Engine.
-Further instructions will be in the directory of the demo.
\ No newline at end of file
+Currently available demos:
+* Simplest demo - everything in just one class.
+* Overlay demo - one page, with overlay.
+* Two-page demo - one window, two pages.
+* Multi-adapter demo - *self explanatory...*
+* Feature preview - multiple pages demonstrating various features of the GraphicsEngine.
+
+Further instructions will be in the corresponding directory of the demo.
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/d1_simplestDemo/Main.java b/src/test/java/graphicsEngineDemo/d1_simplestDemo/Main.java
new file mode 100644
index 0000000..77e1c38
--- /dev/null
+++ b/src/test/java/graphicsEngineDemo/d1_simplestDemo/Main.java
@@ -0,0 +1,60 @@
+package graphicsEngineDemo.d1_simplestDemo;
+
+import org.jetbrains.annotations.NotNull;
+
+import graphicsEngine.GraphicsAdapter;
+import graphicsEngine.windows.WindowConfig;
+import graphicsEngine.windows.WindowManager;
+import graphicsEngine.windows.WindowUpdater;
+import graphicsEngine.windows.windowTypes.SimpleWindow;
+
+/**
+ * Simplest possible use of the GraphicsEngine.
+ * Everything contained in just one class.
+ * See ReadMe.md for more info.
+ */
+public class Main {
+
+ /**
+ * The main method.
+ *
+ * @param args Command-line arguments.
+ */
+ public static void main(String[] args) {
+ new GraphicsAdapter() {{
+ newWindow(new WindowUpdater(new Window(this)));
+ }};
+ }
+
+ /**
+ * The window to display.
+ */
+ private static class Window extends SimpleWindow {
+ /**
+ * Creates the window.
+ *
+ * @param windowManager A WindowManager object.
+ */
+ public Window(@NotNull WindowManager windowManager) {
+ super(windowManager, new WindowConfig(), null);
+ setDefaultCloseOperation(EXIT_ON_CLOSE); // Not necessary; added for easier use.
+ }
+
+ /**
+ * Gets the key of the window.
+ * Intended for multi-window cases.
+ *
+ * @return The key of this window.
+ */
+ @Override
+ public @NotNull String getWindowKey() {
+ return "window";
+ }
+
+ /**
+ * Adds parts to this window.
+ */
+ @Override
+ public void addParts() {}
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/d1_simplestDemo/ReadMe.md b/src/test/java/graphicsEngineDemo/d1_simplestDemo/ReadMe.md
new file mode 100644
index 0000000..068ea32
--- /dev/null
+++ b/src/test/java/graphicsEngineDemo/d1_simplestDemo/ReadMe.md
@@ -0,0 +1,13 @@
+# Simplest demo
+
+## Abstract
+
+This is a demo demonstrating the simplest possible use of the Graphics Engine.
+
+Starts a blank SimpleWindow.
+
+Everything contained in just one class.
+
+## Instructions
+
+Run `Main.main(String[] args)` to launch this demo.
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/d2_overlayDemo/Main.java b/src/test/java/graphicsEngineDemo/d2_overlayDemo/Main.java
new file mode 100644
index 0000000..aa732aa
--- /dev/null
+++ b/src/test/java/graphicsEngineDemo/d2_overlayDemo/Main.java
@@ -0,0 +1,21 @@
+package graphicsEngineDemo.d2_overlayDemo;
+
+import graphicsEngine.GraphicsAdapter;
+import graphicsEngine.windows.WindowUpdater;
+
+/**
+ * GraphicsEngine demo demonstrating the use of overlays.
+ * See ReadMe.md for more info.
+ */
+public class Main {
+ /**
+ * The main method.
+ *
+ * @param args Command-line arguments.
+ */
+ public static void main(String[] args) {
+ new GraphicsAdapter() {{
+ newWindow(new WindowUpdater(new Window(this)));
+ }};
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/d2_overlayDemo/ReadMe.md b/src/test/java/graphicsEngineDemo/d2_overlayDemo/ReadMe.md
new file mode 100644
index 0000000..fcfde0b
--- /dev/null
+++ b/src/test/java/graphicsEngineDemo/d2_overlayDemo/ReadMe.md
@@ -0,0 +1,13 @@
+# Overlay demo
+
+## Abstract
+
+This is a demo for demonstrating the overlay functionality.
+
+Launches a SinglePageWindow with an overlay.
+
+Contains buttons for toggling overlay visibility and color.
+
+## Instructions
+
+Run `Main.main(String[] args)` to launch this demo.
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/d2_overlayDemo/Window.java b/src/test/java/graphicsEngineDemo/d2_overlayDemo/Window.java
new file mode 100644
index 0000000..7be6e33
--- /dev/null
+++ b/src/test/java/graphicsEngineDemo/d2_overlayDemo/Window.java
@@ -0,0 +1,80 @@
+package graphicsEngineDemo.d2_overlayDemo;
+
+import java.util.List;
+import java.awt.event.ActionListener;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import graphicsEngine.windows.WindowConfig;
+import graphicsEngine.windows.WindowManager;
+import graphicsEngine.windows.windowTypes.SinglePageWindow;
+import graphicsEngine.pages.AbstractPage;
+import graphicsEngine.presets.SimpleOverlay;
+
+import graphicsEngineDemo.d2_overlayDemo.page.Page;
+import graphicsEngineDemo.d2_overlayDemo.overlay.Overlay;
+import graphicsEngineDemo.d2_overlayDemo.buttons.ButtonListener;
+
+/**
+ * The window to display.
+ */
+public class Window extends SinglePageWindow {
+ private static final @NotNull String WINDOW_TITLE = "Overlay demo";
+ private @Nullable ButtonListener buttonListener;
+
+ //TODO: add javadoc
+ protected Window(@NotNull WindowManager windowManager) {
+ super(windowManager, new WindowConfig(), null, null);
+ setDefaultCloseOperation(EXIT_ON_CLOSE);
+ setTitle(WINDOW_TITLE);
+ setOverlay(new Overlay(buttonListener));
+ }
+
+ /**
+ * Redundant as there is only one window.
+ * TODO: finish this javadoc
+ *
+ * @return The key of this window.
+ */
+ @Override
+ public final @NotNull String getWindowKey() {
+ return "window";
+ }
+
+ /**
+ * Adds known listeners to this page.
+ * Override this to add custom listeners.
+ *
+ * @param list List of listeners to add.
+ *
+ * @return Remaining unknown listeners.
+ */
+ @Override
+ public @NotNull List addListeners(@Nullable List list) {
+ buttonListener = new ButtonListener(this);
+ return super.addListeners(list);
+ }
+
+ /**
+ * Prepares a page to add to this window.
+ *
+ * @return An AbstractPage object.
+ */
+ @Override
+ public final @NotNull AbstractPage getPage() {
+ return new Page(buttonListener, null);
+ }
+
+ //TODO: add javadoc
+ public void toggleOverlayColor() {
+ try {
+ @NotNull SimpleOverlay simpleOverlay = getOverlay(); //throws ClassCastException
+ if (simpleOverlay instanceof Overlay) {
+ ((Overlay) simpleOverlay).toggleColor();
+ }
+ } catch (ClassCastException ignored) {
+ //glassPane does not contain a SimpleOverlay object
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/d2_overlayDemo/buttons/Button1.java b/src/test/java/graphicsEngineDemo/d2_overlayDemo/buttons/Button1.java
new file mode 100644
index 0000000..d20e6fe
--- /dev/null
+++ b/src/test/java/graphicsEngineDemo/d2_overlayDemo/buttons/Button1.java
@@ -0,0 +1,18 @@
+package graphicsEngineDemo.d2_overlayDemo.buttons;
+
+import java.awt.event.ActionListener;
+
+import org.jetbrains.annotations.Nullable;
+
+import graphicsEngine.parts.SimpleJButton;
+
+/**
+ * A simple button for showing the overlay.
+ */
+public class Button1 extends SimpleJButton {
+ public static final String ACTION_COMMAND = "show";
+
+ public Button1(@Nullable ActionListener actionListener) {
+ super("Show", ACTION_COMMAND, actionListener);
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/d2_overlayDemo/buttons/Button2.java b/src/test/java/graphicsEngineDemo/d2_overlayDemo/buttons/Button2.java
new file mode 100644
index 0000000..f264db3
--- /dev/null
+++ b/src/test/java/graphicsEngineDemo/d2_overlayDemo/buttons/Button2.java
@@ -0,0 +1,18 @@
+package graphicsEngineDemo.d2_overlayDemo.buttons;
+
+import java.awt.event.ActionListener;
+
+import org.jetbrains.annotations.Nullable;
+
+import graphicsEngine.parts.SimpleJButton;
+
+/**
+ * A simple button for hiding the overlay.
+ */
+public class Button2 extends SimpleJButton {
+ public static final String ACTION_COMMAND = "hide";
+
+ public Button2(@Nullable ActionListener actionListener) {
+ super("Hide", ACTION_COMMAND, actionListener);
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/d2_overlayDemo/buttons/Button3.java b/src/test/java/graphicsEngineDemo/d2_overlayDemo/buttons/Button3.java
new file mode 100644
index 0000000..0a6ed23
--- /dev/null
+++ b/src/test/java/graphicsEngineDemo/d2_overlayDemo/buttons/Button3.java
@@ -0,0 +1,18 @@
+package graphicsEngineDemo.d2_overlayDemo.buttons;
+
+import java.awt.event.ActionListener;
+
+import org.jetbrains.annotations.Nullable;
+
+import graphicsEngine.parts.SimpleJButton;
+
+/**
+ * A simple button for toggling the visibility of the overlay.
+ */
+public class Button3 extends SimpleJButton {
+ public static final String ACTION_COMMAND = "toggle";
+
+ public Button3(@Nullable ActionListener actionListener) {
+ super("Toggle visibility", ACTION_COMMAND, actionListener);
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/d2_overlayDemo/buttons/Button4.java b/src/test/java/graphicsEngineDemo/d2_overlayDemo/buttons/Button4.java
new file mode 100644
index 0000000..028286b
--- /dev/null
+++ b/src/test/java/graphicsEngineDemo/d2_overlayDemo/buttons/Button4.java
@@ -0,0 +1,18 @@
+package graphicsEngineDemo.d2_overlayDemo.buttons;
+
+import java.awt.event.ActionListener;
+
+import org.jetbrains.annotations.Nullable;
+
+import graphicsEngine.parts.SimpleJButton;
+
+/**
+ * A simple button for toggling the color of the overlay.
+ */
+public class Button4 extends SimpleJButton {
+ public static final String ACTION_COMMAND = "color";
+
+ public Button4(@Nullable ActionListener actionListener) {
+ super("Toggle color", ACTION_COMMAND, actionListener);
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/d2_overlayDemo/buttons/ButtonListener.java b/src/test/java/graphicsEngineDemo/d2_overlayDemo/buttons/ButtonListener.java
new file mode 100644
index 0000000..2d83ae4
--- /dev/null
+++ b/src/test/java/graphicsEngineDemo/d2_overlayDemo/buttons/ButtonListener.java
@@ -0,0 +1,50 @@
+package graphicsEngineDemo.d2_overlayDemo.buttons;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import org.jetbrains.annotations.NotNull;
+
+import static consoleUtils.ConsoleUtils.printLine;
+
+import graphicsEngineDemo.d2_overlayDemo.Window;
+
+/**
+ * A class for containing buttons.
+ */
+public class ButtonListener implements ActionListener {
+ private final Window window;
+
+ //TODO: add javadocs
+ public ButtonListener(@NotNull Window window) {
+ this.window = window;
+ }
+
+ /**
+ * Invoked when an action occurs.
+ *
+ * @param e the event to be processed
+ */
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ if (actionCheck(e)) return;
+ printLine("A button has been pressed but no action set up");
+ }
+
+ private boolean actionCheck(@NotNull ActionEvent e) {
+ switch (e.getActionCommand()) {
+ case Button1.ACTION_COMMAND ->
+ window.showOverlay();
+ case Button2.ACTION_COMMAND ->
+ window.hideOverlay();
+ case Button3.ACTION_COMMAND ->
+ window.toggleOverlay();
+ case Button4.ACTION_COMMAND ->
+ window.toggleOverlayColor();
+ default -> {
+ return false;
+ }
+ }
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/d2_overlayDemo/overlay/Overlay.java b/src/test/java/graphicsEngineDemo/d2_overlayDemo/overlay/Overlay.java
new file mode 100644
index 0000000..b785cc2
--- /dev/null
+++ b/src/test/java/graphicsEngineDemo/d2_overlayDemo/overlay/Overlay.java
@@ -0,0 +1,42 @@
+package graphicsEngineDemo.d2_overlayDemo.overlay;
+
+import java.awt.Color;
+import java.awt.event.ActionListener;
+import javax.swing.BoxLayout;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import graphicsEngine.presets.SimpleOverlay;
+
+import graphicsEngineDemo.d2_overlayDemo.buttons.Button4;
+
+/**
+ * TODO: finish this javadoc
+ */
+public class Overlay extends SimpleOverlay {
+ private static final boolean INITIAL_COLOR_STATE = false;
+ private boolean colorState;
+
+ //TODO: add javadoc
+ public Overlay(@Nullable ActionListener actionListener) {
+ super(getColorByState(INITIAL_COLOR_STATE));
+ colorState = INITIAL_COLOR_STATE;
+ setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
+ add(new Button4(actionListener));
+ }
+
+ private static @NotNull Color getColorByState(boolean state) {
+ if (state) {
+ return OverlayColors.GREEN;
+ } else {
+ return OverlayColors.RED;
+ }
+ }
+
+ //TODO: add javadoc
+ public void toggleColor() {
+ colorState = !colorState;
+ setColor(getColorByState(colorState));
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/d2_overlayDemo/overlay/OverlayColors.java b/src/test/java/graphicsEngineDemo/d2_overlayDemo/overlay/OverlayColors.java
new file mode 100644
index 0000000..2f3ad56
--- /dev/null
+++ b/src/test/java/graphicsEngineDemo/d2_overlayDemo/overlay/OverlayColors.java
@@ -0,0 +1,15 @@
+package graphicsEngineDemo.d2_overlayDemo.overlay;
+
+import java.awt.Color;
+
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * TODO: finish this javadoc
+ */
+class OverlayColors {
+ private static final int COMMON_TRANSPARENCY = 100;
+ protected static final @NotNull Color
+ RED = new Color(100, 0, 0, COMMON_TRANSPARENCY),
+ GREEN = new Color(0, 100, 0, COMMON_TRANSPARENCY);
+}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/d2_overlayDemo/page/Footer.java b/src/test/java/graphicsEngineDemo/d2_overlayDemo/page/Footer.java
new file mode 100644
index 0000000..6e9149e
--- /dev/null
+++ b/src/test/java/graphicsEngineDemo/d2_overlayDemo/page/Footer.java
@@ -0,0 +1,18 @@
+package graphicsEngineDemo.d2_overlayDemo.page;
+
+import org.jetbrains.annotations.Nullable;
+
+import graphicsEngine.colors.SimpleColorScheme;
+import graphicsEngine.panels.BorderProperties;
+import graphicsEngine.pages.panels.AbstractFooter;
+
+//TODO: add javadocs
+class Footer extends AbstractFooter {
+ private static final int HEIGHT = 100;
+
+ //TODO: add javadoc
+ protected Footer(@Nullable SimpleColorScheme panelColors,
+ @Nullable BorderProperties borderProperties) {
+ super(panelColors, HEIGHT, borderProperties);
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/d2_overlayDemo/page/Header.java b/src/test/java/graphicsEngineDemo/d2_overlayDemo/page/Header.java
new file mode 100644
index 0000000..554499c
--- /dev/null
+++ b/src/test/java/graphicsEngineDemo/d2_overlayDemo/page/Header.java
@@ -0,0 +1,32 @@
+package graphicsEngineDemo.d2_overlayDemo.page;
+
+import java.awt.event.ActionListener;
+import javax.swing.BoxLayout;
+
+import org.jetbrains.annotations.Nullable;
+
+import graphicsEngine.colors.SimpleColorScheme;
+import graphicsEngine.panels.BorderProperties;
+import graphicsEngine.pages.panels.AbstractHeader;
+
+import graphicsEngineDemo.d2_overlayDemo.buttons.*;
+
+//TODO: add javadocs
+class Header extends AbstractHeader {
+ private static final int HEIGHT = 50;
+
+ //TODO: add javadoc
+ protected Header(@Nullable SimpleColorScheme panelColors,
+ @Nullable BorderProperties borderProperties,
+ @Nullable ActionListener actionListener) {
+ super(panelColors, HEIGHT, borderProperties);
+ addButtons(actionListener);
+ }
+
+ private void addButtons(@Nullable ActionListener actionListener) {
+ setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
+ add(new Button1(actionListener));
+ add(new Button2(actionListener));
+ add(new Button3(actionListener));
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/d2_overlayDemo/page/Page.java b/src/test/java/graphicsEngineDemo/d2_overlayDemo/page/Page.java
new file mode 100644
index 0000000..e42b40a
--- /dev/null
+++ b/src/test/java/graphicsEngineDemo/d2_overlayDemo/page/Page.java
@@ -0,0 +1,82 @@
+package graphicsEngineDemo.d2_overlayDemo.page;
+
+import java.util.List;
+import java.util.ArrayList;
+import java.awt.event.ActionListener;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import graphicsEngine.colors.SimpleColorScheme;
+import graphicsEngine.panels.BorderProperties;
+import graphicsEngine.panels.DynamicPanel;
+import graphicsEngine.pages.HeaderAndFooterPage;
+import graphicsEngine.pages.panels.AbstractHeader;
+import graphicsEngine.pages.panels.AbstractFooter;
+
+import graphicsEngineDemo.d2_overlayDemo.buttons.*;
+
+//TODO: add javadocs
+public class Page extends HeaderAndFooterPage {
+ private ButtonListener buttonListener;
+
+ //TODO: add javadoc
+ public Page(@Nullable ActionListener actionListener,
+ @Nullable SimpleColorScheme panelColors) {
+ super(
+ new ArrayList<>() {{
+ add(actionListener);
+ }},
+ null);
+ initializePanels(panelColors, null, null);
+ }
+
+ //TODO: add javadoc
+ @Override
+ public @NotNull String getPageKey() {
+ return "page";
+ }
+
+ /**
+ * Adds known listeners to this page.
+ * Override this to add custom listeners.
+ *
+ * @param list List of listeners to add.
+ *
+ * @return Remaining unknown listeners.
+ */
+ @Override
+ public @NotNull List<@Nullable ActionListener> addListeners(@Nullable List<@Nullable ActionListener> list) {
+ @Nullable List remainder = super.addListeners(list);
+ for (int i = 0; i < remainder.size(); i++) {
+ @Nullable ActionListener listener = remainder.get(i);
+ if (listener instanceof ButtonListener) {
+ buttonListener = (ButtonListener) listener;
+ remainder.remove(i);
+ i--;
+ }
+ }
+ return remainder;
+ }
+
+ //TODO: add javadoc
+ @Override
+ public @NotNull AbstractHeader getHeader(@Nullable SimpleColorScheme headerColors,
+ @Nullable BorderProperties borderProperties) {
+ return new Header(headerColors, borderProperties, buttonListener);
+ }
+
+ //TODO: add javadoc
+ @Override
+ public @NotNull AbstractFooter getFooter(@Nullable SimpleColorScheme footerColors,
+ @Nullable BorderProperties borderProperties) {
+ return new Footer(footerColors, borderProperties);
+ }
+
+ //TODO: add javadoc
+ @Override
+ public @Nullable DynamicPanel getBody(@Nullable SimpleColorScheme colors,
+ @Nullable BorderProperties borderProperties) {
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/d3_twoPageDemo/Main.java b/src/test/java/graphicsEngineDemo/d3_twoPageDemo/Main.java
new file mode 100644
index 0000000..ddeb8db
--- /dev/null
+++ b/src/test/java/graphicsEngineDemo/d3_twoPageDemo/Main.java
@@ -0,0 +1,21 @@
+package graphicsEngineDemo.d3_twoPageDemo;
+
+import graphicsEngine.GraphicsAdapter;
+import graphicsEngine.windows.WindowUpdater;
+
+/**
+ * GraphicsEngine demo demonstrating support of multiple pages within a single window.
+ * See ReadMe.md for more info.
+ */
+public class Main {
+ /**
+ * The main method.
+ *
+ * @param args Command-line arguments.
+ */
+ public static void main(String[] args) {
+ new GraphicsAdapter() {{
+ newWindow(new WindowUpdater(new Window(this)));
+ }};
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/d3_twoPageDemo/ReadMe.md b/src/test/java/graphicsEngineDemo/d3_twoPageDemo/ReadMe.md
new file mode 100644
index 0000000..e9ee923
--- /dev/null
+++ b/src/test/java/graphicsEngineDemo/d3_twoPageDemo/ReadMe.md
@@ -0,0 +1,9 @@
+# Two-page demo
+
+## Abstract
+
+This is a demo for demonstrating the capability to have multiple pages within a window.
+
+## Instructions
+
+Run `Main.main(String[] args)` to launch this demo.
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/d3_twoPageDemo/Window.java b/src/test/java/graphicsEngineDemo/d3_twoPageDemo/Window.java
new file mode 100644
index 0000000..9f03d4b
--- /dev/null
+++ b/src/test/java/graphicsEngineDemo/d3_twoPageDemo/Window.java
@@ -0,0 +1,75 @@
+package graphicsEngineDemo.d3_twoPageDemo;
+
+import java.util.List;
+import java.util.ArrayList;
+import java.awt.Color;
+import java.awt.event.ActionListener;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import graphicsEngine.windows.WindowManager;
+import graphicsEngine.windows.WindowConfig;
+import graphicsEngine.windows.windowTypes.MultiPageWindow;
+import graphicsEngine.pages.AbstractPage;
+
+import graphicsEngineDemo.d3_twoPageDemo.pages.Page1;
+import graphicsEngineDemo.d3_twoPageDemo.pages.Page2;
+import graphicsEngineDemo.d3_twoPageDemo.parts.ButtonListener;
+
+//TODO: add javadocs
+public class Window extends MultiPageWindow {
+ private ButtonListener buttonListener;
+
+ //TODO: add javadoc
+ public Window(@NotNull WindowManager windowManager) {
+ super(windowManager, config(), null, null);
+ setActivePage(Page1.getStaticPageKey());
+ }
+
+ /**
+ * Hardcoded configuration of a new Window object.
+ *
+ * @return Window configuration.
+ */
+ private static @NotNull WindowConfig config() {
+ String title = "Two-page demo";
+ int[]
+ size = new int[]{600, 400},
+ location = new int[]{50, 50};
+ WindowConfig config = new WindowConfig(title, size, location);
+ config.closeOperation = EXIT_ON_CLOSE;
+ return config;
+ }
+
+ /**
+ * Adds known listeners to this page.
+ * Override this to add custom listeners.
+ *
+ * @param list List of listeners to add.
+ *
+ * @return Remaining unknown listeners.
+ */
+ @Override
+ public @NotNull List addListeners(@Nullable List list) {
+ buttonListener = new ButtonListener(this);
+ return super.addListeners(list);
+ }
+
+ //TODO: add javadoc
+ @Override
+ public final @NotNull String getWindowKey() {
+ return "window";
+ }
+
+ /**
+ * Adds pages to this window.
+ */
+ @Override
+ public @NotNull List getInitialPages() {
+ return new ArrayList<>() {{
+ add(new Page1(buttonListener, new Color(200, 120, 0)));
+ add(new Page2(buttonListener, new Color(200,80,100)));
+ }};
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/d3_twoPageDemo/pages/AbstractCommonPage.java b/src/test/java/graphicsEngineDemo/d3_twoPageDemo/pages/AbstractCommonPage.java
new file mode 100644
index 0000000..8d70e6e
--- /dev/null
+++ b/src/test/java/graphicsEngineDemo/d3_twoPageDemo/pages/AbstractCommonPage.java
@@ -0,0 +1,104 @@
+package graphicsEngineDemo.d3_twoPageDemo.pages;
+
+import java.util.Objects;
+import java.util.List;
+import java.util.ArrayList;
+import java.awt.Color;
+import java.awt.event.ActionListener;
+import javax.swing.BoxLayout;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import graphicsEngine.colors.ColorUtilities;
+import graphicsEngine.colors.SimpleColorScheme;
+import graphicsEngine.panels.BorderProperties;
+import graphicsEngine.panels.DynamicPanel;
+import graphicsEngine.pages.HeaderAndFooterPage;
+import graphicsEngine.pages.panels.AbstractFooter;
+import graphicsEngine.pages.panels.AbstractHeader;
+import graphicsEngine.parts.labels.SimpleLabel;
+
+import graphicsEngineDemo.d3_twoPageDemo.parts.CommonHeader;
+import graphicsEngineDemo.d3_twoPageDemo.parts.ButtonListener;
+import graphicsEngineDemo.d3_twoPageDemo.parts.CommonFooter;
+
+//TODO: add javadoc
+abstract class AbstractCommonPage extends HeaderAndFooterPage {
+ private ButtonListener headerButtonListener;
+
+ private static final @NotNull Color
+ DEFAULT_BACKGROUND = ColorUtilities.DEFAULT_COLOR_OPAQUE,
+ LABEL_TEXT_COLOR = new Color(30, 30, 150);
+ private static final @NotNull String DEFAULT_LABEL = "No label defined for this page";
+ private final @NotNull String labelText;
+
+ //TODO: add javadoc
+ protected AbstractCommonPage(@Nullable ActionListener buttonListener,
+ @Nullable String labelText) {
+ super(
+ new ArrayList<>() {{
+ add(buttonListener);
+ }},
+ null);
+ this.labelText = Objects.requireNonNullElse(labelText, DEFAULT_LABEL);
+ initializePanels(null, getBodyColors(), null);
+ }
+
+ private static SimpleColorScheme getBodyColors() {
+ return new SimpleColorScheme(
+ ColorUtilities.DEFAULT_COLOR_TRANSPARENT,
+ LABEL_TEXT_COLOR);
+ }
+
+ /**
+ * Adds known listeners to this page.
+ * Override this to add custom listeners.
+ *
+ * @param list List of listeners to add.
+ *
+ * @return Remaining unknown listeners.
+ */
+ @Override
+ public @NotNull List addListeners(@Nullable List list) {
+ List remainder = super.addListeners(list);
+ for (int i = 0; i < remainder.size(); i++) {
+ ActionListener listener = remainder.get(i);
+ if (listener instanceof ButtonListener) {
+ headerButtonListener = (ButtonListener) listener;
+ remainder.remove(i);
+ i--;
+ }
+ }
+ return remainder;
+ }
+
+ //TODO: add javadoc
+ @Override
+ public @NotNull AbstractHeader getHeader(@Nullable SimpleColorScheme headerColors,
+ @Nullable BorderProperties borderProperties) {
+ return new CommonHeader(headerColors, borderProperties, headerButtonListener);
+ }
+
+ //TODO: add javadoc
+ @Override
+ public @NotNull AbstractFooter getFooter(@Nullable SimpleColorScheme footerColors,
+ @Nullable BorderProperties borderProperties) {
+ return new CommonFooter(footerColors, borderProperties);
+ }
+
+ @Override
+ public @Nullable DynamicPanel getBody(@Nullable SimpleColorScheme colors,
+ @Nullable BorderProperties borderProperties) {
+ return new DynamicPanel(colors) {{
+ setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
+ add(new SimpleLabel(labelText, getPanelColors().getSecondaryColor()));
+ }};
+ }
+
+ //TODO: add javadoc
+ @Override
+ public void setBackground(@Nullable Color background) {
+ super.setBackground(Objects.requireNonNullElse(background, DEFAULT_BACKGROUND));
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/d3_twoPageDemo/pages/Page1.java b/src/test/java/graphicsEngineDemo/d3_twoPageDemo/pages/Page1.java
new file mode 100644
index 0000000..3a8ce45
--- /dev/null
+++ b/src/test/java/graphicsEngineDemo/d3_twoPageDemo/pages/Page1.java
@@ -0,0 +1,33 @@
+package graphicsEngineDemo.d3_twoPageDemo.pages;
+
+import java.awt.Color;
+import java.awt.event.ActionListener;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+//TODO: add javadocs
+public class Page1 extends AbstractCommonPage {
+ //TODO: add javadoc
+ public Page1() {
+ this(null, null);
+ }
+
+ //TODO: add javadoc
+ public Page1(@Nullable ActionListener actionListener,
+ @Nullable Color background) {
+ super(actionListener, "This is page 1");
+ setBackground(background);
+ }
+
+ //TODO: add javadoc
+ @Override
+ public @NotNull String getPageKey() {
+ return "page1";
+ }
+
+ //TODO: add javadoc
+ public static @NotNull String getStaticPageKey() {
+ return (new Page1()).getPageKey();
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/d3_twoPageDemo/pages/Page2.java b/src/test/java/graphicsEngineDemo/d3_twoPageDemo/pages/Page2.java
new file mode 100644
index 0000000..f711d8b
--- /dev/null
+++ b/src/test/java/graphicsEngineDemo/d3_twoPageDemo/pages/Page2.java
@@ -0,0 +1,33 @@
+package graphicsEngineDemo.d3_twoPageDemo.pages;
+
+import java.awt.Color;
+import java.awt.event.ActionListener;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+//TODO: add javadocs
+public class Page2 extends AbstractCommonPage {
+ //TODO: add javadoc
+ public Page2() {
+ this(null, null);
+ }
+
+ //TODO: add javadoc
+ public Page2(@Nullable ActionListener actionListener,
+ @Nullable Color background) {
+ super(actionListener, "This is page 2");
+ setBackground(background);
+ }
+
+ //TODO: add javadoc
+ @Override
+ public @NotNull String getPageKey() {
+ return "page2";
+ }
+
+ //TODO: add javadoc
+ public static @NotNull String getStaticPageKey() {
+ return (new Page2()).getPageKey();
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/d3_twoPageDemo/parts/ButtonListener.java b/src/test/java/graphicsEngineDemo/d3_twoPageDemo/parts/ButtonListener.java
new file mode 100644
index 0000000..0f63a0f
--- /dev/null
+++ b/src/test/java/graphicsEngineDemo/d3_twoPageDemo/parts/ButtonListener.java
@@ -0,0 +1,69 @@
+package graphicsEngineDemo.d3_twoPageDemo.parts;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import static consoleUtils.ConsoleUtils.printLine;
+
+import graphicsEngine.parts.SimpleJButton;
+
+import graphicsEngineDemo.d3_twoPageDemo.Window;
+import graphicsEngineDemo.d3_twoPageDemo.pages.Page1;
+import graphicsEngineDemo.d3_twoPageDemo.pages.Page2;
+
+//TODO: add javadoc
+public class ButtonListener implements ActionListener {
+ private final Window window;
+
+ //TODO: add javadoc
+ public ButtonListener(@NotNull Window window) {
+ this.window = window;
+ }
+
+ /**
+ * Invoked when an action occurs.
+ *
+ * @param e the event to be processed
+ */
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ if (actionCheck(e)) return;
+ printLine("A button has been pressed but no action set up");
+ }
+
+ private boolean actionCheck(@NotNull ActionEvent e) {
+ switch (e.getActionCommand()) {
+ case Button1.ACTION_COMMAND -> window.setActivePage(Page1.getStaticPageKey());
+ case Button2.ACTION_COMMAND -> window.setActivePage(Page2.getStaticPageKey());
+ default -> {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ //TODO: add javadoc
+ protected static class Button1 extends SimpleJButton {
+ //TODO: add javadoc
+ protected static final String ACTION_COMMAND = "button1";
+
+ //TODO: add javadoc
+ protected Button1(@Nullable ActionListener actionListener) {
+ super("Page 1", ACTION_COMMAND, actionListener);
+ }
+ }
+
+ //TODO: add javadoc
+ protected static class Button2 extends SimpleJButton {
+ //TODO: add javadoc
+ protected static final String ACTION_COMMAND = "button2";
+
+ //TODO: add javadoc
+ protected Button2(@Nullable ActionListener actionListener) {
+ super("Page 2", ACTION_COMMAND, actionListener);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/d3_twoPageDemo/parts/CommonFooter.java b/src/test/java/graphicsEngineDemo/d3_twoPageDemo/parts/CommonFooter.java
new file mode 100644
index 0000000..32d2aa3
--- /dev/null
+++ b/src/test/java/graphicsEngineDemo/d3_twoPageDemo/parts/CommonFooter.java
@@ -0,0 +1,17 @@
+package graphicsEngineDemo.d3_twoPageDemo.parts;
+
+import org.jetbrains.annotations.Nullable;
+
+import graphicsEngine.colors.SimpleColorScheme;
+import graphicsEngine.panels.BorderProperties;
+import graphicsEngine.pages.panels.AbstractFooter;
+
+//TODO: finish this and add javadocs
+public class CommonFooter extends AbstractFooter {
+ private static final int HEIGHT = 100;
+
+ public CommonFooter(@Nullable SimpleColorScheme colors,
+ @Nullable BorderProperties borderProperties) {
+ super(colors, HEIGHT, borderProperties);
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/d3_twoPageDemo/parts/CommonHeader.java b/src/test/java/graphicsEngineDemo/d3_twoPageDemo/parts/CommonHeader.java
new file mode 100644
index 0000000..4685f19
--- /dev/null
+++ b/src/test/java/graphicsEngineDemo/d3_twoPageDemo/parts/CommonHeader.java
@@ -0,0 +1,28 @@
+package graphicsEngineDemo.d3_twoPageDemo.parts;
+
+import java.awt.event.ActionListener;
+import javax.swing.BoxLayout;
+
+import org.jetbrains.annotations.Nullable;
+
+import graphicsEngine.colors.SimpleColorScheme;
+import graphicsEngine.panels.BorderProperties;
+import graphicsEngine.pages.panels.AbstractHeader;
+
+//TODO: finish this and add javadocs
+public class CommonHeader extends AbstractHeader {
+ private static final int HEIGHT = 50;
+
+ public CommonHeader(@Nullable SimpleColorScheme colors,
+ @Nullable BorderProperties borderProperties,
+ @Nullable ActionListener actionListener) {
+ super(colors, HEIGHT, borderProperties);
+ addButtons(actionListener);
+ }
+
+ private void addButtons(@Nullable ActionListener actionListener) {
+ setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
+ add(new ButtonListener.Button1(actionListener));
+ add(new ButtonListener.Button2(actionListener));
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/d4_multiAdapterDemo/Main.java b/src/test/java/graphicsEngineDemo/d4_multiAdapterDemo/Main.java
new file mode 100644
index 0000000..8737a3d
--- /dev/null
+++ b/src/test/java/graphicsEngineDemo/d4_multiAdapterDemo/Main.java
@@ -0,0 +1,132 @@
+package graphicsEngineDemo.d4_multiAdapterDemo;
+
+import org.jetbrains.annotations.NotNull;
+
+import graphicsEngine.GraphicsAdapter;
+import graphicsEngine.windows.WindowManager;
+import graphicsEngine.windows.WindowUpdater;
+import graphicsEngine.windows.WindowConfig;
+import graphicsEngine.windows.windowTypes.SimpleWindow;
+
+/**
+ * GraphicsEngine demo demonstrating the capability to simultaneously run multiple graphics adapters.
+ * See ReadMe.md for more info.
+ */
+public class Main {
+ private static GraphicsAdapter adapter1;
+ private static GraphicsAdapter adapter2;
+
+ /**
+ * The main method.
+ *
+ * @param args Command-line arguments.
+ */
+ public static void main(String[] args) {
+ adapter1 = new GraphicsAdapter() {{
+ newWindow(new WindowUpdater(new SimpleWindow1(this)));
+ }};
+ adapter2 = new GraphicsAdapter() {{
+ newWindow(new WindowUpdater(new SimpleWindow2(this)));
+ newWindow(new WindowUpdater(new PagedWindow(this)));
+ }};
+ }
+
+ private static class SimpleWindow1 extends SimpleWindow {
+ //TODO: add javadoc
+ public SimpleWindow1(@NotNull WindowManager windowManager) {
+ super(windowManager, config(), null);
+ }
+
+ /**
+ * Hardcoded configuration of a new SimpleWindow1 object.
+ *
+ * @return Window configuration.
+ */
+ private static WindowConfig config() {
+ String title = "Adapter 1 - Simple window 1";
+ int[]
+ size = new int[] {300, 200},
+ location = new int[] {50, 50};
+ WindowConfig config = new WindowConfig(title, size, location);
+ config.closeOperation = EXIT_ON_CLOSE;
+ return config;
+ }
+
+ @Override
+ public @NotNull String getWindowKey() {
+ return "window";
+ }
+
+ /**
+ * Adds parts to this window.
+ */
+ @Override
+ public void addParts() {}
+ }
+
+ private static class SimpleWindow2 extends SimpleWindow {
+ //TODO: add javadoc
+ public SimpleWindow2(@NotNull WindowManager windowManager) {
+ super(windowManager, config(), null);
+ }
+
+ /**
+ * Hardcoded configuration of a new SimpleWindow2 object.
+ *
+ * @return Window configuration.
+ */
+ private static WindowConfig config() {
+ String title = "Adapter 2 - Simple window 2";
+ int[]
+ size = new int[] {300, 200},
+ location = new int[] {50, 300};
+ WindowConfig config = new WindowConfig(title, size, location);
+ config.closeOperation = DISPOSE_ON_CLOSE;
+ return config;
+ }
+
+ @Override
+ public @NotNull String getWindowKey() {
+ return "simpleWindow";
+ }
+
+ /**
+ * Adds parts to this window.
+ */
+ @Override
+ public void addParts() {}
+ }
+
+ private static class PagedWindow extends SimpleWindow {
+ //TODO: add javadoc
+ public PagedWindow(@NotNull WindowManager windowManager) {
+ super(windowManager, config(), null);
+ }
+
+ /**
+ * Hardcoded configuration of a new PagedWindow object.
+ *
+ * @return Window configuration.
+ */
+ private static WindowConfig config() {
+ String title = "Adapter 2 - Paged window";
+ int[]
+ size = new int[] {600, 400},
+ location = new int[] {400, 300};
+ WindowConfig config = new WindowConfig(title, size, location);
+ config.closeOperation = DISPOSE_ON_CLOSE;
+ return config;
+ }
+
+ @Override
+ public @NotNull String getWindowKey() {
+ return "pagedWindow";
+ }
+
+ /**
+ * Adds parts to this window.
+ */
+ @Override
+ public void addParts() {}
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/d4_multiAdapterDemo/ReadMe.md b/src/test/java/graphicsEngineDemo/d4_multiAdapterDemo/ReadMe.md
new file mode 100644
index 0000000..82197d5
--- /dev/null
+++ b/src/test/java/graphicsEngineDemo/d4_multiAdapterDemo/ReadMe.md
@@ -0,0 +1,13 @@
+# Multi-adapter demo
+
+## Abstract
+
+This is a demo for demonstrating the capability to simultaneously run multiple instances of `GraphicsAdapter` using the Graphics Engine.
+
+## Instructions
+
+Run `Main.main(String[] args)` to launch this demo.
+
+## Notice
+
+*Not quite finished yet...*
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/d5_featurePreview/Main.java b/src/test/java/graphicsEngineDemo/d5_featurePreview/Main.java
new file mode 100644
index 0000000..101d7b4
--- /dev/null
+++ b/src/test/java/graphicsEngineDemo/d5_featurePreview/Main.java
@@ -0,0 +1,23 @@
+package graphicsEngineDemo.d5_featurePreview;
+
+import graphicsEngine.GraphicsAdapter;
+import graphicsEngine.windows.WindowUpdater;
+
+import graphicsEngineDemo.d5_featurePreview.window.Window;
+
+/**
+ * A general demo for previewing various features and capabilities of the Graphics Engine.
+ * See ReadMe.md for more info.
+ */
+public class Main {
+ /**
+ * The main method.
+ *
+ * @param args Command-line arguments.
+ */
+ public static void main(String[] args) {
+ new GraphicsAdapter() {{
+ newWindow(new WindowUpdater(new Window(this)));
+ }};
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/d5_featurePreview/ReadMe.md b/src/test/java/graphicsEngineDemo/d5_featurePreview/ReadMe.md
new file mode 100644
index 0000000..1d9b4ff
--- /dev/null
+++ b/src/test/java/graphicsEngineDemo/d5_featurePreview/ReadMe.md
@@ -0,0 +1,9 @@
+# Feature-preview demo
+
+## Abstract
+
+This is a general demo for previewing various features and capabilities of the Graphics Engine.
+
+## Instructions
+
+Run `Main.main(String[] args)` to launch this demo.
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/d5_featurePreview/common/AbstractCommonPage.java b/src/test/java/graphicsEngineDemo/d5_featurePreview/common/AbstractCommonPage.java
new file mode 100644
index 0000000..1fabca7
--- /dev/null
+++ b/src/test/java/graphicsEngineDemo/d5_featurePreview/common/AbstractCommonPage.java
@@ -0,0 +1,66 @@
+package graphicsEngineDemo.d5_featurePreview.common;
+
+import java.util.List;
+import java.awt.event.ActionListener;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import graphicsEngine.colors.SimpleColorScheme;
+import graphicsEngine.panels.BorderProperties;
+import graphicsEngine.pages.HeaderAndFooterPage;
+import graphicsEngine.pages.panels.AbstractHeader;
+import graphicsEngine.pages.panels.AbstractFooter;
+
+import graphicsEngineDemo.d5_featurePreview.common.header.CommonHeader;
+import graphicsEngineDemo.d5_featurePreview.common.header.HeaderButtonListener;
+
+//TODO: finish this and add javadoc
+public abstract class AbstractCommonPage extends HeaderAndFooterPage {
+ private HeaderButtonListener headerButtonListener;
+
+ //TODO: add javadoc
+ public AbstractCommonPage(@Nullable List actionListenerList) {
+ super(actionListenerList, null);
+ }
+
+ /**
+ * Adds known listeners to this page.
+ * Override this to add custom listeners.
+ *
+ * @param list List of listeners to add.
+ *
+ * @return Remaining unknown listeners.
+ */
+ @Override
+ public @NotNull List addListeners(@Nullable List list) {
+ List remainder = super.addListeners(list);
+ for (int i = 0; i < remainder.size(); i++) {
+ ActionListener listener = remainder.get(i);
+ if (listener instanceof HeaderButtonListener) {
+ headerButtonListener = (HeaderButtonListener) listener;
+ remainder.remove(i);
+ i--;
+ }
+ }
+ return remainder;
+ }
+
+ //TODO: add javadoc
+ @Override
+ public @NotNull AbstractHeader getHeader(@Nullable SimpleColorScheme colors,
+ @Nullable BorderProperties borderProperties) {
+ return new CommonHeader(colors, borderProperties, headerButtonListener);
+ }
+
+ //TODO: add javadoc
+ @Override
+ public @NotNull AbstractFooter getFooter(@Nullable SimpleColorScheme colors,
+ @Nullable BorderProperties borderProperties) {
+ return new CommonFooter(colors, borderProperties);
+ }
+
+ //TODO: add javadoc
+ @Override
+ public final void addParts() {}
+}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/d5_featurePreview/common/AbstractMenuPage.java b/src/test/java/graphicsEngineDemo/d5_featurePreview/common/AbstractMenuPage.java
new file mode 100644
index 0000000..aa22498
--- /dev/null
+++ b/src/test/java/graphicsEngineDemo/d5_featurePreview/common/AbstractMenuPage.java
@@ -0,0 +1,14 @@
+package graphicsEngineDemo.d5_featurePreview.common;
+
+import java.util.List;
+import java.awt.event.ActionListener;
+
+import org.jetbrains.annotations.Nullable;
+
+//TODO: add javadoc
+public abstract class AbstractMenuPage extends AbstractCommonPage {
+ //TODO: add javadoc
+ public AbstractMenuPage(@Nullable List actionListenerList) {
+ super(actionListenerList);
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/d5_featurePreview/common/CommonColors.java b/src/test/java/graphicsEngineDemo/d5_featurePreview/common/CommonColors.java
new file mode 100644
index 0000000..6421dbb
--- /dev/null
+++ b/src/test/java/graphicsEngineDemo/d5_featurePreview/common/CommonColors.java
@@ -0,0 +1,18 @@
+package graphicsEngineDemo.d5_featurePreview.common;
+
+import java.awt.Color;
+
+import org.jetbrains.annotations.NotNull;
+
+import graphicsEngine.colors.SimpleColorScheme;
+
+//TODO: add javadocs
+public class CommonColors {
+ public static final @NotNull SimpleColorScheme
+ HEADER_AND_FOOTER_COLORS = new SimpleColorScheme(
+ new Color(190, 190, 190),//Color.cyan,
+ null),
+ SIDE_PANEL_COLORS = new SimpleColorScheme(
+ new Color(150, 150, 150),
+ new Color(0, 0, 0));
+}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/d5_featurePreview/common/CommonFooter.java b/src/test/java/graphicsEngineDemo/d5_featurePreview/common/CommonFooter.java
new file mode 100644
index 0000000..c0c00a8
--- /dev/null
+++ b/src/test/java/graphicsEngineDemo/d5_featurePreview/common/CommonFooter.java
@@ -0,0 +1,22 @@
+package graphicsEngineDemo.d5_featurePreview.common;
+
+import org.jetbrains.annotations.Nullable;
+
+import graphicsEngine.colors.SimpleColorScheme;
+import graphicsEngine.panels.BorderProperties;
+import graphicsEngine.pages.panels.AbstractFooter;
+
+//TODO: add javadoc
+public class CommonFooter extends AbstractFooter {
+ private static final int HEIGHT = 40;
+
+ //TODO: add javadoc
+ public CommonFooter(@Nullable SimpleColorScheme colors,
+ @Nullable BorderProperties borderProperties) {
+ super(colors, HEIGHT, borderProperties);
+ }
+
+ //TODO: add javadoc
+ @Override
+ public void addParts() {}
+}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/d5_featurePreview/common/header/CommonHeader.java b/src/test/java/graphicsEngineDemo/d5_featurePreview/common/header/CommonHeader.java
new file mode 100644
index 0000000..a49ce32
--- /dev/null
+++ b/src/test/java/graphicsEngineDemo/d5_featurePreview/common/header/CommonHeader.java
@@ -0,0 +1,33 @@
+package graphicsEngineDemo.d5_featurePreview.common.header;
+
+import javax.swing.BoxLayout;
+
+import org.jetbrains.annotations.Nullable;
+
+import graphicsEngine.colors.SimpleColorScheme;
+import graphicsEngine.panels.BorderProperties;
+import graphicsEngine.pages.panels.AbstractHeader;
+
+//TODO: add javadoc
+public class CommonHeader extends AbstractHeader {
+ private static final int HEIGHT = 40;
+
+ //TODO: add javadoc
+ public CommonHeader(@Nullable SimpleColorScheme colors,
+ @Nullable BorderProperties borderProperties,
+ @Nullable HeaderButtonListener buttonListener) {
+ super(colors, HEIGHT, borderProperties);
+ addButtons(buttonListener);
+ }
+
+ //TODO: add javadoc
+ @Override
+ public void addParts() {}
+
+ private void addButtons(@Nullable HeaderButtonListener buttonListener) {
+ setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
+ add(new HeaderButtonListener.Button_Start(buttonListener));
+ add(new HeaderButtonListener.Button_Settings(buttonListener));
+ add(new HeaderButtonListener.Button_DemoSelect(buttonListener));
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/d5_featurePreview/common/header/HeaderButtonListener.java b/src/test/java/graphicsEngineDemo/d5_featurePreview/common/header/HeaderButtonListener.java
new file mode 100644
index 0000000..8e7218f
--- /dev/null
+++ b/src/test/java/graphicsEngineDemo/d5_featurePreview/common/header/HeaderButtonListener.java
@@ -0,0 +1,79 @@
+package graphicsEngineDemo.d5_featurePreview.common.header;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import static consoleUtils.ConsoleUtils.printLine;
+
+import graphicsEngine.parts.SimpleJButton;
+
+import graphicsEngineDemo.d5_featurePreview.window.Window;
+import graphicsEngineDemo.d5_featurePreview.menuPages.startingPage.StartingPage;
+import graphicsEngineDemo.d5_featurePreview.menuPages.settingsPage.SettingsPage;
+import graphicsEngineDemo.d5_featurePreview.menuPages.demoSelectPage.DemoSelectPage;
+
+//TODO: add javadocs
+public class HeaderButtonListener implements ActionListener {
+ private final Window window;
+
+ //TODO: add javadocs
+ public HeaderButtonListener(@NotNull Window window) {
+ this.window = window;
+ }
+
+ /**
+ * Invoked when an action occurs.
+ *
+ * @param e the event to be processed
+ */
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ if (actionCheck(e)) return;
+ printLine("A header button has been pressed but no action set up");
+ }
+
+ private boolean actionCheck(@NotNull ActionEvent e) {
+ switch (e.getActionCommand()) {
+ case Button_Start.ACTION_COMMAND ->
+ window.setActivePage(StartingPage.getStaticPageKey());
+ case Button_Settings.ACTION_COMMAND ->
+ window.setActivePage(SettingsPage.getStaticPageKey());
+ case Button_DemoSelect.ACTION_COMMAND ->
+ window.setActivePage(DemoSelectPage.getStaticPageKey());
+ default -> {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ //TODO: add javadocs
+ public static class Button_Start extends SimpleJButton {
+ public static final String ACTION_COMMAND = "page_start";
+
+ protected Button_Start(@Nullable ActionListener actionListener) {
+ super("Start", ACTION_COMMAND, actionListener);
+ }
+ }
+
+ //TODO: add javadocs
+ public static class Button_Settings extends SimpleJButton {
+ public static final String ACTION_COMMAND = "page_settings";
+
+ protected Button_Settings(@Nullable ActionListener actionListener) {
+ super("Settings", ACTION_COMMAND, actionListener);
+ }
+ }
+
+ //TODO: add javadocs
+ public static class Button_DemoSelect extends SimpleJButton {
+ public static final String ACTION_COMMAND = "page_demoSelect";
+
+ protected Button_DemoSelect(@Nullable ActionListener actionListener) {
+ super("Select demo", ACTION_COMMAND, actionListener);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/d5_featurePreview/demoPages/CommonDemoPage.java b/src/test/java/graphicsEngineDemo/d5_featurePreview/demoPages/CommonDemoPage.java
new file mode 100644
index 0000000..a81aaac
--- /dev/null
+++ b/src/test/java/graphicsEngineDemo/d5_featurePreview/demoPages/CommonDemoPage.java
@@ -0,0 +1,16 @@
+package graphicsEngineDemo.d5_featurePreview.demoPages;
+
+import java.util.List;
+import java.awt.event.ActionListener;
+
+import org.jetbrains.annotations.Nullable;
+
+import graphicsEngineDemo.d5_featurePreview.common.AbstractCommonPage;
+
+//TODO: add javadoc
+public abstract class CommonDemoPage extends AbstractCommonPage {
+ //TODO: add javadoc
+ public CommonDemoPage(@Nullable List actionListenerList) {
+ super(actionListenerList);
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/d5_featurePreview/demoPages/Page1.java b/src/test/java/graphicsEngineDemo/d5_featurePreview/demoPages/Page1.java
new file mode 100644
index 0000000..c17f876
--- /dev/null
+++ b/src/test/java/graphicsEngineDemo/d5_featurePreview/demoPages/Page1.java
@@ -0,0 +1,57 @@
+package graphicsEngineDemo.d5_featurePreview.demoPages;
+
+import java.util.List;
+import java.awt.Color;
+import java.awt.BorderLayout;
+import java.awt.event.ActionListener;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import graphicsEngine.colors.ColorUtilities;
+import graphicsEngine.colors.SimpleColorScheme;
+import graphicsEngine.panels.BorderProperties;
+import graphicsEngine.panels.DynamicPanel;
+
+import graphicsEngine.parts.labels.SimpleLabel;
+
+//TODO: add javadoc
+public class Page1 extends CommonDemoPage {
+ private static final @NotNull Color BACKGROUND_COLOR = new Color(150, 50, 50);
+
+ private Page1() {
+ this(null, null);
+ }
+
+ //TODO: add javadoc
+ public Page1(@Nullable List actionListenerList,
+ @Nullable SimpleColorScheme colors) {
+ super(actionListenerList);
+ setBackground(BACKGROUND_COLOR);
+ initializePanels(
+ colors,
+ new SimpleColorScheme(ColorUtilities.DEFAULT_COLOR_TRANSPARENT, Color.white),
+ null);
+ }
+
+ //TODO: add javadoc
+ @Override
+ public final @NotNull String getPageKey() {
+ return "page1";
+ }
+
+ //TODO: add javadoc
+ public static @NotNull String getStaticPageKey() {
+ return (new Page1()).getPageKey();
+ }
+
+ //
+ @Override
+ public @Nullable DynamicPanel getBody(@Nullable SimpleColorScheme colors,
+ @Nullable BorderProperties borderProperties) {
+ return new DynamicPanel(colors) {{
+ setLayout(new BorderLayout(0, 0));
+ add(new SimpleLabel("Demo 1", getPanelColors().getSecondaryColor()), BorderLayout.NORTH);
+ }};
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/d5_featurePreview/demoPages/Page2.java b/src/test/java/graphicsEngineDemo/d5_featurePreview/demoPages/Page2.java
new file mode 100644
index 0000000..c5b66ef
--- /dev/null
+++ b/src/test/java/graphicsEngineDemo/d5_featurePreview/demoPages/Page2.java
@@ -0,0 +1,91 @@
+package graphicsEngineDemo.d5_featurePreview.demoPages;
+
+import java.util.List;
+import java.awt.Color;
+import java.awt.BorderLayout;
+import java.awt.event.ActionListener;
+import javax.swing.JPanel;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import graphicsEngine.colors.ColorUtilities;
+import graphicsEngine.colors.SimpleColorScheme;
+import graphicsEngine.panels.BorderProperties;
+import graphicsEngine.panels.StaticPanel;
+import graphicsEngine.panels.VerticalPanel;
+import graphicsEngine.parts.labels.SimpleLabel;
+
+//TODO: add javadoc
+public class Page2 extends PageWithPanel {
+ private static final @NotNull Color BACKGROUND_COLOR = new Color(50, 150, 50);
+
+ private Page2() {
+ this(null, null);
+ }
+
+ //TODO: add javadoc
+ public Page2(@Nullable List actionListenerList,
+ @Nullable SimpleColorScheme colors) {
+ super(actionListenerList);
+ setBackground(BACKGROUND_COLOR);
+ initializePanels(
+ colors,
+ new SimpleColorScheme(ColorUtilities.DEFAULT_COLOR_TRANSPARENT, null),
+ null);
+ }
+
+ //TODO: add javadoc
+ @Override
+ public final @NotNull String getPageKey() {
+ return "page2";
+ }
+
+ //TODO: add javadoc
+ public static @NotNull String getStaticPageKey() {
+ return (new Page2()).getPageKey();
+ }
+
+ /**
+ * TODO: finish this javadoc
+ *
+ * @param colors
+ * @return
+ */
+ @Override
+ public final @NotNull VerticalPanel getLeftSidePanel(@Nullable SimpleColorScheme colors) {
+ return new SidePanel(colors, null);
+ }
+
+ /**
+ * TODO: finish this javadoc
+ *
+ * @return
+ */
+ @Override
+ public @Nullable JPanel getPageCenter() {
+ return new StaticPanel(
+ null,
+ new SimpleColorScheme(ColorUtilities.DEFAULT_COLOR_TRANSPARENT, Color.white),
+ null) {
+ {
+ //setLayout(new BorderLayout(0, 0));
+ add(new SimpleLabel("Center", getPanelColors().getSecondaryColor()), BorderLayout.NORTH);
+ //Add parts here
+ }
+ };
+ }
+
+ //TODO: add javadoc
+ private static class SidePanel extends CommonSidePanel {
+ private static final int WIDTH = 200;
+
+ //TODO: add javadoc
+ public SidePanel(@Nullable SimpleColorScheme panelColors,
+ @Nullable BorderProperties borderProperties) {
+ super(panelColors, WIDTH, borderProperties);
+ add(new SimpleLabel("Demo page 2 - Side panel", getPanelColors().getSecondaryColor()));
+ //Add parts here
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/d5_featurePreview/demoPages/PageWithPanel.java b/src/test/java/graphicsEngineDemo/d5_featurePreview/demoPages/PageWithPanel.java
new file mode 100644
index 0000000..07a0815
--- /dev/null
+++ b/src/test/java/graphicsEngineDemo/d5_featurePreview/demoPages/PageWithPanel.java
@@ -0,0 +1,60 @@
+package graphicsEngineDemo.d5_featurePreview.demoPages;
+
+import java.util.List;
+import java.awt.BorderLayout;
+import java.awt.event.ActionListener;
+import javax.swing.JPanel;
+
+import org.jetbrains.annotations.Nullable;
+
+import graphicsEngine.colors.SimpleColorScheme;
+import graphicsEngine.panels.BorderProperties;
+import graphicsEngine.panels.DynamicPanel;
+import graphicsEngine.panels.VerticalPanel;
+
+import graphicsEngineDemo.d5_featurePreview.common.CommonColors;
+
+//TODO: add javadoc
+public abstract class PageWithPanel extends CommonDemoPage {
+ private SimpleColorScheme sidePanelColors;
+
+ //TODO: add javadoc
+ public PageWithPanel(@Nullable List actionListenerList) {
+ super(actionListenerList);
+ sidePanelColors = CommonColors.SIDE_PANEL_COLORS;
+ }
+
+ //
+ @Override
+ public @Nullable DynamicPanel getBody(@Nullable SimpleColorScheme colors,
+ @Nullable BorderProperties borderProperties) {
+ return new DynamicPanel(colors) {{
+ setLayout(new BorderLayout(0, 0));
+ @Nullable VerticalPanel leftSidePanel = getLeftSidePanel(sidePanelColors);
+ if (leftSidePanel != null) {
+ add(leftSidePanel, BorderLayout.WEST);
+ }
+ @Nullable JPanel centralPanel = getPageCenter();
+ if (centralPanel != null) {
+ add(centralPanel, BorderLayout.CENTER);
+ }
+ }};
+ }
+
+ //TODO: add javadoc
+ public abstract @Nullable VerticalPanel getLeftSidePanel(@Nullable SimpleColorScheme panelColors);
+
+ //TODO: add javadoc
+ public abstract @Nullable JPanel getPageCenter();
+
+ //TODO: add javadoc
+ public static class CommonSidePanel extends VerticalPanel {
+
+ //TODO: add javadoc
+ public CommonSidePanel(@Nullable SimpleColorScheme panelColors,
+ int width,
+ @Nullable BorderProperties borderProperties) {
+ super(panelColors, width, borderProperties);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/d5_featurePreview/demoPages/page3/Center.java b/src/test/java/graphicsEngineDemo/d5_featurePreview/demoPages/page3/Center.java
new file mode 100644
index 0000000..de61700
--- /dev/null
+++ b/src/test/java/graphicsEngineDemo/d5_featurePreview/demoPages/page3/Center.java
@@ -0,0 +1,62 @@
+package graphicsEngineDemo.d5_featurePreview.demoPages.page3;
+
+import java.awt.Color;
+import java.awt.BorderLayout;
+
+import org.jetbrains.annotations.Nullable;
+
+import static consoleUtils.ConsoleUtils.printLine;
+
+import graphicsEngine.colors.ColorUtilities;
+import graphicsEngine.colors.SimpleColorScheme;
+import graphicsEngine.panels.DynamicPanel;
+import graphicsEngine.parts.labels.SimpleLabel;
+
+//TODO: add javadocs
+class Center extends DynamicPanel {
+ protected Center(Page3 page) {
+ super(
+ null,
+ new SimpleColorScheme(ColorUtilities.DEFAULT_COLOR_TRANSPARENT, null),
+ null);
+ add(new DynamicLabel(page, Color.red), BorderLayout.PAGE_START);
+ //add(new SimpleLabel("Demo 3", Color.white));
+ //Add parts here
+ }
+
+ //TODO: use parts.labels.DynamicLabel
+ private static class DynamicLabel extends SimpleLabel {
+ private final Page3 page;
+
+ protected DynamicLabel(Page3 page,
+ @Nullable Color textColor) {
+ this(page, textColor, null);
+ }
+
+ protected DynamicLabel(Page3 page,
+ @Nullable Color textColor,
+ @Nullable Color background) {
+ super(null, textColor, background);
+ this.page = page;
+ }
+
+ //calls either paint or update
+ @Override
+ public void repaint() {
+ printLine("label repaint happens");
+ setText(getNewText());
+ super.repaint();
+ }
+
+ private String getNewText() {
+ String valueString = "page=null";
+ if (page != null) {
+ valueString = "data=null";
+ if (page.data != null) {
+ valueString = String.valueOf(page.data.getValue());
+ }
+ }
+ return "A dynamically changeable string. X: " + valueString;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/d5_featurePreview/demoPages/page3/Page3.java b/src/test/java/graphicsEngineDemo/d5_featurePreview/demoPages/page3/Page3.java
new file mode 100644
index 0000000..b64a74f
--- /dev/null
+++ b/src/test/java/graphicsEngineDemo/d5_featurePreview/demoPages/page3/Page3.java
@@ -0,0 +1,71 @@
+package graphicsEngineDemo.d5_featurePreview.demoPages.page3;
+
+import java.util.List;
+import java.awt.Color;
+import java.awt.event.ActionListener;
+import javax.swing.JPanel;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import graphicsEngine.colors.ColorUtilities;
+import graphicsEngine.colors.SimpleColorScheme;
+import graphicsEngine.panels.VerticalPanel;
+
+import graphicsEngineDemo.d5_featurePreview.demoPages.PageWithPanel;
+import graphicsEngineDemo.d5_featurePreview.demoPages.page3.data.DataUpdater;
+
+//TODO: add javadoc
+public class Page3 extends PageWithPanel {
+ private static final @NotNull Color BACKGROUND_COLOR = new Color(50, 50, 150);
+
+ public final DataUpdater data;
+
+ private Page3() {
+ this(null, null);
+ }
+
+ //TODO: add javadoc
+ public Page3(@Nullable List actionListenerList,
+ @Nullable SimpleColorScheme colors) {
+ super(actionListenerList);
+ setBackground(BACKGROUND_COLOR);
+ data = new DataUpdater();
+ initializePanels(
+ colors,
+ new SimpleColorScheme(ColorUtilities.DEFAULT_COLOR_TRANSPARENT, null),
+ null);
+ }
+
+ //TODO: add javadoc
+ @Override
+ public final @NotNull String getPageKey() {
+ return "page3";
+ }
+
+ //TODO: add javadoc
+ public static @NotNull String getStaticPageKey() {
+ return (new Page3()).getPageKey();
+ }
+
+ /**
+ * TODO: finish this javadoc
+ *
+ * @param colors
+ * @return
+ */
+ @Override
+ public final @NotNull VerticalPanel getLeftSidePanel(@Nullable SimpleColorScheme colors) {
+ return new SidePanel(colors, null);
+ }
+
+ /**
+ * TODO: finish this javadoc
+ *
+ * @return
+ */
+ @Override
+ public @Nullable JPanel getPageCenter() {
+ return new Center(this);
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/d5_featurePreview/demoPages/page3/SidePanel.java b/src/test/java/graphicsEngineDemo/d5_featurePreview/demoPages/page3/SidePanel.java
new file mode 100644
index 0000000..5d530b5
--- /dev/null
+++ b/src/test/java/graphicsEngineDemo/d5_featurePreview/demoPages/page3/SidePanel.java
@@ -0,0 +1,23 @@
+package graphicsEngineDemo.d5_featurePreview.demoPages.page3;
+
+import org.jetbrains.annotations.Nullable;
+
+import graphicsEngine.colors.SimpleColorScheme;
+import graphicsEngine.panels.BorderProperties;
+import graphicsEngine.parts.labels.SimpleLabel;
+
+import graphicsEngineDemo.d5_featurePreview.demoPages.PageWithPanel;
+
+//TODO: add javadoc
+class SidePanel extends PageWithPanel.CommonSidePanel {
+ private static final int WIDTH = 200;
+
+ //TODO: add javadoc
+ protected SidePanel(@Nullable SimpleColorScheme colors,
+ @Nullable BorderProperties borderProperties) {
+ super(colors, WIDTH, borderProperties);
+ add(new SimpleLabel("Demo page 3 - Side panel", getPanelColors().getSecondaryColor()));
+ add(new SimpleLabel("Some text", getPanelColors().getSecondaryColor()));
+ //Add parts here
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/d5_featurePreview/demoPages/page3/data/Data.java b/src/test/java/graphicsEngineDemo/d5_featurePreview/demoPages/page3/data/Data.java
new file mode 100644
index 0000000..d4f4cf5
--- /dev/null
+++ b/src/test/java/graphicsEngineDemo/d5_featurePreview/demoPages/page3/data/Data.java
@@ -0,0 +1,29 @@
+package graphicsEngineDemo.d5_featurePreview.demoPages.page3.data;
+
+//TODO: finish this and add javadoc
+public class Data {
+ private int
+ variable,
+ delta;
+
+ //TODO: add javadoc
+ protected Data(int value, int delta) {
+ variable = value;
+ this.delta = delta;
+ }
+
+ //TODO: add javadoc
+ public int getVariableValue() {
+ return variable;
+ }
+
+ //TODO: add javadoc
+ protected void add() {
+ variable += delta;
+ }
+
+ //TODO: add javadoc
+ protected void subtract() {
+ variable -= delta;
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/d5_featurePreview/demoPages/page3/data/DataUpdater.java b/src/test/java/graphicsEngineDemo/d5_featurePreview/demoPages/page3/data/DataUpdater.java
new file mode 100644
index 0000000..51eb617
--- /dev/null
+++ b/src/test/java/graphicsEngineDemo/d5_featurePreview/demoPages/page3/data/DataUpdater.java
@@ -0,0 +1,36 @@
+package graphicsEngineDemo.d5_featurePreview.demoPages.page3.data;
+
+import ThreadAbstraction.AbstractUpdater;
+
+//TODO: finish this and add javadocs
+public class DataUpdater extends AbstractUpdater {
+ private static final long REFRESH_DELAY = 50L; // in milliseconds
+
+ //TODO: make private and use getters
+ public Data data;
+ public boolean subtract = false;
+
+ //TODO: add javadoc
+ public DataUpdater() {
+ super(REFRESH_DELAY);
+ data = new Data(0, 1);
+ this.start();
+ }
+
+ /**
+ * Gets called when thread runs.
+ */
+ @Override
+ public void update() {
+ if (subtract) {
+ data.subtract();
+ } else {
+ data.add();
+ }
+ }
+
+ //TODO: add javadoc
+ public int getValue() {
+ return data.getVariableValue();
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/d5_featurePreview/demoPages/page4/Center.java b/src/test/java/graphicsEngineDemo/d5_featurePreview/demoPages/page4/Center.java
new file mode 100644
index 0000000..fbe811e
--- /dev/null
+++ b/src/test/java/graphicsEngineDemo/d5_featurePreview/demoPages/page4/Center.java
@@ -0,0 +1,58 @@
+package graphicsEngineDemo.d5_featurePreview.demoPages.page4;
+
+import java.awt.Color;
+
+import graphicsEngine.colors.ColorUtilities;
+import graphicsEngine.colors.SimpleColorScheme;
+import graphicsEngine.panels.DynamicPanel;
+import graphicsEngine.parts.labels.SimpleLabel;
+
+//TODO: add javadocs
+class Center extends DynamicPanel {
+ protected Center(Page4 page) {
+ super(
+ null,
+ new SimpleColorScheme(ColorUtilities.DEFAULT_COLOR_TRANSPARENT, null),
+ null);
+ //add(new DynamicLabel(page, Color.red), BorderLayout.PAGE_START);
+ add(new SimpleLabel("Demo 4", Color.white));
+ //Add parts here
+ }
+
+ /*
+ //TODO: use parts.labels.DynamicLabel
+ private static class DynamicLabel extends SimpleLabel {
+ private final Page3 page;
+
+ protected DynamicLabel(Page3 page,
+ @Nullable Color textColor) {
+ this(page, textColor, null);
+ }
+
+ protected DynamicLabel(Page3 page,
+ @Nullable Color textColor,
+ @Nullable Color background) {
+ super(null, textColor, background);
+ this.page = page;
+ }
+
+ //calls either paint or update
+ @Override
+ public void repaint() {
+ printLine("label repaint happens");
+ setText(getNewText());
+ super.repaint();
+ }
+
+ private String getNewText() {
+ String valueString = "page=null";
+ if (page != null) {
+ valueString = "data=null";
+ if (page.data != null) {
+ valueString = String.valueOf(page.data.getValue());
+ }
+ }
+ return "A dynamically changeable string. X: " + valueString;
+ }
+ }*/
+}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/d5_featurePreview/demoPages/page4/Page4.java b/src/test/java/graphicsEngineDemo/d5_featurePreview/demoPages/page4/Page4.java
new file mode 100644
index 0000000..a0a3d2a
--- /dev/null
+++ b/src/test/java/graphicsEngineDemo/d5_featurePreview/demoPages/page4/Page4.java
@@ -0,0 +1,65 @@
+package graphicsEngineDemo.d5_featurePreview.demoPages.page4;
+
+import java.util.List;
+import java.awt.event.ActionListener;
+import javax.swing.JPanel;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import graphicsEngine.colors.ColorUtilities;
+import graphicsEngine.colors.SimpleColorScheme;
+import graphicsEngine.panels.VerticalPanel;
+
+import graphicsEngineDemo.d5_featurePreview.demoPages.PageWithPanel;
+
+//TODO: add javadocs
+public class Page4 extends PageWithPanel {
+ private Page4() {
+ this(null, null);
+ }
+
+ //TODO: add javadoc
+ public Page4(@Nullable List actionListenerList,
+ @Nullable SimpleColorScheme colors) {
+ super(actionListenerList);
+ //setBackground(new Color(50, 50, 150));
+ //data = new DataUpdater();
+ initializePanels(
+ colors,
+ new SimpleColorScheme(ColorUtilities.DEFAULT_COLOR_TRANSPARENT, null),
+ null);
+ }
+
+ //TODO: add javadoc
+ @Override
+ public final @NotNull String getPageKey() {
+ return "page4";
+ }
+
+ //TODO: add javadoc
+ public static @NotNull String getStaticPageKey() {
+ return (new Page4()).getPageKey();
+ }
+
+ /**
+ * TODO: finish this javadoc
+ *
+ * @param colors
+ * @return
+ */
+ @Override
+ public final @NotNull VerticalPanel getLeftSidePanel(@Nullable SimpleColorScheme colors) {
+ return new SidePanel(colors, null);
+ }
+
+ /**
+ * TODO: finish this javadoc
+ *
+ * @return
+ */
+ @Override
+ public @Nullable JPanel getPageCenter() {
+ return new Center(this);
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/d5_featurePreview/demoPages/page4/SidePanel.java b/src/test/java/graphicsEngineDemo/d5_featurePreview/demoPages/page4/SidePanel.java
new file mode 100644
index 0000000..f6c72a2
--- /dev/null
+++ b/src/test/java/graphicsEngineDemo/d5_featurePreview/demoPages/page4/SidePanel.java
@@ -0,0 +1,23 @@
+package graphicsEngineDemo.d5_featurePreview.demoPages.page4;
+
+import org.jetbrains.annotations.Nullable;
+
+import graphicsEngine.colors.SimpleColorScheme;
+import graphicsEngine.panels.BorderProperties;
+import graphicsEngine.parts.labels.SimpleLabel;
+
+import graphicsEngineDemo.d5_featurePreview.demoPages.PageWithPanel;
+
+//TODO: add javadoc
+class SidePanel extends PageWithPanel.CommonSidePanel {
+ private static final int WIDTH = 200;
+
+ //TODO: add javadoc
+ protected SidePanel(@Nullable SimpleColorScheme colors,
+ @Nullable BorderProperties borderProperties) {
+ super(colors, WIDTH, borderProperties);
+ add(new SimpleLabel("Demo page 4 - Side panel", getPanelColors().getSecondaryColor()));
+ add(new SimpleLabel("Some text", getPanelColors().getSecondaryColor()));
+ //Add parts here
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/d5_featurePreview/menuPages/demoSelectPage/DemoSelectButtonListener.java b/src/test/java/graphicsEngineDemo/d5_featurePreview/menuPages/demoSelectPage/DemoSelectButtonListener.java
new file mode 100644
index 0000000..9c57191
--- /dev/null
+++ b/src/test/java/graphicsEngineDemo/d5_featurePreview/menuPages/demoSelectPage/DemoSelectButtonListener.java
@@ -0,0 +1,91 @@
+package graphicsEngineDemo.d5_featurePreview.menuPages.demoSelectPage;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import static consoleUtils.ConsoleUtils.printLine;
+
+import graphicsEngine.parts.SimpleJButton;
+
+import graphicsEngineDemo.d5_featurePreview.window.Window;
+import graphicsEngineDemo.d5_featurePreview.demoPages.Page1;
+import graphicsEngineDemo.d5_featurePreview.demoPages.Page2;
+import graphicsEngineDemo.d5_featurePreview.demoPages.page3.Page3;
+import graphicsEngineDemo.d5_featurePreview.demoPages.page4.Page4;
+
+//TODO: add javadocs
+public class DemoSelectButtonListener implements ActionListener {
+ private final Window window;
+
+ //TODO: add javadocs
+ public DemoSelectButtonListener(@NotNull Window window) {
+ this.window = window;
+ }
+
+ /**
+ * Invoked when an action occurs.
+ *
+ * @param e the event to be processed
+ */
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ if (actionCheck(e)) return;
+ printLine("A header button has been pressed but no action set up");
+ }
+
+ private boolean actionCheck(@NotNull ActionEvent e) {
+ switch (e.getActionCommand()) {
+ case Button_Page1.ACTION_COMMAND ->
+ window.setActivePage(Page1.getStaticPageKey());
+ case Button_Page2.ACTION_COMMAND ->
+ window.setActivePage(Page2.getStaticPageKey());
+ case Button_Page3.ACTION_COMMAND ->
+ window.setActivePage(Page3.getStaticPageKey());
+ case Button_Page4.ACTION_COMMAND ->
+ window.setActivePage(Page4.getStaticPageKey());
+ default -> {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ //TODO: add javadocs
+ public static class Button_Page1 extends SimpleJButton {
+ public static final String ACTION_COMMAND = "page_demo1";
+
+ protected Button_Page1(@Nullable ActionListener actionListener) {
+ super("Page 1", ACTION_COMMAND, actionListener);
+ }
+ }
+
+ //TODO: add javadocs
+ public static class Button_Page2 extends SimpleJButton {
+ public static final String ACTION_COMMAND = "page_demo2";
+
+ protected Button_Page2(@Nullable ActionListener actionListener) {
+ super("Page 2", ACTION_COMMAND, actionListener);
+ }
+ }
+
+ //TODO: add javadocs
+ public static class Button_Page3 extends SimpleJButton {
+ public static final String ACTION_COMMAND = "page_demo3";
+
+ protected Button_Page3(@Nullable ActionListener actionListener) {
+ super("Page 3", ACTION_COMMAND, actionListener);
+ }
+ }
+
+ //TODO: add javadocs
+ public static class Button_Page4 extends SimpleJButton {
+ public static final String ACTION_COMMAND = "page_demo4";
+
+ protected Button_Page4(@Nullable ActionListener actionListener) {
+ super("Page 4", ACTION_COMMAND, actionListener);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/d5_featurePreview/menuPages/demoSelectPage/DemoSelectPage.java b/src/test/java/graphicsEngineDemo/d5_featurePreview/menuPages/demoSelectPage/DemoSelectPage.java
new file mode 100644
index 0000000..d46123e
--- /dev/null
+++ b/src/test/java/graphicsEngineDemo/d5_featurePreview/menuPages/demoSelectPage/DemoSelectPage.java
@@ -0,0 +1,93 @@
+package graphicsEngineDemo.d5_featurePreview.menuPages.demoSelectPage;
+
+import java.util.List;
+import java.awt.Color;
+import java.awt.BorderLayout;
+import java.awt.event.ActionListener;
+import javax.swing.BoxLayout;
+import javax.swing.JPanel;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import graphicsEngine.colors.ColorUtilities;
+import graphicsEngine.colors.SimpleColorScheme;
+import graphicsEngine.panels.BorderProperties;
+import graphicsEngine.panels.DynamicPanel;
+import graphicsEngine.parts.labels.SimpleLabel;
+
+import graphicsEngineDemo.d5_featurePreview.common.AbstractMenuPage;
+
+//TODO: finish this and add javadoc
+public class DemoSelectPage extends AbstractMenuPage {
+ DemoSelectButtonListener demoSelectButtonListener;
+ private DemoSelectPage() {
+ this(null, null);
+ }
+
+ //TODO: add javadoc
+ public DemoSelectPage(@Nullable List actionListenerList,
+ @Nullable SimpleColorScheme colors) {
+ super(actionListenerList);
+ initializePanels(
+ colors,
+ new SimpleColorScheme(ColorUtilities.DEFAULT_COLOR_TRANSPARENT, null),
+ null);
+ }
+
+ //TODO: add javadoc
+ @Override
+ public final @NotNull String getPageKey() {
+ return "demoSelect";
+ }
+
+ //TODO: add javadoc
+ public static @NotNull String getStaticPageKey() {
+ return (new DemoSelectPage()).getPageKey();
+ }
+
+ /**
+ * Adds known listeners to this page.
+ * Override this to add custom listeners.
+ *
+ * @param list List of listeners to add.
+ *
+ * @return Remaining unknown listeners.
+ */
+ @Override
+ public @NotNull List addListeners(@Nullable List list) {
+ List remainder = super.addListeners(list);
+ for (int i = 0; i < remainder.size(); i++) {
+ ActionListener listener = remainder.get(i);
+ if (listener instanceof DemoSelectButtonListener) {
+ demoSelectButtonListener = (DemoSelectButtonListener) listener;
+ remainder.remove(i);
+ i--;
+ }
+ }
+ return remainder;
+ }
+
+ //
+ @Override
+ public @Nullable DynamicPanel getBody(@Nullable SimpleColorScheme colors,
+ @Nullable BorderProperties borderProperties) {
+ return new DynamicPanel(colors) {{
+ setLayout(new BorderLayout(0, 0));
+ add(new SimpleLabel("Select demo:", Color.white), BorderLayout.NORTH);
+ add(getButtonPanel(), BorderLayout.CENTER);
+ }};
+ }
+
+ private @NotNull JPanel getButtonPanel() {
+ return new JPanel() {{
+ setBackground(ColorUtilities.DEFAULT_COLOR_TRANSPARENT);
+ setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
+ add(new DemoSelectButtonListener.Button_Page1(demoSelectButtonListener));
+ add(new DemoSelectButtonListener.Button_Page2(demoSelectButtonListener));
+ add(new DemoSelectButtonListener.Button_Page3(demoSelectButtonListener));
+ add(new DemoSelectButtonListener.Button_Page4(demoSelectButtonListener));
+ //Add more buttons here
+ }};
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/d5_featurePreview/menuPages/settingsPage/SettingsPage.java b/src/test/java/graphicsEngineDemo/d5_featurePreview/menuPages/settingsPage/SettingsPage.java
new file mode 100644
index 0000000..f6b7ead
--- /dev/null
+++ b/src/test/java/graphicsEngineDemo/d5_featurePreview/menuPages/settingsPage/SettingsPage.java
@@ -0,0 +1,55 @@
+package graphicsEngineDemo.d5_featurePreview.menuPages.settingsPage;
+
+import java.util.List;
+import java.awt.Color;
+import java.awt.BorderLayout;
+import java.awt.event.ActionListener;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import graphicsEngine.colors.ColorUtilities;
+import graphicsEngine.colors.SimpleColorScheme;
+import graphicsEngine.panels.BorderProperties;
+import graphicsEngine.panels.DynamicPanel;
+import graphicsEngine.parts.labels.SimpleLabel;
+
+import graphicsEngineDemo.d5_featurePreview.common.AbstractMenuPage;
+
+//TODO: finish this and add javadoc
+public class SettingsPage extends AbstractMenuPage {
+ private SettingsPage() {
+ this(null, null);
+ }
+
+ //TODO: add javadoc
+ public SettingsPage(@Nullable List actionListenerList,
+ @Nullable SimpleColorScheme colors) {
+ super(actionListenerList);
+ initializePanels(
+ colors,
+ new SimpleColorScheme(ColorUtilities.DEFAULT_COLOR_TRANSPARENT, null),
+ null);
+ }
+
+ //TODO: add javadoc
+ @Override
+ public final @NotNull String getPageKey() {
+ return "settings";
+ }
+
+ //TODO: add javadoc
+ public static @NotNull String getStaticPageKey() {
+ return (new SettingsPage()).getPageKey();
+ }
+
+ //
+ @Override
+ public @Nullable DynamicPanel getBody(@Nullable SimpleColorScheme colors,
+ @Nullable BorderProperties borderProperties) {
+ return new DynamicPanel(colors) {{
+ setLayout(new BorderLayout(0, 0));
+ add(new SimpleLabel("Settings page", Color.white), BorderLayout.NORTH);
+ }};
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/d5_featurePreview/menuPages/startingPage/StartingPage.java b/src/test/java/graphicsEngineDemo/d5_featurePreview/menuPages/startingPage/StartingPage.java
new file mode 100644
index 0000000..f59c083
--- /dev/null
+++ b/src/test/java/graphicsEngineDemo/d5_featurePreview/menuPages/startingPage/StartingPage.java
@@ -0,0 +1,55 @@
+package graphicsEngineDemo.d5_featurePreview.menuPages.startingPage;
+
+import java.util.List;
+import java.awt.Color;
+import java.awt.BorderLayout;
+import java.awt.event.ActionListener;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import graphicsEngine.colors.ColorUtilities;
+import graphicsEngine.colors.SimpleColorScheme;
+import graphicsEngine.panels.BorderProperties;
+import graphicsEngine.panels.DynamicPanel;
+import graphicsEngine.parts.labels.SimpleLabel;
+
+import graphicsEngineDemo.d5_featurePreview.common.AbstractMenuPage;
+
+//TODO: finish this and add javadoc
+public class StartingPage extends AbstractMenuPage {
+ private StartingPage() {
+ this(null, null);
+ }
+
+ //TODO: add javadoc
+ public StartingPage(@Nullable List actionListenerList,
+ @Nullable SimpleColorScheme colors) {
+ super(actionListenerList);
+ initializePanels(
+ colors,
+ new SimpleColorScheme(ColorUtilities.DEFAULT_COLOR_TRANSPARENT, null),
+ null);
+ }
+
+ //TODO: add javadoc
+ @Override
+ public final @NotNull String getPageKey() {
+ return "start";
+ }
+
+ //TODO: add javadoc
+ public static @NotNull String getStaticPageKey() {
+ return (new StartingPage()).getPageKey();
+ }
+
+ //
+ @Override
+ public @Nullable DynamicPanel getBody(@Nullable SimpleColorScheme colors,
+ @Nullable BorderProperties borderProperties) {
+ return new DynamicPanel(colors) {{
+ setLayout(new BorderLayout(0, 0));
+ add(new SimpleLabel("Starting page", Color.white), BorderLayout.NORTH);
+ }};
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/d5_featurePreview/window/Window.java b/src/test/java/graphicsEngineDemo/d5_featurePreview/window/Window.java
new file mode 100644
index 0000000..ffe670c
--- /dev/null
+++ b/src/test/java/graphicsEngineDemo/d5_featurePreview/window/Window.java
@@ -0,0 +1,72 @@
+package graphicsEngineDemo.d5_featurePreview.window;
+
+import java.util.List;
+import java.util.ArrayList;
+import java.awt.event.ActionListener;
+
+import org.jetbrains.annotations.NotNull;
+
+import static graphicsEngine.Utilities.getSampleIcon;
+
+import graphicsEngine.windows.WindowManager;
+import graphicsEngine.pages.AbstractPage;
+
+import static graphicsEngineDemo.d5_featurePreview.common.CommonColors.HEADER_AND_FOOTER_COLORS;
+import graphicsEngineDemo.d5_featurePreview.common.header.HeaderButtonListener;
+import graphicsEngineDemo.d5_featurePreview.menuPages.startingPage.StartingPage;
+import graphicsEngineDemo.d5_featurePreview.menuPages.settingsPage.SettingsPage;
+import graphicsEngineDemo.d5_featurePreview.menuPages.demoSelectPage.DemoSelectButtonListener;
+import graphicsEngineDemo.d5_featurePreview.menuPages.demoSelectPage.DemoSelectPage;
+import graphicsEngineDemo.d5_featurePreview.demoPages.Page1;
+import graphicsEngineDemo.d5_featurePreview.demoPages.Page2;
+import graphicsEngineDemo.d5_featurePreview.demoPages.page3.Page3;
+import graphicsEngineDemo.d5_featurePreview.demoPages.page4.Page4;
+
+//TODO: add javadoc
+public class Window extends WindowUtilities {
+ //TODO: add javadoc
+ public Window(@NotNull WindowManager windowManager) {
+ super(windowManager);
+ setActivePage(StartingPage.getStaticPageKey());
+ setIcon(getSampleIcon());
+ }
+
+ //TODO: add javadoc
+ @Override
+ public @NotNull List getInitialPages() {
+ return new ArrayList<>() {{
+ add(new StartingPage(getHeaderListener(), HEADER_AND_FOOTER_COLORS));
+ add(new SettingsPage(getHeaderListener(), HEADER_AND_FOOTER_COLORS));
+ add(new DemoSelectPage(getDemoSelectListeners(), HEADER_AND_FOOTER_COLORS));
+ add(new Page1(getHeaderListener(), HEADER_AND_FOOTER_COLORS));
+ add(new Page2(getHeaderListener(), HEADER_AND_FOOTER_COLORS));
+ add(new Page3(getDemoPage3Listeners(), HEADER_AND_FOOTER_COLORS));
+ add(new Page4(getDemoPage4Listeners(), HEADER_AND_FOOTER_COLORS));
+ }};
+ }
+
+ private @NotNull List getHeaderListener() {
+ Window window = this;
+ return new ArrayList<>() {{
+ add(new HeaderButtonListener(window));
+ }};
+ }
+
+ private @NotNull List getDemoSelectListeners() {
+ List listeners = getHeaderListener();
+ listeners.add(new DemoSelectButtonListener(this));
+ return listeners;
+ }
+
+ private @NotNull List getDemoPage3Listeners() {
+ List listeners = getHeaderListener();
+ //TODO: add custom listener here
+ return listeners;
+ }
+
+ private @NotNull List getDemoPage4Listeners() {
+ List listeners = getHeaderListener();
+ //TODO: add custom listener here
+ return listeners;
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/d5_featurePreview/window/WindowUtilities.java b/src/test/java/graphicsEngineDemo/d5_featurePreview/window/WindowUtilities.java
new file mode 100644
index 0000000..746f769
--- /dev/null
+++ b/src/test/java/graphicsEngineDemo/d5_featurePreview/window/WindowUtilities.java
@@ -0,0 +1,37 @@
+package graphicsEngineDemo.d5_featurePreview.window;
+
+import org.jetbrains.annotations.NotNull;
+
+import graphicsEngine.windows.WindowManager;
+import graphicsEngine.windows.WindowConfig;
+import graphicsEngine.windows.windowTypes.MultiPageWindow;
+
+//TODO: add javadoc
+abstract class WindowUtilities extends MultiPageWindow {
+
+ //TODO: add javadoc
+ public WindowUtilities(@NotNull WindowManager windowManager) {
+ super(windowManager, config(), null, null);
+ }
+
+ /**
+ * Hardcoded configuration of a new Window object.
+ *
+ * @return Window configuration.
+ */
+ private static @NotNull WindowConfig config() {
+ String title = "Feature-preview demo";
+ int[]
+ size = new int[] {600, 400},
+ location = new int[] {50, 50};
+ WindowConfig config = new WindowConfig(title, size, location);
+ config.closeOperation = EXIT_ON_CLOSE;
+ return config;
+ }
+
+ //TODO: add javadoc
+ @Override
+ public @NotNull String getWindowKey() {
+ return "window";
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/paged/Main.java b/src/test/java/graphicsEngineDemo/paged/Main.java
deleted file mode 100644
index 426afb7..0000000
--- a/src/test/java/graphicsEngineDemo/paged/Main.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package graphicsEngineDemo.paged;
-
-import graphicsEngine.AbstractGraphicsAdapter;
-import graphicsEngine.windows.MultiPageWindow;
-import graphicsEngine.windows.WindowConfig;
-import graphicsEngine.windows.AbstractPage;
-
-import graphicsEngineDemo.paged.demoPages.Page1;
-import graphicsEngineDemo.paged.demoPages.Page2;
-
-import java.util.List;
-import java.util.ArrayList;
-
-import static graphicsEngine.Utilities.printLine;
-
-//TODO: finish this
-public class Main {
- public static void main(String[] args) {
- printLine("Paged demo currently not available");
- new GraphicsAdapter();
- }
-
- private static class GraphicsAdapter extends AbstractGraphicsAdapter {
- protected GraphicsAdapter() {
- super();
- graphics.newWindow(new Window());
- }
- }
-
- private static class Window extends MultiPageWindow {
- protected Window() {
- super(config(), preparePages());
- }
-
- /**
- * Hardcoded configuration of a new Window object.
- *
- * @return Window configuration.
- */
- private static WindowConfig config() {
- String title = "Paged demo";
- int[]
- size = new int[] {500, 500},
- location = new int[] {50, 50};
- WindowConfig config = new WindowConfig(title, size, location);
- config.closeOperation = EXIT_ON_CLOSE;
- return config;
- }
-
- private static List preparePages() {
- return new ArrayList<>() {{
- add(new Page1());
- add(new Page2());
- }};
- }
- }
-}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/paged/ReadMe.md b/src/test/java/graphicsEngineDemo/paged/ReadMe.md
deleted file mode 100644
index 5d6bded..0000000
--- a/src/test/java/graphicsEngineDemo/paged/ReadMe.md
+++ /dev/null
@@ -1,7 +0,0 @@
-Paged demo
-
-This is a directory for multi-paged graphics demo.
-
-Look for `Main.java` to launch.
-
-Currently not available...
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/paged/common/placeholder b/src/test/java/graphicsEngineDemo/paged/common/placeholder
deleted file mode 100644
index e69de29..0000000
diff --git a/src/test/java/graphicsEngineDemo/paged/demoPages/CommonDemoPage.java b/src/test/java/graphicsEngineDemo/paged/demoPages/CommonDemoPage.java
deleted file mode 100644
index cefc045..0000000
--- a/src/test/java/graphicsEngineDemo/paged/demoPages/CommonDemoPage.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package graphicsEngineDemo.paged.demoPages;
-
-import graphicsEngine.windows.AbstractPage;
-
-import java.awt.*;
-
-public abstract class CommonDemoPage extends AbstractPage {
- CommonDemoPage() {
- super();
- }
-
- CommonDemoPage(Color backgroundColor) {
- super(backgroundColor);
- }
-}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/paged/demoPages/Page1.java b/src/test/java/graphicsEngineDemo/paged/demoPages/Page1.java
deleted file mode 100644
index eabb412..0000000
--- a/src/test/java/graphicsEngineDemo/paged/demoPages/Page1.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package graphicsEngineDemo.paged.demoPages;
-
-import java.awt.*;
-
-public class Page1 extends CommonDemoPage {
- public Page1() {
- super(Color.green);
- }
-
- @Override
- public String getPageKey() {
- return "page1";
- }
-}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/paged/demoPages/Page2.java b/src/test/java/graphicsEngineDemo/paged/demoPages/Page2.java
deleted file mode 100644
index bd46f58..0000000
--- a/src/test/java/graphicsEngineDemo/paged/demoPages/Page2.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package graphicsEngineDemo.paged.demoPages;
-
-import java.awt.*;
-
-public class Page2 extends CommonDemoPage {
- public Page2() {
- super(Color.magenta);
- }
-
- @Override
- public String getPageKey() {
- return "page2";
- }
-}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/paged/demoPages/placeholder b/src/test/java/graphicsEngineDemo/paged/demoPages/placeholder
deleted file mode 100644
index e69de29..0000000
diff --git a/src/test/java/graphicsEngineDemo/paged/menuPages/demoSelectPage/DemoSelectPage.java b/src/test/java/graphicsEngineDemo/paged/menuPages/demoSelectPage/DemoSelectPage.java
deleted file mode 100644
index e65c277..0000000
--- a/src/test/java/graphicsEngineDemo/paged/menuPages/demoSelectPage/DemoSelectPage.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package graphicsEngineDemo.paged.menuPages.demoSelectPage;
-
-import graphicsEngine.windows.AbstractPage;
-
-//TODO: finish this and add javadoc
-public class DemoSelectPage extends AbstractPage {
- public DemoSelectPage() {
- super();
- }
-
- @Override
- public String getPageKey() {
- return "demoSelect";
- }
-}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/paged/menuPages/placeholder b/src/test/java/graphicsEngineDemo/paged/menuPages/placeholder
deleted file mode 100644
index e69de29..0000000
diff --git a/src/test/java/graphicsEngineDemo/paged/menuPages/settingsPage/SettingsPage.java b/src/test/java/graphicsEngineDemo/paged/menuPages/settingsPage/SettingsPage.java
deleted file mode 100644
index bf48e21..0000000
--- a/src/test/java/graphicsEngineDemo/paged/menuPages/settingsPage/SettingsPage.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package graphicsEngineDemo.paged.menuPages.settingsPage;
-
-import graphicsEngine.windows.AbstractPage;
-
-//TODO: finish this and add javadoc
-public class SettingsPage extends AbstractPage {
- public SettingsPage() {
- super();
- }
-
- @Override
- public String getPageKey() {
- return "settings";
- }
-}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/paged/menuPages/startingPage/StartingPage.java b/src/test/java/graphicsEngineDemo/paged/menuPages/startingPage/StartingPage.java
deleted file mode 100644
index ed0322c..0000000
--- a/src/test/java/graphicsEngineDemo/paged/menuPages/startingPage/StartingPage.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package graphicsEngineDemo.paged.menuPages.startingPage;
-
-import graphicsEngine.windows.AbstractPage;
-
-//TODO: finish this and add javadoc
-public class StartingPage extends AbstractPage {
- public StartingPage() {
- super();
- }
-
- @Override
- public String getPageKey() {
- return "start";
- }
-}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineDemo/simplest/Main.java b/src/test/java/graphicsEngineDemo/simplest/Main.java
deleted file mode 100644
index 62a1b15..0000000
--- a/src/test/java/graphicsEngineDemo/simplest/Main.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package graphicsEngineDemo.simplest;
-
-import graphicsEngine.AbstractGraphicsAdapter;
-import graphicsEngine.windows.AbstractWindow;
-import graphicsEngine.windows.WindowConfig;
-
-//TODO: add javadoc
-public class Main {
- public static void main(String[] args) {
- new GraphicsAdapter();
- }
-
- private static class GraphicsAdapter extends AbstractGraphicsAdapter {
- protected GraphicsAdapter() {
- super();
- graphics.newWindow(new Window());
- }
- }
-
- private static class Window extends AbstractWindow {
- public Window() {
- super(new WindowConfig());
- }
-
- @Override
- public void addParts() {}
- }
-}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineSandbox/ReadMe.md b/src/test/java/graphicsEngineSandbox/ReadMe.md
index c8003ae..9306087 100644
--- a/src/test/java/graphicsEngineSandbox/ReadMe.md
+++ b/src/test/java/graphicsEngineSandbox/ReadMe.md
@@ -1,7 +1,12 @@
-Sandbox
+# Sandbox
-This is a directory for multi-threaded, graphics sandbox.
-Just testing features here...
+## Abstract
+
+This is a general sandbox for testing out various parts of the Graphics Engine as well as trying various unrelated ideas.
+
+*Just testing features here...*
+
+# Instructions
Look for `main/Main.java` to launch.
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineSandbox/graphics/GraphicsAdapter.java b/src/test/java/graphicsEngineSandbox/graphics/MyGraphicsAdapter.java
similarity index 55%
rename from src/test/java/graphicsEngineSandbox/graphics/GraphicsAdapter.java
rename to src/test/java/graphicsEngineSandbox/graphics/MyGraphicsAdapter.java
index f68e03a..cd838fc 100644
--- a/src/test/java/graphicsEngineSandbox/graphics/GraphicsAdapter.java
+++ b/src/test/java/graphicsEngineSandbox/graphics/MyGraphicsAdapter.java
@@ -1,26 +1,26 @@
package graphicsEngineSandbox.graphics;
-import graphicsEngine.AbstractGraphicsAdapter;
-import graphicsEngine.windows.WindowManager;
+import graphicsEngine.GraphicsAdapter;
+import graphicsEngine.windows.WindowUpdater;
import graphicsEngineSandbox.graphics.controlWindow.ControlWindow;
import graphicsEngineSandbox.graphics.viewWinow.ViewWindow;
// TODO: add javadoc
-public class GraphicsAdapter extends AbstractGraphicsAdapter {
+public class MyGraphicsAdapter extends GraphicsAdapter {
// TODO: add javadoc
- public GraphicsAdapter() {
+ public MyGraphicsAdapter() {
super();
newControlWindow();
newViewWindow();
}
private void newControlWindow() {
- graphics.newWindow(new WindowManager(new ControlWindow()));
+ newWindow(new WindowUpdater(new ControlWindow(this)));
}
// TODO: add javadoc
public void newViewWindow() {
- graphics.newWindow(new WindowManager(new ViewWindow()));
+ newWindow(new WindowUpdater(new ViewWindow(this)));
}
}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineSandbox/graphics/controlWindow/ControlWindow.java b/src/test/java/graphicsEngineSandbox/graphics/controlWindow/ControlWindow.java
index 6bc0513..dec5d39 100644
--- a/src/test/java/graphicsEngineSandbox/graphics/controlWindow/ControlWindow.java
+++ b/src/test/java/graphicsEngineSandbox/graphics/controlWindow/ControlWindow.java
@@ -1,18 +1,21 @@
package graphicsEngineSandbox.graphics.controlWindow;
-import graphicsEngine.panels.PanelColors;
-import graphicsEngineSandbox.graphics.controlWindow.leftPanel.LeftPanel;
-import graphicsEngine.windows.AbstractWindow;
+import graphicsEngine.colors.SimpleColorScheme;
+import graphicsEngine.windows.WindowManager;
import graphicsEngine.windows.WindowConfig;
+import graphicsEngine.windows.AbstractWindow;
+import graphicsEngine.panels.StaticPanel;
+import graphicsEngineSandbox.graphics.controlWindow.leftPanel.LeftPanel;
-import javax.swing.*;
import java.awt.*;
+import org.jetbrains.annotations.NotNull;
+
// TODO: add javadoc
public class ControlWindow extends AbstractWindow {
- public ControlWindow() {
- super(config());
+ public ControlWindow(@NotNull WindowManager windowManager) {
+ super(windowManager, config(), null);
}
private static WindowConfig config() {
@@ -25,20 +28,35 @@ private static WindowConfig config() {
}
@Override
- public void addParts() {
- PanelColors panelColors = new PanelColors();
+ public @NotNull String getWindowKey() {
+ return "controlWindow";
+ }
+ @Override
+ public void addParts() {
setLayout(new BorderLayout());
- add(new Footer(panelColors, false), BorderLayout.SOUTH);
- add(new LeftPanel(panelColors, false), BorderLayout.WEST);
- add(new CentralPanel(), BorderLayout.CENTER);
+ add(
+ new Footer(
+ new SimpleColorScheme(Color.gray, null),
+ null),
+ BorderLayout.SOUTH);
+ add(
+ new LeftPanel(
+ new SimpleColorScheme(Color.lightGray, null),
+ null),
+ BorderLayout.WEST);
+ add(
+ new CentralPanel(),
+ BorderLayout.CENTER);
}
- private static class CentralPanel extends JPanel {
+ private static class CentralPanel extends StaticPanel {
private static final Color BACKGROUND = new Color(110, 120, 40);
protected CentralPanel() {
- setBackground(BACKGROUND);
+ super(null,
+ new SimpleColorScheme(BACKGROUND, null),
+ null);
}
}
}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineSandbox/graphics/controlWindow/Footer.java b/src/test/java/graphicsEngineSandbox/graphics/controlWindow/Footer.java
index a97d157..7a74b23 100644
--- a/src/test/java/graphicsEngineSandbox/graphics/controlWindow/Footer.java
+++ b/src/test/java/graphicsEngineSandbox/graphics/controlWindow/Footer.java
@@ -1,33 +1,36 @@
package graphicsEngineSandbox.graphics.controlWindow;
-import graphicsEngine.panels.PanelColors;
-import graphicsEngine.panels.SimplePanel;
-import graphicsEngine.parts.*;
+import graphicsEngine.colors.SimpleColorScheme;
+import graphicsEngine.panels.BorderProperties;
+import graphicsEngine.panels.StaticPanel;
+import graphicsEngine.parts.labels.SimpleLabel;
-import java.awt.*;
-import javax.swing.*;
+import java.awt.Dimension;
+import javax.swing.BoxLayout;
+import javax.swing.Box;
import org.jetbrains.annotations.Nullable;
// TODO: add javadocs
-public class Footer extends SimplePanel {
+public class Footer extends StaticPanel {
private static final int
HEIGHT = 25,
TEXT_OFFSET_X = 10;
- public Footer(@Nullable PanelColors panelColors, boolean border) {
- super(panelColors, border);
- setPreferredSize(new Dimension(Integer.MAX_VALUE, HEIGHT));
- addMembers();
+ public Footer(@Nullable SimpleColorScheme colors,
+ @Nullable BorderProperties borderProperties) {
+ super(new Dimension(Integer.MAX_VALUE, HEIGHT), colors, borderProperties);
}
- private void addMembers() {
+ @Override
+ public void addParts() {
+ super.addParts();
setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
//a separator for separating label from the leftmost edge of the panel
add(Box.createRigidArea(new Dimension(TEXT_OFFSET_X,0)));
//a label
- add(new SimpleLabel("This is a footer", getPanelColors().text));
+ add(new SimpleLabel("This is a footer", getPanelColors().getSecondaryColor()));
}
}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineSandbox/graphics/controlWindow/leftPanel/AbstractSubPanel.java b/src/test/java/graphicsEngineSandbox/graphics/controlWindow/leftPanel/AbstractSubPanel.java
index d8b0fe5..ad807ac 100644
--- a/src/test/java/graphicsEngineSandbox/graphics/controlWindow/leftPanel/AbstractSubPanel.java
+++ b/src/test/java/graphicsEngineSandbox/graphics/controlWindow/leftPanel/AbstractSubPanel.java
@@ -1,15 +1,20 @@
package graphicsEngineSandbox.graphics.controlWindow.leftPanel;
-import graphicsEngine.panels.PanelColors;
-import graphicsEngine.panels.SimplePanel;
+import graphicsEngine.colors.SimpleColorScheme;
+import graphicsEngine.panels.BorderProperties;
+import graphicsEngine.panels.StaticPanel;
import java.awt.*;
-abstract class AbstractSubPanel extends SimplePanel {
- protected AbstractSubPanel(int[] size, PanelColors panelColors, boolean border) {
- super(panelColors, border);
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+abstract class AbstractSubPanel extends StaticPanel {
+ protected AbstractSubPanel(int @NotNull [] size,
+ @Nullable SimpleColorScheme colors,
+ @Nullable BorderProperties borderProperties) {
+ super(new Dimension(size[0], size[1]), colors, borderProperties);
setOpaque(false);
- setPreferredSize(new Dimension(size[0], size[1]));
setAlignmentX(Component.LEFT_ALIGNMENT);
}
diff --git a/src/test/java/graphicsEngineSandbox/graphics/controlWindow/leftPanel/LeftPanel.java b/src/test/java/graphicsEngineSandbox/graphics/controlWindow/leftPanel/LeftPanel.java
index b9c864f..8ea8860 100644
--- a/src/test/java/graphicsEngineSandbox/graphics/controlWindow/leftPanel/LeftPanel.java
+++ b/src/test/java/graphicsEngineSandbox/graphics/controlWindow/leftPanel/LeftPanel.java
@@ -1,22 +1,26 @@
package graphicsEngineSandbox.graphics.controlWindow.leftPanel;
-import graphicsEngine.panels.PanelColors;
-import graphicsEngine.panels.SimplePanel;
+import graphicsEngine.colors.SimpleColorScheme;
+import graphicsEngine.panels.BorderProperties;
+import graphicsEngine.panels.StaticPanel;
import java.awt.*;
import javax.swing.*;
+import org.jetbrains.annotations.Nullable;
+
//TODO: add javadocs
-public class LeftPanel extends SimplePanel {
+public class LeftPanel extends StaticPanel {
static final int WIDTH = 150;
- public LeftPanel(PanelColors panelColors, boolean border) {
- super(panelColors, border);
- setPreferredSize(new Dimension(WIDTH, Integer.MAX_VALUE));
- addMembers();
+ public LeftPanel(@Nullable SimpleColorScheme colors,
+ @Nullable BorderProperties borderProperties) {
+ super(new Dimension(WIDTH, Integer.MAX_VALUE), colors, borderProperties);
}
- private void addMembers() {
+ @Override
+ public void addParts() {
+ super.addParts();
setLayout(new BorderLayout(0, 0));
add(
new JPanel() {
@@ -25,11 +29,11 @@ private void addMembers() {
setPreferredSize(new Dimension(LeftPanel.WIDTH, getPreferredHeight()));
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
//setAlignmentX(Component.LEFT_ALIGNMENT);
- PanelColors colors = getPanelColors();
- add(new SubPanel1(colors, false));
- add(new SubPanel1(colors, false));
- add(new SubPanel2(colors, true));
- add(new TextLabel(colors.border, true));
+ SimpleColorScheme colors = new SimpleColorScheme();
+ add(new SubPanel1(colors, null));
+ add(new SubPanel1(colors, null));
+ add(new SubPanel2(colors, new BorderProperties(null, true)));
+ add(new TextLabel(new BorderProperties(null, true)));
}
},
BorderLayout.NORTH);
diff --git a/src/test/java/graphicsEngineSandbox/graphics/controlWindow/leftPanel/SubPanel1.java b/src/test/java/graphicsEngineSandbox/graphics/controlWindow/leftPanel/SubPanel1.java
index 8310e5b..0bbb966 100644
--- a/src/test/java/graphicsEngineSandbox/graphics/controlWindow/leftPanel/SubPanel1.java
+++ b/src/test/java/graphicsEngineSandbox/graphics/controlWindow/leftPanel/SubPanel1.java
@@ -1,24 +1,28 @@
package graphicsEngineSandbox.graphics.controlWindow.leftPanel;
-import graphicsEngine.panels.PanelColors;
+import graphicsEngine.colors.SimpleColorScheme;
+import graphicsEngine.panels.BorderProperties;
-import java.awt.*;
+import java.awt.Graphics;
+
+import org.jetbrains.annotations.Nullable;
class SubPanel1 extends AbstractSubPanel {
protected static final int HEIGHT = 30;
private static final int[] TEXT_LOCATION = new int[] {5, 20};
private static final String TEXT = "TextPanel 1";
- protected SubPanel1(PanelColors panelColors, boolean border) {
+ protected SubPanel1(@Nullable SimpleColorScheme colors,
+ @Nullable BorderProperties borderProperties) {
super(
new int[] {LeftPanel.WIDTH, HEIGHT},
- panelColors,
- border);
+ colors,
+ borderProperties);
}
@Override
protected final void drawText(Graphics g) {
- g.setColor(getPanelColors().text);
+ g.setColor(getPanelColors().getSecondaryColor());
g.drawString(TEXT, TEXT_LOCATION[0], TEXT_LOCATION[1]);
}
}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineSandbox/graphics/controlWindow/leftPanel/SubPanel2.java b/src/test/java/graphicsEngineSandbox/graphics/controlWindow/leftPanel/SubPanel2.java
index 306eb8a..f1bf63a 100644
--- a/src/test/java/graphicsEngineSandbox/graphics/controlWindow/leftPanel/SubPanel2.java
+++ b/src/test/java/graphicsEngineSandbox/graphics/controlWindow/leftPanel/SubPanel2.java
@@ -1,25 +1,28 @@
package graphicsEngineSandbox.graphics.controlWindow.leftPanel;
-import graphicsEngine.panels.PanelColors;
-
+import graphicsEngine.colors.SimpleColorScheme;
+import graphicsEngine.panels.BorderProperties;
import graphicsEngineSandbox.data.Data;
-import java.awt.*;
+import java.awt.Graphics;
+
+import org.jetbrains.annotations.Nullable;
class SubPanel2 extends AbstractSubPanel {
protected static final int HEIGHT = 60;
private static final int[] TEXT_LOCATION = new int[] {5, 20};
- protected SubPanel2(PanelColors panelColors, boolean border) {
+ protected SubPanel2(@Nullable SimpleColorScheme colors,
+ @Nullable BorderProperties borderProperties) {
super(
new int[] {LeftPanel.WIDTH, HEIGHT},
- panelColors,
- border);
+ colors,
+ borderProperties);
}
@Override
protected final void drawText(Graphics g) {
- g.setColor(getPanelColors().text);
+ g.setColor(getPanelColors().getSecondaryColor());
g.drawString("X: " + Data.getX(), TEXT_LOCATION[0], TEXT_LOCATION[1]);
}
}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineSandbox/graphics/controlWindow/leftPanel/TextLabel.java b/src/test/java/graphicsEngineSandbox/graphics/controlWindow/leftPanel/TextLabel.java
index a14e2f1..a8dad0e 100644
--- a/src/test/java/graphicsEngineSandbox/graphics/controlWindow/leftPanel/TextLabel.java
+++ b/src/test/java/graphicsEngineSandbox/graphics/controlWindow/leftPanel/TextLabel.java
@@ -1,9 +1,11 @@
package graphicsEngineSandbox.graphics.controlWindow.leftPanel;
-import graphicsEngine.Utilities;
-import graphicsEngine.parts.SimpleLabel;
+import graphicsEngine.panels.BorderInterface;
+import graphicsEngine.panels.BorderProperties;
+import graphicsEngine.parts.labels.SimpleLabel;
-import java.awt.*;
+import java.awt.Dimension;
+import java.awt.Color;
import org.jetbrains.annotations.NotNull;
@@ -11,14 +13,15 @@ class TextLabel extends SimpleLabel {
protected static final int HEIGHT = 80;
private static final Color TEXT_COLOR = Color.blue;
- protected TextLabel(@NotNull Color borderColor, boolean border) {
+ protected TextLabel(@NotNull BorderProperties borderProperties) {
super("A label object", TEXT_COLOR);
setPreferredSize(new Dimension(LeftPanel.WIDTH, HEIGHT));
- Utilities.BorderInterface.setBorderState(
+
+ BorderInterface.setComponentBorderState(
this,
- border,
- borderColor);
+ borderProperties.getBorderColor(),
+ borderProperties.getBorderState());
}
@Override
diff --git a/src/test/java/graphicsEngineSandbox/graphics/viewWinow/ViewWindow.java b/src/test/java/graphicsEngineSandbox/graphics/viewWinow/ViewWindow.java
index 55a253b..c148aaf 100644
--- a/src/test/java/graphicsEngineSandbox/graphics/viewWinow/ViewWindow.java
+++ b/src/test/java/graphicsEngineSandbox/graphics/viewWinow/ViewWindow.java
@@ -1,20 +1,25 @@
package graphicsEngineSandbox.graphics.viewWinow;
+import graphicsEngine.colors.SimpleColorScheme;
+import graphicsEngine.windows.WindowManager;
+import graphicsEngine.windows.WindowConfig;
+import graphicsEngine.windows.AbstractWindow;
+import graphicsEngine.windows.windowTypes.SimpleWindow;
import graphicsEngineSandbox.graphics.viewWinow.mainPanels.LeftSidePanel;
import graphicsEngineSandbox.graphics.viewWinow.mainPanels.RightSidePanel;
-import graphicsEngine.panels.PanelColors;
import graphicsEngineSandbox.graphics.viewWinow.mainPanels.center.CenterContainer;
-import graphicsEngine.windows.AbstractWindow;
-import graphicsEngine.windows.WindowConfig;
import java.awt.*;
+import org.jetbrains.annotations.NotNull;
+
// TODO: add javadoc
-public class ViewWindow extends AbstractWindow {
+public class ViewWindow extends SimpleWindow {
private static final int[] WINDOW_MINIMUM_SIZE = new int[] {700, 400};
- public ViewWindow() {
- super(config());
+ public ViewWindow(@NotNull WindowManager windowManager) {
+ super(windowManager, config(), null);
+ //TODO: maybe rework? could use something like setMinimumSize(getSize())
int[] correctedMinimumSize = AbstractWindow.correctWindowsSizeError(WINDOW_MINIMUM_SIZE);
setMinimumSize(new Dimension(correctedMinimumSize[0], correctedMinimumSize[1]));
}
@@ -26,14 +31,19 @@ private static WindowConfig config() {
new int[] {25, 350});
}
+ @Override
+ public @NotNull String getWindowKey() {
+ return "viewWindow";
+ }
+
@Override
public void addParts() {
- PanelColors panelColors = new PanelColors();
+ SimpleColorScheme
+ panelColors = new SimpleColorScheme(Color.gray, null),
+ centerColors = new SimpleColorScheme(Color.cyan, Color.yellow);
add(new LeftSidePanel(150, panelColors), BorderLayout.WEST);
add(new RightSidePanel(150, panelColors), BorderLayout.EAST);
-
-
- add(new CenterContainer(new PanelColors(Color.cyan, Color.yellow, Color.yellow)), BorderLayout.CENTER);
+ add(new CenterContainer(centerColors), BorderLayout.CENTER);
}
}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineSandbox/graphics/viewWinow/mainPanels/LeftSidePanel.java b/src/test/java/graphicsEngineSandbox/graphics/viewWinow/mainPanels/LeftSidePanel.java
index 08b7525..a7ab9e9 100644
--- a/src/test/java/graphicsEngineSandbox/graphics/viewWinow/mainPanels/LeftSidePanel.java
+++ b/src/test/java/graphicsEngineSandbox/graphics/viewWinow/mainPanels/LeftSidePanel.java
@@ -1,17 +1,20 @@
package graphicsEngineSandbox.graphics.viewWinow.mainPanels;
-import graphicsEngine.panels.PanelColors;
-import graphicsEngine.panels.SimplePanel;
+import graphicsEngine.colors.SimpleColorScheme;
+import graphicsEngine.panels.StaticPanel;
-import java.awt.*;
+import java.awt.Dimension;
+import java.awt.Graphics;
-public class LeftSidePanel extends SimplePanel {
- private static final int[] TEXT_LOCATION = new int[] {5, 20};
- private static final String TEXT = "Left side panel";
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
- public LeftSidePanel(int width, PanelColors colors) {
- super(colors, false);
- setPreferredSize(new Dimension(width, Integer.MAX_VALUE));
+public class LeftSidePanel extends StaticPanel {
+ private static final int @NotNull [] TEXT_LOCATION = new int[] {5, 20};
+ private static final @NotNull String TEXT = "Left side panel";
+
+ public LeftSidePanel(int width, @Nullable SimpleColorScheme colors) {
+ super(new Dimension(width, Integer.MAX_VALUE), colors, null);
}
@Override
@@ -20,8 +23,8 @@ public void paintComponent(Graphics g) {
drawText(g);
}
- private void drawText(Graphics g) {
- g.setColor(getPanelColors().text);
+ private void drawText(@NotNull Graphics g) {
+ g.setColor(getPanelColors().getSecondaryColor());
g.drawString(TEXT, TEXT_LOCATION[0], TEXT_LOCATION[1]);
}
}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineSandbox/graphics/viewWinow/mainPanels/RightSidePanel.java b/src/test/java/graphicsEngineSandbox/graphics/viewWinow/mainPanels/RightSidePanel.java
index 7db57a1..8896d57 100644
--- a/src/test/java/graphicsEngineSandbox/graphics/viewWinow/mainPanels/RightSidePanel.java
+++ b/src/test/java/graphicsEngineSandbox/graphics/viewWinow/mainPanels/RightSidePanel.java
@@ -1,17 +1,20 @@
package graphicsEngineSandbox.graphics.viewWinow.mainPanels;
-import graphicsEngine.panels.PanelColors;
-import graphicsEngine.panels.SimplePanel;
+import graphicsEngine.colors.SimpleColorScheme;
+import graphicsEngine.panels.StaticPanel;
-import java.awt.*;
+import java.awt.Dimension;
+import java.awt.Graphics;
-public class RightSidePanel extends SimplePanel {
- private static final int[] TEXT_LOCATION = new int[] {5, 20};
- private static final String TEXT = "Right side panel";
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
- public RightSidePanel(int width, PanelColors colors) {
- super(colors, false);
- setPreferredSize(new Dimension(width, Integer.MAX_VALUE));
+public class RightSidePanel extends StaticPanel {
+ private static final int @NotNull [] TEXT_LOCATION = new int[] {5, 20};
+ private static final @NotNull String TEXT = "Right side panel";
+
+ public RightSidePanel(int width, @Nullable SimpleColorScheme colors) {
+ super(new Dimension(width, Integer.MAX_VALUE), colors, null);
}
@Override
@@ -20,8 +23,8 @@ public void paintComponent(Graphics g) {
drawText(g);
}
- private void drawText(Graphics g) {
- g.setColor(getPanelColors().text);
+ private void drawText(@NotNull Graphics g) {
+ g.setColor(getPanelColors().getSecondaryColor());
g.drawString(TEXT, TEXT_LOCATION[0], TEXT_LOCATION[1]);
}
}
\ No newline at end of file
diff --git a/src/test/java/graphicsEngineSandbox/graphics/viewWinow/mainPanels/center/CenterContainer.java b/src/test/java/graphicsEngineSandbox/graphics/viewWinow/mainPanels/center/CenterContainer.java
index 19a236c..2be11e1 100644
--- a/src/test/java/graphicsEngineSandbox/graphics/viewWinow/mainPanels/center/CenterContainer.java
+++ b/src/test/java/graphicsEngineSandbox/graphics/viewWinow/mainPanels/center/CenterContainer.java
@@ -1,14 +1,23 @@
package graphicsEngineSandbox.graphics.viewWinow.mainPanels.center;
-import graphicsEngine.panels.PanelColors;
-import graphicsEngine.panels.SimplePanel;
+import graphicsEngine.colors.SimpleColorScheme;
+import graphicsEngine.panels.StaticPanel;
-import java.awt.*;
-import javax.swing.*;
+import java.awt.Dimension;
+import java.awt.BorderLayout;
+import javax.swing.JPanel;
-public class CenterContainer extends SimplePanel {
- public CenterContainer(PanelColors panelColors) {
- super(panelColors, false);
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+public class CenterContainer extends StaticPanel {
+ public CenterContainer(@Nullable SimpleColorScheme colors) {
+ super(null, colors, null);
+ }
+
+ @Override
+ public void addParts() {
+ super.addParts();
setLayout(new BorderLayout(0,0));
add(new CentralSquare(), BorderLayout.WEST);
add(
@@ -19,7 +28,7 @@ public CenterContainer(PanelColors panelColors) {
}
@Override
- public Dimension getPreferredSize() {
+ public @NotNull Dimension getPreferredSize() {
Dimension parentSize = getParent().getSize();
if (parentSize.width >= parentSize.height) {
diff --git a/src/test/java/graphicsEngineSandbox/graphics/viewWinow/mainPanels/center/CentralSquare.java b/src/test/java/graphicsEngineSandbox/graphics/viewWinow/mainPanels/center/CentralSquare.java
index 6c347ed..0d62be7 100644
--- a/src/test/java/graphicsEngineSandbox/graphics/viewWinow/mainPanels/center/CentralSquare.java
+++ b/src/test/java/graphicsEngineSandbox/graphics/viewWinow/mainPanels/center/CentralSquare.java
@@ -1,36 +1,39 @@
package graphicsEngineSandbox.graphics.viewWinow.mainPanels.center;
-import graphicsEngine.panels.PanelColors;
-import graphicsEngine.panels.SimplePanel;
+import graphicsEngine.colors.SimpleColorScheme;
+import graphicsEngine.panels.BorderProperties;
+import graphicsEngine.panels.StaticPanel;
import java.awt.*;
-public class CentralSquare extends SimplePanel {
- private static final int[] TEXT_LOCATION = new int[] {5, 20};
- private static final PanelColors COLORS;
+import org.jetbrains.annotations.NotNull;
- static {
- Color
- background = new Color(30, 30, 150),
- text = new Color(150, 150, 0),
- border = new Color(200,180,100);
+public class CentralSquare extends StaticPanel {
+ private static final @NotNull SimpleColorScheme
+ COLORS = new SimpleColorScheme(
+ new Color(30, 30, 150),
+ new Color(150, 150, 0));
- COLORS = new PanelColors(background, text, border);
- }
+ private static final @NotNull BorderProperties
+ BORDER_PROPERTIES = new BorderProperties(
+ new Color(200,180,100),
+ false);
+
+ private static final int @NotNull [] TEXT_LOCATION = new int[] {5, 20};
public CentralSquare() {
- super(COLORS, false);
+ super(null, COLORS, BORDER_PROPERTIES);
}
@Override
- public Dimension getPreferredSize() {
+ public @NotNull Dimension getPreferredSize() {
Dimension maxSize = this.getParent().getSize();
int a = Math.min(maxSize.width, maxSize.height);
return new Dimension(a, a);
}
@Override
- public void setSize(Dimension d) {
+ public void setSize(@NotNull Dimension d) {
int a = Math.max(0, Math.min(d.width, d.height));
super.setSize(new Dimension(a, a));
}
@@ -41,14 +44,15 @@ public void paintComponent(Graphics g) {
myGraphics(g);
}
- private void myGraphics(Graphics g) {
- PanelColors colors = getPanelColors();
- drawCircle(g, colors.border);
- drawDiagonals(g, colors.border);
- drawText(g, colors.text);
+ private void myGraphics(@NotNull Graphics g) {
+ @NotNull Color borderColor = BORDER_PROPERTIES.getBorderColor();
+ drawCircle(g, borderColor);
+ drawDiagonals(g, borderColor);
+ @NotNull Color textColor = getPanelColors().getSecondaryColor();
+ drawText(g, textColor);
}
- private void drawText(Graphics g, Color color) {
+ private void drawText(@NotNull Graphics g, @NotNull Color color) {
g.setColor(color);
g.drawString(
"A square",
@@ -64,16 +68,16 @@ private void drawText(Graphics g, Color color) {
TEXT_LOCATION[0], TEXT_LOCATION[1] + 60);
}
- private void drawDiagonals(Graphics g, Color color) {
- Dimension size = getSize();
+ private void drawDiagonals(@NotNull Graphics g, @NotNull Color color) {
+ @NotNull Dimension size = getSize();
g.setColor(color);
g.drawLine(0, 0, size.width, size.height);
g.drawLine(0, size.height, size.width, 0);
}
- private void drawCircle(Graphics g, Color color) {
- Dimension size = getSize();
+ private void drawCircle(@NotNull Graphics g, @NotNull Color color) {
+ @NotNull Dimension size = getSize();
g.setColor(color);
g.drawOval(0, 0, size.width, size.height);
diff --git a/src/test/java/graphicsEngineSandbox/main/Main.java b/src/test/java/graphicsEngineSandbox/main/Main.java
index b6867b4..bede39d 100644
--- a/src/test/java/graphicsEngineSandbox/main/Main.java
+++ b/src/test/java/graphicsEngineSandbox/main/Main.java
@@ -2,13 +2,18 @@
import ThreadAbstraction.AbstractUpdater;
import graphicsEngineSandbox.calc.Calculations;
-import graphicsEngineSandbox.graphics.GraphicsAdapter;
+import graphicsEngineSandbox.graphics.MyGraphicsAdapter;
-import static graphicsEngine.Utilities.printLine;
+import static consoleUtils.ConsoleUtils.printLine;
// TODO: add javadoc
public class Main extends AbstractUpdater {
- // TODO: add javadoc
+
+ /**
+ * The main method.
+ *
+ * @param args Command-line arguments.
+ */
public static void main(String[] args) {
Starter.start();
}
@@ -16,7 +21,7 @@ public static void main(String[] args) {
public static Main mainThread;
private static final long THREAD_DELAY = 100L;
- protected GraphicsAdapter graphics;
+ protected MyGraphicsAdapter graphics;
protected Main() {
super(THREAD_DELAY);
diff --git a/src/test/java/graphicsEngineSandbox/main/Starter.java b/src/test/java/graphicsEngineSandbox/main/Starter.java
index a5e3e95..85d9b80 100644
--- a/src/test/java/graphicsEngineSandbox/main/Starter.java
+++ b/src/test/java/graphicsEngineSandbox/main/Starter.java
@@ -1,9 +1,9 @@
package graphicsEngineSandbox.main;
import graphicsEngineSandbox.data.Data;
-import graphicsEngineSandbox.graphics.GraphicsAdapter;
+import graphicsEngineSandbox.graphics.MyGraphicsAdapter;
-import static graphicsEngine.Utilities.printLine;
+import static consoleUtils.ConsoleUtils.printLine;
//a helper class for starting everything
// TODO: add javadoc
@@ -19,6 +19,6 @@ protected static void start() {
private static void startOtherThreads() {
Data.resetValues(); //TODO: convert to a non-static object
- Main.mainThread.graphics = new GraphicsAdapter();
+ Main.mainThread.graphics = new MyGraphicsAdapter();
}
}
\ No newline at end of file