Start factoring out the file opening code.

Even when the goal was just viewing images, the Main file was becoming a bit
unwieldy.  Now that I'm trying to add some more functionality, it was time to
start cleaning it up.
1 files changed, 74 insertions(+), 75 deletions(-)

M src/main/java/jones/andrew/imageviewer/Main.java
M src/main/java/jones/andrew/imageviewer/Main.java +74 -75
@@ 1,7 1,3 @@ 
-/*
- * To change this template, choose Tools | Templates
- * and open the template in the editor.
- */
 
 package jones.andrew.imageviewer;
 

          
@@ 87,7 83,7 @@ public class Main extends JFrame {
 
     boolean useImageIO = false;
 
-    JImageReader imageFile = null;
+    JImageReader imageReader = null;
     
     FileExtensionFilter pcxFilter = new FileExtensionFilter(new String[]{"pcx"}, "PCX Files (.pcx)");
     FileExtensionFilter mspFilter = new FileExtensionFilter(new String[]{"msp"}, "Microsoft Paint files (.msp)");

          
@@ 150,18 146,18 @@ public class Main extends JFrame {
                     
                     FileFilter selectedFilter = saveFileChooser.getFileFilter();
                     if (selectedFilter == bmpFilter) {
-                        new BMPReader().exportImage((BufferedImage)imageFile.getImage(), fileName);
+                        new BMPReader().exportImage((BufferedImage)imageReader.getImage(), fileName);
                     }
                     else if (selectedFilter == godFilter) {
-                        new GodPaintReader(fileName).exportImage(imageFile.getImage(), fileName);
+                        new GodPaintReader(fileName).exportImage(imageReader.getImage(), fileName);
                     }
                     //HACK
                     //TODO: experimental.
                     else if (fileName.endsWith(".tga")) {
-                        new TGAReader().exportImage((BufferedImage)imageFile.getImage(), fileName);
+                        new TGAReader().exportImage((BufferedImage)imageReader.getImage(), fileName);
                     }
-                    else if (imageFile instanceof PCXReader) {
-                        PCXReader pcx = (PCXReader)imageFile;
+                    else if (imageReader instanceof PCXReader) {
+                        PCXReader pcx = (PCXReader)imageReader;
                         pcx.saveExistingPCX(fileName);
                     }
                 }

          
@@ 188,7 184,7 @@ public class Main extends JFrame {
                         logger.error("IOException when getting canonical path", e);
                     }
                     try {
-                        ImageIO.write(imageFile.getImage(), "png", new File(fileName));
+                        ImageIO.write(imageReader.getImage(), "png", new File(fileName));
                     }
                     catch(IOException ex) {
                         logger.error("Error saving with ImageIO", ex);

          
@@ 230,9 226,9 @@ public class Main extends JFrame {
 
             public void actionPerformed(java.awt.event.ActionEvent evt)
             {
-                if (imageFile == null)
+                if (imageReader == null)
                     return;
-                String metadata = imageFile.getMetadataSummary();
+                String metadata = imageReader.getMetadataSummary();
                 JOptionPane.showMessageDialog(null, metadata);
             }
         });

          
@@ 244,11 240,11 @@ public class Main extends JFrame {
 
             public void actionPerformed(java.awt.event.ActionEvent evt)
             {
-                if (imageFile == null)
+                if (imageReader == null)
                     return;
-                int w = imageFile.getWidth()/2;
-                int h = imageFile.getHeight()/2;
-                Image newImage = imageFile.getImage().getScaledInstance(w, h, Image.SCALE_DEFAULT);
+                int w = imageReader.getWidth()/2;
+                int h = imageReader.getHeight()/2;
+                Image newImage = imageReader.getImage().getScaledInstance(w, h, Image.SCALE_DEFAULT);
                 pnlPCXViewer.setPreferredSize(new Dimension(w, h));
                 pnlPCXViewer.revalidate();
                 pnlPCXViewer.setImage(newImage);

          
@@ 263,11 259,11 @@ public class Main extends JFrame {
 
             public void actionPerformed(java.awt.event.ActionEvent evt)
             {
-                if (imageFile == null)
+                if (imageReader == null)
                     return;
-                pnlPCXViewer.setPreferredSize(new Dimension(imageFile.getWidth(), imageFile.getHeight()));
+                pnlPCXViewer.setPreferredSize(new Dimension(imageReader.getWidth(), imageReader.getHeight()));
                 pnlPCXViewer.revalidate();
-                pnlPCXViewer.setImage(imageFile.getImage());
+                pnlPCXViewer.setImage(imageReader.getImage());
                 Graphics gphx = pnlPCXViewer.getGraphics();
                 pnlPCXViewer.update(gphx);
                 gphx.dispose();

          
@@ 280,11 276,11 @@ public class Main extends JFrame {
 
             public void actionPerformed(java.awt.event.ActionEvent evt)
             {
-                if (imageFile == null)
+                if (imageReader == null)
                     return;
-                int w = (int)(imageFile.getWidth()*1.5);
-                int h = (int)(imageFile.getHeight()*1.5);
-                Image newImage = imageFile.getImage().getScaledInstance(w, h, Image.SCALE_DEFAULT);
+                int w = (int)(imageReader.getWidth()*1.5);
+                int h = (int)(imageReader.getHeight()*1.5);
+                Image newImage = imageReader.getImage().getScaledInstance(w, h, Image.SCALE_DEFAULT);
                 pnlPCXViewer.setPreferredSize(new Dimension(w, h));
                 pnlPCXViewer.revalidate();
                 pnlPCXViewer.setImage(newImage);

          
@@ 300,11 296,11 @@ public class Main extends JFrame {
 
             public void actionPerformed(java.awt.event.ActionEvent evt)
             {
-                if (imageFile == null)
+                if (imageReader == null)
                     return;
-                int w = imageFile.getWidth()*2;
-                int h = imageFile.getHeight()*2;
-                Image newImage = imageFile.getImage().getScaledInstance(w, h, Image.SCALE_DEFAULT);
+                int w = imageReader.getWidth()*2;
+                int h = imageReader.getHeight()*2;
+                Image newImage = imageReader.getImage().getScaledInstance(w, h, Image.SCALE_DEFAULT);
                 pnlPCXViewer.setPreferredSize(new Dimension(w, h));
                 pnlPCXViewer.revalidate();
                 pnlPCXViewer.setImage(newImage);

          
@@ 409,21 405,17 @@ public class Main extends JFrame {
             try{
                 fileName = jFileChooser1.getSelectedFile().getCanonicalPath();
             }
-            catch(IOException e)
-            {
+            catch(IOException e) {
                 logger.error("IOException when getting canonical path", e);
             }
 
+            BufferedImage bi = null;
             if (useImageIO) {
                 try {
-                    BufferedImage bi = ImageIO.read(new File(fileName));
+                    bi = ImageIO.read(new File(fileName));
                     if (bi == null) {
                         JOptionPane.showMessageDialog(null, "The selected image could not be read.", "Could not read image", JOptionPane.ERROR_MESSAGE);
-                    }
-                    else {
-                        pnlPCXViewer.setPreferredSize(new Dimension(bi.getWidth(), bi.getHeight()));
-                        pnlPCXViewer.revalidate();
-                        pnlPCXViewer.setImage(bi);
+                        throw new RuntimeException("boom!");
                     }
                 }
                 catch(IOException ex) {

          
@@ 431,45 423,18 @@ public class Main extends JFrame {
                 }
             }
             else {
-                if (fileName.endsWith(".pcx") || fileName.endsWith(".PCX"))
-                    imageFile = new PCXReader(fileName);
-                else if (fileName.endsWith(".msp") || fileName.endsWith(".MSP"))
-                    imageFile = new MSPReader(fileName);
-                else if (fileName.endsWith(".ico") || fileName.endsWith(".ICO"))
-                    imageFile = new SunIconReader(fileName);
-                else if (fileName.endsWith(".bmp") || fileName.endsWith(".BMP"))
-                    imageFile = new BMPReader(fileName);
-                else if (fileName.endsWith(".tga") || fileName.endsWith(".TGA"))
-                    imageFile = new TGAReader(fileName);
-                else if (fileName.endsWith(".jpg") || fileName.endsWith(".JPG"))
-                    imageFile = new JFIFReader(fileName);
-                else if (fileName.endsWith(".god") || fileName.endsWith(".GOD"))
-                    imageFile = new GodPaintReader(fileName);
-                else if (fileName.endsWith(".trp") || fileName.endsWith(".TRP"))
-                    imageFile = new EggPaintReader(fileName);
-                else if (fileName.endsWith(".bld") || fileName.endsWith(".BLD"))
-                    imageFile = new MegaPaintBLDReader(fileName);
-                else if (fileName.toLowerCase().endsWith(".cut"))
-                    imageFile = new DrHaloReader(fileName);
-                else if (fileName.toLowerCase().endsWith(".epa"))
-                    imageFile = new AwardBIOSReader(fileName);
-                else if (fileName.toLowerCase().endsWith(".tru"))
-                    imageFile = new IndyPaintReader(fileName);
-                else if (fileName.toLowerCase().endsWith(".ftc"))
-                    imageFile = new FalconTrueColorReader(fileName);
+                getImageReaderByFileExtension(fileName);
                 try{
                     long now = System.nanoTime();
-                    imageFile.processFile();
+                    imageReader.processFile();
                     long end = System.nanoTime();
                     System.out.println("Import time: " + (end - now)/1000000 + " ms");
                 }
-                catch(IllegalDataException e)
-                {
+                catch(IllegalDataException e) {
                     logger.error(e.getMessage(), e);
                     JOptionPane.showMessageDialog(null, "This is not a valid file.  Details: " + e.getMessage());
                 }
-                catch(UnsupportedVariantException e)
-                {
+                catch(UnsupportedVariantException e) {
                     logger.error(e.getMessage(), e);
                     JOptionPane.showMessageDialog(null, "This type of file is not supported.  Details: " + e.getMessage());
                 }

          
@@ 482,11 447,16 @@ public class Main extends JFrame {
                     );
                     throw new RuntimeException(ex);
                 }
-                System.out.println(imageFile);
-                pnlPCXViewer.setPreferredSize(new Dimension(imageFile.getWidth(), imageFile.getHeight()));
-                pnlPCXViewer.revalidate();
-                pnlPCXViewer.setImage(imageFile.getImage());
+                System.out.println(imageReader);
+                bi = imageReader.getImage();
             }
+            
+            pnlPCXViewer.setPreferredSize(new Dimension(bi.getWidth(), bi.getHeight()));
+            pnlPCXViewer.revalidate();
+            pnlPCXViewer.setImage(bi);
+            
+            //Updating the graphics is necessary for the change to appear immediately
+            //Otherwise the old image (or part of it) may remain
             Graphics gphx = pnlPCXViewer.getGraphics();
             pnlPCXViewer.update(gphx);
             gphx.dispose();

          
@@ 495,9 465,38 @@ public class Main extends JFrame {
         }
     }
 
+    private void getImageReaderByFileExtension(String fileName) {
+        if (fileName.endsWith(".pcx") || fileName.endsWith(".PCX"))
+            imageReader = new PCXReader(fileName);
+        else if (fileName.endsWith(".msp") || fileName.endsWith(".MSP"))
+            imageReader = new MSPReader(fileName);
+        else if (fileName.endsWith(".ico") || fileName.endsWith(".ICO"))
+            imageReader = new SunIconReader(fileName);
+        else if (fileName.endsWith(".bmp") || fileName.endsWith(".BMP"))
+            imageReader = new BMPReader(fileName);
+        else if (fileName.endsWith(".tga") || fileName.endsWith(".TGA"))
+            imageReader = new TGAReader(fileName);
+        else if (fileName.endsWith(".jpg") || fileName.endsWith(".JPG"))
+            imageReader = new JFIFReader(fileName);
+        else if (fileName.endsWith(".god") || fileName.endsWith(".GOD"))
+            imageReader = new GodPaintReader(fileName);
+        else if (fileName.endsWith(".trp") || fileName.endsWith(".TRP"))
+            imageReader = new EggPaintReader(fileName);
+        else if (fileName.endsWith(".bld") || fileName.endsWith(".BLD"))
+            imageReader = new MegaPaintBLDReader(fileName);
+        else if (fileName.toLowerCase().endsWith(".cut"))
+            imageReader = new DrHaloReader(fileName);
+        else if (fileName.toLowerCase().endsWith(".epa"))
+            imageReader = new AwardBIOSReader(fileName);
+        else if (fileName.toLowerCase().endsWith(".tru"))
+            imageReader = new IndyPaintReader(fileName);
+        else if (fileName.toLowerCase().endsWith(".ftc"))
+            imageReader = new FalconTrueColorReader(fileName);
+    }
+
     private void customZoomAction()
     {
-        if (imageFile == null)
+        if (imageReader == null)
             return;
         double zoomLevel;
         final JDialog howMuch = new JDialog(this);

          
@@ 541,9 540,9 @@ public class Main extends JFrame {
 
         zoomLevel = zoomPercent/100.0;
 
-        int w = (int)(imageFile.getWidth()*zoomLevel);
-        int h = (int)(imageFile.getHeight()*zoomLevel);
-        Image newImage = imageFile.getImage().getScaledInstance(w, h, Image.SCALE_SMOOTH);
+        int w = (int)(imageReader.getWidth()*zoomLevel);
+        int h = (int)(imageReader.getHeight()*zoomLevel);
+        Image newImage = imageReader.getImage().getScaledInstance(w, h, Image.SCALE_SMOOTH);
         pnlPCXViewer.setPreferredSize(new Dimension(w, h));
         pnlPCXViewer.revalidate();
         pnlPCXViewer.setImage(newImage);