From 0138b01ae981008b291a3003bba21bbb62ac9494 Mon Sep 17 00:00:00 2001 From: iobyte Date: Sun, 7 May 2023 03:47:35 +0000 Subject: [PATCH] trackeditor: move terrain generation object map properties into sepatrate file git-svn-id: https://svn.code.sf.net/p/speed-dreams/code/trunk@8932 30fe4595-0a0c-4342-8851-515496e4dcbd Former-commit-id: acdcc2a6e90c31ac815509da30fd284c25a84457 Former-commit-id: a9de5acd2037ea074aaa13a4ab9571cf0bb58340 --- src/tools/trackeditor/CMakeLists.txt | 1 + .../gui/properties/ObjectMapProperties.java | 703 ++++++++++++++++++ .../gui/properties/TerrainProperties.java | 669 +---------------- src/tools/trackeditor/utils/Properties.java | 2 +- .../utils/circuit/ObjShapeRelief.java | 7 + 5 files changed, 721 insertions(+), 661 deletions(-) create mode 100644 src/tools/trackeditor/gui/properties/ObjectMapProperties.java diff --git a/src/tools/trackeditor/CMakeLists.txt b/src/tools/trackeditor/CMakeLists.txt index c05018634..5b013e73f 100644 --- a/src/tools/trackeditor/CMakeLists.txt +++ b/src/tools/trackeditor/CMakeLists.txt @@ -43,6 +43,7 @@ IF(Java_Development_FOUND AND Java_FOUND) gui/properties/GraphicProperties.java gui/properties/ImageProperties.java gui/properties/LocalInfoProperties.java + gui/properties/ObjectMapProperties.java gui/properties/ObjectProperties.java gui/properties/PitProperties.java gui/properties/PropertiesDialog.java diff --git a/src/tools/trackeditor/gui/properties/ObjectMapProperties.java b/src/tools/trackeditor/gui/properties/ObjectMapProperties.java new file mode 100644 index 000000000..5ffb054d5 --- /dev/null +++ b/src/tools/trackeditor/gui/properties/ObjectMapProperties.java @@ -0,0 +1,703 @@ +package gui.properties; + +import java.awt.Color; +import java.awt.Component; +import java.awt.Graphics2D; +import java.awt.GridLayout; +import java.awt.geom.Rectangle2D; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Iterator; +import java.util.Set; +import java.util.Vector; + +import javax.imageio.ImageIO; +import javax.swing.DefaultCellEditor; +import javax.swing.JButton; +import javax.swing.JComboBox; +import javax.swing.JFileChooser; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTabbedPane; +import javax.swing.JTable; +import javax.swing.JTextField; +import javax.swing.UIManager; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import javax.swing.filechooser.FileNameExtensionFilter; +import javax.swing.table.AbstractTableModel; +import javax.swing.table.DefaultTableCellRenderer; +import javax.swing.table.TableColumn; + +import gui.EditorFrame; +import utils.Editor; +import utils.circuit.ObjShapeObject; +import utils.circuit.ObjectMap; + +public class ObjectMapProperties extends PropertyPanel +{ + private JTabbedPane tabbedPane = null; + private JButton addObjectMapButton = null; + private JButton deleteObjectMapButton = null; + private final String sep = System.getProperty("file.separator"); + + ObjectMapProperties(EditorFrame editorFrame) + { + super(editorFrame); + initialize(); + } + + private void initialize() + { + setLayout(null); + + add(getTabbedPane(), null); + add(getAddObjectMapButton(), null); + add(getDeleteObjectMapButton(), null); + } + + private JTabbedPane getTabbedPane() + { + if (tabbedPane == null) + { + tabbedPane = new JTabbedPane(); + tabbedPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT); + tabbedPane.setBounds(10, 10, 487, 280); + + Vector objectMaps = getEditorFrame().getObjectMaps(); + + for (int i = 0; i < objectMaps.size(); i++) + { + ObjectMap objectMap = objectMaps.elementAt(i); + tabbedPane.addTab(objectMap.getName(), null, new ObjectMapPanel(objectMap), null); + } + } + return tabbedPane; + } + + private JButton getAddObjectMapButton() + { + if (addObjectMapButton == null) + { + addObjectMapButton = new JButton(); + addObjectMapButton.setBounds(10, 300, 130, 25); + addObjectMapButton.setText("Add Object Map"); + addObjectMapButton.addActionListener(new java.awt.event.ActionListener() + { + public void actionPerformed(java.awt.event.ActionEvent e) + { + String name = "map " + (tabbedPane.getTabCount() + 1); + ObjectMap objectMap = new ObjectMap(); + objectMap.setName(name); + + tabbedPane.addTab(name, null, new ObjectMapPanel(objectMap), null); + tabbedPane.setSelectedIndex(tabbedPane.getTabCount() - 1); + } + }); + } + return addObjectMapButton; + } + + private JButton getDeleteObjectMapButton() + { + if (deleteObjectMapButton == null) + { + deleteObjectMapButton = new JButton(); + deleteObjectMapButton.setBounds(155, 300, 140, 25); + deleteObjectMapButton.setText("Delete Object Map"); + deleteObjectMapButton.addActionListener(new java.awt.event.ActionListener() + { + public void actionPerformed(java.awt.event.ActionEvent e) + { + if (tabbedPane.getTabCount() > 0) + { + tabbedPane.removeTabAt(tabbedPane.getSelectedIndex()); + } + } + }); + } + return deleteObjectMapButton; + } + + private class ObjectMapPanel extends JPanel + { + private JLabel nameLabel = new JLabel(); + private JTextField nameTextField = new JTextField(); + private JLabel objectMapLabel = new JLabel(); + private JTextField objectMapTextField = new JTextField(); + private JButton objectMapCreateButton = null; + private JButton objectMapButton = null; + private ObjectTablePanel objectTablePanel = null; + + public class Data + { + String name; + Integer color; + Integer x; + Integer y; + + Data(String name, Integer color, Integer x, Integer y) + { + this.name = name; + this.color = color; + this.x = x; + this.y = y; + } + } + + private Vector data = new Vector(); + + public Vector getData() + { + return data; + } + + /** + * + */ + public ObjectMapPanel(ObjectMap objectMap) + { + super(); + initialize(objectMap); + } + + /** + * + */ + private void initialize(ObjectMap objectMap) + { + setLayout(null); + + addLabel(this, 0, nameLabel, "Name", 120); + addLabel(this, 1, objectMapLabel, "Object Map", 120); + + addTextField(this, 0, nameTextField, objectMap.getName(), 115, 100); + addTextField(this, 1, objectMapTextField, objectMap.getObjectMap(), 115, 275); + + add(getObjectMapCreateButton(), null); + add(getObjectMapButton(), null); + add(getObjectTablePanel(objectMap), null); + + objectMapCreateButton.setEnabled(objectMap.getObjectMap() == null || objectMap.getObjectMap().isEmpty()); + + objectMapTextField.getDocument().addDocumentListener(new DocumentListener() + { + public void changedUpdate(DocumentEvent ev) + { + changed(); + } + public void removeUpdate(DocumentEvent ev) + { + changed(); + } + public void insertUpdate(DocumentEvent ev) + { + changed(); + } + + public void changed() + { + // update table with new data + try + { + getDataFromImage(Editor.getProperties().getPath() + sep + objectMapTextField.getText()); + objectTablePanel.dataChanged(); + } + catch (IOException ex) + { + } + } + }); + } + + /** + * This method initializes objectMapCreateButton + * + * @return javax.swing.JButton + */ + private JButton getObjectMapCreateButton() + { + if (objectMapCreateButton == null) + { + objectMapCreateButton = new JButton(); + objectMapCreateButton.setBounds(395, 6, 80, 25); + objectMapCreateButton.setText("Create"); + objectMapCreateButton.addActionListener(new java.awt.event.ActionListener() + { + public void actionPerformed(java.awt.event.ActionEvent ev) + { + try + { + objectMapCreateFile(); + } + catch (IOException ex) + { + } + } + }); + } + return objectMapCreateButton; + } + + protected void objectMapCreateFile() throws IOException + { + int index = tabbedPane.getSelectedIndex() + 1; + + Path filename = Paths.get(Editor.getProperties().getPath() + sep + "object-map" + index + ".png"); + + if (filename.toFile().exists()) + { + String[] options = {"Overwrite", "Use Existing", "Cancel"}; + + int option = JOptionPane.showOptionDialog(this, filename.getFileName().toString() + " already exists!", + "Create Object Map", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, options, options[0]); + + if (option == 1) + { + objectMapTextField.setText(filename.getFileName().toString()); + + getDataFromImage(filename.toString()); + objectTablePanel.dataChanged(); + return; + } + else if (option == 2) + { + return; + } + } + + Rectangle2D.Double boundingRectangle = getEditorFrame().getBoundingRectangle(); + + int imageWidth = 1024; + int imageHeight = (int)(1024 * (boundingRectangle.height / boundingRectangle.width)); + BufferedImage image = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_RGB); + Graphics2D graphic = image.createGraphics(); + graphic.setColor(new Color(0x00000000)); + graphic.fillRect(0, 0, imageWidth, imageHeight); + + graphic.dispose(); + ImageIO.write(image, "png", new File(filename.toString())); + + objectMapTextField.setText(filename.getFileName().toString()); + + getDataFromImage(filename.toString()); + objectTablePanel.dataChanged(); + } + + /** + * This method initializes objectMapButton + * + * @return javax.swing.JButton + */ + private JButton getObjectMapButton() + { + if (objectMapButton == null) + { + objectMapButton = new JButton(); + objectMapButton.setBounds(395, 36, 80, 25); + objectMapButton.setText("Browse"); + objectMapButton.addActionListener(new java.awt.event.ActionListener() + { + public void actionPerformed(java.awt.event.ActionEvent e) + { + objectMapFile(); + } + }); + } + return objectMapButton; + } + + protected void objectMapFile() + { + Boolean old = UIManager.getBoolean("FileChooser.readOnly"); + UIManager.put("FileChooser.readOnly", Boolean.TRUE); + JFileChooser fc = new JFileChooser(); + fc.setSelectedFiles(null); + fc.setSelectedFile(null); + fc.rescanCurrentDirectory(); + fc.setApproveButtonMnemonic(0); + fc.setDialogTitle("Object Map image file selection"); + fc.setVisible(true); + fc.setAcceptAllFileFilterUsed(false); + FileNameExtensionFilter filter = new FileNameExtensionFilter("RGB and PNG images", "rgb", "png"); + fc.addChoosableFileFilter(filter); + fc.setCurrentDirectory(new File(Editor.getProperties().getPath())); + int result = fc.showOpenDialog(this); + UIManager.put("FileChooser.readOnly", old); + if (result == JFileChooser.APPROVE_OPTION) + { + String selectedFile = fc.getSelectedFile().toString(); + String fileName = selectedFile; + int index = selectedFile.lastIndexOf(sep); + String pathToFile = selectedFile.substring(0, index); + if (pathToFile.equals(Editor.getProperties().getPath())) + fileName = selectedFile.substring(index + 1); + objectMapTextField.setText(fileName); + + // update table with new data + try + { + getDataFromImage(selectedFile); + objectTablePanel.dataChanged(); + } + catch (IOException e) + { + } + } + } + + public void getDataFromImage(String fileName) throws IOException + { + data.clear(); + + File file = new File(fileName); + + if (file.exists()) + { + BufferedImage image = ImageIO.read(file); + int imageWidth = image.getWidth(); + int imageHeight = image.getHeight(); + + for (int x = 0; x < imageWidth; x++) + { + for (int y = 0; y < imageHeight; y++) + { + int rgb = image.getRGB(x, y) & 0x00ffffff; + + if (rgb != 0x0) + { + String name = getEditorFrame().getObjectColorName(rgb); + if (name == null) + { + name = new String("Unknown"); + } + + data.add(new Data(name, rgb, x, y)); + } + } + } + } + } + + public void getDataFromObjectMap(ObjectMap objectMap) + { + data.clear(); + + for (int i = 0; i < objectMap.getObjects().size(); i++) + { + ObjShapeObject object = objectMap.getObjects().get(i); + + String name = getEditorFrame().getObjectColorName(object.getRGB()); + + if (name == null) + { + name = new String("Unknown"); + } + + data.add(new Data(name, object.getRGB(), object.getImageX(), object.getImageY())); + } + } + + private ObjectTablePanel getObjectTablePanel(ObjectMap objectMap) + { + if (objectTablePanel == null) + { + objectTablePanel = new ObjectTablePanel(objectMap); + objectTablePanel.setBounds(10, 64, 465, 180); + } + return objectTablePanel; + } + + public class ColorRenderer extends DefaultTableCellRenderer + { + public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, + boolean hasFocus, int row, int column) + { + Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); + JLabel label = (JLabel)c; + + if (column == 2) + { + int rgb = Integer.decode(value.toString()); + Color color = new Color((rgb >> 16) & 0xff, (rgb >> 8) & 0xff, rgb & 0xff); + label.setBackground(color); + if ((color.getRed()*0.299 + color.getGreen()*0.587 + color.getBlue()*0.114) > 186) + { + label.setForeground(Color.BLACK); + } + else + { + label.setForeground(Color.WHITE); + } + } + else + { + label.setBackground(Color.WHITE); + label.setForeground(Color.BLACK); + } + + return label; + } + } + + class ObjectTableModel extends AbstractTableModel + { + private final String[] columnNames = { null, "Name", "Color", "X", "Y" }; + private final Class[] columnClass = new Class[] + { + Integer.class, String.class, Integer.class, Integer.class, Integer.class + }; + private ObjectMap objectMap = null; + + ObjectTableModel(ObjectMap objectMap) + { + this.objectMap = objectMap; + getDataFromObjectMap(objectMap); + } + + public int getRowCount() + { + return data.size(); + } + + public int getColumnCount() + { + return columnNames.length; + } + + public String getColumnName(int columnIndex) + { + return columnNames[columnIndex]; + } + + public Class getColumnClass(int columnIndex) + { + return columnClass[columnIndex]; + } + + public boolean isCellEditable(int row, int columnIndex) + { + if (columnIndex == 1 || columnIndex == 3 || columnIndex == 4) + { + return true; + } + return false; + } + + public Object getValueAt(int rowIndex, int columnIndex) + { + Data datum = data.get(rowIndex); + + switch (columnIndex) + { + case 0: + return rowIndex + 1; + case 1: + return datum.name; + case 2: + return String.format("0x%06X", datum.color); + case 3: + return datum.x; + case 4: + return datum.y; + } + return null; + } + + public void setValueAt(Object value, int rowIndex, int columnIndex) + { + Data datum = data.get(rowIndex); + + switch (columnIndex) + { + case 1: + datum.name = (String) value; + fireTableCellUpdated(rowIndex, columnIndex); + + if (value.equals("Unknown")) + { + datum.color = objectMap.getObjects().get(rowIndex).getRGB(); + } + else + { + datum.color = getEditorFrame().getObjectColor(datum.name); + } + fireTableCellUpdated(rowIndex, columnIndex + 1); + break; + case 3: + datum.x = (Integer) value; + fireTableCellUpdated(rowIndex, columnIndex); + break; + case 4: + datum.y = (Integer) value; + fireTableCellUpdated(rowIndex, columnIndex); + break; + } + } + } + + public void setUpNameColumn(JTable table, TableColumn nameColumn, Set names) + { + //Set up the editor for the name cells. + JComboBox comboBox = new JComboBox(); + + Iterator it = names.iterator(); + while (it.hasNext()) + { + comboBox.addItem(it.next()); + } + + comboBox.addItem("Unknown"); + + nameColumn.setCellEditor(new DefaultCellEditor(comboBox)); + + //Set up tool tips for the name cells. + DefaultTableCellRenderer renderer = new DefaultTableCellRenderer(); + //renderer.setToolTipText("Click to change object name"); + nameColumn.setCellRenderer(renderer); + } + + class ObjectTablePanel extends JPanel + { + JTable table = null; + JScrollPane scrollPane = null; + ObjectTableModel model = null; + + public ObjectTablePanel(ObjectMap objectMap) + { + super(new GridLayout(1,0)); + + model = new ObjectTableModel(objectMap); + table = new JTable(model); + scrollPane = new JScrollPane(table); + table.getColumnModel().getColumn(0).setPreferredWidth(25); + table.setDefaultRenderer(Integer.class, new ColorRenderer()); + table.setAutoCreateRowSorter(true); + + Set names = getEditorFrame().getObjectColorNames(); + + setUpNameColumn(table, table.getColumnModel().getColumn(1), names); + + add(scrollPane); + } + + void dataChanged() + { + model.fireTableDataChanged(); + } + } + } + + public void exit() + { + MutableString stringResult = new MutableString(); + Vector objectMaps = getEditorFrame().getObjectMaps(); + int minCount = Math.min(objectMaps.size(), tabbedPane.getTabCount()); + if (objectMaps.size() != tabbedPane.getTabCount()) + { + getEditorFrame().documentIsModified = true; + } + for (int i = 0; i < minCount; i++) + { + ObjectMap objectMap = objectMaps.elementAt(i); + ObjectMapPanel panel = (ObjectMapPanel) tabbedPane.getComponentAt(i); + if (isDifferent(panel.nameTextField.getText(), objectMap.getName(), stringResult)) + { + objectMap.setName(stringResult.getValue()); + getEditorFrame().documentIsModified = true; + } + if (isDifferent(panel.objectMapTextField.getText(), objectMap.getObjectMap(), stringResult)) + { + try + { + objectMap.setObjectMap(stringResult.getValue()); + } + catch (IOException e) + { + } + getEditorFrame().documentIsModified = true; + } + + Vector data = panel.getData(); + Vector objects = objectMap.getObjects(); + int minDataCount = Math.min(data.size(), objects.size()); + + if (data.size() != objects.size()) + { + getEditorFrame().documentIsModified = true; + } + for (int j = 0; j < minDataCount; j++) + { + ObjectMapPanel.Data datum = data.get(j); + ObjShapeObject object = objects.get(j); + + if (!datum.color.equals(object.getRGB())) + { + object.setRGB(datum.color); + getEditorFrame().documentIsModified = true; + } + + if (!datum.x.equals(object.getImageX())) + { + object.setImageX(datum.x); + getEditorFrame().documentIsModified = true; + } + + if (!datum.y.equals(object.getImageY())) + { + object.setImageY(datum.y); + getEditorFrame().documentIsModified = true; + } + } + if (data.size() < objects.size()) + { + // need to trim objects + while (objects.size() > data.size()) + { + objects.remove(objects.size() - 1); + } + } + else if (objects.size() < data.size()) + { + // need to add to objects + while (objects.size() < data.size()) + { + ObjectMapPanel.Data datum = data.get(objects.size()); + + objects.add(new ObjShapeObject(datum.color, datum.x, datum.y)); + } + } + } + if (objectMaps.size() > tabbedPane.getTabCount()) + { + // need to trim objectMaps + while (objectMaps.size() > tabbedPane.getTabCount()) + { + objectMaps.remove(objectMaps.size() - 1); + } + } + else if (objectMaps.size() < tabbedPane.getTabCount()) + { + // need to add to objectMaps + while (objectMaps.size() < tabbedPane.getTabCount()) + { + ObjectMapPanel panel = (ObjectMapPanel) tabbedPane.getComponentAt(objectMaps.size()); + ObjectMap objectMap = new ObjectMap(); + objectMap.setName(panel.nameTextField.getText()); + try + { + objectMap.setObjectMap(panel.objectMapTextField.getText()); + } + catch (IOException e) + { + } + objectMaps.add(objectMap); + } + } + } +} diff --git a/src/tools/trackeditor/gui/properties/TerrainProperties.java b/src/tools/trackeditor/gui/properties/TerrainProperties.java index c929733b1..b95af0d12 100644 --- a/src/tools/trackeditor/gui/properties/TerrainProperties.java +++ b/src/tools/trackeditor/gui/properties/TerrainProperties.java @@ -20,48 +20,25 @@ */ package gui.properties; -import java.awt.Color; import java.awt.Component; -import java.awt.Graphics2D; -import java.awt.GridLayout; -import java.awt.geom.Rectangle2D; -import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; -import java.nio.file.Path; -import java.nio.file.Paths; import java.util.Arrays; import java.util.Collections; -import java.util.Iterator; -import java.util.Set; import java.util.Vector; -import javax.imageio.ImageIO; -import javax.swing.DefaultCellEditor; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JFileChooser; import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JScrollPane; import javax.swing.JTabbedPane; -import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.UIManager; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; import javax.swing.filechooser.FileNameExtensionFilter; -import javax.swing.table.AbstractTableModel; -import javax.swing.table.DefaultTableCellRenderer; -import javax.swing.table.TableColumn; - import gui.EditorFrame; import utils.Editor; import utils.SurfaceComboBox; import utils.ac3d.Ac3dException; -import utils.circuit.ObjShapeObject; -import utils.circuit.ObjectMap; import utils.circuit.Surface; import utils.circuit.TerrainGeneration; @@ -103,8 +80,6 @@ public class TerrainProperties extends PropertyPanel private JComboBox useObjectMaterialsComboBox = null; private JButton defaultButton = null; private JButton deleteButton = null; - private JButton addObjectMapButton = null; - private JButton deleteObjectMapButton = null; private JTabbedPane tabbedPane = null; private JButton elevationMapButton = null; private JButton reliefFileButton = null; @@ -177,8 +152,6 @@ public class TerrainProperties extends PropertyPanel this.add(getDefaultButton(), null); this.add(getDeleteButton(), null); this.add(getTabbedPane(), null); - this.add(getAddObjectMapButton(), null); - this.add(getDeleteObjectMapButton(), null); this.add(getElevationMapButton(), null); this.add(getReliefFileButton(), null); this.add(getReliefBorderComboBox(), null); @@ -474,60 +447,6 @@ public class TerrainProperties extends PropertyPanel return deleteButton; } - /** - * This method initializes addObjectMapButton - * - * @return javax.swing.JButton - */ - private JButton getAddObjectMapButton() - { - if (addObjectMapButton == null) - { - addObjectMapButton = new JButton(); - addObjectMapButton.setBounds(10, 731, 130, 25); - addObjectMapButton.setText("Add Object Map"); - addObjectMapButton.addActionListener(new java.awt.event.ActionListener() - { - public void actionPerformed(java.awt.event.ActionEvent e) - { - String name = "map " + (tabbedPane.getTabCount() + 1); - ObjectMap objectMap = new ObjectMap(); - objectMap.setName(name); - - tabbedPane.addTab(name, null, new ObjectMapPanel(objectMap), null); - tabbedPane.setSelectedIndex(tabbedPane.getTabCount() - 1); - } - }); - } - return addObjectMapButton; - } - - /** - * This method initializes deleteObjectMapButton - * - * @return javax.swing.JButton - */ - private JButton getDeleteObjectMapButton() - { - if (deleteObjectMapButton == null) - { - deleteObjectMapButton = new JButton(); - deleteObjectMapButton.setBounds(155, 731, 140, 25); - deleteObjectMapButton.setText("Delete Object Map"); - deleteObjectMapButton.addActionListener(new java.awt.event.ActionListener() - { - public void actionPerformed(java.awt.event.ActionEvent e) - { - if (tabbedPane.getTabCount() > 0) - { - tabbedPane.removeTabAt(tabbedPane.getSelectedIndex()); - } - } - }); - } - return deleteObjectMapButton; - } - /** * This method initializes tabbedPane * @@ -539,488 +458,14 @@ public class TerrainProperties extends PropertyPanel { tabbedPane = new JTabbedPane(); tabbedPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT); - tabbedPane.setBounds(10, 393, 510, 328); + tabbedPane.setBounds(10, 393, 510, 362); - Vector objectMaps = getEditorFrame().getObjectMaps(); - - for (int i = 0; i < objectMaps.size(); i++) - { - ObjectMap objectMap = objectMaps.elementAt(i); - tabbedPane.addTab(objectMap.getName(), null, new ObjectMapPanel(objectMap), null); - } + tabbedPane.addTab("Object Maps", null, new ObjectMapProperties(getEditorFrame())); +// tabbedPane.addTab("Reliefs", null, new ReliefProperties(getEditorFrame())); } return tabbedPane; } - private class ObjectMapPanel extends JPanel - { - private JLabel nameLabel = new JLabel(); - private JTextField nameTextField = new JTextField(); - private JLabel objectMapLabel = new JLabel(); - private JTextField objectMapTextField = new JTextField(); - private JButton objectMapCreateButton = null; - private JButton objectMapButton = null; - private ObjectTablePanel objectTablePanel = null; - - public class Data - { - String name; - Integer color; - Integer x; - Integer y; - - Data(String name, Integer color, Integer x, Integer y) - { - this.name = name; - this.color = color; - this.x = x; - this.y = y; - } - } - - private Vector data = new Vector(); - - public Vector getData() - { - return data; - } - - /** - * - */ - public ObjectMapPanel(ObjectMap objectMap) - { - super(); - initialize(objectMap); - } - - /** - * - */ - private void initialize(ObjectMap objectMap) - { - setLayout(null); - - addLabel(this, 0, nameLabel, "Name", 120); - addLabel(this, 1, objectMapLabel, "Object Map", 120); - - addTextField(this, 0, nameTextField, objectMap.getName(), 130, 100); - addTextField(this, 1, objectMapTextField, objectMap.getObjectMap(), 130, 285); - - add(getObjectMapCreateButton(), null); - add(getObjectMapButton(), null); - add(getObjectTablePanel(objectMap), null); - - objectMapCreateButton.setEnabled(objectMap.getObjectMap() == null || objectMap.getObjectMap().isEmpty()); - - objectMapTextField.getDocument().addDocumentListener(new DocumentListener() - { - public void changedUpdate(DocumentEvent ev) - { - changed(); - } - public void removeUpdate(DocumentEvent ev) - { - changed(); - } - public void insertUpdate(DocumentEvent ev) - { - changed(); - } - - public void changed() - { - // update table with new data - try - { - getDataFromImage(Editor.getProperties().getPath() + sep + objectMapTextField.getText()); - objectTablePanel.dataChanged(); - } - catch (IOException ex) - { - } - } - }); - } - - /** - * This method initializes objectMapCreateButton - * - * @return javax.swing.JButton - */ - private JButton getObjectMapCreateButton() - { - if (objectMapCreateButton == null) - { - objectMapCreateButton = new JButton(); - objectMapCreateButton.setBounds(420, 6, 80, 25); - objectMapCreateButton.setText("Create"); - objectMapCreateButton.addActionListener(new java.awt.event.ActionListener() - { - public void actionPerformed(java.awt.event.ActionEvent ev) - { - try - { - objectMapCreateFile(); - } - catch (IOException ex) - { - } - } - }); - } - return objectMapCreateButton; - } - - protected void objectMapCreateFile() throws IOException - { - int index = tabbedPane.getSelectedIndex() + 1; - - Path filename = Paths.get(Editor.getProperties().getPath() + sep + "object-map" + index + ".png"); - - if (filename.toFile().exists()) - { - String[] options = {"Overwrite", "Use Existing", "Cancel"}; - - int option = JOptionPane.showOptionDialog(this, filename.getFileName().toString() + " already exists!", - "Create Object Map", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, options, options[0]); - - if (option == 1) - { - objectMapTextField.setText(filename.getFileName().toString()); - - getDataFromImage(filename.toString()); - objectTablePanel.dataChanged(); - return; - } - else if (option == 2) - { - return; - } - } - - Rectangle2D.Double boundingRectangle = getEditorFrame().getBoundingRectangle(); - - int imageWidth = 1024; - int imageHeight = (int)(1024 * (boundingRectangle.height / boundingRectangle.width)); - BufferedImage image = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_RGB); - Graphics2D graphic = image.createGraphics(); - graphic.setColor(new Color(0x00000000)); - graphic.fillRect(0, 0, imageWidth, imageHeight); - - graphic.dispose(); - ImageIO.write(image, "png", new File(filename.toString())); - - objectMapTextField.setText(filename.getFileName().toString()); - - getDataFromImage(filename.toString()); - objectTablePanel.dataChanged(); - } - - /** - * This method initializes objectMapButton - * - * @return javax.swing.JButton - */ - private JButton getObjectMapButton() - { - if (objectMapButton == null) - { - objectMapButton = new JButton(); - objectMapButton.setBounds(420, 36, 80, 25); - objectMapButton.setText("Browse"); - objectMapButton.addActionListener(new java.awt.event.ActionListener() - { - public void actionPerformed(java.awt.event.ActionEvent e) - { - objectMapFile(); - } - }); - } - return objectMapButton; - } - - protected void objectMapFile() - { - Boolean old = UIManager.getBoolean("FileChooser.readOnly"); - UIManager.put("FileChooser.readOnly", Boolean.TRUE); - JFileChooser fc = new JFileChooser(); - fc.setSelectedFiles(null); - fc.setSelectedFile(null); - fc.rescanCurrentDirectory(); - fc.setApproveButtonMnemonic(0); - fc.setDialogTitle("Object Map image file selection"); - fc.setVisible(true); - fc.setAcceptAllFileFilterUsed(false); - FileNameExtensionFilter filter = new FileNameExtensionFilter("RGB and PNG images", "rgb", "png"); - fc.addChoosableFileFilter(filter); - fc.setCurrentDirectory(new File(Editor.getProperties().getPath())); - int result = fc.showOpenDialog(this); - UIManager.put("FileChooser.readOnly", old); - if (result == JFileChooser.APPROVE_OPTION) - { - String selectedFile = fc.getSelectedFile().toString(); - String fileName = selectedFile; - int index = selectedFile.lastIndexOf(sep); - String pathToFile = selectedFile.substring(0, index); - if (pathToFile.equals(Editor.getProperties().getPath())) - fileName = selectedFile.substring(index + 1); - objectMapTextField.setText(fileName); - - // update table with new data - try - { - getDataFromImage(selectedFile); - objectTablePanel.dataChanged(); - } - catch (IOException e) - { - } - } - } - - public void getDataFromImage(String fileName) throws IOException - { - data.clear(); - - File file = new File(fileName); - - if (file.exists()) - { - BufferedImage image = ImageIO.read(file); - int imageWidth = image.getWidth(); - int imageHeight = image.getHeight(); - - for (int x = 0; x < imageWidth; x++) - { - for (int y = 0; y < imageHeight; y++) - { - int rgb = image.getRGB(x, y) & 0x00ffffff; - - if (rgb != 0x0) - { - String name = getEditorFrame().getObjectColorName(rgb); - if (name == null) - { - name = new String("Unknown"); - } - - data.add(new Data(name, rgb, x, y)); - } - } - } - } - } - - public void getDataFromObjectMap(ObjectMap objectMap) - { - data.clear(); - - for (int i = 0; i < objectMap.getObjects().size(); i++) - { - ObjShapeObject object = objectMap.getObjects().get(i); - - String name = getEditorFrame().getObjectColorName(object.getRGB()); - - if (name == null) - { - name = new String("Unknown"); - } - - data.add(new Data(name, object.getRGB(), object.getImageX(), object.getImageY())); - } - } - - private ObjectTablePanel getObjectTablePanel(ObjectMap objectMap) - { - if (objectTablePanel == null) - { - objectTablePanel = new ObjectTablePanel(objectMap); - objectTablePanel.setBounds(10, 64, 485, 255); - } - return objectTablePanel; - } - - public class ColorRenderer extends DefaultTableCellRenderer - { - public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, - boolean hasFocus, int row, int column) - { - Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); - JLabel label = (JLabel)c; - - if (column == 2) - { - int rgb = Integer.decode(value.toString()); - Color color = new Color((rgb >> 16) & 0xff, (rgb >> 8) & 0xff, rgb & 0xff); - label.setBackground(color); - if ((color.getRed()*0.299 + color.getGreen()*0.587 + color.getBlue()*0.114) > 186) - { - label.setForeground(Color.BLACK); - } - else - { - label.setForeground(Color.WHITE); - } - } - else - { - label.setBackground(Color.WHITE); - label.setForeground(Color.BLACK); - } - - return label; - } - } - - class ObjectTableModel extends AbstractTableModel - { - private final String[] columnNames = { null, "Name", "Color", "X", "Y" }; - private final Class[] columnClass = new Class[] - { - Integer.class, String.class, Integer.class, Integer.class, Integer.class - }; - private ObjectMap objectMap = null; - - ObjectTableModel(ObjectMap objectMap) - { - this.objectMap = objectMap; - getDataFromObjectMap(objectMap); - } - - public int getRowCount() - { - return data.size(); - } - - public int getColumnCount() - { - return columnNames.length; - } - - public String getColumnName(int columnIndex) - { - return columnNames[columnIndex]; - } - - public Class getColumnClass(int columnIndex) - { - return columnClass[columnIndex]; - } - - public boolean isCellEditable(int row, int columnIndex) - { - if (columnIndex == 1 || columnIndex == 3 || columnIndex == 4) - { - return true; - } - return false; - } - - public Object getValueAt(int rowIndex, int columnIndex) - { - Data datum = data.get(rowIndex); - - switch (columnIndex) - { - case 0: - return rowIndex + 1; - case 1: - return datum.name; - case 2: - return String.format("0x%06X", datum.color); - case 3: - return datum.x; - case 4: - return datum.y; - } - return null; - } - - public void setValueAt(Object value, int rowIndex, int columnIndex) - { - Data datum = data.get(rowIndex); - - switch (columnIndex) - { - case 1: - datum.name = (String) value; - fireTableCellUpdated(rowIndex, columnIndex); - - if (value.equals("Unknown")) - { - datum.color = objectMap.getObjects().get(rowIndex).getRGB(); - } - else - { - datum.color = getEditorFrame().getObjectColor(datum.name); - } - fireTableCellUpdated(rowIndex, columnIndex + 1); - break; - case 3: - datum.x = (Integer) value; - fireTableCellUpdated(rowIndex, columnIndex); - break; - case 4: - datum.y = (Integer) value; - fireTableCellUpdated(rowIndex, columnIndex); - break; - } - } - } - - public void setUpNameColumn(JTable table, TableColumn nameColumn, Set names) - { - //Set up the editor for the name cells. - JComboBox comboBox = new JComboBox(); - - Iterator it = names.iterator(); - while (it.hasNext()) - { - comboBox.addItem(it.next()); - } - - comboBox.addItem("Unknown"); - - nameColumn.setCellEditor(new DefaultCellEditor(comboBox)); - - //Set up tool tips for the name cells. - DefaultTableCellRenderer renderer = new DefaultTableCellRenderer(); - //renderer.setToolTipText("Click to change object name"); - nameColumn.setCellRenderer(renderer); - } - - class ObjectTablePanel extends JPanel - { - JTable table = null; - JScrollPane scrollPane = null; - ObjectTableModel model = null; - - public ObjectTablePanel(ObjectMap objectMap) - { - super(new GridLayout(1,0)); - - model = new ObjectTableModel(objectMap); - table = new JTable(model); - scrollPane = new JScrollPane(table); - table.getColumnModel().getColumn(0).setPreferredWidth(25); - table.setDefaultRenderer(Integer.class, new ColorRenderer()); - table.setAutoCreateRowSorter(true); - - Set names = getEditorFrame().getObjectColorNames(); - - setUpNameColumn(table, table.getColumnModel().getColumn(1), names); - - add(scrollPane); - } - - void dataChanged() - { - model.fireTableDataChanged(); - } - } - } - /** * */ @@ -1140,108 +585,12 @@ public class TerrainProperties extends PropertyPanel getEditorFrame().documentIsModified = true; } - Vector objectMaps = getEditorFrame().getObjectMaps(); - int minCount = Math.min(objectMaps.size(), tabbedPane.getTabCount()); - if (objectMaps.size() != tabbedPane.getTabCount()) - { - getEditorFrame().documentIsModified = true; - } - for (int i = 0; i < minCount; i++) - { - ObjectMap objectMap = objectMaps.elementAt(i); - ObjectMapPanel panel = (ObjectMapPanel) tabbedPane.getComponentAt(i); - if (isDifferent(panel.nameTextField.getText(), objectMap.getName(), stringResult)) - { - objectMap.setName(stringResult.getValue()); - getEditorFrame().documentIsModified = true; - } - if (isDifferent(panel.objectMapTextField.getText(), objectMap.getObjectMap(), stringResult)) - { - try - { - objectMap.setObjectMap(stringResult.getValue()); - } - catch (IOException e) - { - } - getEditorFrame().documentIsModified = true; - } + Component component1 = tabbedPane.getComponentAt(0); + ObjectMapProperties properties1 = (ObjectMapProperties)component1; + properties1.exit(); - Vector data = panel.getData(); - Vector objects = objectMap.getObjects(); - int minDataCount = Math.min(data.size(), objects.size()); - - if (data.size() != objects.size()) - { - getEditorFrame().documentIsModified = true; - } - for (int j = 0; j < minDataCount; j++) - { - ObjectMapPanel.Data datum = data.get(j); - ObjShapeObject object = objects.get(j); - - if (!datum.color.equals(object.getRGB())) - { - object.setRGB(datum.color); - getEditorFrame().documentIsModified = true; - } - - if (!datum.x.equals(object.getImageX())) - { - object.setImageX(datum.x); - getEditorFrame().documentIsModified = true; - } - - if (!datum.y.equals(object.getImageY())) - { - object.setImageY(datum.y); - getEditorFrame().documentIsModified = true; - } - } - if (data.size() < objects.size()) - { - // need to trim objects - while (objects.size() > data.size()) - { - objects.remove(objects.size() - 1); - } - } - else if (objects.size() < data.size()) - { - // need to add to objects - while (objects.size() < data.size()) - { - ObjectMapPanel.Data datum = data.get(objects.size()); - - objects.add(new ObjShapeObject(datum.color, datum.x, datum.y)); - } - } - } - if (objectMaps.size() > tabbedPane.getTabCount()) - { - // need to trim objectMaps - while (objectMaps.size() > tabbedPane.getTabCount()) - { - objectMaps.remove(objectMaps.size() - 1); - } - } - else if (objectMaps.size() < tabbedPane.getTabCount()) - { - // need to add to objectMaps - while (objectMaps.size() < tabbedPane.getTabCount()) - { - ObjectMapPanel panel = (ObjectMapPanel) tabbedPane.getComponentAt(objectMaps.size()); - ObjectMap objectMap = new ObjectMap(); - objectMap.setName(panel.nameTextField.getText()); - try - { - objectMap.setObjectMap(panel.objectMapTextField.getText()); - } - catch (IOException e) - { - } - objectMaps.add(objectMap); - } - } +// Component component2 = tabbedPane.getComponentAt(1); +// ReliefProperties properties2 = (ReliefProperties)component2; +// properties2.exit(); } } // @jve:decl-index=0:visual-constraint="10,10" diff --git a/src/tools/trackeditor/utils/Properties.java b/src/tools/trackeditor/utils/Properties.java index 537407ab6..590046d00 100644 --- a/src/tools/trackeditor/utils/Properties.java +++ b/src/tools/trackeditor/utils/Properties.java @@ -34,7 +34,7 @@ public class Properties private static Properties instance = new Properties(); private Vector propertiesListeners = new Vector(); public final String title = "sd2-trackeditor"; - public final String version = "1.2.10"; + public final String version = "1.2.11"; private String path; private double imageScale = 1; diff --git a/src/tools/trackeditor/utils/circuit/ObjShapeRelief.java b/src/tools/trackeditor/utils/circuit/ObjShapeRelief.java index 13f962d6e..02395b5f9 100644 --- a/src/tools/trackeditor/utils/circuit/ObjShapeRelief.java +++ b/src/tools/trackeditor/utils/circuit/ObjShapeRelief.java @@ -19,6 +19,13 @@ public class ObjShapeRelief extends Segment private LineType lineType; private Vector vertices = new Vector(); + public ObjShapeRelief() + { + super("relief"); + this.reliefType = ReliefType.Interior; + this.lineType = LineType.Polyline; + } + public ObjShapeRelief(ReliefType reliefType, LineType lineType, Vector vertices) { super("relief");