/* * 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.Component; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.swing.table.AbstractTableModel; import org.gamenet.application.mm8leveleditor.control.DsftBinIndexControl; import org.gamenet.application.mm8leveleditor.data.DsftBin; import org.gamenet.application.mm8leveleditor.data.DsftBinSprite; import org.gamenet.application.mm8leveleditor.data.DsftBinSpriteSet; import org.gamenet.swing.controls.ComparativeTableControl; import org.gamenet.swing.controls.DataSection; import org.gamenet.swing.controls.DataSectionable; import org.gamenet.swing.controls.ResizingJTable; import org.gamenet.util.TaskObserver; public class DsftBinDataSectionable extends BaseDataSectionable implements DataSectionable { private DsftBin dsftBin = null; public DsftBinDataSectionable(DsftBin srcDsftBin) { super(); this.dsftBin = srcDsftBin; } public Component getListComponentForDataSection(TaskObserver taskObserver, String dataSectionName, List list, Iterator indexIterator) throws InterruptedException { List indexNumberList = listForIterator(indexIterator); Integer indexNumber = (Integer)indexNumberList.get(0); int index = indexNumber.intValue(); if (dataSectionName == DATA_SECTION_DSFT_SPRITE_SETS) { return getDsftBinSpriteSetPanel(taskObserver, indexNumberList); } else if (dataSectionName == DATA_SECTION_INDEXES) { if (1 == indexNumberList.size()) { return new DsftBinIndexControl(list, index); } else { return getIndexPanel(taskObserver, indexNumberList); } } else throw new IllegalStateException("DataSection " + dataSectionName); } public Component getComponentForDataSection(TaskObserver taskObserver, String dataSectionName) throws InterruptedException { if (dataSectionName == DATA_SECTION_DSFT_SPRITE_SETS) { return getDsftBinSpriteSetPanel(taskObserver, null); } else if (dataSectionName == DATA_SECTION_INDEXES) { return getIndexPanel(taskObserver, null); } else throw new IllegalStateException("DataSection " + dataSectionName); } public Component getIndexPanel(TaskObserver taskObserver, List indexNumberList) throws InterruptedException { taskObserver.taskProgress("Indexes", 0.1f); if (Thread.currentThread().isInterrupted()) throw new InterruptedException("getIndexPanel() was interrupted."); final List dsftBinIndexList = dsftBin.getDsftBinIndexList(); if (null == indexNumberList) indexNumberList = createListForSequence(dsftBinIndexList.size()); class DsftBinIndexHolder { private int realIndex; public DsftBinIndexHolder(int realIndex) { this.realIndex = realIndex; } public int getRealIndex() { return realIndex; } public Integer getDsftBinIndex() { return (Integer)dsftBinIndexList.get(realIndex); } public void setDsftBinIndex(Integer dsftBinIndex) { dsftBinIndexList.remove(realIndex); dsftBinIndexList.add(realIndex, dsftBinIndex); } } final List finalizedPartialDsftBinIndexList = new ArrayList(); Iterator indexIterator = indexNumberList.iterator(); while (indexIterator.hasNext()) { Integer indexInteger = (Integer) indexIterator.next(); int dsftBinIndexIndex = indexInteger.intValue(); DsftBinIndexHolder dsftBinIndexHolder = new DsftBinIndexHolder(dsftBinIndexIndex); finalizedPartialDsftBinIndexList.add(dsftBinIndexHolder); } ResizingJTable indexTable = new ResizingJTable(new AbstractTableModel() { public int getColumnCount() { return 2; } public int getRowCount() { return finalizedPartialDsftBinIndexList.size(); } public boolean isCellEditable(int rowIndex, int columnIndex) { return (1 == columnIndex); } public Object getValueAt(int rowIndex, int columnIndex) { if (0 == columnIndex) return new Integer(rowIndex); DsftBinIndexHolder dsftBinIndexHolder = (DsftBinIndexHolder)finalizedPartialDsftBinIndexList.get(rowIndex); return dsftBinIndexHolder.getDsftBinIndex(); } public void setValueAt(Object aValue, int rowIndex, int columnIndex) { DsftBinIndexHolder dsftBinIndexHolder = (DsftBinIndexHolder)finalizedPartialDsftBinIndexList.get(rowIndex); dsftBinIndexHolder.setDsftBinIndex(new Integer((String)aValue)); } }); return indexTable; } public Component getDsftBinSpriteSetPanel(TaskObserver taskObserver, List indexNumberList) throws InterruptedException { taskObserver.taskProgress("DsftBinSpriteSets", 0.1f); if (Thread.currentThread().isInterrupted()) throw new InterruptedException("getDsftBinSpriteSetPanel() was interrupted."); if (null == indexNumberList) indexNumberList = createListForSequence(dsftBin.getComparativeDataSource().getRowCount()); final Map realSpriteBaseIndexHashMap = new HashMap(); List dsftBinSpriteSetList = dsftBin.getDsftBinSpriteSetList(); int spriteIndex = 0; for (int spriteSetIndex = 0; spriteSetIndex < dsftBinSpriteSetList.size(); spriteSetIndex++) { DsftBinSpriteSet dsftBinSpriteSet = (DsftBinSpriteSet)dsftBinSpriteSetList.get(spriteSetIndex); realSpriteBaseIndexHashMap.put(new Integer(spriteSetIndex), new Integer(spriteIndex)); DsftBinSprite dsftBinSpriteArray[] = dsftBinSpriteSet.getDsftBinSpriteArray(); spriteIndex += dsftBinSpriteArray.length; } final Map realSpriteSetHashMap = new HashMap(); final Map realSpriteSetIndexHashMap = new HashMap(); final Map realSpriteIndexHashMap = new HashMap(); final Map adjustedDataRowHashMap = new HashMap(); int dataRow = 0; Iterator indexIterator = indexNumberList.iterator(); while (indexIterator.hasNext()) { Integer indexInteger = (Integer) indexIterator.next(); int dsftBinSpriteSetListIndex = indexInteger.intValue(); DsftBinSpriteSet dsftBinSpriteSet = (DsftBinSpriteSet)dsftBinSpriteSetList.get(dsftBinSpriteSetListIndex); DsftBinSprite dsftBinSpriteArray[] = dsftBinSpriteSet.getDsftBinSpriteArray(); for (int i = 0; i < dsftBinSpriteArray.length; i++) { realSpriteSetHashMap.put(new Integer(dataRow), dsftBinSpriteSet); realSpriteSetIndexHashMap.put(new Integer(dataRow), new Integer(dsftBinSpriteSetListIndex)); realSpriteIndexHashMap.put(new Integer(dataRow), new Integer(((Integer)realSpriteBaseIndexHashMap.get(new Integer(dsftBinSpriteSetListIndex))).intValue() + i)); adjustedDataRowHashMap.put(new Integer(dataRow), new Integer(i)); dataRow++; } } ComparativeTableControl.DataSource partialComparativeDataSource = new ComparativeTableControl.DataSource() { public int getRowCount() { return adjustedDataRowHashMap.size(); } public byte[] getData(int dataRow) { Integer dataRowNumber = new Integer(dataRow); Integer adjustedDataRowNumber = (Integer)adjustedDataRowHashMap.get(dataRowNumber); int adjustedDataRow = adjustedDataRowNumber.intValue(); DsftBinSpriteSet dsftBinSpriteSet = (DsftBinSpriteSet)realSpriteSetHashMap.get(dataRowNumber); return dsftBinSpriteSet.getComparativeDataSource().getData(adjustedDataRow); } public int getAdjustedDataRowIndex(int dataRow) { Integer dataRowNumber = new Integer(dataRow); return ((Integer)realSpriteIndexHashMap.get(dataRowNumber)).intValue(); } public String getIdentifier(int dataRow) { Integer dataRowNumber = new Integer(dataRow); Integer adjustedDataRowNumber = (Integer)adjustedDataRowHashMap.get(dataRowNumber); Integer realSpriteSetIndexNumber = (Integer)realSpriteSetIndexHashMap.get(dataRowNumber); int adjustedDataRow = adjustedDataRowNumber.intValue(); DsftBinSpriteSet dsftBinSpriteSet = (DsftBinSpriteSet)realSpriteSetHashMap.get(dataRowNumber); return "Set #" + realSpriteSetIndexNumber + "." + dsftBinSpriteSet.getComparativeDataSource().getIdentifier(adjustedDataRow); } public int getOffset(int dataRow) { Integer dataRowNumber = new Integer(dataRow); Integer adjustedDataRowNumber = (Integer)adjustedDataRowHashMap.get(dataRowNumber); int adjustedDataRow = adjustedDataRowNumber.intValue(); DsftBinSpriteSet dsftBinSpriteSet = (DsftBinSpriteSet)realSpriteSetHashMap.get(dataRowNumber); return dsftBinSpriteSet.getComparativeDataSource().getOffset(adjustedDataRow); } }; ComparativeTableControl dsftCBDTC = new ComparativeTableControl(dsftBin.getOffsetList(), partialComparativeDataSource); return dsftCBDTC; } public DataTypeInfo getDataTypeInfo(String dataSectionName) { // if (dataSectionName == DATA_SECTION_VERTEXES) { return vertexDataTypeInfo; } // else if (dataSectionName == DATA_SECTION_FACETS) { return facetDataTypeInfo; } throw new IllegalStateException("DataSection " + dataSectionName); } public Object getData() { return dsftBin; } public static final String DATA_SECTION_DSFT_SPRITE_SETS = "Sprite Sets"; public static final String DATA_SECTION_INDEXES = "Index"; public static DataSection[] getDataSections() { return new DataSection[] { new DataSection(DATA_SECTION_DSFT_SPRITE_SETS, DsftBinSpriteSet.class, DsftBinSpriteSetDataSectionable.class), new DataSection(DATA_SECTION_INDEXES) }; } public DataSection[] getStaticDataSections() { return getDataSections(); } public Object getDataForDataSection(DataSection dataSection) { if (DATA_SECTION_DSFT_SPRITE_SETS == dataSection.getDataSectionName()) { return dsftBin.getDsftBinSpriteSetList(); } else if (DATA_SECTION_INDEXES == dataSection.getDataSectionName()) { return dsftBin.getDsftBinIndexList(); } else throw new IllegalStateException("DataSection " + dataSection.getDataSectionName()); } }