public ComparativeTableControl.DataSource getComparativeDataSource()
    {
        return new ComparativeTableControl.DataSource()
        {
            public int getRowCount()
            {
                int rowCount = 0;
                
                for (int dsftBinIndex = 0; dsftBinIndex < dsftBinSpriteSetList.size();  ++dsftBinIndex)
                {
                    DsftBinSpriteSet dsftBin = (DsftBinSpriteSet)dsftBinSpriteSetList.get(dsftBinIndex);
                    DsftBinSprite dsftBinSpriteArray[] = dsftBin.getDsftBinSpriteArray();
                    rowCount += dsftBinSpriteArray.length;
                }
                return rowCount;
            }

            public byte[] getData(int dataRow)
            {
                int currentRow = 0;
                
                for (int dsftBinIndex = 0; dsftBinIndex < dsftBinSpriteSetList.size();  ++dsftBinIndex)
                {
                    DsftBinSpriteSet dsftBin = (DsftBinSpriteSet)dsftBinSpriteSetList.get(dsftBinIndex);
                    DsftBinSprite dsftBinSpriteArray[] = dsftBin.getDsftBinSpriteArray();

                    for (int dsftBinSpriteIndex = 0; dsftBinSpriteIndex < dsftBinSpriteArray.length;  ++dsftBinSpriteIndex)
                    {
                        if (dataRow == currentRow)
                        {
                            return dsftBinSpriteArray[dsftBinSpriteIndex].getData();
                        }
                        else
                        {
                            ++currentRow;
                        }
                    }
                }
                
                throw new RuntimeException("Should never reach here");
            }

            public int getAdjustedDataRowIndex(int dataRow)
            {
                return dataRow;
            }
            
            public String getIdentifier(int dataRow)
            {
                int currentRow = 0;
                
                for (int dsftBinIndex = 0; dsftBinIndex < dsftBinSpriteSetList.size();  ++dsftBinIndex)
                {
                    DsftBinSpriteSet dsftBin = (DsftBinSpriteSet)dsftBinSpriteSetList.get(dsftBinIndex);
                    DsftBinSprite dsftBinSpriteArray[] = dsftBin.getDsftBinSpriteArray();

                    for (int dsftBinSpriteIndex = 0; dsftBinSpriteIndex < dsftBinSpriteArray.length;  ++dsftBinSpriteIndex)
                    {
                        if (dataRow == currentRow)
                        {
                            return String.valueOf(dsftBinIndex) + "." + String.valueOf(dsftBinSpriteIndex) + ": " + ((dsftBinSpriteArray[dsftBinSpriteIndex].getSetName().length() == 0) ? "     " : dsftBinSpriteArray[dsftBinSpriteIndex].getSetName()) + "." + dsftBinSpriteArray[dsftBinSpriteIndex].getSpriteName();
                        }
                        else
                        {
                            ++currentRow;
                        }
                    }
                }
                
                throw new RuntimeException("Should never reach here");
            }

            public int getOffset(int dataRow)
            {
                return 0;
            }
        };
    }