diff --git a/uk/ac/sanger/artemis/components/FileViewer.java b/uk/ac/sanger/artemis/components/FileViewer.java
index 02ce14a9f6918404d4de3c135f808f6f9a3efea8..e139f6bc0a255f22426c3df3082bae410ea23819 100644
--- a/uk/ac/sanger/artemis/components/FileViewer.java
+++ b/uk/ac/sanger/artemis/components/FileViewer.java
@@ -20,7 +20,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  *
- * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/components/FileViewer.java,v 1.5 2007-02-28 15:51:25 tjc Exp $
+ * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/components/FileViewer.java,v 1.6 2007-03-22 13:41:31 tjc Exp $
  */
 
 package uk.ac.sanger.artemis.components;
@@ -30,17 +30,26 @@ import java.awt.Color;
 import java.awt.Dimension;
 import java.awt.Font;
 import java.awt.Point;
+import java.awt.Rectangle;
 import java.awt.Toolkit;
 import java.awt.event.*;
 import java.io.Reader;
 import java.io.BufferedReader;
 import java.io.IOException;
+import java.util.Hashtable;
 
 import javax.swing.JButton;
 import javax.swing.JFrame;
 import javax.swing.JPanel;
 import javax.swing.JScrollPane;
-import javax.swing.JTextArea;
+import javax.swing.JTextPane;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Document;
+import javax.swing.text.MutableAttributeSet;
+import javax.swing.text.SimpleAttributeSet;
+import javax.swing.text.StyleConstants;
+
+import org.apache.log4j.Level;
 
 import uk.ac.sanger.artemis.Options;
 
@@ -50,7 +59,7 @@ import uk.ac.sanger.artemis.Options;
  *  be viewed.
  *
  *  @author Kim Rutherford
- *  @version $Id: FileViewer.java,v 1.5 2007-02-28 15:51:25 tjc Exp $
+ *  @version $Id: FileViewer.java,v 1.6 2007-03-22 13:41:31 tjc Exp $
  *
  **/
 
@@ -63,7 +72,9 @@ public class FileViewer extends JFrame
   private JPanel button_panel;
 
   /** The main component we use for displaying the file. */
-  private JTextArea text_area = null;
+  private JTextPane textPane = null;
+
+  private Hashtable fontAttributes;
 
   /**
    *  The size of the last FileViewer JFrame to be resized.  When a new
@@ -102,16 +113,34 @@ public class FileViewer extends JFrame
     final Font font = Options.getOptions().getFont();
     setFont(font);
 
-    text_area = new JTextArea();
+    // ensure wrapping is turned off
+    textPane = new JTextPane()
+    {
+      /** */
+      private static final long serialVersionUID = 1L;
+
+      public void setSize(Dimension d)
+      {
+        if (d.width < getParent().getSize().width)
+          d.width = getParent().getSize().width;
+ 
+        super.setSize(d);
+      }
+ 
+      public boolean getScrollableTracksViewportWidth()
+      {
+        return false;
+      }
+    };
     final Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
     
-    JScrollPane scroller = new JScrollPane(text_area);
+    JScrollPane scroller = new JScrollPane(textPane);
     scroller.setPreferredSize(new Dimension((int)screen.getWidth()/2,
                                             (int)screen.getHeight()/2));
-    text_area.setEditable(false);
-    text_area.setFont(font);
-    text_area.setBackground(Color.white);
-
+    textPane.setEditable(false);
+    textPane.setFont(font);
+    textPane.setBackground(Color.white);
+    
     getContentPane().add(scroller, "Center");
 
     button_panel = new JPanel();
@@ -122,7 +151,7 @@ public class FileViewer extends JFrame
     {
       public void actionPerformed(ActionEvent e) 
       {
-        dispose();
+        setVisible(false);
       }
     });
     button_panel.add(close_button);
@@ -131,7 +160,7 @@ public class FileViewer extends JFrame
     {
       public void windowClosing(WindowEvent event) 
       {
-        dispose();
+        setVisible(false);
       }
     });
 
@@ -176,14 +205,16 @@ public class FileViewer extends JFrame
     }
     
     setVisible(visible);
+    createDefaultFontAttributes();
   }
 
+  
   /**
    *  Clear the viewer window.
    **/
   protected void clear()  
   {
-    text_area.setText("");
+    textPane.setText("");
   }
 
   /**
@@ -224,8 +255,8 @@ public class FileViewer extends JFrame
     buffered_reader.close();
 
     final String new_text = line_buffer.toString();
-    text_area.setText(new_text);
-    text_area.setCaretPosition(0);
+    textPane.setText(new_text);
+    textPane.setCaretPosition(0);
   }
 
   /**
@@ -234,10 +265,10 @@ public class FileViewer extends JFrame
    **/
   protected void setText(String read_string) 
   {
-    if(!read_string.equals(text_area.getText())) 
+    if(!read_string.equals(textPane.getText())) 
     {
-      text_area.setText(read_string);
-      text_area.setCaretPosition(0);
+      textPane.setText(read_string);
+      textPane.setCaretPosition(0);
     }
   }
 
@@ -248,16 +279,63 @@ public class FileViewer extends JFrame
    **/
   protected void appendString(String read_string) 
   {
-    text_area.append(read_string);
-    text_area.getCaret().setDot(0);
+    Document doc = textPane.getStyledDocument();
+    
+    final Level level;
+    if(read_string.indexOf("FATAL") > -1)
+      level = Level.FATAL;
+    else if(read_string.indexOf("ERROR") > -1)
+      level = Level.ERROR;
+    else if(read_string.indexOf("WARN") > -1)
+      level = Level.WARN;
+    else if(read_string.indexOf("INFO") > -1)
+      level = Level.INFO;
+    else
+      level = Level.DEBUG;
+    
+    try
+    {
+      doc.insertString(doc.getLength(), read_string, 
+          (MutableAttributeSet)fontAttributes.get(level));
+      textPane.setCaretPosition(doc.getLength());
+    }
+    catch(BadLocationException e)
+    {
+      e.printStackTrace();
+    }
   }
 
+  private void createDefaultFontAttributes() 
+  {
+    Level[] prio = { Level.FATAL, Level.ERROR, 
+           Level.WARN, Level.INFO, Level.DEBUG };
+
+    fontAttributes = new Hashtable();
+    for (int i=0; i<prio.length;i++) 
+    {
+      MutableAttributeSet att = new SimpleAttributeSet();
+      fontAttributes.put(prio[i], att);
+    }
+
+    setTextColor(Level.FATAL, Color.red);
+    setTextColor(Level.ERROR, Color.magenta);
+    setTextColor(Level.WARN, Color.orange);
+    setTextColor(Level.INFO, Color.blue);
+    setTextColor(Level.DEBUG, Color.blue);
+  }
+  
+  void setTextColor(Level p, Color c) 
+  {
+    StyleConstants.setForeground(
+          (MutableAttributeSet)fontAttributes.get(p),c);
+  }
+  
   /**
    *  Return a String containing the text that this component is displaying.
    **/
   protected String getText() 
   {
-    return getTextArea().getText();
+    return textPane.getText();
   }
 
   /**
@@ -273,13 +351,6 @@ public class FileViewer extends JFrame
     super.dispose();
   }
 
-  /**
-   *  return the TextArea component from this FileViewer.
-   **/
-  protected JTextArea getTextArea() 
-  {
-    return text_area;
-  }
 
   /**
    *  Return the JPanel containing the close button of this FileViewer.
@@ -289,4 +360,24 @@ public class FileViewer extends JFrame
     return button_panel;
   }
 
+  /**
+   * 
+   * @return
+   */
+  protected int getLineCount()
+  {
+    int offset = textPane.getDocument().getLength();
+    Rectangle r;
+    try
+    {
+      r = textPane.modelToView( offset );
+    }
+    catch(Exception e)
+    {
+      return 0;
+    }
+    int lineHeight = textPane.getFontMetrics( textPane.getFont() ).getHeight();
+
+    return (int) r.y/lineHeight;
+  }
 }
diff --git a/uk/ac/sanger/artemis/components/LogViewer.java b/uk/ac/sanger/artemis/components/LogViewer.java
index 89db023ff436047bb232b14fc3afc253845ec492..8c3d8835b938d950279fb9f2115704df01a523cc 100644
--- a/uk/ac/sanger/artemis/components/LogViewer.java
+++ b/uk/ac/sanger/artemis/components/LogViewer.java
@@ -20,7 +20,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  *
- * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/components/LogViewer.java,v 1.2 2007-02-28 15:50:56 tjc Exp $
+ * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/components/LogViewer.java,v 1.3 2007-03-22 13:41:31 tjc Exp $
  */
 
 package uk.ac.sanger.artemis.components;
@@ -35,13 +35,13 @@ import java.io.*;
  *  A class for viewing log messages in a FileViewer component.
  *
  *  @author Kim Rutherford <kmr@sanger.ac.uk>
- *  @version $Id: LogViewer.java,v 1.2 2007-02-28 15:50:56 tjc Exp $
+ *  @version $Id: LogViewer.java,v 1.3 2007-03-22 13:41:31 tjc Exp $
  **/
 
 public class LogViewer extends AppenderSkeleton implements Logger 
 {
 
-  public int maxLogLines = Integer.MAX_VALUE;
+  public int maxLogLines;
   /** The FileViewer that is used to show the messages. */
   private FileViewer file_viewer = null;
 
@@ -108,12 +108,11 @@ public class LogViewer extends AppenderSkeleton implements Logger
   protected void append(LoggingEvent e)
   {
     String message = this.layout.format(e);
-    
     FileViewer fv = ((LogViewer)Splash.getLogger()).getFileViewer();
     if(fv  != null &&
-       maxLogLines < fv.getTextArea().getLineCount())
-      fv.getTextArea().setText("");
-    
+       maxLogLines < fv.getLineCount())
+      fv.setText("");
+
     Splash.getLogger().log(message);
   }
 
@@ -132,6 +131,10 @@ public class LogViewer extends AppenderSkeleton implements Logger
     return maxLogLines;
   }
 
+  /**
+   * Set in log4j.properties by log4j.appender.R.MaxLogLines
+   * @param maxLogLines
+   */
   public void setMaxLogLines(int maxLogLines)
   {
     this.maxLogLines = maxLogLines;
@@ -141,5 +144,6 @@ public class LogViewer extends AppenderSkeleton implements Logger
   {
     return this.file_viewer;
   }
+ 
 
 }