public Component getComponentFor(LodResource lodResource, TaskObserver taskObserver) throws InterruptedException
    {
        this.sourceLodResource = lodResource;
        
        taskObserver.taskProgress(lodResource.getName(), 1f / (float)taskObserver.getRange());

        JPanel panel = new JPanel(new BorderLayout());
        JTextArea description = new JTextArea(lodResource.getTextDescription());
        panel.add(description, BorderLayout.PAGE_START);
 
        taskObserver.taskProgress(lodResource.getName(), 2f / (float)taskObserver.getRange());

        this.sourceDataCache = null;
        try
        {
            this.sourceDataCache = lodResource.getData();
        }
        catch (IOException anIOException)
        {
            Throwable throwable = new Throwable("Unable to extract data.", anIOException);
            throwable.printStackTrace();
            StringWriter stringWriter = new StringWriter();
            PrintWriter printWriter = new PrintWriter(stringWriter, true);
            throwable.printStackTrace(printWriter);
            
            Component component = new JTextArea(stringWriter.toString());

            panel.add(component, BorderLayout.CENTER);
            return panel;
        }
        
        taskObserver.taskProgress(lodResource.getName(), 0.7f);
        if (Thread.currentThread().isInterrupted())
            throw new InterruptedException("OdmHandler.getComponentFor() was interrupted.");

        if (OutdoorDataMap.checkDataIntegrity(GameVersion.MM6, sourceDataCache, 0, sourceDataCache.length))
        {
            odm = new OutdoorDataMap(GameVersion.MM6, this.sourceDataCache);
        }
        else if (OutdoorDataMap.checkDataIntegrity(GameVersion.MM7, sourceDataCache, 0, sourceDataCache.length))
        {
            odm = new OutdoorDataMap(GameVersion.MM7, this.sourceDataCache);
        }
        else if (OutdoorDataMap.checkDataIntegrity(GameVersion.MM8, sourceDataCache, 0, sourceDataCache.length))
        {
            odm = new OutdoorDataMap(GameVersion.MM8, this.sourceDataCache);
        }
        else
        {
            throw new UnsupportedFileFormatException("Not an expected mm6, mm7, or mm8 odm format.");
        }

        taskObserver.taskProgress(lodResource.getName(), 0.75f);
        if (Thread.currentThread().isInterrupted())
            throw new InterruptedException("OdmHandler.getComponentFor() was interrupted.");

        panel.add(new OutdoorDataMapControl(odm), BorderLayout.CENTER);
		
		return panel;
    }