2023-12-05 13:19:09 +04:00

370 lines
14 KiB
Java

package ProjectElectricLocomotive;
import javax.swing.*;
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.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.border.Border;
import java.io.IOException;
public class FormLocomotiveConfig{
public DrawingLocomotive _loco;
private JPanel MainPanel;
private JPanel groupBoxObjectParameters;
private JPanel groupBoxColors;
private JSpinner numericUpDownSpeed;
private JSpinner numericUpDownWeight;
private JLabel labelSpeed;
private JLabel labelWeight;
private JCheckBox checkBoxHorns;
private JCheckBox checkBoxSeifBatteries;
public JLabel lableSimpleObject;
private JLabel labelModifiedObject;
public JButton buttonOk;
public JButton buttonClose;
private JLabel labelColor;
private JLabel labelDopColor;
public JComponent pictureBoxObject;
private JPanel redPanel;
private JPanel orangePanel;
private JPanel yellowPanel;
private JPanel ligthGreenPanel;
private JPanel melissePanel;
private JPanel ligthBluePanel;
private JPanel bluePanel;
private JPanel violetPanel;
private JPanel panelBodyColor;
private JPanel panelAdditionalColor;
private JLabel labelBlackWheels;
private JLabel labelCountWheels;
private JSpinner numericUpDownWheels;
private JLabel labelEmptyWheels;
private JLabel labelRainbowWheels;
public Canvas canvas;
public JPanel getPictureBoxObject(){
return MainPanel;
}
private class Canvas extends JComponent{
public Canvas(){
}
public void paintComponent (Graphics g){
if (_loco == null){
return;
}
super.paintComponents (g) ;
Graphics2D g2d = (Graphics2D)g;
_loco.DrawTransport(g2d);
super.repaint();
}
}
// класс для перетаскивания информации из labe'лов
private 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 class ColorTransferable implements Transferable {
private Color color;
private static final DataFlavor colorDataFlavor = new DataFlavor(Color.class, "Color");
public ColorTransferable(Color color) {
this.color = 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, IOException {
if (isDataFlavorSupported(flavor)) {
return color;
} else {
throw new UnsupportedFlavorException(flavor);
}
}
}
//для перетаскивания цвета
private class PanelTransferHandler extends TransferHandler {
@Override
public int getSourceActions(JComponent c) {
return TransferHandler.COPY;
}
@Override
protected Transferable createTransferable(JComponent c) {
return new ColorTransferable(((JPanel)c).getBackground());
}
}
//для обработки "схватывания" label'ов
private class LabelMouseAdapter extends MouseAdapter {
@Override
public void mousePressed(MouseEvent e) {
((JLabel)e.getComponent()).getTransferHandler().exportAsDrag(((JLabel)e.getComponent()), e, TransferHandler.COPY);
}
}
//для обработки "схватывания" panel'ей
private class PanelMouseAdapter extends MouseAdapter{
@Override
public void mousePressed(MouseEvent e) {
((JPanel)e.getComponent()).getTransferHandler().exportAsDrag(((JPanel)e.getComponent()), e, TransferHandler.COPY);
}
}
public FormLocomotiveConfig()
{
Border br = BorderFactory.createLineBorder(Color.BLACK);
SpinnerModel numSpeed = new SpinnerNumberModel(100, 100, 1000, 1);
numericUpDownSpeed = new JSpinner(numSpeed);
SpinnerModel numWeight = new SpinnerNumberModel(100, 100, 1000, 1);
numericUpDownWeight = new JSpinner(numWeight);
lableSimpleObject.setTransferHandler(new LabelTransferHandler());
lableSimpleObject.addMouseListener(new LabelMouseAdapter());
lableSimpleObject.setBorder(br);
labelModifiedObject.setTransferHandler(new LabelTransferHandler());
labelModifiedObject.addMouseListener(new LabelMouseAdapter());
labelModifiedObject.setBorder(br);
labelBlackWheels.setTransferHandler(new TransferHandler(){
@Override
public int getSourceActions(JComponent c) {
return TransferHandler.COPY;
}
@Override
protected Transferable createTransferable(JComponent c) {
return new WheelsTransferable(new DrawingWheel());
}
});
labelBlackWheels.addMouseListener(new LabelMouseAdapter());
labelBlackWheels.setBorder(br);
labelEmptyWheels.setTransferHandler(new TransferHandler(){
@Override
public int getSourceActions(JComponent c) {
return TransferHandler.COPY;
}
@Override
protected Transferable createTransferable(JComponent c) {
return new WheelsTransferable(new DrawingEmptyWheels());
}
});
labelEmptyWheels.addMouseListener(new LabelMouseAdapter());
labelEmptyWheels.setBorder(br);
labelRainbowWheels.setTransferHandler( new TransferHandler(){
@Override
public int getSourceActions(JComponent c) {
return TransferHandler.COPY;
}
@Override
protected Transferable createTransferable(JComponent c) {
return new WheelsTransferable(new DrawingWheelsBlueCrom());
}
});
labelRainbowWheels.addMouseListener(new LabelMouseAdapter());
labelRainbowWheels.setBorder(br);
redPanel.setTransferHandler(new PanelTransferHandler());
redPanel.addMouseListener(new PanelMouseAdapter());
orangePanel.setTransferHandler(new PanelTransferHandler());
orangePanel.addMouseListener(new PanelMouseAdapter());
yellowPanel.setTransferHandler(new PanelTransferHandler());
yellowPanel.addMouseListener(new PanelMouseAdapter());
ligthGreenPanel.setTransferHandler(new PanelTransferHandler());
ligthGreenPanel.addMouseListener(new PanelMouseAdapter());
melissePanel.setTransferHandler(new PanelTransferHandler());
melissePanel.addMouseListener(new PanelMouseAdapter());
ligthBluePanel.setTransferHandler(new PanelTransferHandler());
ligthBluePanel.addMouseListener(new PanelMouseAdapter());
bluePanel.setTransferHandler(new PanelTransferHandler());
bluePanel.addMouseListener(new PanelMouseAdapter());
violetPanel.setTransferHandler(new PanelTransferHandler());
violetPanel.addMouseListener(new PanelMouseAdapter());
labelColor.setBorder(br);
labelColor.setTransferHandler(
new TransferHandler(){
@Override
public boolean canImport(TransferHandler.TransferSupport support)
{
try{
Color color = (Color) support.getTransferable().getTransferData(ColorTransferable.colorDataFlavor);
if(_loco == null) return false;
_loco.EntityLocomotive.SetBodyColor(color);
panelBodyColor.setBackground(color);
Border border = BorderFactory.createLineBorder(color);
labelColor.setBorder(border);
return true;
}
catch(UnsupportedFlavorException | IOException e){
}
return false;
}
}
);
labelDopColor.setBorder(br);
labelDopColor.setTransferHandler(
new TransferHandler(){
@Override
public boolean canImport(TransferHandler.TransferSupport support)
{
try{
Color color = (Color) support.getTransferable().getTransferData(ColorTransferable.colorDataFlavor);
panelAdditionalColor.setBackground(color);
Border border = BorderFactory.createLineBorder(color);
labelDopColor.setBorder(border);
if(_loco == null) return false;
if(!(_loco instanceof DrawingElectricLocomotive))
return false;
((EntityElectricLocomotive)_loco.EntityLocomotive).SetAdditionalColor(color);
return true;
}
catch(UnsupportedFlavorException | IOException e){
}
return false;
}
}
);
pictureBoxObject.setTransferHandler(
new TransferHandler(){
@Override
public boolean canImport(TransferHandler.TransferSupport support) {
return support.isDataFlavorSupported(DataFlavor.stringFlavor) || support.isDataFlavorSupported(WheelsTransferable.wheelsDrawingDataFlavor);
}
@Override
public boolean importData(TransferHandler.TransferSupport support) {
if (canImport(support)) {
try {
String data = (String) support.getTransferable().getTransferData(DataFlavor.stringFlavor);
switch (data) {
case "Простой":
_loco = new DrawingLocomotive(
(int)numericUpDownSpeed.getValue(),
(int)numericUpDownWeight.getValue(),
Color.WHITE,
pictureBoxObject.getWidth(),
pictureBoxObject.getHeight()
);
break;
case "Сложный":
_loco = new DrawingElectricLocomotive(
(int)numericUpDownSpeed.getValue(),
(int)numericUpDownWeight.getValue(),
Color.WHITE,
Color.BLACK,
checkBoxHorns.isSelected(),
checkBoxSeifBatteries.isSelected(),
pictureBoxObject.getWidth(),
pictureBoxObject.getHeight()
);
break;
}
} catch (UnsupportedFlavorException | IOException e) {
}
try{
int wheelsCount = (int)numericUpDownWheels.getValue();
IDrawingWheels drawingWheels = (IDrawingWheels) support.getTransferable().getTransferData(WheelsTransferable.wheelsDrawingDataFlavor);
_loco._drawingWheels = drawingWheels;
_loco.SetWheelsCount(wheelsCount);
}catch(UnsupportedFlavorException | IOException e){
}
pictureBoxObject.repaint();
return true;
}
return false;
}
}
);
}
private class WheelsTransferable implements Transferable {
private IDrawingWheels drawingWheels;
private static final DataFlavor wheelsDrawingDataFlavor = new DataFlavor(IDrawingWheels.class, "Wheels Drawing");
public WheelsTransferable(IDrawingWheels drawingWheels) {
this.drawingWheels = drawingWheels;
}
@Override
public DataFlavor[] getTransferDataFlavors() {
return new DataFlavor[]{wheelsDrawingDataFlavor};
}
@Override
public boolean isDataFlavorSupported(DataFlavor flavor) {
return flavor.equals(wheelsDrawingDataFlavor);
}
@Override
public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException {
if (isDataFlavorSupported(flavor)) {
return drawingWheels;
} else {
throw new UnsupportedFlavorException(flavor);
}
}
}
private void createUIComponents(){
pictureBoxObject = new Canvas();
pictureBoxObject.setBounds(new Rectangle(300, 300));
SpinnerModel numSpeed = new SpinnerNumberModel(100, 100, 1000, 1);
numericUpDownSpeed = new JSpinner(numSpeed);
SpinnerModel numWeight = new SpinnerNumberModel(100, 100, 1000, 1);
numericUpDownWeight = new JSpinner(numWeight);
SpinnerModel numWheels = new SpinnerNumberModel(2,2, 4, 1);
numericUpDownWheels = new JSpinner(numWheels);
}
}