From cae3f0b2cf0de9204781aae39cdcc5cb7d7cb4b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Ha=C3=9Fel?= Date: Mon, 27 Feb 2023 09:33:42 +0100 Subject: [PATCH] MyComponent out of Destructible to handle Component-Events too --- .../de/ph87/kindermalen/Destructible.java | 40 ------ .../java/de/ph87/kindermalen/MyComponent.java | 102 +++++++++++++++ .../java/de/ph87/kindermalen/Sidebar.java | 14 +- .../de/ph87/kindermalen/drawing/Drawing.java | 8 +- .../kindermalen/drawing/DrawingPanel.java | 121 +++++++++--------- .../de/ph87/kindermalen/tools/ToolButton.java | 14 +- .../kindermalen/tools/tool/ToolPanel.java | 4 +- .../tools/tool/stamp/StampButton.java | 17 ++- .../tools/tool/stamp/StampButtonList.java | 4 +- .../tools/tool/stamp/StampOptions.java | 4 +- .../ph87/kindermalen/util/MouseListener.java | 109 ---------------- 11 files changed, 198 insertions(+), 239 deletions(-) delete mode 100644 src/main/java/de/ph87/kindermalen/Destructible.java create mode 100644 src/main/java/de/ph87/kindermalen/MyComponent.java delete mode 100644 src/main/java/de/ph87/kindermalen/util/MouseListener.java diff --git a/src/main/java/de/ph87/kindermalen/Destructible.java b/src/main/java/de/ph87/kindermalen/Destructible.java deleted file mode 100644 index adc3dc9..0000000 --- a/src/main/java/de/ph87/kindermalen/Destructible.java +++ /dev/null @@ -1,40 +0,0 @@ -package de.ph87.kindermalen; - -import de.ph87.kindermalen.util.Publisher; -import de.ph87.kindermalen.util.Subscription; - -import javax.swing.*; -import java.awt.*; -import java.util.ArrayList; -import java.util.List; -import java.util.function.Consumer; - -public abstract class Destructible extends JPanel { - - private final List> subscriptions = new ArrayList<>(); - - public void destruct() { - subscriptions.forEach(this::unsubscribe); - synchronized (getTreeLock()) { - for (final Component component : getComponents()) { - if (component instanceof Destructible) { - ((Destructible) component).destruct(); - } - } - } - } - - protected Subscription subscribe(final Publisher publisher, final Consumer next) { - final Subscription subscription = publisher.subscribe(next); - subscriptions.add(subscription); - return subscription; - } - - protected void unsubscribe(final Subscription subscription) { - if (!subscriptions.remove(subscription)) { - throw new RuntimeException(); - } - subscription.unsubscribe(); - } - -} diff --git a/src/main/java/de/ph87/kindermalen/MyComponent.java b/src/main/java/de/ph87/kindermalen/MyComponent.java new file mode 100644 index 0000000..82bb973 --- /dev/null +++ b/src/main/java/de/ph87/kindermalen/MyComponent.java @@ -0,0 +1,102 @@ +package de.ph87.kindermalen; + +import de.ph87.kindermalen.util.Publisher; +import de.ph87.kindermalen.util.Subscription; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.*; +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; + +public abstract class MyComponent extends JPanel implements ComponentListener, MouseListener, MouseMotionListener { + + private final List> subscriptions = new ArrayList<>(); + + public MyComponent() { + addComponentListener(this); + addMouseListener(this); + addMouseMotionListener(this); + } + + public void destruct() { + subscriptions.forEach(this::unsubscribe); + synchronized (getTreeLock()) { + for (final Component component : getComponents()) { + if (component instanceof MyComponent) { + ((MyComponent) component).destruct(); + } + } + } + } + + protected Subscription subscribe(final Publisher publisher, final Consumer next) { + final Subscription subscription = publisher.subscribe(next); + subscriptions.add(subscription); + return subscription; + } + + protected void unsubscribe(final Subscription subscription) { + if (!subscriptions.remove(subscription)) { + throw new RuntimeException(); + } + subscription.unsubscribe(); + } + + @Override + public void componentResized(final ComponentEvent e) { + // nothing + } + + @Override + public void componentMoved(final ComponentEvent e) { + // nothing + } + + @Override + public void componentShown(final ComponentEvent e) { + // nothing + } + + @Override + public void componentHidden(final ComponentEvent e) { + // nothing + } + + @Override + public void mouseClicked(final MouseEvent mouseEvent) { + // nothing + } + + @Override + public void mousePressed(final MouseEvent mouseEvent) { + // nothing + } + + @Override + public void mouseReleased(final MouseEvent mouseEvent) { + // nothing + } + + @Override + public void mouseEntered(final MouseEvent mouseEvent) { + // nothing + } + + @Override + public void mouseExited(final MouseEvent mouseEvent) { + // nothing + } + + @Override + public void mouseDragged(final MouseEvent mouseEvent) { + // nothing + } + + @Override + public void mouseMoved(final MouseEvent mouseEvent) { + // nothing + } + +} diff --git a/src/main/java/de/ph87/kindermalen/Sidebar.java b/src/main/java/de/ph87/kindermalen/Sidebar.java index e995442..637f556 100644 --- a/src/main/java/de/ph87/kindermalen/Sidebar.java +++ b/src/main/java/de/ph87/kindermalen/Sidebar.java @@ -5,24 +5,27 @@ import de.ph87.kindermalen.tools.tool.Tool; import de.ph87.kindermalen.tools.tool.ToolPanel; import de.ph87.kindermalen.tools.tool.stamp.StampPanel; import de.ph87.kindermalen.tools.tool.stamp.StampTool; -import de.ph87.kindermalen.util.MouseListener; import javax.swing.*; import java.awt.*; +import java.awt.event.MouseEvent; import static de.ph87.kindermalen.CONFIG.BORDERS; import static de.ph87.kindermalen.util.MyGridBagConstraints.C; -public class Sidebar extends Destructible { +public class Sidebar extends MyComponent { + + private final Environment environment; private ToolPanel toolPanel = null; public Sidebar(final Environment environment) { + this.environment = environment; + setPreferredSize(new Dimension(300, 0)); setLayout(new GridBagLayout()); final JButton newDrawing = new JButton("Neues Bild"); - MouseListener.onPress(newDrawing, e -> environment.newDrawing()); add(newDrawing, C(0, 0, 1, 0)); final ToolsPanel toolsPanel = new ToolsPanel(environment.getTools()); @@ -31,6 +34,11 @@ public class Sidebar extends Destructible { subscribe(environment.getTools().getOnSelect(), this::onToolSelected); } + @Override + public void mousePressed(final MouseEvent mouseEvent) { + environment.newDrawing(); + } + @Override public void paint(final Graphics g) { super.paint(g); diff --git a/src/main/java/de/ph87/kindermalen/drawing/Drawing.java b/src/main/java/de/ph87/kindermalen/drawing/Drawing.java index 320cc39..ee4ded0 100644 --- a/src/main/java/de/ph87/kindermalen/drawing/Drawing.java +++ b/src/main/java/de/ph87/kindermalen/drawing/Drawing.java @@ -1,6 +1,5 @@ package de.ph87.kindermalen.drawing; -import lombok.Getter; import lombok.ToString; import lombok.extern.slf4j.Slf4j; @@ -13,15 +12,14 @@ import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; @Slf4j -@Getter @ToString public class Drawing { - private final int width; + public final int width; - private final int height; + public final int height; - private final ZonedDateTime created = ZonedDateTime.now(); + public final ZonedDateTime created = ZonedDateTime.now(); @ToString.Exclude private final Layer current; diff --git a/src/main/java/de/ph87/kindermalen/drawing/DrawingPanel.java b/src/main/java/de/ph87/kindermalen/drawing/DrawingPanel.java index e57b55c..e208f26 100644 --- a/src/main/java/de/ph87/kindermalen/drawing/DrawingPanel.java +++ b/src/main/java/de/ph87/kindermalen/drawing/DrawingPanel.java @@ -1,16 +1,14 @@ package de.ph87.kindermalen.drawing; -import de.ph87.kindermalen.Destructible; import de.ph87.kindermalen.Environment; +import de.ph87.kindermalen.MyComponent; import de.ph87.kindermalen.tools.tool.Tool; -import de.ph87.kindermalen.util.MouseListener; import de.ph87.kindermalen.util.Subscription; import de.ph87.kindermalen.util.Vector; import lombok.extern.slf4j.Slf4j; import java.awt.*; import java.awt.event.ComponentEvent; -import java.awt.event.ComponentListener; import java.awt.event.MouseEvent; import java.awt.geom.AffineTransform; import java.awt.geom.NoninvertibleTransformException; @@ -20,7 +18,7 @@ import java.io.File; import java.io.IOException; @Slf4j -public class DrawingPanel extends Destructible { +public class DrawingPanel extends MyComponent { private static final File SAVE_DIR = new File("./data/images"); @@ -38,32 +36,8 @@ public class DrawingPanel extends Destructible { public DrawingPanel(final Environment environment) { this.environment = environment; - MouseListener.onPress(this, this::onPress); - MouseListener.onRelease(this, this::onRelease); - MouseListener.onMove(this, this::onMove); - MouseListener.onDrag(this, this::onDrag); subscribe(environment.getTools().getOnSelect(), this::onToolSelect); subscribe(environment.getOnNewDrawing(), drawing -> repaint()); - - addComponentListener(new ComponentListener() { - @Override - public void componentResized(final ComponentEvent e) { - calculateTransform(); - } - - @Override - public void componentMoved(final ComponentEvent e) { - calculateTransform(); - } - - @Override - public void componentShown(final ComponentEvent e) { - } - - @Override - public void componentHidden(final ComponentEvent e) { - } - }); } private void onToolSelect(final Tool tool) { @@ -74,10 +48,58 @@ public class DrawingPanel extends Destructible { toolChangeSubscription = subscribe(tool.getOnChange(), ignore -> repaint()); } + @Override + public void componentResized(final ComponentEvent e) { + calculateTransform(); + } + + @Override + public void componentMoved(final ComponentEvent e) { + calculateTransform(); + } + + @Override + public void componentShown(final ComponentEvent e) { + calculateTransform(); + } + + @Override + public void mousePressed(final MouseEvent mouseEvent) { + if (mouseEvent.getButton() == 3) { + environment.getDrawing().undo(); + return; + } + environment.getDrawing().newRevision(); + lastPoint = environment.getTools().getTool().apply(null, environment.getDrawing(), transform(mouseEvent.getPoint())); + repaint(); + } + + @Override + public void mouseReleased(final MouseEvent mouseEvent) { + try { + environment.getDrawing().save(SAVE_DIR); + } catch (IOException ex) { + log.error(ex.toString()); + } + } + + @Override + public void mouseDragged(final MouseEvent mouseEvent) { + cursor = transform(mouseEvent.getPoint()); + lastPoint = environment.getTools().getTool().apply(lastPoint, environment.getDrawing(), transform(mouseEvent.getPoint())); + repaint(); + } + + @Override + public void mouseMoved(final MouseEvent mouseEvent) { + cursor = transform(mouseEvent.getPoint()); + repaint(); + } + private void calculateTransform() { - final Image image = environment.getDrawing().getImage(); - final Rectangle box = fitInside(image.getWidth(null), image.getHeight(null), getWidth(), getHeight(), false); - final double scale = (double) box.width / image.getWidth(null); + final Drawing drawing = environment.getDrawing(); + final Rectangle box = fitInside(drawing.width, drawing.height, getWidth(), getHeight(), false); + final double scale = (double) box.width / drawing.width; transform = new AffineTransform(); transform.translate(box.x, box.y); transform.scale(scale, scale); @@ -88,40 +110,11 @@ public class DrawingPanel extends Destructible { } } - private void onMove(final MouseEvent mouseEvent) { - cursor = transform(mouseEvent.getPoint()); - repaint(); - } - - private void onPress(final MouseEvent mouseEvent) { - if (mouseEvent.getButton() == 3) { - environment.getDrawing().undo(); - return; - } - environment.getDrawing().newRevision(); - lastPoint = environment.getTools().getTool().apply(null, environment.getDrawing(), transform(mouseEvent.getPoint())); - repaint(); - } - - private void onDrag(final MouseEvent mouseEvent) { - cursor = transform(mouseEvent.getPoint()); - lastPoint = environment.getTools().getTool().apply(lastPoint, environment.getDrawing(), transform(mouseEvent.getPoint())); - repaint(); - } - private Vector transform(final Point point) { final Point2D transformed = inverseTransform.transform(new Point2D.Double(point.x, point.y), null); return new Vector(transformed); } - private void onRelease(final MouseEvent mouseEvent) { - try { - environment.getDrawing().save(SAVE_DIR); - } catch (IOException ex) { - log.error(ex.toString()); - } - } - @Override public void paint(final Graphics graphics) { final Graphics2D g = (Graphics2D) graphics; @@ -129,15 +122,15 @@ public class DrawingPanel extends Destructible { g.fillRect(0, 0, getWidth(), getHeight()); g.setTransform(transform); - if (environment == null) { + if (environment == null || environment.getDrawing() == null) { return; } - final Image image = environment.getDrawing().getImage(); + final Drawing drawing = environment.getDrawing(); g.setColor(Color.white); - g.fillRect(0, 0, image.getWidth(null), image.getHeight(null)); - g.drawImage(image, 0, 0, image.getWidth(null), image.getHeight(null), null); + g.fillRect(0, 0, drawing.width, drawing.height); + g.drawImage(drawing.getImage(), 0, 0, drawing.width, drawing.height, null); final BufferedImage preview = environment.getTools().getTool().getPreview(); if (cursor != null && preview != null) { diff --git a/src/main/java/de/ph87/kindermalen/tools/ToolButton.java b/src/main/java/de/ph87/kindermalen/tools/ToolButton.java index be3896f..3cd0f47 100644 --- a/src/main/java/de/ph87/kindermalen/tools/ToolButton.java +++ b/src/main/java/de/ph87/kindermalen/tools/ToolButton.java @@ -1,20 +1,28 @@ package de.ph87.kindermalen.tools; +import de.ph87.kindermalen.MyComponent; import de.ph87.kindermalen.tools.tool.Tool; -import de.ph87.kindermalen.util.MouseListener; import java.awt.*; +import java.awt.event.MouseEvent; import static de.ph87.kindermalen.CONFIG.STAMP_BUTTON_SIZE; -public class ToolButton extends Component { +public class ToolButton extends MyComponent { + + private final Tools tools; private final Tool tool; public ToolButton(final Tools tools, final Tool tool) { + this.tools = tools; this.tool = tool; setPreferredSize(new Dimension(STAMP_BUTTON_SIZE, STAMP_BUTTON_SIZE)); - MouseListener.onRelease(this, e -> tools.setTool(tool)); + } + + @Override + public void mouseReleased(final MouseEvent mouseEvent) { + tools.setTool(tool); } @Override diff --git a/src/main/java/de/ph87/kindermalen/tools/tool/ToolPanel.java b/src/main/java/de/ph87/kindermalen/tools/tool/ToolPanel.java index 98d12a0..7ea4bcb 100644 --- a/src/main/java/de/ph87/kindermalen/tools/tool/ToolPanel.java +++ b/src/main/java/de/ph87/kindermalen/tools/tool/ToolPanel.java @@ -1,9 +1,9 @@ package de.ph87.kindermalen.tools.tool; -import de.ph87.kindermalen.Destructible; +import de.ph87.kindermalen.MyComponent; import lombok.extern.slf4j.Slf4j; @Slf4j -public abstract class ToolPanel extends Destructible { +public abstract class ToolPanel extends MyComponent { } diff --git a/src/main/java/de/ph87/kindermalen/tools/tool/stamp/StampButton.java b/src/main/java/de/ph87/kindermalen/tools/tool/stamp/StampButton.java index e0cd15a..8f269da 100644 --- a/src/main/java/de/ph87/kindermalen/tools/tool/stamp/StampButton.java +++ b/src/main/java/de/ph87/kindermalen/tools/tool/stamp/StampButton.java @@ -1,16 +1,15 @@ package de.ph87.kindermalen.tools.tool.stamp; -import de.ph87.kindermalen.util.MouseListener; +import de.ph87.kindermalen.MyComponent; import lombok.Getter; -import javax.swing.*; import java.awt.*; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import static de.ph87.kindermalen.CONFIG.*; -public class StampButton extends JPanel { +public class StampButton extends MyComponent { private final StampTool tool; @@ -27,24 +26,24 @@ public class StampButton extends JPanel { this.tool = tool; this.image = image; setPreferredSize(new Dimension(STAMP_BUTTON_SIZE, STAMP_BUTTON_SIZE)); - MouseListener.onRelease(this, this::onRelease); - MouseListener.onEnter(this, this::onEnter); - MouseListener.onExit(this, this::onExit); icon = image.getSize(STAMP_BUTTON_ICON_REAL_SIZE); position = new Point((STAMP_BUTTON_SIZE - icon.getWidth()) / 2, (STAMP_BUTTON_SIZE - icon.getHeight()) / 2); } - private void onRelease(final MouseEvent mouseEvent) { + @Override + public void mouseReleased(final MouseEvent mouseEvent) { this.tool.setImage(image); this.tool.prepare(); } - private void onEnter(final MouseEvent mouseEvent) { + @Override + public void mouseEntered(final MouseEvent mouseEvent) { hover = true; repaint(); } - private void onExit(final MouseEvent mouseEvent) { + @Override + public void mouseExited(final MouseEvent mouseEvent) { hover = false; repaint(); } diff --git a/src/main/java/de/ph87/kindermalen/tools/tool/stamp/StampButtonList.java b/src/main/java/de/ph87/kindermalen/tools/tool/stamp/StampButtonList.java index 4216aee..c178406 100644 --- a/src/main/java/de/ph87/kindermalen/tools/tool/stamp/StampButtonList.java +++ b/src/main/java/de/ph87/kindermalen/tools/tool/stamp/StampButtonList.java @@ -1,6 +1,6 @@ package de.ph87.kindermalen.tools.tool.stamp; -import de.ph87.kindermalen.Destructible; +import de.ph87.kindermalen.MyComponent; import lombok.extern.slf4j.Slf4j; import java.awt.*; @@ -8,7 +8,7 @@ import java.util.Comparator; import java.util.List; @Slf4j -public class StampButtonList extends Destructible { +public class StampButtonList extends MyComponent { public StampButtonList(final StampTool stampTool) { final FlowLayout flowLayout = new FlowLayout(FlowLayout.LEADING, 0, 0); diff --git a/src/main/java/de/ph87/kindermalen/tools/tool/stamp/StampOptions.java b/src/main/java/de/ph87/kindermalen/tools/tool/stamp/StampOptions.java index 866e513..37c3724 100644 --- a/src/main/java/de/ph87/kindermalen/tools/tool/stamp/StampOptions.java +++ b/src/main/java/de/ph87/kindermalen/tools/tool/stamp/StampOptions.java @@ -1,13 +1,13 @@ package de.ph87.kindermalen.tools.tool.stamp; -import de.ph87.kindermalen.Destructible; +import de.ph87.kindermalen.MyComponent; import javax.swing.*; import java.awt.*; import static de.ph87.kindermalen.CONFIG.BORDERS; -public class StampOptions extends Destructible { +public class StampOptions extends MyComponent { private final JSlider sizeSlider = new JSlider(10, 1000, 100); diff --git a/src/main/java/de/ph87/kindermalen/util/MouseListener.java b/src/main/java/de/ph87/kindermalen/util/MouseListener.java deleted file mode 100644 index 3e6f180..0000000 --- a/src/main/java/de/ph87/kindermalen/util/MouseListener.java +++ /dev/null @@ -1,109 +0,0 @@ -package de.ph87.kindermalen.util; - -import java.awt.*; -import java.awt.event.MouseEvent; -import java.awt.event.MouseMotionListener; -import java.util.function.Consumer; - -public class MouseListener { - - public static void onPress(final Component component, final Consumer onPress) { - component.addMouseListener(new MouseListenerImpl() { - @Override - public void mousePressed(final MouseEvent mouseEvent) { - onPress.accept(mouseEvent); - } - }); - } - - public static void onRelease(final Component component, final Consumer release) { - component.addMouseListener(new MouseListenerImpl() { - @Override - public void mouseReleased(final MouseEvent mouseEvent) { - if (release != null) { - release.accept(mouseEvent); - } - } - }); - } - - public static void onMove(final Component component, final Consumer onMove) { - component.addMouseMotionListener(new MouseMotionListenerImpl() { - @Override - public void mouseMoved(final MouseEvent mouseEvent) { - onMove.accept(mouseEvent); - } - }); - } - - public static void onDrag(final Component component, final Consumer onDrag) { - component.addMouseMotionListener(new MouseMotionListenerImpl() { - @Override - public void mouseDragged(final MouseEvent mouseEvent) { - onDrag.accept(mouseEvent); - } - }); - } - - public static void onEnter(final Component component, final Consumer onEnter) { - component.addMouseListener(new MouseListenerImpl() { - @Override - public void mouseEntered(final MouseEvent mouseEvent) { - onEnter.accept(mouseEvent); - } - }); - } - - public static void onExit(final Component component, final Consumer onExit) { - component.addMouseListener(new MouseListenerImpl() { - @Override - public void mouseExited(final MouseEvent mouseEvent) { - onExit.accept(mouseEvent); - } - }); - } - - private static class MouseListenerImpl implements java.awt.event.MouseListener { - - @Override - public void mouseClicked(final MouseEvent mouseEvent) { - - } - - @Override - public void mousePressed(final MouseEvent mouseEvent) { - - } - - @Override - public void mouseReleased(final MouseEvent mouseEvent) { - - } - - @Override - public void mouseEntered(final MouseEvent mouseEvent) { - - } - - @Override - public void mouseExited(final MouseEvent mouseEvent) { - - } - - } - - private static class MouseMotionListenerImpl implements MouseMotionListener { - - @Override - public void mouseDragged(final MouseEvent mouseEvent) { - - } - - @Override - public void mouseMoved(final MouseEvent mouseEvent) { - - } - - } - -}