PIbd-23_Panina_A.D.Cruiser..../FormCruiserConfig.java
2023-12-29 17:26:50 +04:00

383 lines
17 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import javax.swing.*;
import javax.swing.border.Border;
import java.awt.*;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.IOException;
public class FormCruiserConfig extends JDialog {
public DrawingCruiser drawingCruiser;
JPanel cruiserPanel = new JPanel();
protected DrawingCruiser SelectedCruiser;
protected static JLabel colorLabel = new JLabel("Цвет", 0);
protected JLabel colorAddLabel = new JLabel("Доп. цвет", 0);
FormCruiserConfig() {
setTitle("Cruiser");
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
this.setModalExclusionType(ModalExclusionType.APPLICATION_EXCLUDE);
this.setModalityType(ModalityType.APPLICATION_MODAL);
this.setResizable(false);
setSize(900, 400);
setLayout(null);
JCheckBox ifTentCheckBox = new JCheckBox("Признак наличия площадки под вертолет");
JCheckBox ifKitCheckBox = new JCheckBox("Признак наличия ракетных шахт ");
ifTentCheckBox.setBounds(20, 200, 150, 30);
this.add(ifTentCheckBox);
ifKitCheckBox.setBounds(20, 250, 150, 30);
this.add(ifKitCheckBox);
JSpinner speedSpinner = new JSpinner();
speedSpinner.setBounds(20 + 100, 100, 50, 20);
speedSpinner.setValue(100);
this.add(speedSpinner);
JSpinner weightSpinner = new JSpinner();
weightSpinner.setBounds(20 + 100, 150, 50, 20);
weightSpinner.setValue(100);
this.add(weightSpinner);
JLabel speedLabel = new JLabel("Скорость");
speedLabel.setBounds(20, 100, 150, 20);
this.add(speedLabel);
JLabel weightLabel = new JLabel("Вес");
weightLabel.setBounds(20, 150, 150, 20);
this.add(weightLabel);
int xStart = 300;
int yStart = 50;
int panelColorSize = 50;
Color[] colors = {Color.RED, Color.ORANGE, Color.YELLOW, Color.GREEN, Color.CYAN, Color.BLUE, Color.MAGENTA, Color.PINK};
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 4; j++) {
JPanel colorPanel = new JPanel();
colorPanel.setTransferHandler(new PanelTransferHandler());
colorPanel.addMouseListener(new PanelMouseAdapter());
colorPanel.setBackground(colors[i * 4 + j]);
colorPanel.setBounds(xStart, yStart, panelColorSize, panelColorSize);
this.add(colorPanel);
xStart += panelColorSize + 10;
}
yStart += panelColorSize + 10;
xStart -= (4 * panelColorSize + 40);
}
JLabel easyLabel = new JLabel("Простой", 0);
easyLabel.setTransferHandler(new LabelTransferHandler());
easyLabel.addMouseListener(new LabelMouseAdapter());
easyLabel.setBounds(300, 300, 100, 50);
easyLabel.setOpaque(true);
easyLabel.setBackground(Color.LIGHT_GRAY);
this.add(easyLabel);
JLabel hardLabel = new JLabel("Продвинутый", 0);
hardLabel.setTransferHandler(new LabelTransferHandler());
hardLabel.addMouseListener(new LabelMouseAdapter());
hardLabel.setBounds(410, 300, 100, 50);
hardLabel.setOpaque(true);
hardLabel.setBackground(Color.LIGHT_GRAY);
this.add(hardLabel);
colorLabel.setTransferHandler(new TransferHandler("background"));
colorLabel.setBounds(600, 50, 100, 40);
colorLabel.setOpaque(true);
Border border = BorderFactory.createLineBorder(Color.BLACK, 1); // Создание границы
colorLabel.setBorder(border);
this.add(colorLabel);
colorAddLabel.setTransferHandler(new TransferHandler("background"));
colorAddLabel.setBounds(750, 50, 100, 40);
colorAddLabel.setOpaque(true);
colorAddLabel.setBorder(border);
this.add(colorAddLabel);
JLabel iDopLabel = new JLabel("Палубы", 0);
iDopLabel.setBounds(680, 10, 100, 30);
iDopLabel.setOpaque(true);
iDopLabel.setBorder(border);
this.add(iDopLabel);
colorLabel.setTransferHandler(
new TransferHandler() {
@Override
public boolean canImport(TransferHandler.TransferSupport support) {
return support.isDataFlavorSupported(ColorTransferable.colorDataFlavor);
}
@Override
public boolean importData(TransferHandler.TransferSupport support) {
if (canImport(support)) {
try {
Color color = (Color) support.getTransferable().getTransferData(ColorTransferable.colorDataFlavor);
if (drawingCruiser == null)
return false;
drawingCruiser.ChangeColor(color);
colorLabel.setBackground(color);
repaintPanel();
return true;
} catch (UnsupportedFlavorException | IOException e) {
e.printStackTrace();
}
}
return false;
}
}
);
colorAddLabel.setTransferHandler(
new TransferHandler() {
@Override
public boolean canImport(TransferHandler.TransferSupport support) {
return support.isDataFlavorSupported(ColorTransferable.colorDataFlavor);
}
@Override
public boolean importData(TransferHandler.TransferSupport support) {
if (canImport(support)) {
try {
Color color = (Color) support.getTransferable().getTransferData(ColorTransferable.colorDataFlavor);
if (drawingCruiser == null || !(drawingCruiser instanceof DrawingAdvancedCruiser))
return false;
((DrawingAdvancedCruiser) drawingCruiser).ChangeAddColor(color);
colorAddLabel.setBackground(color);
repaintPanel();
return true;
} catch (UnsupportedFlavorException | IOException e) {
e.printStackTrace();
}
}
return false;
}
}
);
JSpinner numOfWheelsSpinner = new JSpinner();
iDopLabel.setTransferHandler(
new TransferHandler() {
@Override
public boolean canImport(TransferHandler.TransferSupport support) {
return support.isDataFlavorSupported(iDopTransferable.iDrawDataFlavor);
}
@Override
public boolean importData(TransferHandler.TransferSupport support) {
if (canImport(support)) {
try {
IDop obj = (IDop) support.getTransferable().getTransferData(iDopTransferable.iDrawDataFlavor);
if (drawingCruiser == null)
return false;
drawingCruiser.ChangeIDop(obj, (String) numOfWheelsSpinner.getValue());
repaintPanel();
return true;
} catch (UnsupportedFlavorException | IOException e) {
e.printStackTrace();
}
}
return false;
}
}
);
JButton deleteButton = new JButton("Отмена");
deleteButton.setBounds(750, 300, 100, 30);
this.add(deleteButton);
JButton buttonCruiser = new JButton("Добавить");
buttonCruiser.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
SelectedCruiser = drawingCruiser;
dispose();
}
});
buttonCruiser.setBounds(600, 300, 100, 30);
this.add(buttonCruiser);
JLabel numWheelsLabel = new JLabel("Палубы");
numWheelsLabel.setBounds(300, 200, 70, 20);
this.add(numWheelsLabel);
numOfWheelsSpinner.setValue(3);
numOfWheelsSpinner.setBounds(370, 200, 40, 20);
this.add(numOfWheelsSpinner);
IDopComponent triangleLComp = new IDopComponent(new DopClassMixed(3));
JLabel triangleLabel = new JLabel("1 вид", 0);
triangleLComp.add(triangleLabel);
triangleLComp.setBounds(300, 250, 20, 20);
triangleLComp.setBorder(border);
this.add(triangleLComp);
IDopComponent rectComp = new IDopComponent(new DopClassRect(3));
JLabel rectLabel = new JLabel("2 вид", 0);
rectComp.add(rectLabel);
rectComp.setBounds(330, 250, 20, 20);
rectComp.setBorder(border);
this.add(rectComp);
IDopComponent circleComp = new IDopComponent(new NumberOfWheels(3));
JLabel circleLabel = new JLabel("3 вид", 0);
circleComp.add(circleLabel);
circleComp.setBounds(360, 250, 20, 20);
circleComp.setBorder(border);
this.add(circleComp);
cruiserPanel.setTransferHandler(
new TransferHandler() {
@Override
public boolean canImport(TransferHandler.TransferSupport support) {
return support.isDataFlavorSupported(DataFlavor.stringFlavor);
}
@Override
public boolean importData(TransferHandler.TransferSupport support) {
if (canImport(support)) {
try {
int speed = ((Number) speedSpinner.getValue()).intValue();
int weight = ((Number) weightSpinner.getValue()).intValue();
int enginesNumber = ((Number) numOfWheelsSpinner.getValue()).intValue();
switch ((String) support.getTransferable().getTransferData(DataFlavor.stringFlavor)) {
case "Простой" -> {
drawingCruiser = new DrawingCruiser(speed, weight, Color.WHITE,
cruiserPanel.getWidth(), cruiserPanel.getHeight(), 0, enginesNumber);
}
case "Продвинутый" -> {
drawingCruiser = new DrawingAdvancedCruiser(speed, (double) weight, Color.WHITE, Color.BLACK,
ifKitCheckBox.isSelected(), ifTentCheckBox.isSelected(), true, cruiserPanel.getWidth(), cruiserPanel.getHeight());
}
}
drawingCruiser.SetPosition(10, 10);
repaintPanel();
return true;
} catch (UnsupportedFlavorException | IOException e) {
e.printStackTrace();
}
}
return false;
}
}
);
cruiserPanel.setBounds(600, 100, 250, 190);
this.add(cruiserPanel);
this.setVisible(true);
}
void repaintPanel() {
Graphics g = cruiserPanel.getGraphics();
g.clearRect(0, 0, cruiserPanel.getWidth(), cruiserPanel.getHeight());
drawingCruiser.DrawTransport(g);
}
private static class LabelTransferHandler extends TransferHandler {
@Override
public int getSourceActions(JComponent c) {
return TransferHandler.COPY;
}
@Override
protected Transferable createTransferable(JComponent c) {
return new StringSelection(((JLabel) c).getText());
}
}
private record ColorTransferable(Color color) implements Transferable {
private static final DataFlavor colorDataFlavor = new DataFlavor(Color.class, "Color");
@Override
public DataFlavor[] getTransferDataFlavors() {
return new DataFlavor[]{colorDataFlavor};
}
@Override
public boolean isDataFlavorSupported(DataFlavor flavor) {
return colorDataFlavor.equals(flavor);
}
@Override
public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException {
if (isDataFlavorSupported(flavor)) {
return color;
} else {
throw new UnsupportedFlavorException(flavor);
}
}
}
private static class PanelTransferHandler extends TransferHandler {
@Override
public int getSourceActions(JComponent c) {
return TransferHandler.COPY;
}
@Override
protected Transferable createTransferable(JComponent c) {
return new ColorTransferable(c.getBackground());
}
}
private static class LabelMouseAdapter extends MouseAdapter {
@Override
public void mousePressed(MouseEvent e) {
((JLabel) e.getComponent()).getTransferHandler().exportAsDrag(((JLabel) e.getComponent()), e, TransferHandler.COPY);
}
}
private static class PanelMouseAdapter extends MouseAdapter {
@Override
public void mousePressed(MouseEvent e) {
((JPanel) e.getComponent()).getTransferHandler().exportAsDrag(((JPanel) e.getComponent()), e, TransferHandler.COPY);
}
}
private record IDopTransferable(IDop obj) implements Transferable {
private static final DataFlavor colorDataFlavor = new DataFlavor(Color.class, "IDop");
@Override
public DataFlavor[] getTransferDataFlavors() {
return new DataFlavor[]{colorDataFlavor};
}
@Override
public boolean isDataFlavorSupported(DataFlavor flavor) {
return colorDataFlavor.equals(flavor);
}
@Override
public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException {
if (isDataFlavorSupported(flavor)) {
return obj;
} else {
throw new UnsupportedFlavorException(flavor);
}
}
}
private static class IDopMouseAdapter extends MouseAdapter {
@Override
public void mousePressed(MouseEvent e) {
((JLabel) e.getComponent()).getTransferHandler().exportAsDrag(((JLabel) e.getComponent()), e, TransferHandler.COPY);
}
}
private class iDopTransferable implements Transferable {
private IDop iDopObject;
private static final DataFlavor iDrawDataFlavor = new DataFlavor(IDop.class, "IDraw");
public iDopTransferable(IDop iDrawObject) {
this.iDopObject = iDrawObject;
}
@Override
public DataFlavor[] getTransferDataFlavors() {
return new DataFlavor[]{iDrawDataFlavor};
}
@Override
public boolean isDataFlavorSupported(DataFlavor flavor) {
return iDrawDataFlavor.equals(flavor);
}
@Override
public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
if (isDataFlavorSupported(flavor)) {
return iDopObject;
} else {
throw new UnsupportedFlavorException(flavor);
}
}
}
private class IDopComponent extends JComponent {
public IDop obj;
public IDopComponent(IDop obj) {
this.obj = obj;
this.addMouseListener(
new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
((IDopComponent) e.getComponent()).getTransferHandler().exportAsDrag(((IDopComponent) e.getComponent()), e, TransferHandler.COPY);
}
}
);
this.setTransferHandler(
new TransferHandler() {
@Override
public int getSourceActions(JComponent c) {
return TransferHandler.COPY;
}
@Override
protected Transferable createTransferable(JComponent c) {
return new iDopTransferable(((IDopComponent) c).obj);
}
}
);
}
}
public DrawingCruiser getSelectedCruiser() {
return SelectedCruiser;
}
}