From 3935381e310f7ff2a124b5117473b7c3db228396 Mon Sep 17 00:00:00 2001 From: rozenkranzz Date: Sat, 15 Feb 2025 17:46:26 +0400 Subject: [PATCH] completed --- .../AdditionalElementsTransferHandler.java | 22 ++++ .../AdditionalElementsTransferable.java | 31 +++++ .../Drawings/DrawingBaseLiner.java | 7 +- .../projectliner/Drawings/DrawingLiner.java | 4 +- .../Entities/BaseLinerEntity.java | 8 ++ .../projectliner/Entities/LinerEntity.java | 20 ++++ .../src/projectliner/FormLinerConfig.java | 113 ++++++++++++++++-- 7 files changed, 195 insertions(+), 10 deletions(-) create mode 100644 Liner_Advanced/src/projectliner/Drawings/AdditionalElementsTransferHandler.java create mode 100644 Liner_Advanced/src/projectliner/Drawings/AdditionalElementsTransferable.java diff --git a/Liner_Advanced/src/projectliner/Drawings/AdditionalElementsTransferHandler.java b/Liner_Advanced/src/projectliner/Drawings/AdditionalElementsTransferHandler.java new file mode 100644 index 0000000..aa972d0 --- /dev/null +++ b/Liner_Advanced/src/projectliner/Drawings/AdditionalElementsTransferHandler.java @@ -0,0 +1,22 @@ +package projectliner.Drawings; + +import javax.swing.*; +import java.awt.datatransfer.*; + +public class AdditionalElementsTransferHandler extends TransferHandler { + private final IAdditionalElements additionalElements; + + public AdditionalElementsTransferHandler(IAdditionalElements additionalElements) { + this.additionalElements = additionalElements; + } + + @Override + protected Transferable createTransferable(JComponent c) { + return new AdditionalElementsTransferable(additionalElements); + } + + @Override + public int getSourceActions(JComponent c) { + return COPY; + } +} diff --git a/Liner_Advanced/src/projectliner/Drawings/AdditionalElementsTransferable.java b/Liner_Advanced/src/projectliner/Drawings/AdditionalElementsTransferable.java new file mode 100644 index 0000000..db02dfc --- /dev/null +++ b/Liner_Advanced/src/projectliner/Drawings/AdditionalElementsTransferable.java @@ -0,0 +1,31 @@ +package projectliner.Drawings; + +import java.awt.datatransfer.*; +import java.io.IOException; + +public class AdditionalElementsTransferable implements Transferable { + public static final DataFlavor additionalElementsFlavor = new DataFlavor(IAdditionalElements.class, "IAdditionalElements"); + private final IAdditionalElements additionalElements; + + public AdditionalElementsTransferable(IAdditionalElements additionalElements) { + this.additionalElements = additionalElements; + } + + @Override + public DataFlavor[] getTransferDataFlavors() { + return new DataFlavor[]{additionalElementsFlavor}; + } + + @Override + public boolean isDataFlavorSupported(DataFlavor flavor) { + return flavor.equals(additionalElementsFlavor); + } + + @Override + public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException { + if (!isDataFlavorSupported(flavor)) { + throw new UnsupportedFlavorException(flavor); + } + return additionalElements; + } +} diff --git a/Liner_Advanced/src/projectliner/Drawings/DrawingBaseLiner.java b/Liner_Advanced/src/projectliner/Drawings/DrawingBaseLiner.java index dd66b39..f8c6501 100644 --- a/Liner_Advanced/src/projectliner/Drawings/DrawingBaseLiner.java +++ b/Liner_Advanced/src/projectliner/Drawings/DrawingBaseLiner.java @@ -14,7 +14,7 @@ public class DrawingBaseLiner { protected Integer startPosY; private int drawingLinerWidth; private int drawingLinerHeight; - private IAdditionalElements deck; + protected IAdditionalElements deck; private DrawingBaseLiner() { this.drawingLinerWidth = 140; @@ -103,6 +103,11 @@ public class DrawingBaseLiner { } } + public void setDeck(IAdditionalElements deck, int deckNum) { + this.deck = deck; + this.deck.setNumericalValue(deckNum); + } + public void drawTransport(Graphics g) { if (this.baseLiner != null && this.startPosX != null && this.startPosY != null) { int x = this.startPosX; diff --git a/Liner_Advanced/src/projectliner/Drawings/DrawingLiner.java b/Liner_Advanced/src/projectliner/Drawings/DrawingLiner.java index 83d5869..142e362 100644 --- a/Liner_Advanced/src/projectliner/Drawings/DrawingLiner.java +++ b/Liner_Advanced/src/projectliner/Drawings/DrawingLiner.java @@ -12,7 +12,6 @@ import projectliner.Entities.LinerEntityType; import javax.swing.*; public class DrawingLiner extends DrawingBaseLiner { - private IAdditionalElements deck; public DrawingLiner(int speed, double weight, Color primaryColor, Color secondaryColor, LinerEntityType type, int capacity, @@ -46,7 +45,10 @@ public class DrawingLiner extends DrawingBaseLiner { case "Square Deck" -> this.deck = new SquareDeckDrawing(); default -> throw new IllegalArgumentException("Invalid deck form: " + form); } + } + public void setDeckNum(int deckNum) { + this.deck.setNumericalValue(deckNum); } public void drawTransport(Graphics g) { diff --git a/Liner_Advanced/src/projectliner/Entities/BaseLinerEntity.java b/Liner_Advanced/src/projectliner/Entities/BaseLinerEntity.java index bdd1663..4e83b11 100644 --- a/Liner_Advanced/src/projectliner/Entities/BaseLinerEntity.java +++ b/Liner_Advanced/src/projectliner/Entities/BaseLinerEntity.java @@ -29,6 +29,14 @@ public class BaseLinerEntity { return (double)this.speed / (this.weight / (double)100.0F); } + public void setSpeed(int speed) { + this.speed = speed; + } + + public void setWeight(double weight) { + this.weight = weight; + } + public void setPrimaryColor(Color primaryColor) { this.primaryColor = primaryColor; } diff --git a/Liner_Advanced/src/projectliner/Entities/LinerEntity.java b/Liner_Advanced/src/projectliner/Entities/LinerEntity.java index e8a1bc7..84a1f47 100644 --- a/Liner_Advanced/src/projectliner/Entities/LinerEntity.java +++ b/Liner_Advanced/src/projectliner/Entities/LinerEntity.java @@ -51,7 +51,27 @@ public class LinerEntity extends BaseLinerEntity { return this.hasPool; } + public void setCapacity(int capacity) { + this.capacity = capacity; + } + + public void setMaxPassengers(int maxPassengers) { + this.maxPassengers = maxPassengers; + } + + public void setExtraDeck(boolean extraDeck) { + this.hasExtraDeck = extraDeck; + } + + public void setPool(boolean pool) { + this.hasPool = pool; + } + public void setSecondaryColor(Color secondaryColor) { this.secondaryColor = secondaryColor; } + + public void setType(LinerEntityType type) { + this.type = type; + } } diff --git a/Liner_Advanced/src/projectliner/FormLinerConfig.java b/Liner_Advanced/src/projectliner/FormLinerConfig.java index 9e26db7..46c5711 100644 --- a/Liner_Advanced/src/projectliner/FormLinerConfig.java +++ b/Liner_Advanced/src/projectliner/FormLinerConfig.java @@ -1,12 +1,8 @@ package projectliner; -import projectliner.Drawings.DrawingBaseLiner; -import projectliner.Drawings.ColorTransferable; -import projectliner.Drawings.DrawingLiner; -import projectliner.Drawings.LabelTransferHandler; +import projectliner.Drawings.*; import projectliner.Entities.LinerEntity; import projectliner.Entities.LinerEntityType; -import projectliner.Drawings.ILinerDelegate; import javax.swing.*; import javax.swing.border.EmptyBorder; @@ -20,6 +16,7 @@ import java.awt.image.BufferedImage; public class FormLinerConfig extends JFrame { private DrawingBaseLiner liner; private ILinerDelegate linerDelegate; + private IAdditionalElements deck; private ColorTransferable colorTransferable; private JButton buttonCancel; @@ -116,7 +113,7 @@ public class FormLinerConfig extends JFrame { } private void panelObjectDragEnter(DropTargetDragEvent e) { - if (e.isDataFlavorSupported(DataFlavor.stringFlavor)) { + if (e.isDataFlavorSupported(DataFlavor.stringFlavor) || e.isDataFlavorSupported(AdditionalElementsTransferable.additionalElementsFlavor)) { e.acceptDrag(DnDConstants.ACTION_COPY); } else { e.rejectDrag(); @@ -136,7 +133,7 @@ public class FormLinerConfig extends JFrame { liner = new DrawingLiner((int) numericUpDownSpeed.getValue(), ((Integer) numericUpDownWeight.getValue()).doubleValue(), Color.WHITE, Color.BLACK, LinerEntityType.values()[comboBoxLinerType.getSelectedIndex()], (int) numericUpDownCapacity.getValue(), (int) numericUpDownMaxPassengers.getValue(), - checkBoxExtraDeck.isSelected(), checkBoxPool.isSelected(), (int) numericUpDownDeckNum.getValue(), "Triangular Deck"); + checkBoxExtraDeck.isSelected(), checkBoxPool.isSelected(), (int) numericUpDownDeckNum.getValue(), "Square Deck"); break; } drawObject(); @@ -147,6 +144,23 @@ public class FormLinerConfig extends JFrame { } } + private void panelObjectDropAdditionalElements(DropTargetDropEvent e) { + try { + e.acceptDrop(DnDConstants.ACTION_COPY); + IAdditionalElements deck = (IAdditionalElements) e.getTransferable().getTransferData(AdditionalElementsTransferable.additionalElementsFlavor); + if (deck != null) { + liner.setDeck(deck, (int) numericUpDownDeckNum.getValue()); + drawObject(); + e.dropComplete(true); + } else { + e.dropComplete(false); + } + } catch (Exception ex) { + ex.printStackTrace(); + e.dropComplete(false); + } + } + private void panelMouseDown(JPanel panel) { Color color = panel.getBackground(); Transferable transferable = new ColorTransferable(color); @@ -327,6 +341,47 @@ public class FormLinerConfig extends JFrame { } }); + JLabel labelSquareDeck = new JLabel("Square Deck"); + labelSquareDeck.setHorizontalAlignment(SwingConstants.CENTER); + labelSquareDeck.setMaximumSize(new Dimension(200, 20)); + labelSquareDeck.setBorder(new LineBorder(Color.BLACK)); + labelSquareDeck.setTransferHandler(new AdditionalElementsTransferHandler(new SquareDeckDrawing())); + labelSquareDeck.addMouseListener(new MouseAdapter() { + public void mousePressed(MouseEvent e) { + labelObjectMouseDown(e); + } + }); + + JLabel labelCircularDeck = new JLabel("Circular Deck"); + labelCircularDeck.setHorizontalAlignment(SwingConstants.CENTER); + labelCircularDeck.setMaximumSize(new Dimension(200, 20)); + labelCircularDeck.setBorder(new LineBorder(Color.BLACK)); + labelCircularDeck.setTransferHandler(new AdditionalElementsTransferHandler(new CircularDeckDrawing())); + labelCircularDeck.addMouseListener(new MouseAdapter() { + public void mousePressed(MouseEvent e) { + labelObjectMouseDown(e); + } + }); + + JLabel labelTriangularDeck = new JLabel("Triangular Deck"); + labelTriangularDeck.setHorizontalAlignment(SwingConstants.CENTER); + labelTriangularDeck.setMaximumSize(new Dimension(200, 20)); + labelTriangularDeck.setBorder(new LineBorder(Color.BLACK)); + labelTriangularDeck.setTransferHandler(new AdditionalElementsTransferHandler(new TriangularDeckDrawing())); + labelTriangularDeck.addMouseListener(new MouseAdapter() { + public void mousePressed(MouseEvent e) { + labelObjectMouseDown(e); + } + }); + + JPanel additionalElements = new JPanel(); + additionalElements.setLayout(new BoxLayout(additionalElements, BoxLayout.X_AXIS)); + additionalElements.add(labelSquareDeck); + additionalElements.add(Box.createHorizontalStrut(10)); + additionalElements.add(labelCircularDeck); + additionalElements.add(Box.createHorizontalStrut(10)); + additionalElements.add(labelTriangularDeck); + JPanel objectEntities = new JPanel(); objectEntities.setLayout(new BoxLayout(objectEntities, BoxLayout.X_AXIS)); objectEntities.add(labelBasicObject); @@ -340,6 +395,8 @@ public class FormLinerConfig extends JFrame { middlePanel.add(panelColorsDown); middlePanel.add(Box.createVerticalStrut(10)); middlePanel.add(objectEntities); + middlePanel.add(Box.createVerticalStrut(10)); + middlePanel.add(additionalElements); add(middlePanel, BorderLayout.CENTER); @@ -397,7 +454,18 @@ public class FormLinerConfig extends JFrame { } public void drop(DropTargetDropEvent e) { - panelObjectDragDrop(e); + try { + if (e.isDataFlavorSupported(DataFlavor.stringFlavor)) { + panelObjectDragDrop(e); + } else if (e.isDataFlavorSupported(AdditionalElementsTransferable.additionalElementsFlavor)) { + panelObjectDropAdditionalElements(e); + } else { + e.rejectDrop(); + } + } catch (Exception ex) { + ex.printStackTrace(); + e.dropComplete(false); + } } }); @@ -429,9 +497,38 @@ public class FormLinerConfig extends JFrame { } }); + numericUpDownSpeed.addChangeListener(e -> updateLinerParameters()); + numericUpDownWeight.addChangeListener(e -> updateLinerParameters()); + numericUpDownCapacity.addChangeListener(e -> updateLinerParameters()); + numericUpDownMaxPassengers.addChangeListener(e -> updateLinerParameters()); + numericUpDownDeckNum.addChangeListener(e -> updateLinerParameters()); + + comboBoxLinerType.addItemListener(e -> updateLinerParameters()); + + checkBoxExtraDeck.addItemListener(e -> updateLinerParameters()); + checkBoxPool.addItemListener(e -> updateLinerParameters()); + add(panelObject, BorderLayout.EAST); } + private void updateLinerParameters() { + if (liner != null) { + liner.baseLiner.setSpeed((int) numericUpDownSpeed.getValue()); + liner.baseLiner.setWeight(((Integer) numericUpDownWeight.getValue()).doubleValue()); + if (liner instanceof DrawingLiner drawingLiner) { + if (drawingLiner.getBaseLiner() instanceof LinerEntity linerEntity) { + linerEntity.setType(LinerEntityType.values()[comboBoxLinerType.getSelectedIndex()]); + linerEntity.setCapacity((int) numericUpDownCapacity.getValue()); + linerEntity.setMaxPassengers((int) numericUpDownMaxPassengers.getValue()); + linerEntity.setExtraDeck(checkBoxExtraDeck.isSelected()); + linerEntity.setPool(checkBoxPool.isSelected()); + } + drawingLiner.setDeckNum((int) numericUpDownDeckNum.getValue()); + } + drawObject(); + } + } + private JPanel createColorPanel(Color color) { JPanel panel = new JPanel(); panel.setBackground(color);