protected Component getUnknownMappedDataPanel(TaskObserver taskObserver) throws InterruptedException
    {
        taskObserver.taskProgress("Unknown Mapped Data", 0.1f);
        if (Thread.currentThread().isInterrupted())
            throw new InterruptedException("getUnknownMappedDataPanel() was interrupted.");

	    abstract class Function
	    {
	        abstract public Object getValue(int row, int col);
	    }

        class SubstitutingIncrementingTableModel extends AbstractTableModel
        {
            private Function function = null;
            
            public SubstitutingIncrementingTableModel(Function f)
            {
                super();
                this.function = f;
            }
            
            public int getColumnCount()
            {
                return 1 + 128;
            }

            public int getRowCount()
            {
                return 1 + 128;
            }

            public String getColumnName(int realColumnIndex)
            {
                int dataColumnIndex = realColumnIndex - 1;
                
                if (0 == realColumnIndex)  return null;
                
                return String.valueOf(dataColumnIndex);
            }
            
            public Object getValueAt(int realRowIndex, int realColumnIndex)
            {
                if (realRowIndex == 0)  return getColumnName(realColumnIndex);
                int dataRowIndex = realRowIndex - 1;
                
                int dataColumnIndex = realColumnIndex - 1;
                
                if (0 == realColumnIndex)  return String.valueOf(dataRowIndex);

                
                return getDataValueAt(dataRowIndex, dataColumnIndex);
            }

            public Object getDataValueAt(int dataRowIndex, int dataColumnIndex)
            {
                return function.getValue(dataRowIndex, dataColumnIndex);
            }
        }

        ResizingJTable shortValueMapTable = new ResizingJTable(new SubstitutingIncrementingTableModel(new Function()
                {
		            public Object getValue(int dataRowIndex, int dataColumnIndex)
		            {
		                short value = outdoorDataMap.getUnknownMapData().getUnknownShortDataAt(dataRowIndex, dataColumnIndex);
		                if (0 == value)  return null;
		                String v = String.valueOf(value);
		                switch (v.length())
		                {
		                    case 1:  return "000" + v;
		                    case 2:  return "00" + v;
		                    case 3:  return "0" + v;
		                    case 4:  return v;
		                    
		                    default: throw new RuntimeException("v[" + v + "].length() = " + v.length());
		                }
		            }
                }));
        
        JPanel unknownDataPanel = new JPanel();
        unknownDataPanel.setLayout(new BoxLayout(unknownDataPanel, BoxLayout.Y_AXIS));
        unknownDataPanel.add(makeNonStretchedPanelFor(new JLabel("See unknown data map tabs for visual representations.")));
        unknownDataPanel.add(makeNonStretchedPanelFor(new JLabel("# of Unknown Objects (after map table): 2? size = " + String.valueOf(outdoorDataMap.getUnknownMapData().getIdData().length / 2))));
        unknownDataPanel.add(makeNonStretchedPanelFor(shortValueMapTable));

        return unknownDataPanel;
    }