From 1840a5c0a02e66d5c560dd75035aaa97b5070ced Mon Sep 17 00:00:00 2001 From: karina Date: Sun, 2 Mar 2025 21:35:56 +0500 Subject: [PATCH 01/10] 1 task --- pom.xml | 29 ++++ robots/.classpath | 6 - robots/.gitignore | 2 - robots/.project | 17 -- robots/src/gui/GameVisualizer.java | 210 ----------------------- robots/src/gui/GameWindow.java | 20 --- robots/src/gui/LogWindow.java | 50 ------ robots/src/gui/MainApplicationFrame.java | 156 ----------------- robots/src/gui/RobotsProgram.java | 25 --- robots/src/log/LogChangeListener.java | 6 - robots/src/log/LogEntry.java | 24 --- robots/src/log/LogLevel.java | 24 --- robots/src/log/LogWindowSource.java | 89 ---------- robots/src/log/Logger.java | 28 --- 14 files changed, 29 insertions(+), 657 deletions(-) create mode 100644 pom.xml delete mode 100644 robots/.classpath delete mode 100644 robots/.gitignore delete mode 100644 robots/.project delete mode 100644 robots/src/gui/GameVisualizer.java delete mode 100644 robots/src/gui/GameWindow.java delete mode 100644 robots/src/gui/LogWindow.java delete mode 100644 robots/src/gui/MainApplicationFrame.java delete mode 100644 robots/src/gui/RobotsProgram.java delete mode 100644 robots/src/log/LogChangeListener.java delete mode 100644 robots/src/log/LogEntry.java delete mode 100644 robots/src/log/LogLevel.java delete mode 100644 robots/src/log/LogWindowSource.java delete mode 100644 robots/src/log/Logger.java diff --git a/pom.xml b/pom.xml new file mode 100644 index 000000000..c3c16b7d3 --- /dev/null +++ b/pom.xml @@ -0,0 +1,29 @@ + + + 4.0.0 + + groupId + Robots + 1.0-SNAPSHOT + + + 23 + 23 + UTF-8 + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 8 + 8 + + + + + + \ No newline at end of file diff --git a/robots/.classpath b/robots/.classpath deleted file mode 100644 index fceb4801b..000000000 --- a/robots/.classpath +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/robots/.gitignore b/robots/.gitignore deleted file mode 100644 index 2757ffa76..000000000 --- a/robots/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/bin/ -/.settings/ diff --git a/robots/.project b/robots/.project deleted file mode 100644 index 78e165663..000000000 --- a/robots/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - Robots - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - diff --git a/robots/src/gui/GameVisualizer.java b/robots/src/gui/GameVisualizer.java deleted file mode 100644 index f82cfd8f8..000000000 --- a/robots/src/gui/GameVisualizer.java +++ /dev/null @@ -1,210 +0,0 @@ -package gui; - -import java.awt.Color; -import java.awt.EventQueue; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Point; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.awt.geom.AffineTransform; -import java.util.Timer; -import java.util.TimerTask; - -import javax.swing.JPanel; - -public class GameVisualizer extends JPanel -{ - private final Timer m_timer = initTimer(); - - private static Timer initTimer() - { - Timer timer = new Timer("events generator", true); - return timer; - } - - private volatile double m_robotPositionX = 100; - private volatile double m_robotPositionY = 100; - private volatile double m_robotDirection = 0; - - private volatile int m_targetPositionX = 150; - private volatile int m_targetPositionY = 100; - - private static final double maxVelocity = 0.1; - private static final double maxAngularVelocity = 0.001; - - public GameVisualizer() - { - m_timer.schedule(new TimerTask() - { - @Override - public void run() - { - onRedrawEvent(); - } - }, 0, 50); - m_timer.schedule(new TimerTask() - { - @Override - public void run() - { - onModelUpdateEvent(); - } - }, 0, 10); - addMouseListener(new MouseAdapter() - { - @Override - public void mouseClicked(MouseEvent e) - { - setTargetPosition(e.getPoint()); - repaint(); - } - }); - setDoubleBuffered(true); - } - - protected void setTargetPosition(Point p) - { - m_targetPositionX = p.x; - m_targetPositionY = p.y; - } - - protected void onRedrawEvent() - { - EventQueue.invokeLater(this::repaint); - } - - private static double distance(double x1, double y1, double x2, double y2) - { - double diffX = x1 - x2; - double diffY = y1 - y2; - return Math.sqrt(diffX * diffX + diffY * diffY); - } - - private static double angleTo(double fromX, double fromY, double toX, double toY) - { - double diffX = toX - fromX; - double diffY = toY - fromY; - - return asNormalizedRadians(Math.atan2(diffY, diffX)); - } - - protected void onModelUpdateEvent() - { - double distance = distance(m_targetPositionX, m_targetPositionY, - m_robotPositionX, m_robotPositionY); - if (distance < 0.5) - { - return; - } - double velocity = maxVelocity; - double angleToTarget = angleTo(m_robotPositionX, m_robotPositionY, m_targetPositionX, m_targetPositionY); - double angularVelocity = 0; - if (angleToTarget > m_robotDirection) - { - angularVelocity = maxAngularVelocity; - } - if (angleToTarget < m_robotDirection) - { - angularVelocity = -maxAngularVelocity; - } - - moveRobot(velocity, angularVelocity, 10); - } - - private static double applyLimits(double value, double min, double max) - { - if (value < min) - return min; - if (value > max) - return max; - return value; - } - - private void moveRobot(double velocity, double angularVelocity, double duration) - { - velocity = applyLimits(velocity, 0, maxVelocity); - angularVelocity = applyLimits(angularVelocity, -maxAngularVelocity, maxAngularVelocity); - double newX = m_robotPositionX + velocity / angularVelocity * - (Math.sin(m_robotDirection + angularVelocity * duration) - - Math.sin(m_robotDirection)); - if (!Double.isFinite(newX)) - { - newX = m_robotPositionX + velocity * duration * Math.cos(m_robotDirection); - } - double newY = m_robotPositionY - velocity / angularVelocity * - (Math.cos(m_robotDirection + angularVelocity * duration) - - Math.cos(m_robotDirection)); - if (!Double.isFinite(newY)) - { - newY = m_robotPositionY + velocity * duration * Math.sin(m_robotDirection); - } - m_robotPositionX = newX; - m_robotPositionY = newY; - double newDirection = asNormalizedRadians(m_robotDirection + angularVelocity * duration); - m_robotDirection = newDirection; - } - - private static double asNormalizedRadians(double angle) - { - while (angle < 0) - { - angle += 2*Math.PI; - } - while (angle >= 2*Math.PI) - { - angle -= 2*Math.PI; - } - return angle; - } - - private static int round(double value) - { - return (int)(value + 0.5); - } - - @Override - public void paint(Graphics g) - { - super.paint(g); - Graphics2D g2d = (Graphics2D)g; - drawRobot(g2d, round(m_robotPositionX), round(m_robotPositionY), m_robotDirection); - drawTarget(g2d, m_targetPositionX, m_targetPositionY); - } - - private static void fillOval(Graphics g, int centerX, int centerY, int diam1, int diam2) - { - g.fillOval(centerX - diam1 / 2, centerY - diam2 / 2, diam1, diam2); - } - - private static void drawOval(Graphics g, int centerX, int centerY, int diam1, int diam2) - { - g.drawOval(centerX - diam1 / 2, centerY - diam2 / 2, diam1, diam2); - } - - private void drawRobot(Graphics2D g, int x, int y, double direction) - { - int robotCenterX = round(m_robotPositionX); - int robotCenterY = round(m_robotPositionY); - AffineTransform t = AffineTransform.getRotateInstance(direction, robotCenterX, robotCenterY); - g.setTransform(t); - g.setColor(Color.MAGENTA); - fillOval(g, robotCenterX, robotCenterY, 30, 10); - g.setColor(Color.BLACK); - drawOval(g, robotCenterX, robotCenterY, 30, 10); - g.setColor(Color.WHITE); - fillOval(g, robotCenterX + 10, robotCenterY, 5, 5); - g.setColor(Color.BLACK); - drawOval(g, robotCenterX + 10, robotCenterY, 5, 5); - } - - private void drawTarget(Graphics2D g, int x, int y) - { - AffineTransform t = AffineTransform.getRotateInstance(0, 0, 0); - g.setTransform(t); - g.setColor(Color.GREEN); - fillOval(g, x, y, 5, 5); - g.setColor(Color.BLACK); - drawOval(g, x, y, 5, 5); - } -} diff --git a/robots/src/gui/GameWindow.java b/robots/src/gui/GameWindow.java deleted file mode 100644 index ecb63c00f..000000000 --- a/robots/src/gui/GameWindow.java +++ /dev/null @@ -1,20 +0,0 @@ -package gui; - -import java.awt.BorderLayout; - -import javax.swing.JInternalFrame; -import javax.swing.JPanel; - -public class GameWindow extends JInternalFrame -{ - private final GameVisualizer m_visualizer; - public GameWindow() - { - super("Игровое поле", true, true, true, true); - m_visualizer = new GameVisualizer(); - JPanel panel = new JPanel(new BorderLayout()); - panel.add(m_visualizer, BorderLayout.CENTER); - getContentPane().add(panel); - pack(); - } -} diff --git a/robots/src/gui/LogWindow.java b/robots/src/gui/LogWindow.java deleted file mode 100644 index 723d3e2fc..000000000 --- a/robots/src/gui/LogWindow.java +++ /dev/null @@ -1,50 +0,0 @@ -package gui; - -import java.awt.BorderLayout; -import java.awt.EventQueue; -import java.awt.TextArea; - -import javax.swing.JInternalFrame; -import javax.swing.JPanel; - -import log.LogChangeListener; -import log.LogEntry; -import log.LogWindowSource; - -public class LogWindow extends JInternalFrame implements LogChangeListener -{ - private LogWindowSource m_logSource; - private TextArea m_logContent; - - public LogWindow(LogWindowSource logSource) - { - super("Протокол работы", true, true, true, true); - m_logSource = logSource; - m_logSource.registerListener(this); - m_logContent = new TextArea(""); - m_logContent.setSize(200, 500); - - JPanel panel = new JPanel(new BorderLayout()); - panel.add(m_logContent, BorderLayout.CENTER); - getContentPane().add(panel); - pack(); - updateLogContent(); - } - - private void updateLogContent() - { - StringBuilder content = new StringBuilder(); - for (LogEntry entry : m_logSource.all()) - { - content.append(entry.getMessage()).append("\n"); - } - m_logContent.setText(content.toString()); - m_logContent.invalidate(); - } - - @Override - public void onLogChanged() - { - EventQueue.invokeLater(this::updateLogContent); - } -} diff --git a/robots/src/gui/MainApplicationFrame.java b/robots/src/gui/MainApplicationFrame.java deleted file mode 100644 index 62e943ee1..000000000 --- a/robots/src/gui/MainApplicationFrame.java +++ /dev/null @@ -1,156 +0,0 @@ -package gui; - -import java.awt.Dimension; -import java.awt.Toolkit; -import java.awt.event.KeyEvent; - -import javax.swing.JDesktopPane; -import javax.swing.JFrame; -import javax.swing.JInternalFrame; -import javax.swing.JMenu; -import javax.swing.JMenuBar; -import javax.swing.JMenuItem; -import javax.swing.SwingUtilities; -import javax.swing.UIManager; -import javax.swing.UnsupportedLookAndFeelException; - -import log.Logger; - -/** - * Что требуется сделать: - * 1. Метод создания меню перегружен функционалом и трудно читается. - * Следует разделить его на серию более простых методов (или вообще выделить отдельный класс). - * - */ -public class MainApplicationFrame extends JFrame -{ - private final JDesktopPane desktopPane = new JDesktopPane(); - - public MainApplicationFrame() { - //Make the big window be indented 50 pixels from each edge - //of the screen. - int inset = 50; - Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); - setBounds(inset, inset, - screenSize.width - inset*2, - screenSize.height - inset*2); - - setContentPane(desktopPane); - - - LogWindow logWindow = createLogWindow(); - addWindow(logWindow); - - GameWindow gameWindow = new GameWindow(); - gameWindow.setSize(400, 400); - addWindow(gameWindow); - - setJMenuBar(generateMenuBar()); - setDefaultCloseOperation(EXIT_ON_CLOSE); - } - - protected LogWindow createLogWindow() - { - LogWindow logWindow = new LogWindow(Logger.getDefaultLogSource()); - logWindow.setLocation(10,10); - logWindow.setSize(300, 800); - setMinimumSize(logWindow.getSize()); - logWindow.pack(); - Logger.debug("Протокол работает"); - return logWindow; - } - - protected void addWindow(JInternalFrame frame) - { - desktopPane.add(frame); - frame.setVisible(true); - } - -// protected JMenuBar createMenuBar() { -// JMenuBar menuBar = new JMenuBar(); -// -// //Set up the lone menu. -// JMenu menu = new JMenu("Document"); -// menu.setMnemonic(KeyEvent.VK_D); -// menuBar.add(menu); -// -// //Set up the first menu item. -// JMenuItem menuItem = new JMenuItem("New"); -// menuItem.setMnemonic(KeyEvent.VK_N); -// menuItem.setAccelerator(KeyStroke.getKeyStroke( -// KeyEvent.VK_N, ActionEvent.ALT_MASK)); -// menuItem.setActionCommand("new"); -//// menuItem.addActionListener(this); -// menu.add(menuItem); -// -// //Set up the second menu item. -// menuItem = new JMenuItem("Quit"); -// menuItem.setMnemonic(KeyEvent.VK_Q); -// menuItem.setAccelerator(KeyStroke.getKeyStroke( -// KeyEvent.VK_Q, ActionEvent.ALT_MASK)); -// menuItem.setActionCommand("quit"); -//// menuItem.addActionListener(this); -// menu.add(menuItem); -// -// return menuBar; -// } - - private JMenuBar generateMenuBar() - { - JMenuBar menuBar = new JMenuBar(); - - JMenu lookAndFeelMenu = new JMenu("Режим отображения"); - lookAndFeelMenu.setMnemonic(KeyEvent.VK_V); - lookAndFeelMenu.getAccessibleContext().setAccessibleDescription( - "Управление режимом отображения приложения"); - - { - JMenuItem systemLookAndFeel = new JMenuItem("Системная схема", KeyEvent.VK_S); - systemLookAndFeel.addActionListener((event) -> { - setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); - this.invalidate(); - }); - lookAndFeelMenu.add(systemLookAndFeel); - } - - { - JMenuItem crossplatformLookAndFeel = new JMenuItem("Универсальная схема", KeyEvent.VK_S); - crossplatformLookAndFeel.addActionListener((event) -> { - setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName()); - this.invalidate(); - }); - lookAndFeelMenu.add(crossplatformLookAndFeel); - } - - JMenu testMenu = new JMenu("Тесты"); - testMenu.setMnemonic(KeyEvent.VK_T); - testMenu.getAccessibleContext().setAccessibleDescription( - "Тестовые команды"); - - { - JMenuItem addLogMessageItem = new JMenuItem("Сообщение в лог", KeyEvent.VK_S); - addLogMessageItem.addActionListener((event) -> { - Logger.debug("Новая строка"); - }); - testMenu.add(addLogMessageItem); - } - - menuBar.add(lookAndFeelMenu); - menuBar.add(testMenu); - return menuBar; - } - - private void setLookAndFeel(String className) - { - try - { - UIManager.setLookAndFeel(className); - SwingUtilities.updateComponentTreeUI(this); - } - catch (ClassNotFoundException | InstantiationException - | IllegalAccessException | UnsupportedLookAndFeelException e) - { - // just ignore - } - } -} diff --git a/robots/src/gui/RobotsProgram.java b/robots/src/gui/RobotsProgram.java deleted file mode 100644 index ae0930a8b..000000000 --- a/robots/src/gui/RobotsProgram.java +++ /dev/null @@ -1,25 +0,0 @@ -package gui; - -import java.awt.Frame; - -import javax.swing.SwingUtilities; -import javax.swing.UIManager; - -public class RobotsProgram -{ - public static void main(String[] args) { - try { - UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel"); -// UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel"); -// UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); -// UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName()); - } catch (Exception e) { - e.printStackTrace(); - } - SwingUtilities.invokeLater(() -> { - MainApplicationFrame frame = new MainApplicationFrame(); - frame.pack(); - frame.setVisible(true); - frame.setExtendedState(Frame.MAXIMIZED_BOTH); - }); - }} diff --git a/robots/src/log/LogChangeListener.java b/robots/src/log/LogChangeListener.java deleted file mode 100644 index 0b0fb85dd..000000000 --- a/robots/src/log/LogChangeListener.java +++ /dev/null @@ -1,6 +0,0 @@ -package log; - -public interface LogChangeListener -{ - public void onLogChanged(); -} diff --git a/robots/src/log/LogEntry.java b/robots/src/log/LogEntry.java deleted file mode 100644 index 3d9147107..000000000 --- a/robots/src/log/LogEntry.java +++ /dev/null @@ -1,24 +0,0 @@ -package log; - -public class LogEntry -{ - private LogLevel m_logLevel; - private String m_strMessage; - - public LogEntry(LogLevel logLevel, String strMessage) - { - m_strMessage = strMessage; - m_logLevel = logLevel; - } - - public String getMessage() - { - return m_strMessage; - } - - public LogLevel getLevel() - { - return m_logLevel; - } -} - diff --git a/robots/src/log/LogLevel.java b/robots/src/log/LogLevel.java deleted file mode 100644 index 582d010cc..000000000 --- a/robots/src/log/LogLevel.java +++ /dev/null @@ -1,24 +0,0 @@ -package log; - -public enum LogLevel -{ - Trace(0), - Debug(1), - Info(2), - Warning(3), - Error(4), - Fatal(5); - - private int m_iLevel; - - private LogLevel(int iLevel) - { - m_iLevel = iLevel; - } - - public int level() - { - return m_iLevel; - } -} - diff --git a/robots/src/log/LogWindowSource.java b/robots/src/log/LogWindowSource.java deleted file mode 100644 index ca0ce4426..000000000 --- a/robots/src/log/LogWindowSource.java +++ /dev/null @@ -1,89 +0,0 @@ -package log; - -import java.util.ArrayList; -import java.util.Collections; - -/** - * Что починить: - * 1. Этот класс порождает утечку ресурсов (связанные слушатели оказываются - * удерживаемыми в памяти) - * 2. Этот класс хранит активные сообщения лога, но в такой реализации он - * их лишь накапливает. Надо же, чтобы количество сообщений в логе было ограничено - * величиной m_iQueueLength (т.е. реально нужна очередь сообщений - * ограниченного размера) - */ -public class LogWindowSource -{ - private int m_iQueueLength; - - private ArrayList m_messages; - private final ArrayList m_listeners; - private volatile LogChangeListener[] m_activeListeners; - - public LogWindowSource(int iQueueLength) - { - m_iQueueLength = iQueueLength; - m_messages = new ArrayList(iQueueLength); - m_listeners = new ArrayList(); - } - - public void registerListener(LogChangeListener listener) - { - synchronized(m_listeners) - { - m_listeners.add(listener); - m_activeListeners = null; - } - } - - public void unregisterListener(LogChangeListener listener) - { - synchronized(m_listeners) - { - m_listeners.remove(listener); - m_activeListeners = null; - } - } - - public void append(LogLevel logLevel, String strMessage) - { - LogEntry entry = new LogEntry(logLevel, strMessage); - m_messages.add(entry); - LogChangeListener [] activeListeners = m_activeListeners; - if (activeListeners == null) - { - synchronized (m_listeners) - { - if (m_activeListeners == null) - { - activeListeners = m_listeners.toArray(new LogChangeListener [0]); - m_activeListeners = activeListeners; - } - } - } - for (LogChangeListener listener : activeListeners) - { - listener.onLogChanged(); - } - } - - public int size() - { - return m_messages.size(); - } - - public Iterable range(int startFrom, int count) - { - if (startFrom < 0 || startFrom >= m_messages.size()) - { - return Collections.emptyList(); - } - int indexTo = Math.min(startFrom + count, m_messages.size()); - return m_messages.subList(startFrom, indexTo); - } - - public Iterable all() - { - return m_messages; - } -} diff --git a/robots/src/log/Logger.java b/robots/src/log/Logger.java deleted file mode 100644 index b008a5d01..000000000 --- a/robots/src/log/Logger.java +++ /dev/null @@ -1,28 +0,0 @@ -package log; - -public final class Logger -{ - private static final LogWindowSource defaultLogSource; - static { - defaultLogSource = new LogWindowSource(100); - } - - private Logger() - { - } - - public static void debug(String strMessage) - { - defaultLogSource.append(LogLevel.Debug, strMessage); - } - - public static void error(String strMessage) - { - defaultLogSource.append(LogLevel.Error, strMessage); - } - - public static LogWindowSource getDefaultLogSource() - { - return defaultLogSource; - } -} From 816371c10f4f2633482ff1d75275f555dd4fe935 Mon Sep 17 00:00:00 2001 From: karina Date: Sun, 2 Mar 2025 21:38:14 +0500 Subject: [PATCH 02/10] 1 task --- .idea/.gitignore | 3 + .idea/compiler.xml | 13 + .idea/encodings.xml | 7 + .idea/jarRepositories.xml | 20 ++ .idea/misc.xml | 14 ++ .idea/vcs.xml | 6 + src/main/java/robots/.classpath | 6 + src/main/java/robots/.gitignore | 2 + src/main/java/robots/.project | 17 ++ src/main/java/robots/gui/GameVisualizer.java | 227 ++++++++++++++++++ src/main/java/robots/gui/GameWindow.java | 20 ++ src/main/java/robots/gui/LogWindow.java | 56 +++++ .../java/robots/gui/MainApplicationFrame.java | 135 +++++++++++ src/main/java/robots/gui/RobotsProgram.java | 22 ++ .../java/robots/log/LogChangeListener.java | 6 + src/main/java/robots/log/LogEntry.java | 24 ++ src/main/java/robots/log/LogLevel.java | 24 ++ src/main/java/robots/log/LogWindowSource.java | 76 ++++++ src/main/java/robots/log/Logger.java | 28 +++ .../classes/robots/gui/GameVisualizer$1.class | Bin 0 -> 621 bytes .../classes/robots/gui/GameVisualizer$2.class | Bin 0 -> 626 bytes .../classes/robots/gui/GameVisualizer$3.class | Bin 0 -> 849 bytes .../classes/robots/gui/GameVisualizer.class | Bin 0 -> 5883 bytes target/classes/robots/gui/GameWindow.class | Bin 0 -> 884 bytes target/classes/robots/gui/LogWindow.class | Bin 0 -> 2791 bytes .../robots/gui/MainApplicationFrame.class | Bin 0 -> 5677 bytes target/classes/robots/gui/RobotsProgram.class | Bin 0 -> 1570 bytes .../robots/log/LogChangeListener.class | Bin 0 -> 155 bytes target/classes/robots/log/LogEntry.class | Bin 0 -> 686 bytes target/classes/robots/log/LogLevel.class | Bin 0 -> 1432 bytes .../classes/robots/log/LogWindowSource.class | Bin 0 -> 2952 bytes target/classes/robots/log/Logger.class | Bin 0 -> 913 bytes 32 files changed, 706 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/compiler.xml create mode 100644 .idea/encodings.xml create mode 100644 .idea/jarRepositories.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/vcs.xml create mode 100644 src/main/java/robots/.classpath create mode 100644 src/main/java/robots/.gitignore create mode 100644 src/main/java/robots/.project create mode 100644 src/main/java/robots/gui/GameVisualizer.java create mode 100644 src/main/java/robots/gui/GameWindow.java create mode 100644 src/main/java/robots/gui/LogWindow.java create mode 100644 src/main/java/robots/gui/MainApplicationFrame.java create mode 100644 src/main/java/robots/gui/RobotsProgram.java create mode 100644 src/main/java/robots/log/LogChangeListener.java create mode 100644 src/main/java/robots/log/LogEntry.java create mode 100644 src/main/java/robots/log/LogLevel.java create mode 100644 src/main/java/robots/log/LogWindowSource.java create mode 100644 src/main/java/robots/log/Logger.java create mode 100644 target/classes/robots/gui/GameVisualizer$1.class create mode 100644 target/classes/robots/gui/GameVisualizer$2.class create mode 100644 target/classes/robots/gui/GameVisualizer$3.class create mode 100644 target/classes/robots/gui/GameVisualizer.class create mode 100644 target/classes/robots/gui/GameWindow.class create mode 100644 target/classes/robots/gui/LogWindow.class create mode 100644 target/classes/robots/gui/MainApplicationFrame.class create mode 100644 target/classes/robots/gui/RobotsProgram.class create mode 100644 target/classes/robots/log/LogChangeListener.class create mode 100644 target/classes/robots/log/LogEntry.class create mode 100644 target/classes/robots/log/LogLevel.class create mode 100644 target/classes/robots/log/LogWindowSource.class create mode 100644 target/classes/robots/log/Logger.class diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 000000000..26d33521a --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 000000000..6834da5ca --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 000000000..aa00ffab7 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 000000000..712ab9d98 --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 000000000..64d7c8e87 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 000000000..35eb1ddfb --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/main/java/robots/.classpath b/src/main/java/robots/.classpath new file mode 100644 index 000000000..fceb4801b --- /dev/null +++ b/src/main/java/robots/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/main/java/robots/.gitignore b/src/main/java/robots/.gitignore new file mode 100644 index 000000000..2757ffa76 --- /dev/null +++ b/src/main/java/robots/.gitignore @@ -0,0 +1,2 @@ +/bin/ +/.settings/ diff --git a/src/main/java/robots/.project b/src/main/java/robots/.project new file mode 100644 index 000000000..78e165663 --- /dev/null +++ b/src/main/java/robots/.project @@ -0,0 +1,17 @@ + + + Robots + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/src/main/java/robots/gui/GameVisualizer.java b/src/main/java/robots/gui/GameVisualizer.java new file mode 100644 index 000000000..eb2421b92 --- /dev/null +++ b/src/main/java/robots/gui/GameVisualizer.java @@ -0,0 +1,227 @@ +package robots.gui; + +import java.awt.Color; +import java.awt.EventQueue; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Point; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.geom.AffineTransform; +import java.util.Timer; +import java.util.TimerTask; + +import javax.swing.JPanel; + +public class GameVisualizer extends JPanel +{ + private final Timer m_timer = initTimer(); + + private static Timer initTimer() + { + Timer timer = new Timer("events generator", true); + return timer; + } + + private volatile double m_robotPositionX = 100; + private volatile double m_robotPositionY = 100; + private volatile double m_robotDirection = 0; + + private volatile int m_targetPositionX = 150; + private volatile int m_targetPositionY = 100; + + private static final double maxVelocity = 0.1; + private static final double maxAngularVelocity = 0.001; + + public GameVisualizer() + { + m_timer.schedule(new TimerTask() + { + @Override + public void run() + { + onRedrawEvent(); + } + }, 0, 50); + m_timer.schedule(new TimerTask() + { + @Override + public void run() + { + onModelUpdateEvent(); + } + }, 0, 10); + addMouseListener(new MouseAdapter() + { + @Override + public void mouseClicked(MouseEvent e) + { + setTargetPosition(e.getPoint()); + repaint(); + } + }); + setDoubleBuffered(true); + } + + protected void setTargetPosition(Point p) + { + m_targetPositionX = p.x; + m_targetPositionY = p.y; + } + + public Point getTargetPoint() { + return new Point(m_targetPositionX, m_targetPositionY); + } + + protected void onRedrawEvent() + { + EventQueue.invokeLater(this::repaint); + } + + private static double distance(double x1, double y1, double x2, double y2) + { + double diffX = x1 - x2; + double diffY = y1 - y2; + return Math.sqrt(diffX * diffX + diffY * diffY); + } + + private static double angleTo(double fromX, double fromY, double toX, double toY) + { + double diffX = toX - fromX; + double diffY = toY - fromY; + + return asNormalizedRadians(Math.atan2(diffY, diffX)); + } + + public void onModelUpdateEvent() + { + m_targetPositionX = (int) applyLimits(m_targetPositionX, 0, this.getWidth()); + m_targetPositionY = (int) applyLimits(m_targetPositionY, 0, this.getHeight()); + + double distance = distance(m_targetPositionX, m_targetPositionY, + m_robotPositionX, m_robotPositionY); + if (distance < 7) + { + return; + } + + double angleToTarget = angleTo(m_robotPositionX, m_robotPositionY, m_targetPositionX, m_targetPositionY); + double angularVelocity = 0; + + if (angleToTarget > m_robotDirection) + { + angularVelocity = maxAngularVelocity; + } + if (angleToTarget < m_robotDirection) + { + angularVelocity = -maxAngularVelocity; + } + + moveRobot(maxVelocity, angularVelocity, 10); + } + + private static double applyLimits(double value, double min, double max) + { + if (value < min) + return min; + if (value > max) + return max; + return value; + } + + private void moveRobot(double velocity, double angularVelocity, double duration) + { + m_robotDirection = asNormalizedRadians(m_robotDirection + angularVelocity * duration); + velocity = applyLimits(velocity, 0, maxVelocity); + angularVelocity = applyLimits(angularVelocity, -maxAngularVelocity, maxAngularVelocity); + double newX = m_robotPositionX + velocity / angularVelocity * + (Math.sin(m_robotDirection + angularVelocity * duration) - + Math.sin(m_robotDirection)); + if (!Double.isFinite(newX)) + { + newX = m_robotPositionX + velocity * duration * Math.cos(m_robotDirection); + } + double newY = m_robotPositionY - velocity / angularVelocity * + (Math.cos(m_robotDirection + angularVelocity * duration) - + Math.cos(m_robotDirection)); + if (!Double.isFinite(newY)) + { + newY = m_robotPositionY + velocity * duration * Math.sin(m_robotDirection); + } + + newX = applyLimits(newX, 0, getWidth()); + newY = applyLimits(newY, 0, getHeight()); + + m_robotPositionX = newX; + m_robotPositionY = newY; + + double newDirection = asNormalizedRadians(m_robotDirection + angularVelocity * duration); + m_robotDirection = newDirection; + } + + private static double asNormalizedRadians(double angle) + { + while (angle < 0) + { + angle += 2*Math.PI; + } + while (angle >= 2*Math.PI) + { + angle -= 2*Math.PI; + } + return angle; + } + + private static int round(double value) + { + return (int)(value + 0.5); + } + + @Override + public void paint(Graphics g) + { + super.paint(g); + Graphics2D g2d = (Graphics2D)g; + drawRobot(g2d, round(m_robotPositionX), round(m_robotPositionY), m_robotDirection); + drawTarget(g2d, m_targetPositionX, m_targetPositionY); + } + + private static void fillOval(Graphics g, int centerX, int centerY, int diam1, int diam2) + { + g.fillOval(centerX - diam1 / 2, centerY - diam2 / 2, diam1, diam2); + } + + private static void drawOval(Graphics g, int centerX, int centerY, int diam1, int diam2) + { + g.drawOval(centerX - diam1 / 2, centerY - diam2 / 2, diam1, diam2); + } + + private void drawRobot(Graphics2D g, int x, int y, double direction) + { + int robotCenterX = round(m_robotPositionX); + int robotCenterY = round(m_robotPositionY); + + AffineTransform originalTransform = g.getTransform(); + + g.rotate(direction, robotCenterX, robotCenterY); + + g.setColor(Color.MAGENTA); + fillOval(g, robotCenterX, robotCenterY, 30, 10); + g.setColor(Color.BLACK); + drawOval(g, robotCenterX, robotCenterY, 30, 10); + g.setColor(Color.WHITE); + fillOval(g, robotCenterX + 10, robotCenterY, 5, 5); + g.setColor(Color.BLACK); + drawOval(g, robotCenterX + 10, robotCenterY, 5, 5); + + g.setTransform(originalTransform); + } + + private void drawTarget(Graphics2D g, int x, int y) + { + g.setColor(Color.GREEN); + fillOval(g, x, y, 5, 5); + g.setColor(Color.BLACK); + drawOval(g, x, y, 5, 5); + } +} \ No newline at end of file diff --git a/src/main/java/robots/gui/GameWindow.java b/src/main/java/robots/gui/GameWindow.java new file mode 100644 index 000000000..a04d78a7b --- /dev/null +++ b/src/main/java/robots/gui/GameWindow.java @@ -0,0 +1,20 @@ +package robots.gui; + +import java.awt.BorderLayout; + +import javax.swing.JInternalFrame; +import javax.swing.JPanel; + +public class GameWindow extends JInternalFrame +{ + private final GameVisualizer m_visualizer; + public GameWindow() + { + super("Игровое поле", true, true, true, true); + m_visualizer = new GameVisualizer(); + JPanel panel = new JPanel(new BorderLayout()); + panel.add(m_visualizer, BorderLayout.CENTER); + getContentPane().add(panel); + pack(); + } +} diff --git a/src/main/java/robots/gui/LogWindow.java b/src/main/java/robots/gui/LogWindow.java new file mode 100644 index 000000000..8ede316b5 --- /dev/null +++ b/src/main/java/robots/gui/LogWindow.java @@ -0,0 +1,56 @@ +package robots.gui; + +import java.awt.BorderLayout; +import java.awt.EventQueue; +import java.awt.TextArea; + +import javax.swing.JInternalFrame; +import javax.swing.JPanel; + +import robots.log.LogChangeListener; +import robots.log.LogEntry; +import robots.log.LogWindowSource; + +public class LogWindow extends JInternalFrame implements LogChangeListener +{ + private LogWindowSource m_logSource; + private TextArea m_logContent; + + public LogWindow(LogWindowSource logSource) + { + super("Протокол работы", true, true, true, true); + m_logSource = logSource; + m_logSource.registerListener(this); + m_logContent = new TextArea(""); + m_logContent.setSize(200, 500); + + JPanel panel = new JPanel(new BorderLayout()); + panel.add(m_logContent, BorderLayout.CENTER); + getContentPane().add(panel); + pack(); + updateLogContent(); + } + + private void updateLogContent() + { + StringBuilder content = new StringBuilder(); + for (LogEntry entry : m_logSource.all()) + { + content.append(entry.getMessage()).append("\n"); + } + m_logContent.setText(content.toString()); + m_logContent.invalidate(); + } + + @Override + public void doDefaultCloseAction() { + m_logSource.unregisterListener(this); + super.doDefaultCloseAction(); + } + + @Override + public void onLogChanged() + { + EventQueue.invokeLater(this::updateLogContent); + } +} \ No newline at end of file diff --git a/src/main/java/robots/gui/MainApplicationFrame.java b/src/main/java/robots/gui/MainApplicationFrame.java new file mode 100644 index 000000000..36f7e9ef5 --- /dev/null +++ b/src/main/java/robots/gui/MainApplicationFrame.java @@ -0,0 +1,135 @@ +package robots.gui; + +import java.awt.Dimension; +import java.awt.Toolkit; +import java.awt.event.KeyEvent; + +import javax.swing.JDesktopPane; +import javax.swing.JFrame; +import javax.swing.JInternalFrame; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +import robots.log.Logger; + +public class MainApplicationFrame extends JFrame +{ + private final JDesktopPane desktopPane = new JDesktopPane(); + + public MainApplicationFrame() { + + int inset = 50; + Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); + setBounds(inset, inset, + screenSize.width - inset*2, + screenSize.height - inset*2); + + setContentPane(desktopPane); + + + LogWindow logWindow = createLogWindow(); + addWindow(logWindow); + + GameWindow gameWindow = new GameWindow(); + gameWindow.setSize(400, 400); + addWindow(gameWindow); + + setJMenuBar(generateMenuBar()); + setDefaultCloseOperation(EXIT_ON_CLOSE); + } + + protected LogWindow createLogWindow() + { + LogWindow logWindow = new LogWindow(Logger.getDefaultLogSource()); + logWindow.setLocation(10,10); + logWindow.setSize(300, 800); + setMinimumSize(logWindow.getSize()); + logWindow.pack(); + Logger.debug("Протокол работает"); + return logWindow; + } + + protected void addWindow(JInternalFrame frame) + { + desktopPane.add(frame); + frame.setVisible(true); + } + + private JMenu createLookAndFeelMenu() { + JMenu lookAndFeelMenu = new JMenu("Режим отображения"); + lookAndFeelMenu.setMnemonic(KeyEvent.VK_V); + lookAndFeelMenu.getAccessibleContext().setAccessibleDescription( + "Управление режимом отображения приложения"); + + JMenuItem systemLookAndFeel = createLookAndFeelMenuItem("Системная схема", UIManager.getSystemLookAndFeelClassName()); + JMenuItem crossplatformLookAndFeel = createLookAndFeelMenuItem("Универсальная схема", UIManager.getCrossPlatformLookAndFeelClassName()); + + lookAndFeelMenu.add(systemLookAndFeel); + lookAndFeelMenu.add(crossplatformLookAndFeel); + + return lookAndFeelMenu; + } + + private JMenuItem createLookAndFeelMenuItem(String name, String className) { + JMenuItem menuItem = new JMenuItem(name); + menuItem.setMnemonic(KeyEvent.VK_S); + menuItem.addActionListener((event) -> { + setLookAndFeel(className); + this.invalidate(); + }); + + return menuItem; + } + + private JMenu createTestMenu() { + JMenu testMenu = new JMenu("Тесты"); + testMenu.setMnemonic(KeyEvent.VK_T); + testMenu.getAccessibleContext().setAccessibleDescription( + "Тестовые команды"); + + JMenuItem addLogMessageItem = createTestMenuItem("Сообщение в лог", "Новая строка"); + + testMenu.add(addLogMessageItem); + + return testMenu; + } + + private JMenuItem createTestMenuItem(String name, String logMessage) { + JMenuItem menuItem = new JMenuItem(name); + menuItem.setMnemonic(KeyEvent.VK_S); + menuItem.addActionListener((event) -> { + Logger.debug(logMessage); + }); + + return menuItem; + } + + private JMenuBar generateMenuBar() { + JMenuBar menuBar = new JMenuBar(); + + JMenu lookAndFeelMenu = createLookAndFeelMenu(); + JMenu testMenu = createTestMenu(); + + menuBar.add(lookAndFeelMenu); + menuBar.add(testMenu); + + return menuBar; + } + + private void setLookAndFeel(String className) + { + try + { + UIManager.setLookAndFeel(className); + SwingUtilities.updateComponentTreeUI(this); + } + catch (ClassNotFoundException | InstantiationException + | IllegalAccessException | UnsupportedLookAndFeelException e) + { + } + } +} \ No newline at end of file diff --git a/src/main/java/robots/gui/RobotsProgram.java b/src/main/java/robots/gui/RobotsProgram.java new file mode 100644 index 000000000..1454cbe02 --- /dev/null +++ b/src/main/java/robots/gui/RobotsProgram.java @@ -0,0 +1,22 @@ +package robots.gui; + +import java.awt.Frame; + +import javax.swing.SwingUtilities; +import javax.swing.UIManager; + +public class RobotsProgram +{ + public static void main(String[] args) { + try { + UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel"); + } catch (Exception e) { + e.printStackTrace(); + } + SwingUtilities.invokeLater(() -> { + MainApplicationFrame frame = new MainApplicationFrame(); + frame.pack(); + frame.setVisible(true); + frame.setExtendedState(Frame.MAXIMIZED_BOTH); + }); + }} diff --git a/src/main/java/robots/log/LogChangeListener.java b/src/main/java/robots/log/LogChangeListener.java new file mode 100644 index 000000000..2553a375a --- /dev/null +++ b/src/main/java/robots/log/LogChangeListener.java @@ -0,0 +1,6 @@ +package robots.log; + +public interface LogChangeListener +{ + public void onLogChanged(); +} diff --git a/src/main/java/robots/log/LogEntry.java b/src/main/java/robots/log/LogEntry.java new file mode 100644 index 000000000..ab539b24d --- /dev/null +++ b/src/main/java/robots/log/LogEntry.java @@ -0,0 +1,24 @@ +package robots.log; + +public class LogEntry +{ + private LogLevel m_logLevel; + private String m_strMessage; + + public LogEntry(LogLevel logLevel, String strMessage) + { + m_strMessage = strMessage; + m_logLevel = logLevel; + } + + public String getMessage() + { + return m_strMessage; + } + + public LogLevel getLevel() + { + return m_logLevel; + } +} + diff --git a/src/main/java/robots/log/LogLevel.java b/src/main/java/robots/log/LogLevel.java new file mode 100644 index 000000000..898e8dbfb --- /dev/null +++ b/src/main/java/robots/log/LogLevel.java @@ -0,0 +1,24 @@ +package robots.log; + +public enum LogLevel +{ + Trace(0), + Debug(1), + Info(2), + Warning(3), + Error(4), + Fatal(5); + + private int m_iLevel; + + private LogLevel(int iLevel) + { + m_iLevel = iLevel; + } + + public int level() + { + return m_iLevel; + } +} + diff --git a/src/main/java/robots/log/LogWindowSource.java b/src/main/java/robots/log/LogWindowSource.java new file mode 100644 index 000000000..7f4a7604c --- /dev/null +++ b/src/main/java/robots/log/LogWindowSource.java @@ -0,0 +1,76 @@ +package robots.log; + +import java.util.ArrayList; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.BlockingQueue; + + +public class LogWindowSource { + private final int m_iQueueLength; + + private final BlockingQueue m_messages; + private final ArrayList m_listeners; + private volatile LogChangeListener[] m_activeListeners; + + public LogWindowSource(int iQueueLength) { + m_iQueueLength = iQueueLength; + m_messages = new ArrayBlockingQueue(iQueueLength); + m_listeners = new ArrayList(); + } + + public void registerListener(LogChangeListener listener) { + m_listeners.add(listener); + updateActiveListeners(); + } + + public void unregisterListener(LogChangeListener listener) { + m_listeners.remove(listener); + updateActiveListeners(); + } + + public void append(LogLevel logLevel, String strMessage) { + LogEntry entry = new LogEntry(logLevel, strMessage); + boolean result = false; + do { + result = m_messages.offer(entry); + if (!result) { + m_messages.poll(); + } + } while (!result); + + notifyListeners(); + } + + public void notifyListeners() { + LogChangeListener[] activeListeners = m_activeListeners; + + if (activeListeners != null) { + for (LogChangeListener listener : activeListeners) { + listener.onLogChanged(); + } + } + } + + + private void updateActiveListeners() { + m_activeListeners = m_listeners.toArray(new LogChangeListener[0]); + } + + public int size() { + return m_messages.size(); + } + + public int getCountListener() { + return m_listeners.size(); + } + + public Iterable range(int startFrom, int count) { + ArrayList range = new ArrayList<>(m_messages); + int end = Math.min(startFrom + count, range.size()); + return range.subList(startFrom, end); + } + + public Iterable all() { + return new ArrayList<>(m_messages); + } +} \ No newline at end of file diff --git a/src/main/java/robots/log/Logger.java b/src/main/java/robots/log/Logger.java new file mode 100644 index 000000000..fc1d6f341 --- /dev/null +++ b/src/main/java/robots/log/Logger.java @@ -0,0 +1,28 @@ +package robots.log; + +public final class Logger +{ + private static final LogWindowSource defaultLogSource; + static { + defaultLogSource = new LogWindowSource(3); + } + + private Logger() + { + } + + public static void debug(String strMessage) + { + defaultLogSource.append(LogLevel.Debug, strMessage); + } + + public static void error(String strMessage) + { + defaultLogSource.append(LogLevel.Error, strMessage); + } + + public static LogWindowSource getDefaultLogSource() + { + return defaultLogSource; + } +} diff --git a/target/classes/robots/gui/GameVisualizer$1.class b/target/classes/robots/gui/GameVisualizer$1.class new file mode 100644 index 0000000000000000000000000000000000000000..93de48da84fdcb69a1c817d1044eefea34a5b8f1 GIT binary patch literal 621 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 literal 0 HcmV?d00001 diff --git a/target/classes/robots/gui/GameWindow.class b/target/classes/robots/gui/GameWindow.class new file mode 100644 index 0000000000000000000000000000000000000000..f4f686762153ee44fe3e8b19d1a21aa7c1273a52 GIT binary patch literal 884 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 H>e2XL@&I~I literal 0 HcmV?d00001 diff --git a/target/classes/robots/gui/RobotsProgram.class b/target/classes/robots/gui/RobotsProgram.class new file mode 100644 index 0000000000000000000000000000000000000000..6bda901873d76a8e871f56d42ef930d613778acf GIT binary patch literal 1570 zcma)6U31e$6g_J@mLnAGIE@oh2n`KwY+8%9d=*n5q)C$^2O5XWw0&CJ8?!`SX{0rT zU&J#nfq@x*0K;!$dRO*1Vwy4?k9MuQ_ndp~+10-P_~speD`?rsAZsD#U;=rD(i8ra zyFOPv_d)xK=xB!gEvclw&5&KG?iEmAsG6k1di+ePUOn{reqG6adl1*RlgSH$gH_et z5W=@%}A!X~9=ADDxh<8Mp`kZx8!5noE4HQFVrJ7>j87RfuzG&Dug9Qs; zIyj4S3=3(kEz{~FEq$q_h#5{v^)xsT9@j?xTw3jz&*(kRa6Ss!fsWnYK)OvX)oK{} zvcrw+jfnS!jYVY5aKXXXrh!~Y(oNu^gKzLHgH7)2$yky|T3z|e5Ld~x#0dUOyJMb9 z4!*>x|Cb=q!QbMep^Jl#u|pQ z7j(G4$0KRpN5PzaEXj)n@4pBe#Mq~njpcu*EFW(u10(X;)Y5oM4VFhe;-5JI$}pAe zaFd54F;hP8x4V4V)LXvHFtKmUWmrn9JIQ}4WVeDr)DaspY4sCN>c(U;^j<)Fs3RUW zg?=1#;}Y`4JbtxN$GU@C$=h!>HnC;lcL(?3Ft)SiVu7#2UDN*B}63oOwlWaujgvY?Gep2o}c=F-e)o~XS7 zdr5yX_<=^V3>5Gqjm|IuKhaePOyVl8QN(~_nhj~CY`wuVx z=;FyHtP8|z_$E*$?h0vK_llE+@_o? e?$DUQU98e=6FtY&X8)h zx;bQ#Q=n?dLu050e&3Hm!}V>$^zBP83Z59WQ7?>wYaWJ{%^51@oU{`Kj%T-Hnxcjh z$_(nLM{tu*xXVyC|1yejn?Y}`{8(mgbs6Lf|AFe3OvmFl<58ancUIpOo%jRG?OK5o z`$gqS=df@MLd%@PtqhHdOn SB<^t$T=);JuLSRk5_{kL$A*Le literal 0 HcmV?d00001 diff --git a/target/classes/robots/log/LogLevel.class b/target/classes/robots/log/LogLevel.class new file mode 100644 index 0000000000000000000000000000000000000000..6d158062b72835d6273b36db74216e183f42e6e9 GIT binary patch literal 1432 zcmZuw-*XdH6#j1ZXO?XnQd%e!L_kTxkBAl(Q){8L5)H!4mO2?8oK0B5GTYsm?WWJZ z`>*(*L50!L;n_dR;X60!5Qpr{?%8whcfNbhchCLzzd!#0u!j2%N(zg4*2{{6W|9q> zoovvF4x^+D1=EKGTfy4R!+xZ&)R_Tn3DWgZ*2ue2Z#a<1F(1A}%y#-Tlfb->1qnFc zhj|*O8g$%8Ri|y|d6o<6gpVa1*$InK7je?ZDXcK>(%$XPqwPRp`SHv;JefgJif7rA zhha`k5#=n_ES|+Q_K_6jAReS)G0e$f*4Q#nH<2M#FlzNSWn1qj6OkF<^5vQ%sdEOIub44x!K+7@Lmcy+rXIfj%v9_FEW|ZVO zfy!x_UHUfjzQ8T=wdh@-mB$-l`460ajWfT{Q&{KM)@ugw7x5)|1iwZr8D3R2Ug5ph zP=YW055K{PKStpzY|^{U*J9d_0_6n3&}8>$O)mM3E2}T@LF4T2sQ*fTOgGO}$VEj3 z$8a1%yUaBqzoT1|zb!Ur=nduwuW(gfK6m++u+2Jl@HM|ueUnzIw;I2p{<8+WZFEWR zFfQC0?@;k%cqhqsbge+6V*d@*HAXOkt~r7ebgdB&uWOGm7j&HwDnZvBVKI1DN*DLg zp78y|gOum-Uu3IZGmMwG{sM;fZkVR_9PNE|rR2Fw5e literal 0 HcmV?d00001 diff --git a/target/classes/robots/log/LogWindowSource.class b/target/classes/robots/log/LogWindowSource.class new file mode 100644 index 0000000000000000000000000000000000000000..721bf0517dc4f6f003cff8bcf525ebb57ca62ee0 GIT binary patch literal 2952 zcma)8%T^Ru6y3MGp_`_7h&0MeKr!?K>_`yNMk3-1(_j<>L6cz76isP&6{)VqU|y39 z^8<01NhTSXwF1Pr;>sw4{6=Q^f=m*#Z&leZa3u>U>ORgs`|NYhz4iM)KfeGlhA+eL z!5>6GK^^J^S|6xeYBHx9+2qaD2U^A!sGrmg-JTNgM`Mc(2%#Z}u!2S?0$rB5YTAWl z&des$W_C$8*33r>X3@%M0?qjq{Z>&cYH7{L+8Y95Hi%|{A;(A2)^o{>X=I9)r5Sc| z+OpK`OF1+1P&cxUSr|=dmAnoK1fsL9^TP_-5fKRISMpk+pk}p#z+n17$SSl{5JvR*091 z-3=4>xPlW>+(>bAO|`Y@jID2J(zD}1BArz5hD55jw7j{c1ra6HYHhC=wzVC`5aLpj zgg`u+uHKQ>wzOQTg2aMtQOi_pu@NIU6+}|Oo6^hivIrFks8UOy&Rk#DENMBa;4O?X z2b*RtC(s^^RrqkLgmQ#1uHdW;v&ArNeSNzWpp^EUg7ZiT9Lle#)!_^D-Kz;?W`p%t z5-8P(3z!PxZ3P!4d{1@M)tdzr(_kgKvuje@OA2OiSs-YePWl9*(R=$Nh#fE&1f7rI znu6&EMkd#3&mBbp;Vk}E@KB?&Qi;U1wCu1cF`gyFYUEWRh84p z8kwDnN=*^zOa*wU#A~-#3+>niX3RA@Z%ONhHebxIYStZfHOHB@w3$(Ji>jr|u{Rm8 zH+1$>PYsRALxWtD>NBI&(z3EstXJhEFi>0gHOyj*0->DOUINEz{MGCx*`l%ENxizc zsTpkR5YINJv*bxoU3zZA@hmFX)|`77$Du0Wm9pXgQyAqsO1{Q*KHP75qW z0^hv+Bfg6>GA2KyX2+Q>AWHFL^qrt;!;El*Gf6&A^JmoIGv<0K#W{*BHpqkCq2mE{ z3)AKya>SJ}LsDlc+XQ-Xj^a%qj!B1ZKWX$L=p;i*l<uNjckq+j-sWU+^L=DU0Dj}Yr8%#Q~~x+8&I+I6rP~!zDjo|L>oeMZ?(F{JU$J+KE&u=k literal 0 HcmV?d00001 diff --git a/target/classes/robots/log/Logger.class b/target/classes/robots/log/Logger.class new file mode 100644 index 0000000000000000000000000000000000000000..58605f01996eeb9edaa7f4345609eabb3fc866af GIT binary patch literal 913 zcmZ{i-EPxB5QWbsPMkQVP1>e~5(+JUP6~|>+@Mt4P>_%eToeUyxsDg(%6O}_)4mq8 zQY*C*5737~%-R+tX~;#qGrRlEIkR*1`{EaX7uc~-LfM32qk<|!^MD`me#GOT|Is@T zqm-e#8^&S!ilOXuhjr9YH(}Xmz-DME>B%(dM>6QUG6;ksgfG7GagzB0sS4v@pj|Iu-NtRLukuDIsdU9Vx@Q{0o)20X3H1bE@(G~HGW}!q=L=D%|K&uMH zG)9!UOVM-sGM(+6gZ-pM3HRt6ZU#jQmoWj(?^BcK;lR8kN%oEC&@bnMIxwiiR literal 0 HcmV?d00001 From 2213cdaf123287edaa575378198252fe33aa937f Mon Sep 17 00:00:00 2001 From: KarinaPakholkova <104212969+KarinaPakholkova@users.noreply.github.com> Date: Sun, 2 Mar 2025 21:40:44 +0500 Subject: [PATCH 03/10] Delete target/classes/robots directory --- target/classes/robots/gui/GameVisualizer$1.class | Bin 621 -> 0 bytes target/classes/robots/gui/GameVisualizer$2.class | Bin 626 -> 0 bytes target/classes/robots/gui/GameVisualizer$3.class | Bin 849 -> 0 bytes target/classes/robots/gui/GameVisualizer.class | Bin 5883 -> 0 bytes target/classes/robots/gui/GameWindow.class | Bin 884 -> 0 bytes target/classes/robots/gui/LogWindow.class | Bin 2791 -> 0 bytes .../robots/gui/MainApplicationFrame.class | Bin 5677 -> 0 bytes target/classes/robots/gui/RobotsProgram.class | Bin 1570 -> 0 bytes .../classes/robots/log/LogChangeListener.class | Bin 155 -> 0 bytes target/classes/robots/log/LogEntry.class | Bin 686 -> 0 bytes target/classes/robots/log/LogLevel.class | Bin 1432 -> 0 bytes target/classes/robots/log/LogWindowSource.class | Bin 2952 -> 0 bytes target/classes/robots/log/Logger.class | Bin 913 -> 0 bytes 13 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 target/classes/robots/gui/GameVisualizer$1.class delete mode 100644 target/classes/robots/gui/GameVisualizer$2.class delete mode 100644 target/classes/robots/gui/GameVisualizer$3.class delete mode 100644 target/classes/robots/gui/GameVisualizer.class delete mode 100644 target/classes/robots/gui/GameWindow.class delete mode 100644 target/classes/robots/gui/LogWindow.class delete mode 100644 target/classes/robots/gui/MainApplicationFrame.class delete mode 100644 target/classes/robots/gui/RobotsProgram.class delete mode 100644 target/classes/robots/log/LogChangeListener.class delete mode 100644 target/classes/robots/log/LogEntry.class delete mode 100644 target/classes/robots/log/LogLevel.class delete mode 100644 target/classes/robots/log/LogWindowSource.class delete mode 100644 target/classes/robots/log/Logger.class diff --git a/target/classes/robots/gui/GameVisualizer$1.class b/target/classes/robots/gui/GameVisualizer$1.class deleted file mode 100644 index 93de48da84fdcb69a1c817d1044eefea34a5b8f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 621 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 diff --git a/target/classes/robots/gui/GameWindow.class b/target/classes/robots/gui/GameWindow.class deleted file mode 100644 index f4f686762153ee44fe3e8b19d1a21aa7c1273a52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 884 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 H>e2XL@&I~I diff --git a/target/classes/robots/gui/RobotsProgram.class b/target/classes/robots/gui/RobotsProgram.class deleted file mode 100644 index 6bda901873d76a8e871f56d42ef930d613778acf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1570 zcma)6U31e$6g_J@mLnAGIE@oh2n`KwY+8%9d=*n5q)C$^2O5XWw0&CJ8?!`SX{0rT zU&J#nfq@x*0K;!$dRO*1Vwy4?k9MuQ_ndp~+10-P_~speD`?rsAZsD#U;=rD(i8ra zyFOPv_d)xK=xB!gEvclw&5&KG?iEmAsG6k1di+ePUOn{reqG6adl1*RlgSH$gH_et z5W=@%}A!X~9=ADDxh<8Mp`kZx8!5noE4HQFVrJ7>j87RfuzG&Dug9Qs; zIyj4S3=3(kEz{~FEq$q_h#5{v^)xsT9@j?xTw3jz&*(kRa6Ss!fsWnYK)OvX)oK{} zvcrw+jfnS!jYVY5aKXXXrh!~Y(oNu^gKzLHgH7)2$yky|T3z|e5Ld~x#0dUOyJMb9 z4!*>x|Cb=q!QbMep^Jl#u|pQ z7j(G4$0KRpN5PzaEXj)n@4pBe#Mq~njpcu*EFW(u10(X;)Y5oM4VFhe;-5JI$}pAe zaFd54F;hP8x4V4V)LXvHFtKmUWmrn9JIQ}4WVeDr)DaspY4sCN>c(U;^j<)Fs3RUW zg?=1#;}Y`4JbtxN$GU@C$=h!>HnC;lcL(?3Ft)SiVu7#2UDN*B}63oOwlWaujgvY?Gep2o}c=F-e)o~XS7 zdr5yX_<=^V3>5Gqjm|IuKhaePOyVl8QN(~_nhj~CY`wuVx z=;FyHtP8|z_$E*$?h0vK_llE+@_o? e?$DUQU98e=6FtY&X8)h zx;bQ#Q=n?dLu050e&3Hm!}V>$^zBP83Z59WQ7?>wYaWJ{%^51@oU{`Kj%T-Hnxcjh z$_(nLM{tu*xXVyC|1yejn?Y}`{8(mgbs6Lf|AFe3OvmFl<58ancUIpOo%jRG?OK5o z`$gqS=df@MLd%@PtqhHdOn SB<^t$T=);JuLSRk5_{kL$A*Le diff --git a/target/classes/robots/log/LogLevel.class b/target/classes/robots/log/LogLevel.class deleted file mode 100644 index 6d158062b72835d6273b36db74216e183f42e6e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1432 zcmZuw-*XdH6#j1ZXO?XnQd%e!L_kTxkBAl(Q){8L5)H!4mO2?8oK0B5GTYsm?WWJZ z`>*(*L50!L;n_dR;X60!5Qpr{?%8whcfNbhchCLzzd!#0u!j2%N(zg4*2{{6W|9q> zoovvF4x^+D1=EKGTfy4R!+xZ&)R_Tn3DWgZ*2ue2Z#a<1F(1A}%y#-Tlfb->1qnFc zhj|*O8g$%8Ri|y|d6o<6gpVa1*$InK7je?ZDXcK>(%$XPqwPRp`SHv;JefgJif7rA zhha`k5#=n_ES|+Q_K_6jAReS)G0e$f*4Q#nH<2M#FlzNSWn1qj6OkF<^5vQ%sdEOIub44x!K+7@Lmcy+rXIfj%v9_FEW|ZVO zfy!x_UHUfjzQ8T=wdh@-mB$-l`460ajWfT{Q&{KM)@ugw7x5)|1iwZr8D3R2Ug5ph zP=YW055K{PKStpzY|^{U*J9d_0_6n3&}8>$O)mM3E2}T@LF4T2sQ*fTOgGO}$VEj3 z$8a1%yUaBqzoT1|zb!Ur=nduwuW(gfK6m++u+2Jl@HM|ueUnzIw;I2p{<8+WZFEWR zFfQC0?@;k%cqhqsbge+6V*d@*HAXOkt~r7ebgdB&uWOGm7j&HwDnZvBVKI1DN*DLg zp78y|gOum-Uu3IZGmMwG{sM;fZkVR_9PNE|rR2Fw5e diff --git a/target/classes/robots/log/LogWindowSource.class b/target/classes/robots/log/LogWindowSource.class deleted file mode 100644 index 721bf0517dc4f6f003cff8bcf525ebb57ca62ee0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2952 zcma)8%T^Ru6y3MGp_`_7h&0MeKr!?K>_`yNMk3-1(_j<>L6cz76isP&6{)VqU|y39 z^8<01NhTSXwF1Pr;>sw4{6=Q^f=m*#Z&leZa3u>U>ORgs`|NYhz4iM)KfeGlhA+eL z!5>6GK^^J^S|6xeYBHx9+2qaD2U^A!sGrmg-JTNgM`Mc(2%#Z}u!2S?0$rB5YTAWl z&des$W_C$8*33r>X3@%M0?qjq{Z>&cYH7{L+8Y95Hi%|{A;(A2)^o{>X=I9)r5Sc| z+OpK`OF1+1P&cxUSr|=dmAnoK1fsL9^TP_-5fKRISMpk+pk}p#z+n17$SSl{5JvR*091 z-3=4>xPlW>+(>bAO|`Y@jID2J(zD}1BArz5hD55jw7j{c1ra6HYHhC=wzVC`5aLpj zgg`u+uHKQ>wzOQTg2aMtQOi_pu@NIU6+}|Oo6^hivIrFks8UOy&Rk#DENMBa;4O?X z2b*RtC(s^^RrqkLgmQ#1uHdW;v&ArNeSNzWpp^EUg7ZiT9Lle#)!_^D-Kz;?W`p%t z5-8P(3z!PxZ3P!4d{1@M)tdzr(_kgKvuje@OA2OiSs-YePWl9*(R=$Nh#fE&1f7rI znu6&EMkd#3&mBbp;Vk}E@KB?&Qi;U1wCu1cF`gyFYUEWRh84p z8kwDnN=*^zOa*wU#A~-#3+>niX3RA@Z%ONhHebxIYStZfHOHB@w3$(Ji>jr|u{Rm8 zH+1$>PYsRALxWtD>NBI&(z3EstXJhEFi>0gHOyj*0->DOUINEz{MGCx*`l%ENxizc zsTpkR5YINJv*bxoU3zZA@hmFX)|`77$Du0Wm9pXgQyAqsO1{Q*KHP75qW z0^hv+Bfg6>GA2KyX2+Q>AWHFL^qrt;!;El*Gf6&A^JmoIGv<0K#W{*BHpqkCq2mE{ z3)AKya>SJ}LsDlc+XQ-Xj^a%qj!B1ZKWX$L=p;i*l<uNjckq+j-sWU+^L=DU0Dj}Yr8%#Q~~x+8&I+I6rP~!zDjo|L>oeMZ?(F{JU$J+KE&u=k diff --git a/target/classes/robots/log/Logger.class b/target/classes/robots/log/Logger.class deleted file mode 100644 index 58605f01996eeb9edaa7f4345609eabb3fc866af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 913 zcmZ{i-EPxB5QWbsPMkQVP1>e~5(+JUP6~|>+@Mt4P>_%eToeUyxsDg(%6O}_)4mq8 zQY*C*5737~%-R+tX~;#qGrRlEIkR*1`{EaX7uc~-LfM32qk<|!^MD`me#GOT|Is@T zqm-e#8^&S!ilOXuhjr9YH(}Xmz-DME>B%(dM>6QUG6;ksgfG7GagzB0sS4v@pj|Iu-NtRLukuDIsdU9Vx@Q{0o)20X3H1bE@(G~HGW}!q=L=D%|K&uMH zG)9!UOVM-sGM(+6gZ-pM3HRt6ZU#jQmoWj(?^BcK;lR8kN%oEC&@bnMIxwiiR From daa6e92eac65ef6a883a4a96a480f81fa293f6b8 Mon Sep 17 00:00:00 2001 From: KarinaPakholkova <104212969+KarinaPakholkova@users.noreply.github.com> Date: Sun, 2 Mar 2025 21:41:00 +0500 Subject: [PATCH 04/10] Delete .idea directory --- .idea/.gitignore | 3 --- .idea/compiler.xml | 13 ------------- .idea/encodings.xml | 7 ------- .idea/jarRepositories.xml | 20 -------------------- .idea/misc.xml | 14 -------------- .idea/vcs.xml | 6 ------ 6 files changed, 63 deletions(-) delete mode 100644 .idea/.gitignore delete mode 100644 .idea/compiler.xml delete mode 100644 .idea/encodings.xml delete mode 100644 .idea/jarRepositories.xml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 26d33521a..000000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml diff --git a/.idea/compiler.xml b/.idea/compiler.xml deleted file mode 100644 index 6834da5ca..000000000 --- a/.idea/compiler.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml deleted file mode 100644 index aa00ffab7..000000000 --- a/.idea/encodings.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml deleted file mode 100644 index 712ab9d98..000000000 --- a/.idea/jarRepositories.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 64d7c8e87..000000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 35eb1ddfb..000000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file From 7449a38059e5311e684594cf0772557b9825ed60 Mon Sep 17 00:00:00 2001 From: karina Date: Mon, 10 Mar 2025 21:09:43 +0500 Subject: [PATCH 05/10] 1 task test --- pom.xml | 32 +++++---- .../java/robots/log/LogWindowSourceTest.java | 71 +++++++++++++++++++ 2 files changed, 88 insertions(+), 15 deletions(-) create mode 100644 src/test/java/robots/log/LogWindowSourceTest.java diff --git a/pom.xml b/pom.xml index c3c16b7d3..a12b99741 100644 --- a/pom.xml +++ b/pom.xml @@ -4,26 +4,28 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - groupId + org.example Robots 1.0-SNAPSHOT - 23 - 23 + 21 + 21 UTF-8 - - - - org.apache.maven.plugins - maven-compiler-plugin - - 8 - 8 - - - - + + + org.junit.jupiter + junit-jupiter + RELEASE + test + + + org.junit.jupiter + junit-jupiter + RELEASE + test + + \ No newline at end of file diff --git a/src/test/java/robots/log/LogWindowSourceTest.java b/src/test/java/robots/log/LogWindowSourceTest.java new file mode 100644 index 000000000..7498e5a0f --- /dev/null +++ b/src/test/java/robots/log/LogWindowSourceTest.java @@ -0,0 +1,71 @@ +package robots.log; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class LogWindowSourceTest { + private LogWindowSource logWindowSource; + + @BeforeEach + public void setUp() { + logWindowSource = new LogWindowSource(5); + } + + @Test + void testRegisterListener() { + LogChangeListener listener = new LogChangeListener() { + @Override + public void onLogChanged() { + } + }; + logWindowSource.registerListener(listener); + assertEquals(1, logWindowSource.getCountListener()); + } + + @Test + void testUnregisterListener() { + LogChangeListener listener = new LogChangeListener() { + @Override + public void onLogChanged() { + } + }; + logWindowSource.registerListener(listener); + logWindowSource.unregisterListener(listener); + + assertEquals(0, logWindowSource.getCountListener()); + } + + @Test + void testAppend() { + LogChangeListener listener = new LogChangeListener() { + @Override + public void onLogChanged() { + } + }; + logWindowSource.registerListener(listener); + logWindowSource.append(LogLevel.Info, "message"); + logWindowSource.append(LogLevel.Info, "message"); + logWindowSource.append(LogLevel.Info, "message"); + assertEquals(3, logWindowSource.size()); + } + + @Test + void testOverflowQueue() { + LogChangeListener listener = new LogChangeListener() { + @Override + public void onLogChanged() { + } + }; + logWindowSource.registerListener(listener); + logWindowSource.append(LogLevel.Info, "message"); + logWindowSource.append(LogLevel.Info, "message"); + logWindowSource.append(LogLevel.Info, "message"); + logWindowSource.append(LogLevel.Info, "message"); + logWindowSource.append(LogLevel.Info, "message"); + logWindowSource.append(LogLevel.Info, "message"); + logWindowSource.append(LogLevel.Info, "message"); + assertEquals(5, logWindowSource.size()); + } +} \ No newline at end of file From c99895b283b1f03e577da29991e1d8564ad43013 Mon Sep 17 00:00:00 2001 From: karina Date: Mon, 24 Mar 2025 20:37:15 +0500 Subject: [PATCH 06/10] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=D0=B0=20=D1=82=D0=B5=D1=81=D1=82=20=D0=BD=D0=B0=201=20ta?= =?UTF-8?q?sk?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/robots/log/LogWindowSourceTest.java | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/test/java/robots/log/LogWindowSourceTest.java b/src/test/java/robots/log/LogWindowSourceTest.java index 7498e5a0f..eb0b7323e 100644 --- a/src/test/java/robots/log/LogWindowSourceTest.java +++ b/src/test/java/robots/log/LogWindowSourceTest.java @@ -1,7 +1,11 @@ package robots.log; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; +import robots.gui.GameVisualizer; + +import java.awt.*; import static org.junit.jupiter.api.Assertions.*; @@ -68,4 +72,32 @@ public void onLogChanged() { logWindowSource.append(LogLevel.Info, "message"); assertEquals(5, logWindowSource.size()); } + + @Nested + class GameVisualizerTest { + + private GameVisualizer gameVisualizer; + + @BeforeEach + void setUp() { + gameVisualizer = new GameVisualizer(); + gameVisualizer.setSize(300, 300); + gameVisualizer.setVisible(true); + } + + @Test + void testRobotDoesNotMoveOutsideBounds() { + gameVisualizer.setTargetPosition(new Point(400, 400)); + + gameVisualizer.onModelUpdateEvent(); + + double robotX = gameVisualizer.m_robotPositionX; + double robotY = gameVisualizer.m_robotPositionY; + + assertTrue(robotX >= 0 && robotX <= gameVisualizer.getWidth() - 1); + assertTrue(robotY >= 0 && robotY <= gameVisualizer.getHeight() - 1); + } + } + + } \ No newline at end of file From 078f2678c57dbcf016e826fe98bc1eca81f7fe57 Mon Sep 17 00:00:00 2001 From: karina Date: Mon, 24 Mar 2025 20:39:12 +0500 Subject: [PATCH 07/10] task 2 --- src/main/java/robots/gui/AbstractWindow.java | 34 +++++++++++++ src/main/java/robots/gui/GameVisualizer.java | 6 +-- src/main/java/robots/gui/GameWindow.java | 7 ++- src/main/java/robots/gui/LogWindow.java | 5 +- .../java/robots/gui/MainApplicationFrame.java | 48 +++++++++++++++++-- 5 files changed, 88 insertions(+), 12 deletions(-) create mode 100644 src/main/java/robots/gui/AbstractWindow.java diff --git a/src/main/java/robots/gui/AbstractWindow.java b/src/main/java/robots/gui/AbstractWindow.java new file mode 100644 index 000000000..824df2c7c --- /dev/null +++ b/src/main/java/robots/gui/AbstractWindow.java @@ -0,0 +1,34 @@ +package robots.gui; + +import javax.swing.*; +import javax.swing.event.InternalFrameAdapter; +import javax.swing.event.InternalFrameEvent; + +public abstract class AbstractWindow extends JInternalFrame { + + public AbstractWindow(String title, boolean resizable, boolean closable, boolean maximizable, boolean iconifiable) { + super(title, resizable, closable, maximizable, iconifiable); + setDefaultCloseOperation(JInternalFrame.DO_NOTHING_ON_CLOSE); + + addInternalFrameListener(new InternalFrameAdapter() { + @Override + public void internalFrameClosing(InternalFrameEvent e) { + int result = JOptionPane.showConfirmDialog( + AbstractWindow.this, + "Вы уверены, что хотите закрыть окно?", + "Подтверждение", + JOptionPane.YES_NO_OPTION); + if (result == JOptionPane.YES_OPTION) { + dispose(); + } + } + }); } + + protected abstract void closeWindow(); + + @Override + public void dispose() { + closeWindow(); + super.dispose(); + } +} \ No newline at end of file diff --git a/src/main/java/robots/gui/GameVisualizer.java b/src/main/java/robots/gui/GameVisualizer.java index eb2421b92..2d9967f9d 100644 --- a/src/main/java/robots/gui/GameVisualizer.java +++ b/src/main/java/robots/gui/GameVisualizer.java @@ -23,8 +23,8 @@ private static Timer initTimer() return timer; } - private volatile double m_robotPositionX = 100; - private volatile double m_robotPositionY = 100; + public volatile double m_robotPositionX = 100; + public volatile double m_robotPositionY = 100; private volatile double m_robotDirection = 0; private volatile int m_targetPositionX = 150; @@ -63,7 +63,7 @@ public void mouseClicked(MouseEvent e) setDoubleBuffered(true); } - protected void setTargetPosition(Point p) + public void setTargetPosition(Point p) { m_targetPositionX = p.x; m_targetPositionY = p.y; diff --git a/src/main/java/robots/gui/GameWindow.java b/src/main/java/robots/gui/GameWindow.java index a04d78a7b..fb7b3de92 100644 --- a/src/main/java/robots/gui/GameWindow.java +++ b/src/main/java/robots/gui/GameWindow.java @@ -2,10 +2,9 @@ import java.awt.BorderLayout; -import javax.swing.JInternalFrame; import javax.swing.JPanel; -public class GameWindow extends JInternalFrame +public class GameWindow extends AbstractWindow { private final GameVisualizer m_visualizer; public GameWindow() @@ -17,4 +16,8 @@ public GameWindow() getContentPane().add(panel); pack(); } + + @Override + protected void closeWindow() { + } } diff --git a/src/main/java/robots/gui/LogWindow.java b/src/main/java/robots/gui/LogWindow.java index 8ede316b5..5fe960a25 100644 --- a/src/main/java/robots/gui/LogWindow.java +++ b/src/main/java/robots/gui/LogWindow.java @@ -11,7 +11,7 @@ import robots.log.LogEntry; import robots.log.LogWindowSource; -public class LogWindow extends JInternalFrame implements LogChangeListener +public class LogWindow extends AbstractWindow implements LogChangeListener { private LogWindowSource m_logSource; private TextArea m_logContent; @@ -43,9 +43,8 @@ private void updateLogContent() } @Override - public void doDefaultCloseAction() { + protected void closeWindow() { m_logSource.unregisterListener(this); - super.doDefaultCloseAction(); } @Override diff --git a/src/main/java/robots/gui/MainApplicationFrame.java b/src/main/java/robots/gui/MainApplicationFrame.java index 36f7e9ef5..79b83999d 100644 --- a/src/main/java/robots/gui/MainApplicationFrame.java +++ b/src/main/java/robots/gui/MainApplicationFrame.java @@ -3,6 +3,8 @@ import java.awt.Dimension; import java.awt.Toolkit; import java.awt.event.KeyEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; import javax.swing.JDesktopPane; import javax.swing.JFrame; @@ -13,6 +15,7 @@ import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; +import javax.swing.*; import robots.log.Logger; @@ -34,12 +37,30 @@ public MainApplicationFrame() { LogWindow logWindow = createLogWindow(); addWindow(logWindow); - GameWindow gameWindow = new GameWindow(); - gameWindow.setSize(400, 400); + GameWindow gameWindow = createGameWindow(); addWindow(gameWindow); setJMenuBar(generateMenuBar()); - setDefaultCloseOperation(EXIT_ON_CLOSE); + + + setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); + addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent e) { + int result = JOptionPane.showConfirmDialog(MainApplicationFrame.this, + "Вы уверены, что хотите выйти?", + "Подтверждение", JOptionPane.YES_NO_OPTION); + if (result == JOptionPane.YES_OPTION) { + System.exit(0); + } + } + }); + } + + protected GameWindow createGameWindow() + { + GameWindow gameWindow = new GameWindow(); + gameWindow.setSize(400, 400); + return gameWindow; } protected LogWindow createLogWindow() @@ -47,7 +68,6 @@ protected LogWindow createLogWindow() LogWindow logWindow = new LogWindow(Logger.getDefaultLogSource()); logWindow.setLocation(10,10); logWindow.setSize(300, 800); - setMinimumSize(logWindow.getSize()); logWindow.pack(); Logger.debug("Протокол работает"); return logWindow; @@ -108,14 +128,34 @@ private JMenuItem createTestMenuItem(String name, String logMessage) { return menuItem; } + private JMenuItem createExitMenuItem() { + JMenuItem exitMenuItem = new JMenuItem("Выход"); + exitMenuItem.setMnemonic(KeyEvent.VK_T); + exitMenuItem.addActionListener((event) -> { + int result = JOptionPane.showConfirmDialog(null, + "Вы уверены, что хотите выйти?", "Подтверждение", + JOptionPane.YES_NO_OPTION); + if (result == JOptionPane.YES_OPTION) { + System.exit(0); + } + }); + + exitMenuItem.setPreferredSize(new Dimension(62, 20)); + exitMenuItem.setMaximumSize(new Dimension(62, 20)); + + return exitMenuItem; + } + private JMenuBar generateMenuBar() { JMenuBar menuBar = new JMenuBar(); JMenu lookAndFeelMenu = createLookAndFeelMenu(); JMenu testMenu = createTestMenu(); + JMenuItem exitMenuItem = createExitMenuItem(); menuBar.add(lookAndFeelMenu); menuBar.add(testMenu); + menuBar.add(exitMenuItem); return menuBar; } From 15ed99fcfc794cf06021e8835b403a99a99f60cf Mon Sep 17 00:00:00 2001 From: karina Date: Mon, 14 Apr 2025 19:49:43 +0500 Subject: [PATCH 08/10] new test for task 1 --- src/main/java/robots/gui/GameVisualizer.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/robots/gui/GameVisualizer.java b/src/main/java/robots/gui/GameVisualizer.java index 2d9967f9d..dc2662740 100644 --- a/src/main/java/robots/gui/GameVisualizer.java +++ b/src/main/java/robots/gui/GameVisualizer.java @@ -25,10 +25,10 @@ private static Timer initTimer() public volatile double m_robotPositionX = 100; public volatile double m_robotPositionY = 100; - private volatile double m_robotDirection = 0; + volatile double m_robotDirection = 0; - private volatile int m_targetPositionX = 150; - private volatile int m_targetPositionY = 100; + volatile int m_targetPositionX = 150; + volatile int m_targetPositionY = 100; private static final double maxVelocity = 0.1; private static final double maxAngularVelocity = 0.001; @@ -129,7 +129,7 @@ private static double applyLimits(double value, double min, double max) return value; } - private void moveRobot(double velocity, double angularVelocity, double duration) + void moveRobot(double velocity, double angularVelocity, double duration) { m_robotDirection = asNormalizedRadians(m_robotDirection + angularVelocity * duration); velocity = applyLimits(velocity, 0, maxVelocity); From 0f3eacc759a634e75e40e599a073501cb90c19aa Mon Sep 17 00:00:00 2001 From: karina Date: Mon, 14 Apr 2025 19:50:45 +0500 Subject: [PATCH 09/10] debug test for task 1 --- .../java/robots/log/LogWindowSourceTest.java | 28 ------------------- 1 file changed, 28 deletions(-) diff --git a/src/test/java/robots/log/LogWindowSourceTest.java b/src/test/java/robots/log/LogWindowSourceTest.java index eb0b7323e..6d80b5a57 100644 --- a/src/test/java/robots/log/LogWindowSourceTest.java +++ b/src/test/java/robots/log/LogWindowSourceTest.java @@ -72,32 +72,4 @@ public void onLogChanged() { logWindowSource.append(LogLevel.Info, "message"); assertEquals(5, logWindowSource.size()); } - - @Nested - class GameVisualizerTest { - - private GameVisualizer gameVisualizer; - - @BeforeEach - void setUp() { - gameVisualizer = new GameVisualizer(); - gameVisualizer.setSize(300, 300); - gameVisualizer.setVisible(true); - } - - @Test - void testRobotDoesNotMoveOutsideBounds() { - gameVisualizer.setTargetPosition(new Point(400, 400)); - - gameVisualizer.onModelUpdateEvent(); - - double robotX = gameVisualizer.m_robotPositionX; - double robotY = gameVisualizer.m_robotPositionY; - - assertTrue(robotX >= 0 && robotX <= gameVisualizer.getWidth() - 1); - assertTrue(robotY >= 0 && robotY <= gameVisualizer.getHeight() - 1); - } - } - - } \ No newline at end of file From 3747ebd0402c0336670abdcb25f21363d7b6af03 Mon Sep 17 00:00:00 2001 From: karina Date: Mon, 14 Apr 2025 20:31:52 +0500 Subject: [PATCH 10/10] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BC=D1=83=D1=81=D0=BE=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/robots/gui/LogWindow.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/robots/gui/LogWindow.java b/src/main/java/robots/gui/LogWindow.java index 5fe960a25..c4175d4dc 100644 --- a/src/main/java/robots/gui/LogWindow.java +++ b/src/main/java/robots/gui/LogWindow.java @@ -4,7 +4,6 @@ import java.awt.EventQueue; import java.awt.TextArea; -import javax.swing.JInternalFrame; import javax.swing.JPanel; import robots.log.LogChangeListener;