/* * Copyright (c) 2005 (Mike) Maurice Kienenberger (mkienenb@gmail.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ package org.gamenet.application.mm8leveleditor.dataSectionable; import java.awt.BorderLayout; import java.awt.Component; import java.awt.FlowLayout; import java.awt.GridLayout; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.Collections; import java.util.Iterator; import java.util.List; import javax.swing.BorderFactory; import javax.swing.BoxLayout; import javax.swing.JFormattedTextField; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.border.BevelBorder; import org.gamenet.application.mm8leveleditor.control.OutdoorFaceControl; import org.gamenet.application.mm8leveleditor.control.VertexControl; import org.gamenet.application.mm8leveleditor.data.mm6.outdoor.D3Object; import org.gamenet.application.mm8leveleditor.data.mm6.outdoor.IntVertex; import org.gamenet.application.mm8leveleditor.data.mm6.outdoor.OutdoorFace; import org.gamenet.swing.controls.ComparativeTableControl; import org.gamenet.swing.controls.DataSection; import org.gamenet.swing.controls.DataSectionable; import org.gamenet.swing.controls.Vertex3DTextFieldPanel; import org.gamenet.swing.controls.Vertex3DValueHolder; import org.gamenet.util.TaskObserver; public class D3ObjectDataSectionable extends BaseDataSectionable implements DataSectionable { private D3Object d3Object = null; public D3ObjectDataSectionable(D3Object srcD3Object) { super(); this.d3Object = srcD3Object; } public Object getData() { return d3Object; } public Component getInfoPanel(TaskObserver taskObserver) throws InterruptedException { taskObserver.taskProgress("Info", 0.1f); if (Thread.currentThread().isInterrupted()) throw new InterruptedException("getInfoPanel() was interrupted."); JPanel infoPanel = new JPanel(); infoPanel.setLayout(new BoxLayout(infoPanel, BoxLayout.Y_AXIS)); infoPanel.setBorder(new BevelBorder(BevelBorder.LOWERED)); JFormattedTextField name1TextField = new JFormattedTextField(d3Object.getName1()); name1TextField.setColumns(32); JFormattedTextField name2TextField = new JFormattedTextField(d3Object.getName2()); name2TextField.setColumns(36); name1TextField.addPropertyChangeListener("value", new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent e) { d3Object.setName1((String)((JFormattedTextField)e.getSource()).getValue()); } }); name2TextField.addPropertyChangeListener("value", new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent e) { d3Object.setName2((String)((JFormattedTextField)e.getSource()).getValue()); } }); //Lay out the labels in a panel. JPanel labelPane = new JPanel(new GridLayout(0,1)); labelPane.add(new JLabel("Name1: ")); labelPane.add(new JLabel("Name2: ")); labelPane.add(new JLabel("Offset: ")); labelPane.add(new JLabel("# of vertexes: ")); labelPane.add(new JLabel("Vertexes offset: ")); labelPane.add(new JLabel("# of faces: ")); labelPane.add(new JLabel("Faces offset: ")); //Layout the text fields in a panel. JPanel fieldPane = new JPanel(new GridLayout(0,1)); fieldPane.add(name1TextField); fieldPane.add(name2TextField); fieldPane.add(new JLabel(String.valueOf(d3Object.getOffset()))); fieldPane.add(new JLabel(String.valueOf(d3Object.getVertexList().size()))); fieldPane.add(new JLabel(String.valueOf(d3Object.getVertexesOffset()))); fieldPane.add(new JLabel(String.valueOf(d3Object.getFacetList().size()))); fieldPane.add(new JLabel(String.valueOf(d3Object.getFacesOffset()))); //Put the panels in this panel, labels on left, //text fields on right. JPanel labelAndFieldPanel = new JPanel(new BorderLayout()); labelAndFieldPanel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); labelAndFieldPanel.add(labelPane, BorderLayout.CENTER); labelAndFieldPanel.add(fieldPane, BorderLayout.LINE_END); JPanel wrappingLabelAndFieldPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); wrappingLabelAndFieldPanel.add(labelAndFieldPanel); infoPanel.add(wrappingLabelAndFieldPanel); JPanel vertexMinAttributePanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); vertexMinAttributePanel.add(new JLabel("IntVertex Minimum (")); vertexMinAttributePanel.add(new Vertex3DTextFieldPanel(new Vertex3DValueHolder() { public int getX() { return d3Object.getXMin(); } public void setX(int x) { d3Object.setXMin(x); } public int getY() { return d3Object.getYMin(); } public void setY(int y) { d3Object.setYMin(y); } public int getZ() { return d3Object.getZMin(); } public void setZ(int z) { d3Object.setZMin(z); } })); JFormattedTextField xMinTextField = new JFormattedTextField(new Integer(d3Object.getXMin())); xMinTextField.setColumns(5); xMinTextField.addPropertyChangeListener("value", new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent e) { d3Object.setXMin(((Number)((JFormattedTextField)e.getSource()).getValue()).intValue()); } }); vertexMinAttributePanel.add(xMinTextField); vertexMinAttributePanel.add(new JLabel(",")); JFormattedTextField yMinTextField = new JFormattedTextField(new Integer(d3Object.getYMin())); yMinTextField.setColumns(5); yMinTextField.addPropertyChangeListener("value", new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent e) { d3Object.setYMin(((Number)((JFormattedTextField)e.getSource()).getValue()).intValue()); } }); vertexMinAttributePanel.add(yMinTextField); vertexMinAttributePanel.add(new JLabel(",")); JFormattedTextField heightMinTextField = new JFormattedTextField(new Integer(d3Object.getZMin())); heightMinTextField.setColumns(3); heightMinTextField.addPropertyChangeListener("value", new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent e) { d3Object.setZMin(((Number)((JFormattedTextField)e.getSource()).getValue()).intValue()); } }); vertexMinAttributePanel.add(heightMinTextField); vertexMinAttributePanel.add(new JLabel(")")); infoPanel.add(vertexMinAttributePanel); return infoPanel; } protected Component getUnknownsPanel(TaskObserver taskObserver) throws InterruptedException { JPanel unknownsPanel = new JPanel(); unknownsPanel.setLayout(new BoxLayout(unknownsPanel, BoxLayout.Y_AXIS)); unknownsPanel.setBorder(new BevelBorder(BevelBorder.LOWERED)); final ComparativeTableControl dataComparativeByteDataTableControl; dataComparativeByteDataTableControl = new ComparativeTableControl(D3Object.getOffsetList(), D3Object.getComparativeDataSource(Collections.singletonList(d3Object))); unknownsPanel.add(makeNonStretchedPanelFor(new JLabel(" D3Object Unknowns: "))); unknownsPanel.add(dataComparativeByteDataTableControl); return unknownsPanel; } public IntVertex createNewVertex() { int x = 0; int y = 0; int z = 0; return new IntVertex(x, y, z); } public OutdoorFace createNewFace() { short ordering = 0; String bitmapName = ""; return new OutdoorFace(ordering, bitmapName); } public Component getComponentForDataSection(TaskObserver taskObserver, String dataSectionName) throws InterruptedException { if (DATA_SECTION_INFO == dataSectionName) { return getInfoPanel(taskObserver); } else if (DATA_SECTION_UNKNOWNS == dataSectionName) { return getUnknownsPanel(taskObserver); } return super.getComponent(dataSectionName, taskObserver); } public Component getListComponentForDataSection(TaskObserver taskObserver, String dataSectionName, List list, Iterator indexIterator) throws InterruptedException { return super.getListComponent(dataSectionName, taskObserver, list, indexIterator); } public static final String DATA_SECTION_INFO = "Info"; public static final String DATA_SECTION_VERTEXES = "Vertexes"; public static final String DATA_SECTION_FACES = "Faces"; public static final String DATA_SECTION_UNKNOWNS = "Unknowns"; public static DataSection[] getDataSections() { return new DataSection[] { new DataSection(DATA_SECTION_INFO), new DataSection(DATA_SECTION_VERTEXES, IntVertex.class, OutdoorVertexDataSectionable.class), new DataSection(DATA_SECTION_FACES, OutdoorFace.class, OutdoorFaceDataSectionable.class), new DataSection(DATA_SECTION_UNKNOWNS) }; } public DataSection[] getStaticDataSections() { return getDataSections(); } public Object getDataForDataSection(DataSection dataSection) { if (DATA_SECTION_INFO == dataSection.getDataSectionName()) { return null; } else if (DATA_SECTION_VERTEXES == dataSection.getDataSectionName()) { return d3Object.getVertexList(); } else if (DATA_SECTION_FACES == dataSection.getDataSectionName()) { return d3Object.getFacetList(); } else if (DATA_SECTION_UNKNOWNS == dataSection.getDataSectionName()) { return d3Object.getRemainingData(); } else throw new IllegalStateException("No data sections: " + dataSection); } public DataTypeInfo getDataTypeInfo(String dataSectionName) { if (dataSectionName == DATA_SECTION_VERTEXES) { return vertexDataTypeInfo; } if (dataSectionName == DATA_SECTION_FACES) { return facetDataTypeInfo; } else throw new IllegalStateException("No data sections: " + dataSectionName); } private DataTypeInfo vertexDataTypeInfo = new AbstractDataTypeInfo() { public String getDataTypeNameSingular() { return "Vertex"; } public String getDataTypeNamePlural() { return "Vertexes"; } public List getDataList() { return d3Object.getVertexList(); } public List getOffsetList() { return null; } public ComparativeTableControl.DataSource getComparativeDataSource() { return null; } public Component getDataControl(int dataIndex) { return new VertexControl((IntVertex)getDataList().get(dataIndex)); } public void addDataAtIndexFromComponent(int index, Component component) { getDataList().add(index, ((VertexControl)component).getVertex()); } public Component createNewDataControl() { return new VertexControl(createNewVertex()); } }; private DataTypeInfo facetDataTypeInfo = new AbstractDataTypeInfo() { public String getDataTypeNameSingular() { return "Facet"; } public String getDataTypeNamePlural() { return "Facets"; } public List getDataList() { return d3Object.getFacetList(); } public List getOffsetList() { return OutdoorFace.getOffsetList(); } public ComparativeTableControl.DataSource getComparativeDataSource() { return OutdoorFace.getComparativeDataSource(getDataList()); } public Component getDataControl(int dataIndex) { return new OutdoorFaceControl((OutdoorFace)getDataList().get(dataIndex)); } public void addDataAtIndexFromComponent(int index, Component component) { getDataList().add(index, ((OutdoorFaceControl)component).getFace()); } public Component createNewDataControl() { return new OutdoorFaceControl(createNewFace()); } }; }