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 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 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 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 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