From 01f84a805316e24bd9e6b46c68bd3af16374432e Mon Sep 17 00:00:00 2001 From: Tinglyyy Date: Sat, 7 Feb 2026 21:56:05 +0100 Subject: [PATCH] Added more default elements and changed colours --- .../oacswing/component/OACButton.java | 4 +- .../oacswing/component/OACCheckBox.java | 4 +- .../component/OACCheckBoxMenuItem.java | 4 +- .../oacswing/component/OACColorChooser.java | 4 +- .../oacswing/component/OACComboBox.java | 4 +- .../oacswing/component/OACComponent.java | 4 +- .../oacswing/component/OACFrame.java | 297 ++++++++++++++---- .../oacswing/component/OACLayeredPane.java | 4 +- .../oacswing/component/OACList.java | 4 +- .../oacswing/component/OACMenu.java | 4 +- .../oacswing/component/OACMenuBar.java | 4 +- .../oacswing/component/OACMenuItem.java | 4 +- .../oacswing/component/OACOptionPane.java | 4 +- .../oacswing/component/OACPanel.java | 4 +- .../oacswing/component/OACPasswordField.java | 4 +- .../oacswing/component/OACPopupMenu.java | 4 +- .../oacswing/component/OACProgressBar.java | 4 +- .../oacswing/component/OACRadioButton.java | 4 +- .../component/OACRadioButtonMenuItem.java | 4 +- .../oacswing/component/OACRootPane.java | 4 +- .../oacswing/component/OACScrollBar.java | 4 +- .../oacswing/component/OACScrollPane.java | 4 +- .../oacswing/component/OACSeparator.java | 4 +- .../oacswing/component/OACSlider.java | 4 +- .../oacswing/component/OACSpinner.java | 4 +- .../oacswing/component/OACSplitPane.java | 4 +- .../oacswing/component/OACTabbedPane.java | 4 +- .../oacswing/component/OACTable.java | 6 +- .../oacswing/component/OACTextArea.java | 4 +- .../oacswing/component/OACTextField.java | 4 +- .../oacswing/component/OACTextPane.java | 4 +- .../oacswing/component/OACTitleBar.java | 173 ++++++++++ .../oacswing/component/OACToggleButton.java | 4 +- .../oacswing/component/OACToolBar.java | 4 +- .../oacswing/component/OACToolTip.java | 4 +- .../oacswing/component/OACTree.java | 4 +- .../oacswing/component/OACViewport.java | 4 +- .../oacswing/component/OACWindow.java | 4 +- .../oacswing/component/design/Design.java | 16 +- .../component/design/DesignManager.java | 59 +++- .../oacswing/component/design/OACColor.java | 28 +- .../oacswing/icons/defaults/DefaultIcons.java | 17 + .../oacswing/test/AnimationTests.java | 6 +- .../oacswing/test/CustomizedTests.java | 15 +- .../oacswing/test/TestUtils.java | 5 + 45 files changed, 597 insertions(+), 165 deletions(-) create mode 100644 src/main/java/org/openautonomousconnection/oacswing/component/OACTitleBar.java create mode 100644 src/main/java/org/openautonomousconnection/oacswing/icons/defaults/DefaultIcons.java diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACButton.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACButton.java index 7726528..ac0fef3 100644 --- a/src/main/java/org/openautonomousconnection/oacswing/component/OACButton.java +++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACButton.java @@ -4,7 +4,7 @@ package org.openautonomousconnection.oacswing.component; -import org.jetbrains.annotations.NotNull; +import lombok.NonNull; import org.openautonomousconnection.oacswing.component.design.Design; import javax.swing.*; @@ -46,7 +46,7 @@ public class OACButton extends JButton implements OACComponent { } @Override - public void add(@NotNull Component comp, Object constraints) { + public void add(@NonNull Component comp, Object constraints) { this.initOther(comp); super.add(comp, constraints); } diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACCheckBox.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACCheckBox.java index f088402..bae8802 100644 --- a/src/main/java/org/openautonomousconnection/oacswing/component/OACCheckBox.java +++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACCheckBox.java @@ -4,7 +4,7 @@ package org.openautonomousconnection.oacswing.component; -import org.jetbrains.annotations.NotNull; +import lombok.NonNull; import javax.swing.*; import java.awt.*; @@ -53,7 +53,7 @@ public class OACCheckBox extends JCheckBox implements OACComponent { } @Override - public void add(@NotNull Component comp, Object constraints) { + public void add(@NonNull Component comp, Object constraints) { OACComponent.super.add(comp, constraints); } diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACCheckBoxMenuItem.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACCheckBoxMenuItem.java index 21dafa3..fc069a9 100644 --- a/src/main/java/org/openautonomousconnection/oacswing/component/OACCheckBoxMenuItem.java +++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACCheckBoxMenuItem.java @@ -4,7 +4,7 @@ package org.openautonomousconnection.oacswing.component; -import org.jetbrains.annotations.NotNull; +import lombok.NonNull; import javax.swing.*; import java.awt.*; @@ -49,7 +49,7 @@ public class OACCheckBoxMenuItem extends JCheckBoxMenuItem implements OACCompone } @Override - public void add(@NotNull Component comp, Object constraints) { + public void add(@NonNull Component comp, Object constraints) { OACComponent.super.add(comp, constraints); } diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACColorChooser.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACColorChooser.java index 0729043..cfe7127 100644 --- a/src/main/java/org/openautonomousconnection/oacswing/component/OACColorChooser.java +++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACColorChooser.java @@ -4,7 +4,7 @@ package org.openautonomousconnection.oacswing.component; -import org.jetbrains.annotations.NotNull; +import lombok.NonNull; import javax.swing.*; import java.awt.*; @@ -21,7 +21,7 @@ public class OACColorChooser extends JColorChooser implements OACComponent { } @Override - public void add(@NotNull Component comp, Object constraints) { + public void add(@NonNull Component comp, Object constraints) { OACComponent.super.add(comp, constraints); } diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACComboBox.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACComboBox.java index c40bb0b..fa9151f 100644 --- a/src/main/java/org/openautonomousconnection/oacswing/component/OACComboBox.java +++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACComboBox.java @@ -4,7 +4,7 @@ package org.openautonomousconnection.oacswing.component; -import org.jetbrains.annotations.NotNull; +import lombok.NonNull; import javax.swing.*; import java.awt.*; @@ -38,7 +38,7 @@ public class OACComboBox extends JComboBox implements OACComponent { } @Override - public void add(@NotNull Component comp, Object constraints) { + public void add(@NonNull Component comp, Object constraints) { OACComponent.super.add(comp, constraints); } diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACComponent.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACComponent.java index 6e9084a..b0822f0 100644 --- a/src/main/java/org/openautonomousconnection/oacswing/component/OACComponent.java +++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACComponent.java @@ -1,7 +1,6 @@ package org.openautonomousconnection.oacswing.component; import jdk.jshell.spi.ExecutionControl; -import org.jetbrains.annotations.Nullable; import org.openautonomousconnection.oacswing.component.design.Design; import org.openautonomousconnection.oacswing.component.design.DesignManager; @@ -13,6 +12,7 @@ import java.util.OptionalInt; public interface OACComponent { default void initDesign() { DesignManager.apply(this); + // Design design = DesignManager.getGlobalDesign(); // // this.setBackground(design.getElements().get(this.getClass()).getColor()); @@ -25,7 +25,7 @@ public interface OACComponent { component.initDesign(); } - default @Nullable Component add(Optional name, Component comp, OptionalInt index, Optional constrains) throws ExecutionControl.NotImplementedException { + default Component add(Optional name, Component comp, OptionalInt index, Optional constrains) throws ExecutionControl.NotImplementedException { JComponent superclass = this.getSuperclass(); if(comp instanceof OACComponent component) diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACFrame.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACFrame.java index f56cfe3..7dc00bd 100644 --- a/src/main/java/org/openautonomousconnection/oacswing/component/OACFrame.java +++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACFrame.java @@ -1,32 +1,226 @@ -/* Author: Maple - * Feb. 2 2026 - * */ - package org.openautonomousconnection.oacswing.component; -import org.jetbrains.annotations.NotNull; +import lombok.Getter; +import lombok.NonNull; +import lombok.Setter; import org.openautonomousconnection.oacswing.component.design.DesignManager; import javax.swing.*; import java.awt.*; +import java.awt.event.ComponentAdapter; +import java.awt.event.ComponentEvent; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; import java.awt.geom.RoundRectangle2D; +/** + * OAC Swing frame with a custom title bar. + */ public class OACFrame extends JFrame { + private static final int RESIZE_MARGIN = 8; + + private Point dragStart; + private Rectangle startBounds; + private int resizeCursor = Cursor.DEFAULT_CURSOR; + @Getter + private OACTitleBar titleBar; + + /** + * Creates a new frame. + */ public OACFrame() { super(); + init(); + } - this.init(); + /** + * Creates a new frame with the given graphics configuration. + * + * @param gc graphics configuration + */ + public OACFrame(GraphicsConfiguration gc) { + super(gc); + init(); + } + + /** + * Creates a new frame with the given title. + * + * @param title frame title + */ + public OACFrame(String title) { + super(title); + init(); + } + + /** + * Creates a new frame with the given title and graphics configuration. + * + * @param title frame title + * @param gc graphics configuration + */ + public OACFrame(String title, GraphicsConfiguration gc) { + super(title, gc); + init(); + } + private static final int TITLE_BAR_HEIGHT = 42; + private void init() { + super.setLayeredPane(new OACLayeredPane()); + + setUndecorated(true); + setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); + setMinimumSize(new Dimension(900, 600)); + setLocationByPlatform(true); + + OACPanel content = new OACPanel(new BorderLayout()); + setContentPane(content); + + titleBar = new OACTitleBar(this); + + OACPanel titleRoot = new OACPanel(new BorderLayout()); + titleRoot.setOpaque(false); + titleRoot.add(titleBar, BorderLayout.CENTER); + + OACLayeredPane layeredPane = getLayeredPane(); + layeredPane.add(titleRoot, OACLayeredPane.DRAG_LAYER); + + addComponentListener(new ComponentAdapter() { + @Override + public void componentResized(ComponentEvent e) { + titleRoot.setBounds(0, 0, getWidth(), TITLE_BAR_HEIGHT); + + setShape(new RoundRectangle2D.Double(0, 0, getWidth(), getHeight(), 30, 30)); + } + + @Override + public void componentShown(ComponentEvent e) { + titleRoot.setBounds(0, 0, getWidth(), TITLE_BAR_HEIGHT); + + setShape(new RoundRectangle2D.Double(0, 0, getWidth(), getHeight(), 30, 30)); + } + }); + + setSize(900, 600); + + SwingUtilities.invokeLater(() -> { + titleRoot.setBounds(0, 0, getWidth(), TITLE_BAR_HEIGHT); + setShape(new RoundRectangle2D.Double(0, 0, getWidth(), getHeight(), 30, 30)); + }); + + MouseAdapter adapter = new MouseAdapter() { + + @Override + public void mouseMoved(MouseEvent e) { + resizeCursor = getResizeCursor(e); + + setCursor(Cursor.getPredefinedCursor(resizeCursor)); + } + + @Override + public void mousePressed(MouseEvent e) { + dragStart = e.getLocationOnScreen(); + startBounds = getBounds(); + } + + @Override + public void mouseDragged(MouseEvent e) { + if (resizeCursor == Cursor.DEFAULT_CURSOR) return; + + Point dragNow = e.getLocationOnScreen(); + int dx = dragNow.x - dragStart.x; + int dy = dragNow.y - dragStart.y; + + Rectangle newBounds = new Rectangle(startBounds); + + switch (resizeCursor) { + case Cursor.E_RESIZE_CURSOR -> newBounds.width += dx; + case Cursor.S_RESIZE_CURSOR -> newBounds.height += dy; + case Cursor.SE_RESIZE_CURSOR -> { + newBounds.width += dx; + newBounds.height += dy; + } + case Cursor.W_RESIZE_CURSOR -> { + newBounds.x += dx; + newBounds.width -= dx; + } + case Cursor.N_RESIZE_CURSOR -> { + newBounds.y += dy; + newBounds.height -= dy; + } + case Cursor.NW_RESIZE_CURSOR -> { + newBounds.x += dx; + newBounds.y += dy; + newBounds.width -= dx; + newBounds.height -= dy; + } + case Cursor.NE_RESIZE_CURSOR -> { + newBounds.y += dy; + newBounds.width += dx; + newBounds.height -= dy; + } + case Cursor.SW_RESIZE_CURSOR -> { + newBounds.x += dx; + newBounds.width -= dx; + newBounds.height += dy; + } + } + + setBounds(newBounds); + + e.getComponent().dispatchEvent(new ComponentEvent(e.getComponent(), ComponentEvent.COMPONENT_RESIZED)); + } + }; + + addMouseListener(adapter); + addMouseMotionListener(adapter); + + DesignManager.apply(this); + } + + /** + * Adds a component into the content area (center) by default. + * + * @param comp component + */ + @Override + public Component add(Component comp) { + initIfOACComponent(comp); + return super.add(comp); + } + + @Override + public Component add(Component comp, int index) { + initIfOACComponent(comp); + return super.add(comp, index); + } + + @Override + public void add(@NonNull Component comp, Object constraints) { + initIfOACComponent(comp); + super.add(comp, constraints); + } + + @Override + public Component add(String name, Component comp) { + initIfOACComponent(comp); + return super.add(name, comp); + } + + @Override + public void add(Component comp, Object constraints, int index) { + initIfOACComponent(comp); + super.add(comp, constraints, index); } private void initIfOACComponent(Component comp) { - if(comp instanceof OACComponent component) + if (comp instanceof OACComponent component) { component.initDesign(); + } } @Override protected OACRootPane createRootPane() { OACRootPane rp = new OACRootPane(); - rp.setOpaque(true); return rp; } @@ -37,69 +231,40 @@ public class OACFrame extends JFrame { } @Override - public Component add(Component comp) { - this.initIfOACComponent(comp); + public void setLayeredPane(JLayeredPane layeredPane) { + if(layeredPane instanceof OACLayeredPane) + super.setLayeredPane(layeredPane); + } - return super.add(comp); + public void setLayeredPane(OACLayeredPane layeredPane) { + setLayeredPane((JLayeredPane) layeredPane); } @Override - public Component add(Component comp, int index) { - this.initIfOACComponent(comp); - - return super.add(comp, index); + public OACLayeredPane getLayeredPane() { + return (OACLayeredPane) super.getLayeredPane(); } - @Override - public void add(@NotNull Component comp, Object constraints) { - this.initIfOACComponent(comp); + private int getResizeCursor(MouseEvent e) { + int x = e.getX(); + int y = e.getY(); + int w = e.getComponent().getWidth(); + int h = e.getComponent().getHeight(); - super.add(comp, constraints); + boolean left = x < RESIZE_MARGIN; + boolean right = x > w - RESIZE_MARGIN; + boolean top = y < RESIZE_MARGIN; + boolean bottom = y > h - RESIZE_MARGIN; + + if (left && top) return Cursor.NW_RESIZE_CURSOR; + if (right && top) return Cursor.NE_RESIZE_CURSOR; + if (left && bottom) return Cursor.SW_RESIZE_CURSOR; + if (right && bottom) return Cursor.SE_RESIZE_CURSOR; + if (left) return Cursor.W_RESIZE_CURSOR; + if (right) return Cursor.E_RESIZE_CURSOR; + if (top) return Cursor.N_RESIZE_CURSOR; + if (bottom) return Cursor.S_RESIZE_CURSOR; + + return Cursor.DEFAULT_CURSOR; } - - @Override - public Component add(String name, Component comp) { - this.initIfOACComponent(comp); - - return super.add(name, comp); - } - - @Override - public void add(Component comp, Object constraints, int index) { - this.initIfOACComponent(comp); - - super.add(comp, constraints, index); - } - - public OACFrame(GraphicsConfiguration gc) { - super(gc); - - this.init(); - } - - public OACFrame(String title) { - super(title); - - this.init(); - } - - public OACFrame(String title, GraphicsConfiguration gc) { - super(title, gc); - - this.init(); - } - - private void init() { - this.setUndecorated(true); - -// DesignManager.apply(this.getRootPane()); - DesignManager.apply(this); - this.setShape(new RoundRectangle2D.Double( - 0, 0, - this.getWidth(), - this.getHeight(), - 30, 30 - )); - - } -} +} \ No newline at end of file diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACLayeredPane.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACLayeredPane.java index 6c62596..4858c59 100644 --- a/src/main/java/org/openautonomousconnection/oacswing/component/OACLayeredPane.java +++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACLayeredPane.java @@ -4,7 +4,7 @@ package org.openautonomousconnection.oacswing.component; -import org.jetbrains.annotations.NotNull; +import lombok.NonNull; import javax.swing.*; import java.awt.*; @@ -27,7 +27,7 @@ public class OACLayeredPane extends JLayeredPane implements OACComponent { } @Override - public void add(@NotNull Component comp, Object constraints) { + public void add(@NonNull Component comp, Object constraints) { this.initOther(comp); super.add(comp, constraints); } diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACList.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACList.java index f8bcd1f..84e4b67 100644 --- a/src/main/java/org/openautonomousconnection/oacswing/component/OACList.java +++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACList.java @@ -4,7 +4,7 @@ package org.openautonomousconnection.oacswing.component; -import org.jetbrains.annotations.NotNull; +import lombok.NonNull; import javax.swing.*; import java.awt.*; @@ -40,7 +40,7 @@ public class OACList extends JList implements OACComponent { } @Override - public void add(@NotNull Component comp, Object constraints) { + public void add(@NonNull Component comp, Object constraints) { this.initOther(comp); super.add(comp, constraints); } diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACMenu.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACMenu.java index 13c86fa..e8f26be 100644 --- a/src/main/java/org/openautonomousconnection/oacswing/component/OACMenu.java +++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACMenu.java @@ -4,8 +4,6 @@ package org.openautonomousconnection.oacswing.component; -import org.jetbrains.annotations.NotNull; - import javax.swing.*; import java.awt.*; @@ -39,7 +37,7 @@ public class OACMenu extends JMenu implements OACComponent { } @Override - public void add(@NotNull Component comp, Object constraints) { + public void add(Component comp, Object constraints) { this.initOther(comp); super.add(comp, constraints); } diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACMenuBar.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACMenuBar.java index eb82df9..a3b4701 100644 --- a/src/main/java/org/openautonomousconnection/oacswing/component/OACMenuBar.java +++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACMenuBar.java @@ -4,7 +4,7 @@ package org.openautonomousconnection.oacswing.component; -import org.jetbrains.annotations.NotNull; +import lombok.NonNull; import javax.swing.*; import java.awt.*; @@ -27,7 +27,7 @@ public class OACMenuBar extends JMenuBar implements OACComponent { } @Override - public void add(@NotNull Component comp, Object constraints) { + public void add(@NonNull Component comp, Object constraints) { this.initOther(comp); super.add(comp, constraints); } diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACMenuItem.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACMenuItem.java index 19ecd81..e7bee9e 100644 --- a/src/main/java/org/openautonomousconnection/oacswing/component/OACMenuItem.java +++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACMenuItem.java @@ -4,7 +4,7 @@ package org.openautonomousconnection.oacswing.component; -import org.jetbrains.annotations.NotNull; +import lombok.NonNull; import javax.swing.*; import java.awt.*; @@ -47,7 +47,7 @@ public class OACMenuItem extends JMenuItem implements OACComponent { } @Override - public void add(@NotNull Component comp, Object constraints) { + public void add(@NonNull Component comp, Object constraints) { this.initOther(comp); super.add(comp, constraints); } diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACOptionPane.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACOptionPane.java index abfa499..a4bd9aa 100644 --- a/src/main/java/org/openautonomousconnection/oacswing/component/OACOptionPane.java +++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACOptionPane.java @@ -4,7 +4,7 @@ package org.openautonomousconnection.oacswing.component; -import org.jetbrains.annotations.NotNull; +import lombok.NonNull; import javax.swing.*; import java.awt.*; @@ -51,7 +51,7 @@ public class OACOptionPane extends JOptionPane implements OACComponent { } @Override - public void add(@NotNull Component comp, Object constraints) { + public void add(@NonNull Component comp, Object constraints) { this.initOther(comp); super.add(comp, constraints); } diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACPanel.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACPanel.java index 861b015..4601375 100644 --- a/src/main/java/org/openautonomousconnection/oacswing/component/OACPanel.java +++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACPanel.java @@ -4,7 +4,7 @@ package org.openautonomousconnection.oacswing.component; -import org.jetbrains.annotations.NotNull; +import lombok.NonNull; import javax.swing.*; import java.awt.*; @@ -39,7 +39,7 @@ public class OACPanel extends JPanel implements OACComponent { } @Override - public void add(@NotNull Component comp, Object constraints) { + public void add(@NonNull Component comp, Object constraints) { this.initOther(comp); super.add(comp, constraints); } diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACPasswordField.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACPasswordField.java index 56ed836..a236e1c 100644 --- a/src/main/java/org/openautonomousconnection/oacswing/component/OACPasswordField.java +++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACPasswordField.java @@ -4,7 +4,7 @@ package org.openautonomousconnection.oacswing.component; -import org.jetbrains.annotations.NotNull; +import lombok.NonNull; import javax.swing.*; import javax.swing.text.Document; @@ -44,7 +44,7 @@ public class OACPasswordField extends JPasswordField implements OACComponent { } @Override - public void add(@NotNull Component comp, Object constraints) { + public void add(@NonNull Component comp, Object constraints) { this.initOther(comp); super.add(comp, constraints); } diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACPopupMenu.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACPopupMenu.java index 62ed59f..874f806 100644 --- a/src/main/java/org/openautonomousconnection/oacswing/component/OACPopupMenu.java +++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACPopupMenu.java @@ -4,7 +4,7 @@ package org.openautonomousconnection.oacswing.component; -import org.jetbrains.annotations.NotNull; +import lombok.NonNull; import javax.swing.*; import java.awt.*; @@ -31,7 +31,7 @@ public class OACPopupMenu extends JPopupMenu implements OACComponent { } @Override - public void add(@NotNull Component comp, Object constraints) { + public void add(@NonNull Component comp, Object constraints) { this.initOther(comp); super.add(comp, constraints); } diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACProgressBar.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACProgressBar.java index 3b61948..e4b09d7 100644 --- a/src/main/java/org/openautonomousconnection/oacswing/component/OACProgressBar.java +++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACProgressBar.java @@ -4,7 +4,7 @@ package org.openautonomousconnection.oacswing.component; -import org.jetbrains.annotations.NotNull; +import lombok.NonNull; import javax.swing.*; import java.awt.*; @@ -43,7 +43,7 @@ public class OACProgressBar extends JProgressBar implements OACComponent { } @Override - public void add(@NotNull Component comp, Object constraints) { + public void add(@NonNull Component comp, Object constraints) { this.initOther(comp); super.add(comp, constraints); } diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACRadioButton.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACRadioButton.java index e341f3f..64b7b5c 100644 --- a/src/main/java/org/openautonomousconnection/oacswing/component/OACRadioButton.java +++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACRadioButton.java @@ -4,7 +4,7 @@ package org.openautonomousconnection.oacswing.component; -import org.jetbrains.annotations.NotNull; +import lombok.NonNull; import javax.swing.*; import java.awt.*; @@ -55,7 +55,7 @@ public class OACRadioButton extends JRadioButton implements OACComponent { } @Override - public void add(@NotNull Component comp, Object constraints) { + public void add(@NonNull Component comp, Object constraints) { this.initOther(comp); super.add(comp, constraints); } diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACRadioButtonMenuItem.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACRadioButtonMenuItem.java index 6a5f42c..5d93e07 100644 --- a/src/main/java/org/openautonomousconnection/oacswing/component/OACRadioButtonMenuItem.java +++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACRadioButtonMenuItem.java @@ -4,7 +4,7 @@ package org.openautonomousconnection.oacswing.component; -import org.jetbrains.annotations.NotNull; +import lombok.NonNull; import javax.swing.*; import java.awt.*; @@ -55,7 +55,7 @@ public class OACRadioButtonMenuItem extends JRadioButtonMenuItem implements OACC } @Override - public void add(@NotNull Component comp, Object constraints) { + public void add(@NonNull Component comp, Object constraints) { this.initOther(comp); super.add(comp, constraints); } diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACRootPane.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACRootPane.java index 2683294..656498f 100644 --- a/src/main/java/org/openautonomousconnection/oacswing/component/OACRootPane.java +++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACRootPane.java @@ -4,7 +4,7 @@ package org.openautonomousconnection.oacswing.component; -import org.jetbrains.annotations.NotNull; +import lombok.NonNull; import javax.swing.*; import java.awt.*; @@ -110,7 +110,7 @@ public class OACRootPane extends JRootPane implements OACComponent { } @Override - public void add(@NotNull Component comp, Object constraints) { + public void add(@NonNull Component comp, Object constraints) { this.initOther(comp); super.add(comp, constraints); } diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACScrollBar.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACScrollBar.java index 0e651cb..9641399 100644 --- a/src/main/java/org/openautonomousconnection/oacswing/component/OACScrollBar.java +++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACScrollBar.java @@ -4,7 +4,7 @@ package org.openautonomousconnection.oacswing.component; -import org.jetbrains.annotations.NotNull; +import lombok.NonNull; import javax.swing.*; import java.awt.*; @@ -35,7 +35,7 @@ public class OACScrollBar extends JScrollBar implements OACComponent { } @Override - public void add(@NotNull Component comp, Object constraints) { + public void add(@NonNull Component comp, Object constraints) { this.initOther(comp); super.add(comp, constraints); } diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACScrollPane.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACScrollPane.java index a3a50a9..3ae2fec 100644 --- a/src/main/java/org/openautonomousconnection/oacswing/component/OACScrollPane.java +++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACScrollPane.java @@ -4,7 +4,7 @@ package org.openautonomousconnection.oacswing.component; -import org.jetbrains.annotations.NotNull; +import lombok.NonNull; import javax.swing.*; import java.awt.*; @@ -39,7 +39,7 @@ public class OACScrollPane extends JScrollPane implements OACComponent { } @Override - public void add(@NotNull Component comp, Object constraints) { + public void add(@NonNull Component comp, Object constraints) { this.initOther(comp); super.add(comp, constraints); } diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACSeparator.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACSeparator.java index 2a36d72..e140427 100644 --- a/src/main/java/org/openautonomousconnection/oacswing/component/OACSeparator.java +++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACSeparator.java @@ -4,7 +4,7 @@ package org.openautonomousconnection.oacswing.component; -import org.jetbrains.annotations.NotNull; +import lombok.NonNull; import javax.swing.*; import java.awt.*; @@ -31,7 +31,7 @@ public class OACSeparator extends JSeparator implements OACComponent { } @Override - public void add(@NotNull Component comp, Object constraints) { + public void add(@NonNull Component comp, Object constraints) { this.initOther(comp); super.add(comp, constraints); } diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACSlider.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACSlider.java index 7b8a47f..90cf3c9 100644 --- a/src/main/java/org/openautonomousconnection/oacswing/component/OACSlider.java +++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACSlider.java @@ -4,7 +4,7 @@ package org.openautonomousconnection.oacswing.component; -import org.jetbrains.annotations.NotNull; +import lombok.NonNull; import javax.swing.*; import java.awt.*; @@ -47,7 +47,7 @@ public class OACSlider extends JSlider implements OACComponent { } @Override - public void add(@NotNull Component comp, Object constraints) { + public void add(@NonNull Component comp, Object constraints) { this.initOther(comp); super.add(comp, constraints); } diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACSpinner.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACSpinner.java index 430f31e..fdd7eb9 100644 --- a/src/main/java/org/openautonomousconnection/oacswing/component/OACSpinner.java +++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACSpinner.java @@ -4,7 +4,7 @@ package org.openautonomousconnection.oacswing.component; -import org.jetbrains.annotations.NotNull; +import lombok.NonNull; import javax.swing.*; import java.awt.*; @@ -31,7 +31,7 @@ public class OACSpinner extends JSpinner implements OACComponent { } @Override - public void add(@NotNull Component comp, Object constraints) { + public void add(@NonNull Component comp, Object constraints) { this.initOther(comp); super.add(comp, constraints); } diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACSplitPane.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACSplitPane.java index e202a01..321c376 100644 --- a/src/main/java/org/openautonomousconnection/oacswing/component/OACSplitPane.java +++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACSplitPane.java @@ -4,7 +4,7 @@ package org.openautonomousconnection.oacswing.component; -import org.jetbrains.annotations.NotNull; +import lombok.NonNull; import javax.swing.*; import java.awt.*; @@ -43,7 +43,7 @@ public class OACSplitPane extends JSplitPane implements OACComponent { } @Override - public void add(@NotNull Component comp, Object constraints) { + public void add(@NonNull Component comp, Object constraints) { this.initOther(comp); super.add(comp, constraints); } diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACTabbedPane.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACTabbedPane.java index 89819c0..76b7529 100644 --- a/src/main/java/org/openautonomousconnection/oacswing/component/OACTabbedPane.java +++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACTabbedPane.java @@ -4,7 +4,7 @@ package org.openautonomousconnection.oacswing.component; -import org.jetbrains.annotations.NotNull; +import lombok.NonNull; import javax.swing.*; import java.awt.*; @@ -35,7 +35,7 @@ public class OACTabbedPane extends JTabbedPane implements OACComponent { } @Override - public void add(@NotNull Component comp, Object constraints) { + public void add(@NonNull Component comp, Object constraints) { this.initOther(comp); super.add(comp, constraints); } diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACTable.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACTable.java index 9c3a515..0a241fa 100644 --- a/src/main/java/org/openautonomousconnection/oacswing/component/OACTable.java +++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACTable.java @@ -4,7 +4,7 @@ package org.openautonomousconnection.oacswing.component; -import org.jetbrains.annotations.NotNull; +import lombok.NonNull; import javax.swing.*; import javax.swing.table.TableColumnModel; @@ -37,7 +37,7 @@ public class OACTable extends JTable implements OACComponent { super(rowData, columnNames); } - public OACTable(@NotNull Object[][] rowData, @NotNull Object[] columnNames) { + public OACTable(@NonNull Object[][] rowData, @NonNull Object[] columnNames) { super(rowData, columnNames); } @@ -54,7 +54,7 @@ public class OACTable extends JTable implements OACComponent { } @Override - public void add(@NotNull Component comp, Object constraints) { + public void add(@NonNull Component comp, Object constraints) { this.initOther(comp); super.add(comp, constraints); } diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACTextArea.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACTextArea.java index 44918c2..12af7ee 100644 --- a/src/main/java/org/openautonomousconnection/oacswing/component/OACTextArea.java +++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACTextArea.java @@ -4,7 +4,7 @@ package org.openautonomousconnection.oacswing.component; -import org.jetbrains.annotations.NotNull; +import lombok.NonNull; import javax.swing.*; import javax.swing.text.Document; @@ -48,7 +48,7 @@ public class OACTextArea extends JTextArea implements OACComponent { } @Override - public void add(@NotNull Component comp, Object constraints) { + public void add(@NonNull Component comp, Object constraints) { this.initOther(comp); super.add(comp, constraints); } diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACTextField.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACTextField.java index dedd5fb..a1c7a33 100644 --- a/src/main/java/org/openautonomousconnection/oacswing/component/OACTextField.java +++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACTextField.java @@ -4,8 +4,6 @@ package org.openautonomousconnection.oacswing.component; -import org.jetbrains.annotations.NotNull; - import javax.swing.*; import javax.swing.text.Document; import java.awt.*; @@ -44,7 +42,7 @@ public class OACTextField extends JTextField implements OACComponent { } @Override - public void add(@NotNull Component comp, Object constraints) { + public void add(Component comp, Object constraints) { this.initOther(comp); super.add(comp, constraints); } diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACTextPane.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACTextPane.java index e0d154b..650c73f 100644 --- a/src/main/java/org/openautonomousconnection/oacswing/component/OACTextPane.java +++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACTextPane.java @@ -4,7 +4,7 @@ package org.openautonomousconnection.oacswing.component; -import org.jetbrains.annotations.NotNull; +import lombok.NonNull; import javax.swing.*; import javax.swing.text.StyledDocument; @@ -31,7 +31,7 @@ public class OACTextPane extends JTextPane implements OACComponent { } @Override - public void add(@NotNull Component comp, Object constraints) { + public void add(@NonNull Component comp, Object constraints) { this.initOther(comp); super.add(comp, constraints); } diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACTitleBar.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACTitleBar.java new file mode 100644 index 0000000..d1ad4f2 --- /dev/null +++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACTitleBar.java @@ -0,0 +1,173 @@ +/* Author: UnlegitDqrk + * Feb. 2 2026 + * */ + +package org.openautonomousconnection.oacswing.component; + +import lombok.Getter; +import lombok.Setter; +import org.openautonomousconnection.oacswing.component.design.DesignManager; + +import javax.swing.*; +import javax.swing.border.EmptyBorder; +import java.awt.*; +import java.awt.event.ComponentEvent; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.WindowEvent; + +/** + * Custom title bar with tabs and window control buttons. + */ +public class OACTitleBar extends OACPanel { + + @Getter @Setter + private static int HEIGHT = 42; + + private final OACFrame frame; + private final OACTabbedPane tabs; + + private Point dragStartOnScreen; + private Point dragStartFrameLocation; + + /** + * Creates a title bar for the given frame. + * + * @param frame owning frame + */ + public OACTitleBar(OACFrame frame) { + super(new BorderLayout()); + this.frame = frame; + + setPreferredSize(new Dimension(1, HEIGHT)); + setBorder(new EmptyBorder(6, 10, 6, 10)); + + tabs = createTabs(); + OACPanel left = new OACPanel(new BorderLayout()); + left.setOpaque(false); + left.add(tabs, BorderLayout.CENTER); + + OACPanel right = createWindowControls(); + + add(left, BorderLayout.CENTER); + add(right, BorderLayout.EAST); + + installDragToMove(); + installDoubleClickMaximize(); + } + + /** + * Returns the tab component. + * + * @return tabbed pane + */ + public OACTabbedPane getTabs() { + return tabs; + } + + /** + * Adds a new tab. + * + * @param title tab title + */ + public void addTab(String title) { + OACPanel placeholder = new OACPanel(); + placeholder.setOpaque(false); + tabs.addTab(title, placeholder); + } + + private OACTabbedPane createTabs() { + OACTabbedPane tp = new OACTabbedPane(OACTabbedPane.TOP, OACTabbedPane.SCROLL_TAB_LAYOUT); + tp.setOpaque(false); + + tp.setFocusable(false); + + return tp; + } + + private OACPanel createWindowControls() { + OACPanel p = new OACPanel(new FlowLayout(FlowLayout.RIGHT, 8, 0)); + p.setOpaque(false); + + OACButton min = createTitleButton("—"); + OACButton max = createTitleButton("▢"); + OACButton close = createTitleButton("✕"); + + min.addActionListener(e -> frame.setState(Frame.ICONIFIED)); + max.addActionListener(e -> toggleMaximize()); + close.addActionListener(e -> frame.dispatchEvent(new WindowEvent(frame, WindowEvent.WINDOW_CLOSING))); + + p.add(min); + p.add(max); + p.add(close); + + return p; + } + + private OACButton createTitleButton(String text) { + OACButton b = new OACButton(text); + b.setFocusable(false); + b.setBorderPainted(false); + b.setContentAreaFilled(true); + b.setOpaque(true); + b.setPreferredSize(new Dimension(42, 28)); + + return b; + } + + private void installDragToMove() { + MouseAdapter drag = new MouseAdapter() { + @Override + public void mousePressed(MouseEvent e) { + dragStartOnScreen = e.getLocationOnScreen(); + dragStartFrameLocation = frame.getLocation(); + } + + @Override + public void mouseDragged(MouseEvent e) { + if (dragStartOnScreen == null || dragStartFrameLocation == null) { + return; + } + Point now = e.getLocationOnScreen(); + int dx = now.x - dragStartOnScreen.x; + int dy = now.y - dragStartOnScreen.y; + + if ((frame.getExtendedState() & Frame.MAXIMIZED_BOTH) == Frame.MAXIMIZED_BOTH) { + return; + } + + frame.setLocation(dragStartFrameLocation.x + dx, dragStartFrameLocation.y + dy); + + frame.dispatchEvent(new ComponentEvent(e.getComponent(), ComponentEvent.COMPONENT_MOVED)); + + } + }; + + addMouseListener(drag); + addMouseMotionListener(drag); + } + + private void installDoubleClickMaximize() { + addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + if (e.getClickCount() == 2 && SwingUtilities.isLeftMouseButton(e)) { + toggleMaximize(); + } + } + }); + } + + private void toggleMaximize() { + int state = frame.getExtendedState(); + boolean maximized = (state & Frame.MAXIMIZED_BOTH) == Frame.MAXIMIZED_BOTH; + + if (maximized) { + frame.setExtendedState(state & ~Frame.MAXIMIZED_BOTH); + } else { + frame.setExtendedState(state | Frame.MAXIMIZED_BOTH); + } + + frame.dispatchEvent(new ComponentEvent(this, ComponentEvent.COMPONENT_RESIZED)); + } +} \ No newline at end of file diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACToggleButton.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACToggleButton.java index 9a00c4f..69406d0 100644 --- a/src/main/java/org/openautonomousconnection/oacswing/component/OACToggleButton.java +++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACToggleButton.java @@ -4,7 +4,7 @@ package org.openautonomousconnection.oacswing.component; -import org.jetbrains.annotations.NotNull; +import lombok.NonNull; import javax.swing.*; import java.awt.*; @@ -55,7 +55,7 @@ public class OACToggleButton extends JToggleButton implements OACComponent { } @Override - public void add(@NotNull Component comp, Object constraints) { + public void add(@NonNull Component comp, Object constraints) { this.initOther(comp); super.add(comp, constraints); } diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACToolBar.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACToolBar.java index 8721c46..1605e68 100644 --- a/src/main/java/org/openautonomousconnection/oacswing/component/OACToolBar.java +++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACToolBar.java @@ -4,7 +4,7 @@ package org.openautonomousconnection.oacswing.component; -import org.jetbrains.annotations.NotNull; +import lombok.NonNull; import javax.swing.*; import java.awt.*; @@ -39,7 +39,7 @@ public class OACToolBar extends JToolBar implements OACComponent { } @Override - public void add(@NotNull Component comp, Object constraints) { + public void add(@NonNull Component comp, Object constraints) { this.initOther(comp); super.add(comp, constraints); } diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACToolTip.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACToolTip.java index d1c38ff..490acc2 100644 --- a/src/main/java/org/openautonomousconnection/oacswing/component/OACToolTip.java +++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACToolTip.java @@ -4,7 +4,7 @@ package org.openautonomousconnection.oacswing.component; -import org.jetbrains.annotations.NotNull; +import lombok.NonNull; import javax.swing.*; import java.awt.*; @@ -27,7 +27,7 @@ public class OACToolTip extends JToolTip implements OACComponent { } @Override - public void add(@NotNull Component comp, Object constraints) { + public void add(@NonNull Component comp, Object constraints) { this.initOther(comp); super.add(comp, constraints); } diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACTree.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACTree.java index 1479d10..8352d00 100644 --- a/src/main/java/org/openautonomousconnection/oacswing/component/OACTree.java +++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACTree.java @@ -4,7 +4,7 @@ package org.openautonomousconnection.oacswing.component; -import org.jetbrains.annotations.NotNull; +import lombok.NonNull; import javax.swing.*; import javax.swing.tree.TreeModel; @@ -55,7 +55,7 @@ public class OACTree extends JTree implements OACComponent { } @Override - public void add(@NotNull Component comp, Object constraints) { + public void add(@NonNull Component comp, Object constraints) { this.initOther(comp); super.add(comp, constraints); } diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACViewport.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACViewport.java index 2b93a84..3496e7b 100644 --- a/src/main/java/org/openautonomousconnection/oacswing/component/OACViewport.java +++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACViewport.java @@ -4,7 +4,7 @@ package org.openautonomousconnection.oacswing.component; -import org.jetbrains.annotations.NotNull; +import lombok.NonNull; import javax.swing.*; import java.awt.*; @@ -27,7 +27,7 @@ public class OACViewport extends JViewport implements OACComponent { } @Override - public void add(@NotNull Component comp, Object constraints) { + public void add(@NonNull Component comp, Object constraints) { this.initOther(comp); super.add(comp, constraints); } diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/OACWindow.java b/src/main/java/org/openautonomousconnection/oacswing/component/OACWindow.java index e6dd74f..bd84c3d 100644 --- a/src/main/java/org/openautonomousconnection/oacswing/component/OACWindow.java +++ b/src/main/java/org/openautonomousconnection/oacswing/component/OACWindow.java @@ -4,7 +4,7 @@ package org.openautonomousconnection.oacswing.component; -import org.jetbrains.annotations.NotNull; +import lombok.NonNull; import javax.swing.*; import java.awt.*; @@ -43,7 +43,7 @@ public class OACWindow extends JWindow implements OACComponent { } @Override - public void add(@NotNull Component comp, Object constraints) { + public void add(@NonNull Component comp, Object constraints) { this.initOther(comp); super.add(comp, constraints); } diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/design/Design.java b/src/main/java/org/openautonomousconnection/oacswing/component/design/Design.java index 55b548e..d950be5 100644 --- a/src/main/java/org/openautonomousconnection/oacswing/component/design/Design.java +++ b/src/main/java/org/openautonomousconnection/oacswing/component/design/Design.java @@ -5,7 +5,10 @@ package org.openautonomousconnection.oacswing.component.design; import lombok.Getter; +import lombok.NonNull; +import javax.swing.border.Border; +import java.awt.*; import java.util.HashMap; import java.util.Map; import java.util.Objects; @@ -23,11 +26,22 @@ public final class Design { @Getter private final Map, OACColor> elements; - public Design(String name, Map, OACColor> elements) { + @Getter + protected Border border; + + public Design(String name, Map, OACColor> elements, @NonNull Border border) { this.name = name; this.elements = elements; + this.border = border; } + private Design(String name, Map, OACColor> elements) { + this.name = name; + this.elements = elements; + this.border = null; + } + + @Override public boolean equals(Object obj) { if (obj == this) return true; diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/design/DesignManager.java b/src/main/java/org/openautonomousconnection/oacswing/component/design/DesignManager.java index 187b361..7ce9142 100644 --- a/src/main/java/org/openautonomousconnection/oacswing/component/design/DesignManager.java +++ b/src/main/java/org/openautonomousconnection/oacswing/component/design/DesignManager.java @@ -6,13 +6,15 @@ package org.openautonomousconnection.oacswing.component.design; import lombok.Getter; import lombok.Setter; -import org.openautonomousconnection.oacswing.component.OACAnimatedPanel; -import org.openautonomousconnection.oacswing.component.OACButton; -import org.openautonomousconnection.oacswing.component.OACComponent; -import org.openautonomousconnection.oacswing.component.OACFrame; +import org.openautonomousconnection.oacswing.component.*; +import javax.swing.*; +import javax.swing.border.BevelBorder; +import javax.swing.border.Border; +import javax.swing.border.LineBorder; +import java.awt.*; +import java.util.ArrayList; import java.util.List; -import java.util.Map; import java.util.Objects; public class DesignManager { @@ -27,16 +29,26 @@ public class DesignManager { private DesignManager() { instance = this; + + this.designs = new ArrayList<>(); } @Getter - private List designs; + private final List designs; public static void apply(OACComponent component) { - OACColor color; + if(globalDesign == null) + return; - if(globalDesign != null && ((color = globalDesign.getElements().get(component.getClass())) != null)) - component.setBackground(color.getColor()); + OACColor backgroundColour = globalDesign.getElements().get(component.getClass()); + Border border = globalDesign.getBorder(); + + if(backgroundColour == null) + return; + + component.setBackground(backgroundColour.getColor()); + if(component instanceof JComponent jComponent) + jComponent.setBorder(border); } public static void apply(OACFrame frame) { @@ -70,11 +82,30 @@ public class DesignManager { } static { - Design.DARK.getElements().putAll(Map.of( - OACButton.class, OACColor.DARK_GREY, - OACAnimatedPanel.class, OACColor.LIGHT_GREY, - OACFrame.class, OACColor.GREY + Design.DARK.getElements().put(OACButton.class, OACColor.DARK_BUTTON); + Design.DARK.getElements().put(OACCheckBox.class, OACColor.DARK_INPUT_FIELD); + Design.DARK.getElements().put(OACCheckBoxMenuItem.class, OACColor.DARK_ITEM); + Design.DARK.getElements().put(OACColorChooser.class, OACColor.DARK_SECTION); + Design.DARK.getElements().put(OACComboBox.class, OACColor.DARK_INPUT_FIELD); + Design.DARK.getElements().put(OACFrame.class, OACColor.DARK_BACKGROUND); + Design.DARK.getElements().put(OACLabel.class, OACColor.DARK_TEXT); + Design.DARK.getElements().put(OACLayeredPane.class, OACColor.DARK_BACKGROUND); + Design.DARK.getElements().put(OACList.class, OACColor.DARK_SECTION); + Design.DARK.getElements().put(OACMenu.class, OACColor.DARK_INPUT_BUTTON); + Design.DARK.getElements().put(OACMenuBar.class, OACColor.DARK_SECTION); + Design.DARK.getElements().put(OACMenuItem.class, OACColor.DARK_ITEM); + Design.DARK.getElements().put(OACOptionPane.class, OACColor.DARK_BACKGROUND); + Design.DARK.getElements().put(OACPanel.class, OACColor.DARK_BACKGROUND); + Design.DARK.getElements().put(OACPasswordField.class, OACColor.DARK_INPUT_FIELD); + Design.DARK.getElements().put(OACPopupMenu.class, OACColor.DARK_BACKGROUND); + Design.DARK.getElements().put(OACProgressBar.class, OACColor.DARK_ITEM); + Design.DARK.getElements().put(OACRadioButton.class, OACColor.DARK_BUTTON); + Design.DARK.getElements().put(OACTitleBar.class, OACColor.DARK_SECTION); - )); + Design.DARK.border = new LineBorder(OACColor.DARK_BORDERS.getColor(), 1); + + //Design.DARK.border = new BevelBorder(BevelBorder.LOWERED, OACColor.DARK_BORDERS.getColor(), OACColor.DARK_SHADOW.getColor()); + + DesignManager.getInstance().registerDesign(Design.DARK); } } diff --git a/src/main/java/org/openautonomousconnection/oacswing/component/design/OACColor.java b/src/main/java/org/openautonomousconnection/oacswing/component/design/OACColor.java index eae3061..65eb2f0 100644 --- a/src/main/java/org/openautonomousconnection/oacswing/component/design/OACColor.java +++ b/src/main/java/org/openautonomousconnection/oacswing/component/design/OACColor.java @@ -9,7 +9,31 @@ import lombok.Getter; import java.awt.*; public enum OACColor { - WEAK_RED(Color.getHSBColor(355, 0.5f, 0.7f)), + SUPER_HIGHLIGHT(Color.decode("#fffff")), + + // Dark mode colours + DARK_INPUT_FIELD(Color.decode("#0f1118")), + DARK_INPUT_BUTTON(Color.decode("#1f2330")), + DARK_INPUT_BUTTON_HOVER(Color.decode("#1c2140")), + DARK_ITEM(Color.decode("#d7dbe5")), + DARK_BORDERS(Color.decode("#2a2f42")), + DARK_BUTTON(Color.decode("#151a2b")), + DARK_BUTTON_HOVER(Color.decode("#151a2b")), + DARK_TEXT(Color.decode("#cfd3dc")), + DARK_SUBTITLE(Color.decode("#9aa0aa")), + DARK_LINK(Color.decode("#b4c6ff")), + DARK_SECTION(Color.decode("#1f2330")), + DARK_BIG_TEXT(Color.decode("#9aa0aa")), + DARK_HEADING_1(Color.decode("#9bbcff")), + DARK_HEADING_2(Color.decode("#8fb1ff")), + DARK_HEADING_3(Color.decode("#cdd9ff")), + DARK_HEADER(Color.decode("#0f1118")), + DARK_HEADER_BORDER(Color.decode("#1f2330")), + DARK_RAW_TEXT(Color.decode("#9aa0aa")), + DARK_BACKGROUND(Color.decode("#0b0d12")), + DARK_SHADOW(Color.decode("#9aa0aa")); + + /*WEAK_RED(Color.getHSBColor(355, 0.5f, 0.7f)), STRONG_RED(Color.getHSBColor(350, 0.7f, 0.6f)), WEAK_ORANGE(Color.getHSBColor(37, 0.6f, 0.8f)), @@ -36,7 +60,7 @@ public enum OACColor { LIGHT_GREY(Color.getHSBColor(0, 0f, 0.60f)), - VERY_LIGHT_GREY(Color.getHSBColor(0, 0, 0.9f)); + VERY_LIGHT_GREY(Color.getHSBColor(0, 0, 0.9f));*/ @Getter private final Color color; diff --git a/src/main/java/org/openautonomousconnection/oacswing/icons/defaults/DefaultIcons.java b/src/main/java/org/openautonomousconnection/oacswing/icons/defaults/DefaultIcons.java new file mode 100644 index 0000000..2675c45 --- /dev/null +++ b/src/main/java/org/openautonomousconnection/oacswing/icons/defaults/DefaultIcons.java @@ -0,0 +1,17 @@ +package org.openautonomousconnection.oacswing.icons.defaults; + +import org.openautonomousconnection.oacswing.ModifiableImageIcon; + +public class DefaultIcons { + public static final ModifiableImageIcon CLOSE_ICON; + public static final ModifiableImageIcon MINIMIZE_ICON; + public static final ModifiableImageIcon FULL_ICON; + + static { + ClassLoader classloader = Thread.currentThread().getContextClassLoader(); + + CLOSE_ICON = new ModifiableImageIcon(classloader.getResource("defaults/icons/temp_hole.png")); + MINIMIZE_ICON = new ModifiableImageIcon(classloader.getResource("defaults/icons/temp_hole.png")); + FULL_ICON = new ModifiableImageIcon(classloader.getResource("defaults/icons/temp_hole.png")); + } +} diff --git a/src/test/java/org/openautonomousconnection/oacswing/test/AnimationTests.java b/src/test/java/org/openautonomousconnection/oacswing/test/AnimationTests.java index 9e7ec15..0639af9 100644 --- a/src/test/java/org/openautonomousconnection/oacswing/test/AnimationTests.java +++ b/src/test/java/org/openautonomousconnection/oacswing/test/AnimationTests.java @@ -1,3 +1,7 @@ +/* Author: Maple + * Feb. 2 2026 + * */ + package org.openautonomousconnection.oacswing.test; import org.junit.jupiter.api.Test; @@ -26,7 +30,7 @@ public class AnimationTests { frame.add(animatedPanel); - animatedPanel.play(0.1, true); + animatedPanel.play(10, true); frame.setVisible(true); diff --git a/src/test/java/org/openautonomousconnection/oacswing/test/CustomizedTests.java b/src/test/java/org/openautonomousconnection/oacswing/test/CustomizedTests.java index a2f7a31..c9dcd37 100644 --- a/src/test/java/org/openautonomousconnection/oacswing/test/CustomizedTests.java +++ b/src/test/java/org/openautonomousconnection/oacswing/test/CustomizedTests.java @@ -1,7 +1,10 @@ +/* Author: Maple + * Feb. 2 2026 + * */ + package org.openautonomousconnection.oacswing.test; import org.junit.jupiter.api.Test; -import org.openautonomousconnection.oacswing.component.OACTitledComponent; import org.openautonomousconnection.oacswing.component.*; import org.openautonomousconnection.oacswing.component.design.Design; import org.openautonomousconnection.oacswing.component.design.DesignManager; @@ -19,16 +22,16 @@ public class CustomizedTests { OACFrame frame = TestUtils.mockOacFrame(); - frame.setLayout(new FlowLayout(FlowLayout.CENTER)); - - frame.add(new OACButton()); + frame.setLayout(new FlowLayout()); OACLabel imageLabel = new OACLabel(TempIcons.TEMP_HOLE_ICON.ofSize(IconSize.MEDIUM)); - frame.add(new OACTitledComponent<>("Titled", imageLabel)); + //frame.add(new OACTitledComponent<>("Titled", imageLabel)); + + frame.add(new OACButton()); frame.setVisible(true); - wait(5000); + wait(15000); } } diff --git a/src/test/java/org/openautonomousconnection/oacswing/test/TestUtils.java b/src/test/java/org/openautonomousconnection/oacswing/test/TestUtils.java index 79ebd5f..321a4e6 100644 --- a/src/test/java/org/openautonomousconnection/oacswing/test/TestUtils.java +++ b/src/test/java/org/openautonomousconnection/oacswing/test/TestUtils.java @@ -1,3 +1,8 @@ +/* Author: Maple + * Feb. 2 2026 + * */ + + package org.openautonomousconnection.oacswing.test; import org.openautonomousconnection.oacswing.component.OACFrame;